usage.c 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. /*
  2. * usage.c
  3. *
  4. * Various reporting routines.
  5. * Originally copied from GIT source.
  6. *
  7. * Copyright (C) Linus Torvalds, 2005
  8. */
  9. #include "util.h"
  10. #include "debug.h"
  11. static void report(const char *prefix, const char *err, va_list params)
  12. {
  13. char msg[1024];
  14. vsnprintf(msg, sizeof(msg), err, params);
  15. fprintf(stderr, " %s%s\n", prefix, msg);
  16. }
  17. static NORETURN void usage_builtin(const char *err)
  18. {
  19. fprintf(stderr, "\n Usage: %s\n", err);
  20. exit(129);
  21. }
  22. static NORETURN void die_builtin(const char *err, va_list params)
  23. {
  24. report(" Fatal: ", err, params);
  25. exit(128);
  26. }
  27. static void error_builtin(const char *err, va_list params)
  28. {
  29. report(" Error: ", err, params);
  30. }
  31. static void warn_builtin(const char *warn, va_list params)
  32. {
  33. report(" Warning: ", warn, params);
  34. }
  35. /* If we are in a dlopen()ed .so write to a global variable would segfault
  36. * (ugh), so keep things static. */
  37. static void (*usage_routine)(const char *err) NORETURN = usage_builtin;
  38. static void (*die_routine)(const char *err, va_list params) NORETURN = die_builtin;
  39. static void (*error_routine)(const char *err, va_list params) = error_builtin;
  40. static void (*warn_routine)(const char *err, va_list params) = warn_builtin;
  41. void set_die_routine(void (*routine)(const char *err, va_list params) NORETURN)
  42. {
  43. die_routine = routine;
  44. }
  45. void usage(const char *err)
  46. {
  47. usage_routine(err);
  48. }
  49. void die(const char *err, ...)
  50. {
  51. va_list params;
  52. va_start(params, err);
  53. die_routine(err, params);
  54. va_end(params);
  55. }
  56. int error(const char *err, ...)
  57. {
  58. va_list params;
  59. va_start(params, err);
  60. error_routine(err, params);
  61. va_end(params);
  62. return -1;
  63. }
  64. void warning(const char *warn, ...)
  65. {
  66. va_list params;
  67. va_start(params, warn);
  68. warn_routine(warn, params);
  69. va_end(params);
  70. }
  71. uid_t parse_target_uid(const char *str, const char *tid, const char *pid)
  72. {
  73. struct passwd pwd, *result;
  74. char buf[1024];
  75. if (str == NULL)
  76. return UINT_MAX;
  77. /* UID and PID are mutually exclusive */
  78. if (tid || pid) {
  79. ui__warning("PID/TID switch overriding UID\n");
  80. sleep(1);
  81. return UINT_MAX;
  82. }
  83. getpwnam_r(str, &pwd, buf, sizeof(buf), &result);
  84. if (result == NULL) {
  85. char *endptr;
  86. int uid = strtol(str, &endptr, 10);
  87. if (*endptr != '\0') {
  88. ui__error("Invalid user %s\n", str);
  89. return UINT_MAX - 1;
  90. }
  91. getpwuid_r(uid, &pwd, buf, sizeof(buf), &result);
  92. if (result == NULL) {
  93. ui__error("Problems obtaining information for user %s\n",
  94. str);
  95. return UINT_MAX - 1;
  96. }
  97. }
  98. return result->pw_uid;
  99. }