| OLD | NEW |
| 1 #include <pthread.h> | 1 #include <pthread.h> |
| 2 #include <byteswap.h> | 2 #include <byteswap.h> |
| 3 #include <string.h> | 3 #include <string.h> |
| 4 #include <unistd.h> | 4 #include <unistd.h> |
| 5 #include "pwf.h" | 5 #include "pwf.h" |
| 6 #include "nscd.h" | 6 #include "nscd.h" |
| 7 | 7 |
| 8 static char *itoa(char *p, uint32_t x) | 8 static char *itoa(char *p, uint32_t x) |
| 9 { | 9 { |
| 10 // number of digits in a uint32_t + NUL | 10 // number of digits in a uint32_t + NUL |
| (...skipping 15 matching lines...) Expand all Loading... |
| 26 *res = 0; | 26 *res = 0; |
| 27 | 27 |
| 28 pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs); | 28 pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs); |
| 29 f = fopen("/etc/group", "rbe"); | 29 f = fopen("/etc/group", "rbe"); |
| 30 if (!f) { | 30 if (!f) { |
| 31 rv = errno; | 31 rv = errno; |
| 32 goto done; | 32 goto done; |
| 33 } | 33 } |
| 34 | 34 |
| 35 while (!(rv = __getgrent_a(f, gr, buf, size, mem, nmem, res)) && *res) { | 35 while (!(rv = __getgrent_a(f, gr, buf, size, mem, nmem, res)) && *res) { |
| 36 » » if (name && !strcmp(name, (*res)->gr_name) | 36 » » if ((name && !strcmp(name, (*res)->gr_name)) |
| 37 » » || !name && (*res)->gr_gid == gid) { | 37 » » || (!name && (*res)->gr_gid == gid)) { |
| 38 break; | 38 break; |
| 39 } | 39 } |
| 40 } | 40 } |
| 41 fclose(f); | 41 fclose(f); |
| 42 | 42 |
| 43 if (!*res && (rv == 0 || rv == ENOENT || rv == ENOTDIR)) { | 43 if (!*res && (rv == 0 || rv == ENOENT || rv == ENOTDIR)) { |
| 44 int32_t req = name ? GETGRBYNAME : GETGRBYGID; | 44 int32_t req = name ? GETGRBYNAME : GETGRBYGID; |
| 45 int32_t i; | 45 int32_t i; |
| 46 const char *key; | 46 const char *key; |
| 47 int32_t groupbuf[GR_LEN] = {0}; | 47 int32_t groupbuf[GR_LEN] = {0}; |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 142 gr->gr_passwd = gr->gr_name + groupbuf[GRNAMELEN]; | 142 gr->gr_passwd = gr->gr_name + groupbuf[GRNAMELEN]; |
| 143 gr->gr_gid = groupbuf[GRGID]; | 143 gr->gr_gid = groupbuf[GRGID]; |
| 144 gr->gr_mem = *mem; | 144 gr->gr_mem = *mem; |
| 145 | 145 |
| 146 if (gr->gr_passwd[-1] | 146 if (gr->gr_passwd[-1] |
| 147 || gr->gr_passwd[groupbuf[GRPASSWDLEN]-1]) { | 147 || gr->gr_passwd[groupbuf[GRPASSWDLEN]-1]) { |
| 148 rv = EIO; | 148 rv = EIO; |
| 149 goto cleanup_f; | 149 goto cleanup_f; |
| 150 } | 150 } |
| 151 | 151 |
| 152 » » if (name && strcmp(name, gr->gr_name) | 152 » » if ((name && strcmp(name, gr->gr_name)) |
| 153 » » || !name && gid != gr->gr_gid) { | 153 » » || (!name && gid != gr->gr_gid)) { |
| 154 rv = EIO; | 154 rv = EIO; |
| 155 goto cleanup_f; | 155 goto cleanup_f; |
| 156 } | 156 } |
| 157 | 157 |
| 158 *res = gr; | 158 *res = gr; |
| 159 | 159 |
| 160 cleanup_f: | 160 cleanup_f: |
| 161 fclose(f); | 161 fclose(f); |
| 162 goto done; | 162 goto done; |
| 163 } | 163 } |
| 164 | 164 |
| 165 done: | 165 done: |
| 166 pthread_setcancelstate(cs, 0); | 166 pthread_setcancelstate(cs, 0); |
| 167 if (rv) errno = rv; | 167 if (rv) errno = rv; |
| 168 return rv; | 168 return rv; |
| 169 } | 169 } |
| OLD | NEW |