関数 | |
NSS_STATUS | _nss_winbind_setpwent (void) |
NSS_STATUS | _nss_winbind_endpwent (void) |
NSS_STATUS | _nss_winbind_getpwent_r (struct passwd *result, char *buffer, size_t buflen, int *errnop) |
NSS_STATUS | _nss_winbind_getpwuid_r (uid_t uid, struct passwd *result, char *buffer, size_t buflen, int *errnop) |
NSS_STATUS | _nss_winbind_getpwnam_r (const char *name, struct passwd *result, char *buffer, size_t buflen, int *errnop) |
NSS_STATUS | _nss_winbind_setgrent (void) |
NSS_STATUS | _nss_winbind_endgrent (void) |
NSS_STATUS | _nss_winbind_getgrent_r (struct group *result, char *buffer, size_t buflen, int *errnop) |
NSS_STATUS | _nss_winbind_getgrlst_r (struct group *result, char *buffer, size_t buflen, int *errnop) |
NSS_STATUS | _nss_winbind_getgrnam_r (const char *name, struct group *result, char *buffer, size_t buflen, int *errnop) |
NSS_STATUS | _nss_winbind_getgrgid_r (gid_t gid, struct group *result, char *buffer, size_t buflen, int *errnop) |
NSS_STATUS | _nss_winbind_initgroups_dyn (char *user, gid_t group, long int *start, long int *size, gid_t **groups, long int limit, int *errnop) |
NSS_STATUS | _nss_winbind_getusersids (const char *user_sid, char **group_sids, int *num_groups, char *buffer, size_t buf_size, int *errnop) |
NSS_STATUS | _nss_winbind_nametosid (const char *name, char **sid, char *buffer, size_t buflen, int *errnop) |
NSS_STATUS | _nss_winbind_sidtoname (const char *sid, char **name, char *buffer, size_t buflen, int *errnop) |
NSS_STATUS | _nss_winbind_sidtouid (const char *sid, uid_t *uid, int *errnop) |
NSS_STATUS | _nss_winbind_sidtogid (const char *sid, gid_t *gid, int *errnop) |
NSS_STATUS | _nss_winbind_uidtosid (uid_t uid, char **sid, char *buffer, size_t buflen, int *errnop) |
NSS_STATUS | _nss_winbind_gidtosid (gid_t gid, char **sid, char *buffer, size_t buflen, int *errnop) |
static const char * | nss_err_str (NSS_STATUS ret) |
static char * | get_static (char **buffer, size_t *buflen, size_t len) |
static BOOL | next_token (char **ptr, char *buff, const char *sep, size_t bufsize) |
static NSS_STATUS | fill_pwent (struct passwd *result, struct winbindd_pw *pw, char **buffer, size_t *buflen) |
static NSS_STATUS | fill_grent (struct group *result, struct winbindd_gr *gr, char *gr_mem, char **buffer, size_t *buflen) |
static NSS_STATUS | winbind_getgrent (enum winbindd_cmd cmd, struct group *result, char *buffer, size_t buflen, int *errnop) |
変数 | |
int | winbindd_fd |
static struct winbindd_response | getpwent_response |
static int | ndx_pw_cache |
static int | num_pw_cache |
static struct winbindd_response | getgrent_response |
static int | ndx_gr_cache |
static int | num_gr_cache |
NSS_STATUS _nss_winbind_setpwent | ( | void | ) |
NSS_STATUS _nss_winbind_endpwent | ( | void | ) |
NSS_STATUS _nss_winbind_getpwent_r | ( | struct passwd * | result, | |
char * | buffer, | |||
size_t | buflen, | |||
int * | errnop | |||
) |
NSS_STATUS _nss_winbind_getpwuid_r | ( | uid_t | uid, | |
struct passwd * | result, | |||
char * | buffer, | |||
size_t | buflen, | |||
int * | errnop | |||
) |
winbind_nss_linux.c の 482 行で定義されています。
参照先 winbindd_response::data・winbindd_request::data・errno・fill_pwent()・fprintf()・free_response()・nss_err_str()・NSS_STATUS_SUCCESS・NSS_STATUS_TRYAGAIN・winbindd_response::pw・winbindd_request::uid・WINBINDD_GETPWUID・winbindd_request_response().
00484 { 00485 NSS_STATUS ret; 00486 static struct winbindd_response response; 00487 struct winbindd_request request; 00488 static int keep_response=0; 00489 00490 #ifdef DEBUG_NSS 00491 fprintf(stderr, "[%5d]: getpwuid %d\n", getpid(), (unsigned int)uid); 00492 #endif 00493 00494 /* If our static buffer needs to be expanded we are called again */ 00495 if (!keep_response) { 00496 00497 /* Call for the first time */ 00498 00499 ZERO_STRUCT(response); 00500 ZERO_STRUCT(request); 00501 00502 request.data.uid = uid; 00503 00504 ret = winbindd_request_response(WINBINDD_GETPWUID, &request, &response); 00505 00506 if (ret == NSS_STATUS_SUCCESS) { 00507 ret = fill_pwent(result, &response.data.pw, 00508 &buffer, &buflen); 00509 00510 if (ret == NSS_STATUS_TRYAGAIN) { 00511 keep_response = True; 00512 *errnop = errno = ERANGE; 00513 goto done; 00514 } 00515 } 00516 00517 } else { 00518 00519 /* We've been called again */ 00520 00521 ret = fill_pwent(result, &response.data.pw, &buffer, &buflen); 00522 00523 if (ret == NSS_STATUS_TRYAGAIN) { 00524 keep_response = True; 00525 *errnop = errno = ERANGE; 00526 goto done; 00527 } 00528 00529 keep_response = False; 00530 *errnop = errno = 0; 00531 } 00532 00533 free_response(&response); 00534 done: 00535 00536 #ifdef DEBUG_NSS 00537 fprintf(stderr, "[%5d]: getpwuid %d returns %s (%d)\n", getpid(), 00538 (unsigned int)uid, nss_err_str(ret), ret); 00539 #endif 00540 return ret; 00541 }
NSS_STATUS _nss_winbind_getpwnam_r | ( | const char * | name, | |
struct passwd * | result, | |||
char * | buffer, | |||
size_t | buflen, | |||
int * | errnop | |||
) |
NSS_STATUS _nss_winbind_setgrent | ( | void | ) |
NSS_STATUS _nss_winbind_endgrent | ( | void | ) |
NSS_STATUS _nss_winbind_getgrent_r | ( | struct group * | result, | |
char * | buffer, | |||
size_t | buflen, | |||
int * | errnop | |||
) |
NSS_STATUS _nss_winbind_getgrlst_r | ( | struct group * | result, | |
char * | buffer, | |||
size_t | buflen, | |||
int * | errnop | |||
) |
winbind_nss_linux.c の 771 行で定義されています。
参照先 winbind_getgrent()・WINBINDD_GETGRLST.
00773 { 00774 return winbind_getgrent(WINBINDD_GETGRLST, result, buffer, buflen, errnop); 00775 }
NSS_STATUS _nss_winbind_getgrnam_r | ( | const char * | name, | |
struct group * | result, | |||
char * | buffer, | |||
size_t | buflen, | |||
int * | errnop | |||
) |
NSS_STATUS _nss_winbind_getgrgid_r | ( | gid_t | gid, | |
struct group * | result, | |||
char * | buffer, | |||
size_t | buflen, | |||
int * | errnop | |||
) |
NSS_STATUS _nss_winbind_initgroups_dyn | ( | char * | user, | |
gid_t | group, | |||
long int * | start, | |||
long int * | size, | |||
gid_t ** | groups, | |||
long int | limit, | |||
int * | errnop | |||
) |
winbind_nss_linux.c の 920 行で定義されています。
参照先 winbindd_response::data・winbindd_request::data・winbindd_response::extra_data・fprintf()・nss_err_str()・NSS_STATUS_NOTFOUND・NSS_STATUS_SUCCESS・winbindd_response::num_entries・winbindd_request::username・WINBINDD_GETGROUPS・winbindd_request_response().
参照元 _nss_winbind_getgroupsbymember_solwrap().
00923 { 00924 NSS_STATUS ret; 00925 struct winbindd_request request; 00926 struct winbindd_response response; 00927 int i; 00928 00929 #ifdef DEBUG_NSS 00930 fprintf(stderr, "[%5d]: initgroups %s (%d)\n", getpid(), 00931 user, group); 00932 #endif 00933 00934 ZERO_STRUCT(request); 00935 ZERO_STRUCT(response); 00936 00937 strncpy(request.data.username, user, 00938 sizeof(request.data.username) - 1); 00939 00940 ret = winbindd_request_response(WINBINDD_GETGROUPS, &request, &response); 00941 00942 if (ret == NSS_STATUS_SUCCESS) { 00943 int num_gids = response.data.num_entries; 00944 gid_t *gid_list = (gid_t *)response.extra_data.data; 00945 00946 #ifdef DEBUG_NSS 00947 fprintf(stderr, "[%5d]: initgroups %s: got NSS_STATUS_SUCCESS " 00948 "and %d gids\n", getpid(), 00949 user, num_gids); 00950 #endif 00951 if (gid_list == NULL) { 00952 ret = NSS_STATUS_NOTFOUND; 00953 goto done; 00954 } 00955 00956 /* Copy group list to client */ 00957 00958 for (i = 0; i < num_gids; i++) { 00959 00960 #ifdef DEBUG_NSS 00961 fprintf(stderr, "[%5d]: initgroups %s (%d): " 00962 "processing gid %d \n", getpid(), 00963 user, group, gid_list[i]); 00964 #endif 00965 00966 /* Skip primary group */ 00967 00968 if (gid_list[i] == group) { 00969 continue; 00970 } 00971 00972 /* Filled buffer ? If so, resize. */ 00973 00974 if (*start == *size) { 00975 long int newsize; 00976 gid_t *newgroups; 00977 00978 newsize = 2 * (*size); 00979 if (limit > 0) { 00980 if (*size == limit) { 00981 goto done; 00982 } 00983 if (newsize > limit) { 00984 newsize = limit; 00985 } 00986 } 00987 00988 newgroups = (gid_t *) 00989 realloc((*groups), 00990 newsize * sizeof(**groups)); 00991 if (!newgroups) { 00992 *errnop = ENOMEM; 00993 ret = NSS_STATUS_NOTFOUND; 00994 goto done; 00995 } 00996 *groups = newgroups; 00997 *size = newsize; 00998 } 00999 01000 /* Add to buffer */ 01001 01002 (*groups)[*start] = gid_list[i]; 01003 *start += 1; 01004 } 01005 } 01006 01007 /* Back to your regularly scheduled programming */ 01008 01009 done: 01010 #ifdef DEBUG_NSS 01011 fprintf(stderr, "[%5d]: initgroups %s returns %s (%d)\n", getpid(), 01012 user, nss_err_str(ret), ret); 01013 #endif 01014 return ret; 01015 }
NSS_STATUS _nss_winbind_getusersids | ( | const char * | user_sid, | |
char ** | group_sids, | |||
int * | num_groups, | |||
char * | buffer, | |||
size_t | buf_size, | |||
int * | errnop | |||
) |
winbind_nss_linux.c の 1020 行で定義されています。
参照先 winbindd_request::data・errno・fprintf()・free_response()・winbindd_response::length・NSS_STATUS_SUCCESS・NSS_STATUS_TRYAGAIN・winbindd_request::sid・WINBINDD_GETUSERSIDS・winbindd_request_response().
01023 { 01024 NSS_STATUS ret; 01025 struct winbindd_request request; 01026 struct winbindd_response response; 01027 01028 #ifdef DEBUG_NSS 01029 fprintf(stderr, "[%5d]: getusersids %s\n", getpid(), user_sid); 01030 #endif 01031 01032 ZERO_STRUCT(request); 01033 ZERO_STRUCT(response); 01034 01035 strncpy(request.data.sid, user_sid,sizeof(request.data.sid) - 1); 01036 request.data.sid[sizeof(request.data.sid) - 1] = '\0'; 01037 01038 ret = winbindd_request_response(WINBINDD_GETUSERSIDS, &request, &response); 01039 01040 if (ret != NSS_STATUS_SUCCESS) { 01041 goto done; 01042 } 01043 01044 if (buf_size < response.length - sizeof(response)) { 01045 ret = NSS_STATUS_TRYAGAIN; 01046 errno = *errnop = ERANGE; 01047 goto done; 01048 } 01049 01050 *num_groups = response.data.num_entries; 01051 *group_sids = buffer; 01052 memcpy(buffer, response.extra_data.data, response.length - sizeof(response)); 01053 errno = *errnop = 0; 01054 01055 done: 01056 free_response(&response); 01057 return ret; 01058 }
NSS_STATUS _nss_winbind_nametosid | ( | const char * | name, | |
char ** | sid, | |||
char * | buffer, | |||
size_t | buflen, | |||
int * | errnop | |||
) |
winbind_nss_linux.c の 1063 行で定義されています。
参照先 winbindd_response::data・winbindd_request::data・errno・failed・fprintf()・free_response()・winbindd_request::name・NSS_STATUS_SUCCESS・NSS_STATUS_TRYAGAIN・winbindd_response::sid・WINBINDD_LOOKUPNAME・winbindd_request_response().
01065 { 01066 NSS_STATUS ret; 01067 struct winbindd_response response; 01068 struct winbindd_request request; 01069 01070 #ifdef DEBUG_NSS 01071 fprintf(stderr, "[%5d]: nametosid %s\n", getpid(), name); 01072 #endif 01073 01074 ZERO_STRUCT(response); 01075 ZERO_STRUCT(request); 01076 01077 strncpy(request.data.name.name, name, 01078 sizeof(request.data.name.name) - 1); 01079 request.data.name.name[sizeof(request.data.name.name) - 1] = '\0'; 01080 01081 ret = winbindd_request_response(WINBINDD_LOOKUPNAME, &request, &response); 01082 if (ret != NSS_STATUS_SUCCESS) { 01083 *errnop = errno = EINVAL; 01084 goto failed; 01085 } 01086 01087 if (buflen < strlen(response.data.sid.sid)+1) { 01088 ret = NSS_STATUS_TRYAGAIN; 01089 *errnop = errno = ERANGE; 01090 goto failed; 01091 } 01092 01093 *errnop = errno = 0; 01094 *sid = buffer; 01095 strcpy(*sid, response.data.sid.sid); 01096 01097 failed: 01098 free_response(&response); 01099 return ret; 01100 }
NSS_STATUS _nss_winbind_sidtoname | ( | const char * | sid, | |
char ** | name, | |||
char * | buffer, | |||
size_t | buflen, | |||
int * | errnop | |||
) |
winbind_nss_linux.c の 1104 行で定義されています。
参照先 winbindd_request::data・winbindd_response::data・errno・failed・fprintf()・free_response()・winbindd_response::info・winbindd_response::name・NSS_STATUS_SUCCESS・NSS_STATUS_TRYAGAIN・winbindd_request::sid・snprintf()・WINBINDD_INFO・WINBINDD_LOOKUPSID・winbindd_request_response().
01106 { 01107 NSS_STATUS ret; 01108 struct winbindd_response response; 01109 struct winbindd_request request; 01110 static char sep_char; 01111 unsigned needed; 01112 01113 #ifdef DEBUG_NSS 01114 fprintf(stderr, "[%5d]: sidtoname %s\n", getpid(), sid); 01115 #endif 01116 01117 ZERO_STRUCT(response); 01118 ZERO_STRUCT(request); 01119 01120 /* we need to fetch the separator first time through */ 01121 if (!sep_char) { 01122 ret = winbindd_request_response(WINBINDD_INFO, &request, &response); 01123 if (ret != NSS_STATUS_SUCCESS) { 01124 *errnop = errno = EINVAL; 01125 goto failed; 01126 } 01127 01128 sep_char = response.data.info.winbind_separator; 01129 free_response(&response); 01130 } 01131 01132 01133 strncpy(request.data.sid, sid, 01134 sizeof(request.data.sid) - 1); 01135 request.data.sid[sizeof(request.data.sid) - 1] = '\0'; 01136 01137 ret = winbindd_request_response(WINBINDD_LOOKUPSID, &request, &response); 01138 if (ret != NSS_STATUS_SUCCESS) { 01139 *errnop = errno = EINVAL; 01140 goto failed; 01141 } 01142 01143 needed = 01144 strlen(response.data.name.dom_name) + 01145 strlen(response.data.name.name) + 2; 01146 01147 if (buflen < needed) { 01148 ret = NSS_STATUS_TRYAGAIN; 01149 *errnop = errno = ERANGE; 01150 goto failed; 01151 } 01152 01153 snprintf(buffer, needed, "%s%c%s", 01154 response.data.name.dom_name, 01155 sep_char, 01156 response.data.name.name); 01157 01158 *name = buffer; 01159 *errnop = errno = 0; 01160 01161 failed: 01162 free_response(&response); 01163 return ret; 01164 }
NSS_STATUS _nss_winbind_sidtouid | ( | const char * | sid, | |
uid_t * | uid, | |||
int * | errnop | |||
) |
winbind_nss_linux.c の 1168 行で定義されています。
参照先 winbindd_response::data・winbindd_request::data・errno・failed・fprintf()・NSS_STATUS_SUCCESS・winbindd_request::sid・winbindd_response::uid・winbindd_request_response()・WINBINDD_SID_TO_UID.
01169 { 01170 NSS_STATUS ret; 01171 struct winbindd_response response; 01172 struct winbindd_request request; 01173 01174 #ifdef DEBUG_NSS 01175 fprintf(stderr, "[%5d]: sidtouid %s\n", getpid(), sid); 01176 #endif 01177 01178 ZERO_STRUCT(request); 01179 ZERO_STRUCT(response); 01180 01181 strncpy(request.data.sid, sid, sizeof(request.data.sid) - 1); 01182 request.data.sid[sizeof(request.data.sid) - 1] = '\0'; 01183 01184 ret = winbindd_request_response(WINBINDD_SID_TO_UID, &request, &response); 01185 if (ret != NSS_STATUS_SUCCESS) { 01186 *errnop = errno = EINVAL; 01187 goto failed; 01188 } 01189 01190 *uid = response.data.uid; 01191 01192 failed: 01193 return ret; 01194 }
NSS_STATUS _nss_winbind_sidtogid | ( | const char * | sid, | |
gid_t * | gid, | |||
int * | errnop | |||
) |
winbind_nss_linux.c の 1198 行で定義されています。
参照先 winbindd_response::data・winbindd_request::data・errno・failed・fprintf()・winbindd_response::gid・NSS_STATUS_SUCCESS・winbindd_request::sid・winbindd_request_response()・WINBINDD_SID_TO_GID.
01199 { 01200 NSS_STATUS ret; 01201 struct winbindd_response response; 01202 struct winbindd_request request; 01203 01204 #ifdef DEBUG_NSS 01205 fprintf(stderr, "[%5d]: sidtogid %s\n", getpid(), sid); 01206 #endif 01207 01208 ZERO_STRUCT(request); 01209 ZERO_STRUCT(response); 01210 01211 strncpy(request.data.sid, sid, sizeof(request.data.sid) - 1); 01212 request.data.sid[sizeof(request.data.sid) - 1] = '\0'; 01213 01214 ret = winbindd_request_response(WINBINDD_SID_TO_GID, &request, &response); 01215 if (ret != NSS_STATUS_SUCCESS) { 01216 *errnop = errno = EINVAL; 01217 goto failed; 01218 } 01219 01220 *gid = response.data.gid; 01221 01222 failed: 01223 return ret; 01224 }
NSS_STATUS _nss_winbind_uidtosid | ( | uid_t | uid, | |
char ** | sid, | |||
char * | buffer, | |||
size_t | buflen, | |||
int * | errnop | |||
) |
winbind_nss_linux.c の 1228 行で定義されています。
参照先 winbindd_response::data・winbindd_request::data・errno・failed・fprintf()・free_response()・NSS_STATUS_SUCCESS・NSS_STATUS_TRYAGAIN・winbindd_response::sid・winbindd_request::uid・winbindd_request_response()・WINBINDD_UID_TO_SID.
01230 { 01231 NSS_STATUS ret; 01232 struct winbindd_response response; 01233 struct winbindd_request request; 01234 01235 #ifdef DEBUG_NSS 01236 fprintf(stderr, "[%5u]: uidtosid %u\n", (unsigned int)getpid(), (unsigned int)uid); 01237 #endif 01238 01239 ZERO_STRUCT(response); 01240 ZERO_STRUCT(request); 01241 01242 request.data.uid = uid; 01243 01244 ret = winbindd_request_response(WINBINDD_UID_TO_SID, &request, &response); 01245 if (ret != NSS_STATUS_SUCCESS) { 01246 *errnop = errno = EINVAL; 01247 goto failed; 01248 } 01249 01250 if (buflen < strlen(response.data.sid.sid)+1) { 01251 ret = NSS_STATUS_TRYAGAIN; 01252 *errnop = errno = ERANGE; 01253 goto failed; 01254 } 01255 01256 *errnop = errno = 0; 01257 *sid = buffer; 01258 strcpy(*sid, response.data.sid.sid); 01259 01260 failed: 01261 free_response(&response); 01262 return ret; 01263 }
NSS_STATUS _nss_winbind_gidtosid | ( | gid_t | gid, | |
char ** | sid, | |||
char * | buffer, | |||
size_t | buflen, | |||
int * | errnop | |||
) |
winbind_nss_linux.c の 1267 行で定義されています。
参照先 winbindd_response::data・winbindd_request::data・errno・failed・fprintf()・free_response()・winbindd_request::gid・NSS_STATUS_SUCCESS・NSS_STATUS_TRYAGAIN・winbindd_response::sid・WINBINDD_GID_TO_SID・winbindd_request_response().
01269 { 01270 NSS_STATUS ret; 01271 struct winbindd_response response; 01272 struct winbindd_request request; 01273 01274 #ifdef DEBUG_NSS 01275 fprintf(stderr, "[%5u]: gidtosid %u\n", (unsigned int)getpid(), (unsigned int)gid); 01276 #endif 01277 01278 ZERO_STRUCT(response); 01279 ZERO_STRUCT(request); 01280 01281 request.data.gid = gid; 01282 01283 ret = winbindd_request_response(WINBINDD_GID_TO_SID, &request, &response); 01284 if (ret != NSS_STATUS_SUCCESS) { 01285 *errnop = errno = EINVAL; 01286 goto failed; 01287 } 01288 01289 if (buflen < strlen(response.data.sid.sid)+1) { 01290 ret = NSS_STATUS_TRYAGAIN; 01291 *errnop = errno = ERANGE; 01292 goto failed; 01293 } 01294 01295 *errnop = errno = 0; 01296 *sid = buffer; 01297 strcpy(*sid, response.data.sid.sid); 01298 01299 failed: 01300 free_response(&response); 01301 return ret; 01302 }
static const char* nss_err_str | ( | NSS_STATUS | ret | ) | [static] |
winbind_nss_linux.c の 73 行で定義されています。
参照先 NSS_STATUS_NOTFOUND・NSS_STATUS_SUCCESS・NSS_STATUS_TRYAGAIN・NSS_STATUS_UNAVAIL.
参照元 _nss_winbind_endgrent()・_nss_winbind_endpwent()・_nss_winbind_getgrgid_r()・_nss_winbind_getgrnam_r()・_nss_winbind_getpwent_r()・_nss_winbind_getpwnam_r()・_nss_winbind_getpwuid_r()・_nss_winbind_initgroups_dyn()・_nss_winbind_setgrent()・_nss_winbind_setpwent()・winbind_getgrent().
00073 { 00074 switch (ret) { 00075 case NSS_STATUS_TRYAGAIN: 00076 return "NSS_STATUS_TRYAGAIN"; 00077 case NSS_STATUS_SUCCESS: 00078 return "NSS_STATUS_SUCCESS"; 00079 case NSS_STATUS_NOTFOUND: 00080 return "NSS_STATUS_NOTFOUND"; 00081 case NSS_STATUS_UNAVAIL: 00082 return "NSS_STATUS_UNAVAIL"; 00083 case NSS_STATUS_RETURN: 00084 return "NSS_STATUS_RETURN"; 00085 default: 00086 return "UNKNOWN RETURN CODE!!!!!!!"; 00087 } 00088 }
static char* get_static | ( | char ** | buffer, | |
size_t * | buflen, | |||
size_t | len | |||
) | [static] |
winbind_nss_linux.c の 95 行で定義されています。
参照先 result.
参照元 _nss_wins_gethostbyname_r()・fill_grent()・fill_pwent().
00096 { 00097 char *result; 00098 00099 /* Error check. We return false if things aren't set up right, or 00100 there isn't enough buffer space left. */ 00101 00102 if ((buffer == NULL) || (buflen == NULL) || (*buflen < len)) { 00103 return NULL; 00104 } 00105 00106 /* Return an index into the static buffer */ 00107 00108 result = *buffer; 00109 *buffer += len; 00110 *buflen -= len; 00111 00112 return result; 00113 }
static BOOL next_token | ( | char ** | ptr, | |
char * | buff, | |||
const char * | sep, | |||
size_t | bufsize | |||
) | [static] |
winbind_nss_linux.c の 119 行で定義されています。
参照先 len.
00120 { 00121 char *s; 00122 BOOL quoted; 00123 size_t len=1; 00124 00125 if (!ptr) return(False); 00126 00127 s = *ptr; 00128 00129 /* default to simple separators */ 00130 if (!sep) sep = " \t\n\r"; 00131 00132 /* find the first non sep char */ 00133 while (*s && strchr(sep,*s)) s++; 00134 00135 /* nothing left? */ 00136 if (! *s) return(False); 00137 00138 /* copy over the token */ 00139 for (quoted = False; len < bufsize && *s && (quoted || !strchr(sep,*s)); s++) { 00140 if (*s == '\"') { 00141 quoted = !quoted; 00142 } else { 00143 len++; 00144 *buff++ = *s; 00145 } 00146 } 00147 00148 *ptr = (*s) ? s+1 : s; 00149 *buff = 0; 00150 00151 return(True); 00152 }
static NSS_STATUS fill_pwent | ( | struct passwd * | result, | |
struct winbindd_pw * | pw, | |||
char ** | buffer, | |||
size_t * | buflen | |||
) | [static] |
winbind_nss_linux.c の 159 行で定義されています。
参照先 get_static()・NSS_STATUS_SUCCESS・NSS_STATUS_TRYAGAIN・winbindd_pw::pw_dir・winbindd_pw::pw_gecos・winbindd_pw::pw_gid・winbindd_pw::pw_name・winbindd_pw::pw_passwd・winbindd_pw::pw_shell・winbindd_pw::pw_uid.
00162 { 00163 /* User name */ 00164 00165 if ((result->pw_name = 00166 get_static(buffer, buflen, strlen(pw->pw_name) + 1)) == NULL) { 00167 00168 /* Out of memory */ 00169 00170 return NSS_STATUS_TRYAGAIN; 00171 } 00172 00173 strcpy(result->pw_name, pw->pw_name); 00174 00175 /* Password */ 00176 00177 if ((result->pw_passwd = 00178 get_static(buffer, buflen, strlen(pw->pw_passwd) + 1)) == NULL) { 00179 00180 /* Out of memory */ 00181 00182 return NSS_STATUS_TRYAGAIN; 00183 } 00184 00185 strcpy(result->pw_passwd, pw->pw_passwd); 00186 00187 /* [ug]id */ 00188 00189 result->pw_uid = pw->pw_uid; 00190 result->pw_gid = pw->pw_gid; 00191 00192 /* GECOS */ 00193 00194 if ((result->pw_gecos = 00195 get_static(buffer, buflen, strlen(pw->pw_gecos) + 1)) == NULL) { 00196 00197 /* Out of memory */ 00198 00199 return NSS_STATUS_TRYAGAIN; 00200 } 00201 00202 strcpy(result->pw_gecos, pw->pw_gecos); 00203 00204 /* Home directory */ 00205 00206 if ((result->pw_dir = 00207 get_static(buffer, buflen, strlen(pw->pw_dir) + 1)) == NULL) { 00208 00209 /* Out of memory */ 00210 00211 return NSS_STATUS_TRYAGAIN; 00212 } 00213 00214 strcpy(result->pw_dir, pw->pw_dir); 00215 00216 /* Logon shell */ 00217 00218 if ((result->pw_shell = 00219 get_static(buffer, buflen, strlen(pw->pw_shell) + 1)) == NULL) { 00220 00221 /* Out of memory */ 00222 00223 return NSS_STATUS_TRYAGAIN; 00224 } 00225 00226 strcpy(result->pw_shell, pw->pw_shell); 00227 00228 /* The struct passwd for Solaris has some extra fields which must 00229 be initialised or nscd crashes. */ 00230 00231 #if HAVE_PASSWD_PW_COMMENT 00232 result->pw_comment = ""; 00233 #endif 00234 00235 #if HAVE_PASSWD_PW_AGE 00236 result->pw_age = ""; 00237 #endif 00238 00239 return NSS_STATUS_SUCCESS; 00240 }
static NSS_STATUS fill_grent | ( | struct group * | result, | |
struct winbindd_gr * | gr, | |||
char * | gr_mem, | |||
char ** | buffer, | |||
size_t * | buflen | |||
) | [static] |
winbind_nss_linux.c の 246 行で定義されています。
参照先 get_static()・winbindd_gr::gr_gid・winbindd_gr::gr_name・winbindd_gr::gr_passwd・name・next_token()・NSS_STATUS_SUCCESS・NSS_STATUS_TRYAGAIN・winbindd_gr::num_gr_mem.
00248 { 00249 fstring name; 00250 int i; 00251 char *tst; 00252 00253 /* Group name */ 00254 00255 if ((result->gr_name = 00256 get_static(buffer, buflen, strlen(gr->gr_name) + 1)) == NULL) { 00257 00258 /* Out of memory */ 00259 00260 return NSS_STATUS_TRYAGAIN; 00261 } 00262 00263 strcpy(result->gr_name, gr->gr_name); 00264 00265 /* Password */ 00266 00267 if ((result->gr_passwd = 00268 get_static(buffer, buflen, strlen(gr->gr_passwd) + 1)) == NULL) { 00269 00270 /* Out of memory */ 00271 00272 return NSS_STATUS_TRYAGAIN; 00273 } 00274 00275 strcpy(result->gr_passwd, gr->gr_passwd); 00276 00277 /* gid */ 00278 00279 result->gr_gid = gr->gr_gid; 00280 00281 /* Group membership */ 00282 00283 if ((gr->num_gr_mem < 0) || !gr_mem) { 00284 gr->num_gr_mem = 0; 00285 } 00286 00287 /* this next value is a pointer to a pointer so let's align it */ 00288 00289 /* Calculate number of extra bytes needed to align on pointer size boundry */ 00290 if ((i = (unsigned long)(*buffer) % sizeof(char*)) != 0) 00291 i = sizeof(char*) - i; 00292 00293 if ((tst = get_static(buffer, buflen, ((gr->num_gr_mem + 1) * 00294 sizeof(char *)+i))) == NULL) { 00295 00296 /* Out of memory */ 00297 00298 return NSS_STATUS_TRYAGAIN; 00299 } 00300 result->gr_mem = (char **)(tst + i); 00301 00302 if (gr->num_gr_mem == 0) { 00303 00304 /* Group is empty */ 00305 00306 *(result->gr_mem) = NULL; 00307 return NSS_STATUS_SUCCESS; 00308 } 00309 00310 /* Start looking at extra data */ 00311 00312 i = 0; 00313 00314 while(next_token((char **)&gr_mem, name, ",", sizeof(fstring))) { 00315 00316 /* Allocate space for member */ 00317 00318 if (((result->gr_mem)[i] = 00319 get_static(buffer, buflen, strlen(name) + 1)) == NULL) { 00320 00321 /* Out of memory */ 00322 00323 return NSS_STATUS_TRYAGAIN; 00324 } 00325 00326 strcpy((result->gr_mem)[i], name); 00327 i++; 00328 } 00329 00330 /* Terminate list */ 00331 00332 (result->gr_mem)[i] = NULL; 00333 00334 return NSS_STATUS_SUCCESS; 00335 }
static NSS_STATUS winbind_getgrent | ( | enum winbindd_cmd | cmd, | |
struct group * | result, | |||
char * | buffer, | |||
size_t | buflen, | |||
int * | errnop | |||
) | [static] |
winbind_nss_linux.c の 667 行で定義されています。
参照先 winbindd_response::data・winbindd_request::data・errno・winbindd_response::extra_data・fill_grent()・fprintf()・free_response()・getgrent_response・winbindd_gr::gr_mem_ofs・ndx_gr_cache・nss_err_str()・NSS_STATUS_NOTFOUND・NSS_STATUS_SUCCESS・NSS_STATUS_TRYAGAIN・winbindd_response::num_entries・winbindd_request::num_entries・num_gr_cache・winbindd_request_response().
参照元 _nss_winbind_getgrent_r()・_nss_winbind_getgrlst_r().
00670 { 00671 NSS_STATUS ret; 00672 static struct winbindd_request request; 00673 static int called_again; 00674 00675 00676 #ifdef DEBUG_NSS 00677 fprintf(stderr, "[%5d]: getgrent\n", getpid()); 00678 #endif 00679 00680 /* Return an entry from the cache if we have one, or if we are 00681 called again because we exceeded our static buffer. */ 00682 00683 if ((ndx_gr_cache < num_gr_cache) || called_again) { 00684 goto return_result; 00685 } 00686 00687 /* Else call winbindd to get a bunch of entries */ 00688 00689 if (num_gr_cache > 0) { 00690 free_response(&getgrent_response); 00691 } 00692 00693 ZERO_STRUCT(request); 00694 ZERO_STRUCT(getgrent_response); 00695 00696 request.data.num_entries = MAX_GETGRENT_USERS; 00697 00698 ret = winbindd_request_response(cmd, &request, 00699 &getgrent_response); 00700 00701 if (ret == NSS_STATUS_SUCCESS) { 00702 struct winbindd_gr *gr_cache; 00703 int mem_ofs; 00704 00705 /* Fill cache */ 00706 00707 ndx_gr_cache = 0; 00708 num_gr_cache = getgrent_response.data.num_entries; 00709 00710 /* Return a result */ 00711 00712 return_result: 00713 00714 gr_cache = (struct winbindd_gr *) 00715 getgrent_response.extra_data.data; 00716 00717 /* Check data is valid */ 00718 00719 if (gr_cache == NULL) { 00720 ret = NSS_STATUS_NOTFOUND; 00721 goto done; 00722 } 00723 00724 /* Fill group membership. The offset into the extra data 00725 for the group membership is the reported offset plus the 00726 size of all the winbindd_gr records returned. */ 00727 00728 mem_ofs = gr_cache[ndx_gr_cache].gr_mem_ofs + 00729 num_gr_cache * sizeof(struct winbindd_gr); 00730 00731 ret = fill_grent(result, &gr_cache[ndx_gr_cache], 00732 ((char *)getgrent_response.extra_data.data)+mem_ofs, 00733 &buffer, &buflen); 00734 00735 /* Out of memory - try again */ 00736 00737 if (ret == NSS_STATUS_TRYAGAIN) { 00738 called_again = True; 00739 *errnop = errno = ERANGE; 00740 goto done; 00741 } 00742 00743 *errnop = 0; 00744 called_again = False; 00745 ndx_gr_cache++; 00746 00747 /* If we've finished with this lot of results free cache */ 00748 00749 if (ndx_gr_cache == num_gr_cache) { 00750 ndx_gr_cache = num_gr_cache = 0; 00751 free_response(&getgrent_response); 00752 } 00753 } 00754 done: 00755 #ifdef DEBUG_NSS 00756 fprintf(stderr, "[%5d]: getgrent returns %s (%d)\n", getpid(), 00757 nss_err_str(ret), ret); 00758 #endif 00759 return ret; 00760 }
int winbindd_fd |
wb_common.c の 35 行で定義されています。
struct winbindd_response getpwent_response [static] |
int ndx_pw_cache [static] |
int num_pw_cache [static] |
struct winbindd_response getgrent_response [static] |
winbind_nss_linux.c の 613 行で定義されています。
参照元 _nss_winbind_endgrent()・_nss_winbind_setgrent()・winbind_getgrent().
int ndx_gr_cache [static] |
winbind_nss_linux.c の 615 行で定義されています。
参照元 _nss_winbind_endgrent()・_nss_winbind_setgrent()・winbind_getgrent().
int num_gr_cache [static] |
winbind_nss_linux.c の 616 行で定義されています。
参照元 _nss_winbind_endgrent()・_nss_winbind_setgrent()・winbind_getgrent().