OLD | NEW |
1 #include "pwf.h" | 1 #include "pwf.h" |
2 #include <pthread.h> | 2 #include <pthread.h> |
3 | 3 |
4 #define FIX(x) (pw->pw_##x = pw->pw_##x-line+buf) | 4 #define FIX(x) (pw->pw_##x = pw->pw_##x - line + buf) |
5 | 5 |
6 static int getpw_r(const char *name, uid_t uid, struct passwd *pw, char *buf, si
ze_t size, struct passwd **res) | 6 static int getpw_r(const char* name, |
7 { | 7 uid_t uid, |
8 » char *line = 0; | 8 struct passwd* pw, |
9 » size_t len = 0; | 9 char* buf, |
10 » int rv = 0; | 10 size_t size, |
11 » int cs; | 11 struct passwd** res) { |
| 12 char* line = 0; |
| 13 size_t len = 0; |
| 14 int rv = 0; |
| 15 int cs; |
12 | 16 |
13 » pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs); | 17 pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs); |
14 | 18 |
15 » rv = __getpw_a(name, uid, pw, &line, &len, res); | 19 rv = __getpw_a(name, uid, pw, &line, &len, res); |
16 » if (*res && size < len) { | 20 if (*res && size < len) { |
17 » » *res = 0; | 21 *res = 0; |
18 » » rv = ERANGE; | 22 rv = ERANGE; |
19 » } | 23 } |
20 » if (*res) { | 24 if (*res) { |
21 » » memcpy(buf, line, len); | 25 memcpy(buf, line, len); |
22 » » FIX(name); | 26 FIX(name); |
23 » » FIX(passwd); | 27 FIX(passwd); |
24 » » FIX(gecos); | 28 FIX(gecos); |
25 » » FIX(dir); | 29 FIX(dir); |
26 » » FIX(shell); | 30 FIX(shell); |
27 » } | 31 } |
28 » free(line); | 32 free(line); |
29 » pthread_setcancelstate(cs, 0); | 33 pthread_setcancelstate(cs, 0); |
30 » return rv; | 34 return rv; |
31 } | 35 } |
32 | 36 |
33 int getpwnam_r(const char *name, struct passwd *pw, char *buf, size_t size, stru
ct passwd **res) | 37 int getpwnam_r(const char* name, |
34 { | 38 struct passwd* pw, |
35 » return getpw_r(name, 0, pw, buf, size, res); | 39 char* buf, |
| 40 size_t size, |
| 41 struct passwd** res) { |
| 42 return getpw_r(name, 0, pw, buf, size, res); |
36 } | 43 } |
37 | 44 |
38 int getpwuid_r(uid_t uid, struct passwd *pw, char *buf, size_t size, struct pass
wd **res) | 45 int getpwuid_r(uid_t uid, |
39 { | 46 struct passwd* pw, |
40 » return getpw_r(0, uid, pw, buf, size, res); | 47 char* buf, |
| 48 size_t size, |
| 49 struct passwd** res) { |
| 50 return getpw_r(0, uid, pw, buf, size, res); |
41 } | 51 } |
OLD | NEW |