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