realpath.c 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. /*
  2. * This program is free software; you can redistribute it and/or modify
  3. * it under the terms of the GNU General Public License as published by
  4. * the Free Software Foundation; either version 2 of the License, or
  5. * (at your option) any later version.
  6. *
  7. * This program is distributed in the hope that it will be useful,
  8. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. * GNU General Public License for more details.
  11. *
  12. * You should have received a copy of the GNU General Public License
  13. * along with this program; if not, write to the Free Software
  14. * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  15. */
  16. /* BB_AUDIT SUSv3 N/A -- Apparently a busybox extension. */
  17. /* Mar 16, 2003 Manuel Novoa III (mjn3@codepoet.org)
  18. *
  19. * Now does proper error checking on output and returns a failure exit code
  20. * if one or more paths can not be resolved.
  21. */
  22. #include <limits.h>
  23. #include <stdlib.h>
  24. #include "busybox.h"
  25. int realpath_main(int argc, char **argv)
  26. {
  27. int retval = EXIT_SUCCESS;
  28. #if PATH_MAX > (BUFSIZ+1)
  29. RESERVE_CONFIG_BUFFER(resolved_path, PATH_MAX);
  30. # define resolved_path_MUST_FREE 1
  31. #else
  32. #define resolved_path bb_common_bufsiz1
  33. # define resolved_path_MUST_FREE 0
  34. #endif
  35. if (--argc == 0) {
  36. bb_show_usage();
  37. }
  38. do {
  39. argv++;
  40. if (realpath(*argv, resolved_path) != NULL) {
  41. puts(resolved_path);
  42. } else {
  43. retval = EXIT_FAILURE;
  44. bb_perror_msg("%s", *argv);
  45. }
  46. } while (--argc);
  47. #if ENABLE_FEATURE_CLEAN_UP && resolved_path_MUST_FREE
  48. RELEASE_CONFIG_BUFFER(resolved_path);
  49. #endif
  50. bb_fflush_stdout_and_exit(retval);
  51. }