diff options
Diffstat (limited to 'source3/nsswitch/winbind_nss_aix.c')
-rw-r--r-- | source3/nsswitch/winbind_nss_aix.c | 297 |
1 files changed, 128 insertions, 169 deletions
diff --git a/source3/nsswitch/winbind_nss_aix.c b/source3/nsswitch/winbind_nss_aix.c index ba5332bf98..c06fbc7d4b 100644 --- a/source3/nsswitch/winbind_nss_aix.c +++ b/source3/nsswitch/winbind_nss_aix.c @@ -1,27 +1,3 @@ -/* - Unix SMB/CIFS implementation. - - AIX loadable authentication mmodule, providing identification - routines against Samba winbind/Windows NT Domain - - Copyright (C) Tim Potter 2003 - Copyright (C) Steve Roylance 2003 - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public - License as published by the Free Software Foundation; either - version 2 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with this library; if not, write to the - Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. -*/ #include <stdlib.h> #include <string.h> @@ -32,28 +8,70 @@ #define MAX_GETPWENT_USERS 250 #define MAX_GETGRENT_USERS 250 -/* #define WB_AIX_DEBUG */ + +BOOL next_token(char **ptr,char *buff,char *sep, size_t bufsize) +{ + char *s; + BOOL quoted; + size_t len=1; + + if (!ptr) return(False); + + s = *ptr; + + /* default to simple separators */ + if (!sep) sep = " \t\n\r"; + + /* find the first non sep char */ + while (*s && strchr(sep,*s)) s++; + + /* nothing left? */ + if (! *s) return(False); + + /* copy over the token */ + for (quoted = False; len < bufsize && *s && (quoted || !strchr(sep,*s)); s++) { + if (*s == '\"') { + quoted = !quoted; + } else { + len++; + *buff++ = *s; + } + } + + *ptr = (*s) ? s+1 : s; + *buff = 0; + + return(True); +} static struct passwd *fill_pwent(struct winbindd_pw *pw) { struct passwd *result; - if (!(result = malloc(sizeof(struct passwd)))) - goto out; - - ZERO_STRUCTP(result); + if (!(result = malloc(sizeof(struct passwd)))) { + return NULL; + } + memset(result, 0, sizeof(struct passwd)); /* User name */ - if ((result->pw_name = malloc(strlen(pw->pw_name) + 1)) == NULL) - goto out; + if ((result->pw_name = malloc(strlen(pw->pw_name) + 1)) == NULL) { + + /* Out of memory */ + + return NULL; + } strcpy(result->pw_name, pw->pw_name); /* Password */ - if ((result->pw_passwd = malloc(strlen(pw->pw_passwd) + 1)) == NULL) - goto out; + if ((result->pw_passwd = malloc(strlen(pw->pw_passwd) + 1)) == NULL) { + + /* Out of memory */ + + return NULL; + } strcpy(result->pw_passwd, pw->pw_passwd); @@ -64,75 +82,38 @@ static struct passwd *fill_pwent(struct winbindd_pw *pw) /* GECOS */ - if ((result->pw_gecos = malloc(strlen(pw->pw_gecos) + 1)) == NULL) - goto out; + if ((result->pw_gecos = malloc(strlen(pw->pw_gecos) + 1)) == NULL) { + + /* Out of memory */ + + return NULL; + } strcpy(result->pw_gecos, pw->pw_gecos); /* Home directory */ - if ((result->pw_dir = malloc(strlen(pw->pw_dir) + 1)) == NULL) - goto out; + if ((result->pw_dir = malloc(strlen(pw->pw_dir) + 1)) == NULL) { + + /* Out of memory */ + + return NULL; + } strcpy(result->pw_dir, pw->pw_dir); /* Logon shell */ - if ((result->pw_shell = malloc(strlen(pw->pw_shell) + 1)) == NULL) - goto out; - - strcpy(result->pw_shell, pw->pw_shell); -#ifdef WB_AIX_DEBUG - printf("wb_aix - returning filled pwent %s, %d\n", result->pw_name, result->pw_uid); -#endif - return result; - - /* A memory allocation failed, undo succesfull allocations and - return NULL */ - -out: - SAFE_FREE(result->pw_dir); - SAFE_FREE(result->pw_gecos); - SAFE_FREE(result->pw_passwd); - SAFE_FREE(result->pw_name); - SAFE_FREE(result); - - return NULL; -} - -static BOOL next_token(char **ptr,char *buff,char *sep, size_t bufsize) -{ - char *s; - BOOL quoted; - size_t len=1; - - if (!ptr) return(False); - - s = *ptr; - - /* default to simple separators */ - if (!sep) sep = " \t\n\r"; + if ((result->pw_shell = malloc(strlen(pw->pw_shell) + 1)) == NULL) { + + /* Out of memory */ - /* find the first non sep char */ - while (*s && strchr(sep,*s)) s++; - - /* nothing left? */ - if (! *s) return(False); - - /* copy over the token */ - for (quoted = False; len < bufsize && *s && (quoted || !strchr(sep,*s)); s++) { - if (*s == '\"') { - quoted = !quoted; - } else { - len++; - *buff++ = *s; - } + return NULL; } - *ptr = (*s) ? s+1 : s; - *buff = 0; - - return(True); + strcpy(result->pw_shell, pw->pw_shell); + + return result; } static struct group *fill_grent(struct winbindd_gr *gr, char *gr_mem) @@ -142,22 +123,30 @@ static struct group *fill_grent(struct winbindd_gr *gr, char *gr_mem) char *tst; struct group *result; - if (!(result = malloc(sizeof(struct group)))) - goto out; - - ZERO_STRUCTP(result); + if (!(result = malloc(sizeof(struct group)))) { + return NULL; + } + memset(result, 0, sizeof(struct group)); /* Group name */ - if ((result->gr_name = malloc(strlen(gr->gr_name) + 1)) == NULL) - goto out; + if ((result->gr_name = malloc(strlen(gr->gr_name) + 1)) == NULL) { + + /* Out of memory */ + + return NULL; + } strcpy(result->gr_name, gr->gr_name); /* Password */ - if ((result->gr_passwd = malloc(strlen(gr->gr_passwd) + 1)) == NULL) - goto out; + if ((result->gr_passwd = malloc(strlen(gr->gr_passwd) + 1)) == NULL) { + + /* Out of memory */ + + return NULL; + } strcpy(result->gr_passwd, gr->gr_passwd); @@ -179,9 +168,12 @@ static struct group *fill_grent(struct winbindd_gr *gr, char *gr_mem) return result; } - if ((tst = malloc(((gr->num_gr_mem + 1) * sizeof(char *)))) == NULL) - goto out; - + if ((tst = malloc(((gr->num_gr_mem + 1) * sizeof(char *)))) == NULL) { + + /* Out of memory */ + + return NULL; + } result->gr_mem = (char **)tst; /* Start looking at extra data */ @@ -194,10 +186,10 @@ static struct group *fill_grent(struct winbindd_gr *gr, char *gr_mem) if (((result->gr_mem)[i] = malloc(strlen(name) + 1)) == NULL) { - for ( i -= 1; i >= 0; i--) - SAFE_FREE((result->gr_mem)[i]); - goto out; - + + /* Out of memory */ + + return NULL; } strcpy((result->gr_mem)[i], name); @@ -208,21 +200,7 @@ static struct group *fill_grent(struct winbindd_gr *gr, char *gr_mem) (result->gr_mem)[i] = NULL; -#ifdef WB_AIX_DEBUG - printf("wb_aix - returning filled grent %s, %d\n", result->gr_name, result->gr_gid); -#endif return result; - - /* A memory allocation failed, undo succesfull allocations and - return NULL */ - -out: - SAFE_FREE(tst); - SAFE_FREE(result->gr_passwd); - SAFE_FREE(result->gr_name); - SAFE_FREE(result); - - return NULL; } @@ -232,25 +210,20 @@ wb_aix_getgrgid (gid_t gid) { /* take a group id and return a filled struct group */ + NSS_STATUS ret; struct winbindd_response response; struct winbindd_request request; ZERO_STRUCT(response); ZERO_STRUCT(request); -#ifdef WB_AIX_DEBUG - printf("wb_aix - getgrid for %d\n", gid); -#endif request.data.gid = gid; - if (winbindd_request(WINBINDD_GETGRGID, &request, &response) - == NSS_STATUS_SUCCESS) { -#ifdef WB_AIX_DEBUG - printf("wb_aix - returned from winbind_request\n"); -#endif + ret = winbindd_request(WINBINDD_GETGRGID, &request, &response); + + if (ret == NSS_STATUS_SUCCESS) { return fill_grent(&response.data.gr, response.extra_data); } - return NULL; } @@ -259,29 +232,23 @@ wb_aix_getgrnam (const char *name) { /* take a group name and return a filled struct group */ + NSS_STATUS ret; struct winbindd_response response; struct winbindd_request request; ZERO_STRUCT(response); ZERO_STRUCT(request); -#ifdef WB_AIX_DEBUG - printf("wb_aix - getgrnam for %s\n", name); -#endif - strncpy(request.data.groupname, name, sizeof(request.data.groupname)); request.data.groupname [sizeof(request.data.groupname) - 1] = '\0'; + ret = winbindd_request(WINBINDD_GETGRNAM, &request, &response); - if (winbindd_request(WINBINDD_GETGRNAM, &request, &response) - == NSS_STATUS_SUCCESS) { -#ifdef WB_AIX_DEBUG - printf("wb_aix - returned from winbind_request\n"); -#endif + if (ret == NSS_STATUS_SUCCESS) { return fill_grent(&response.data.gr, response.extra_data); - } + } return NULL; } @@ -291,28 +258,23 @@ wb_aix_getgrset (const char *user) /* take a username and return a string containing a comma-separated list of group id numbers to which the user belongs */ + NSS_STATUS ret; struct winbindd_response response; struct winbindd_request request; char *tmpbuf, *result; int i, idx = 0; - -#ifdef WB_AIX_DEBUG - printf("wb_aix - getgrset for %s\n", user); -#endif + strncpy(request.data.username, user, sizeof(request.data.username) - 1); request.data.username [sizeof(request.data.username) - 1] = '\0'; + ret = winbindd_request(WINBINDD_GETGROUPS, &request, &response); - if (winbindd_request(WINBINDD_GETGROUPS, &request, &response) - == NSS_STATUS_SUCCESS) { + if (ret == NSS_STATUS_SUCCESS) { int num_gids = response.data.num_entries; gid_t *gid_list = (gid_t *)response.extra_data; -#ifdef WB_AIX_DEBUG - printf("wb_aix - returned from winbind_request\n"); -#endif /* allocate a space large enough to contruct the string */ if (!(tmpbuf = malloc(num_gids*12))) { @@ -331,7 +293,7 @@ wb_aix_getgrset (const char *user) return tmpbuf; } strcpy(result, tmpbuf); - SAFE_FREE(tmpbuf); + free(tmpbuf); return result; } return NULL; @@ -342,23 +304,18 @@ wb_aix_getpwuid (uid_t uid) { /* take a uid and return a filled struct passwd */ + NSS_STATUS ret; struct winbindd_response response; struct winbindd_request request; ZERO_STRUCT(response); ZERO_STRUCT(request); - -#ifdef WB_AIX_DEBUG - printf("wb_aix - getpwid for %d\n", uid); -#endif request.data.uid = uid; - - if (winbindd_request(WINBINDD_GETPWUID, &request, &response) - == NSS_STATUS_SUCCESS) { -#ifdef WB_AIX_DEBUG - printf("wb_aix - returned from winbind_request\n"); -#endif + + ret = winbindd_request(WINBINDD_GETPWUID, &request, &response); + + if (ret == NSS_STATUS_SUCCESS) { return fill_pwent(&response.data.pw); } return NULL; @@ -369,26 +326,22 @@ wb_aix_getpwnam (const char *name) { /* take a username and return a filled struct passwd */ + NSS_STATUS ret; struct winbindd_response response; struct winbindd_request request; ZERO_STRUCT(response); ZERO_STRUCT(request); -#ifdef WB_AIX_DEBUG - printf("wb_aix - getpwnam for %s\n", name); -#endif + strncpy(request.data.username, name, sizeof(request.data.username) - 1); request.data.username [sizeof(request.data.username) - 1] = '\0'; + ret = winbindd_request(WINBINDD_GETPWNAM, &request, &response); - if (winbindd_request(WINBINDD_GETPWNAM, &request, &response) - == NSS_STATUS_SUCCESS) { -#ifdef WB_AIX_DEBUG - printf("wb_aix - returned from winbind_request\n"); -#endif - return fill_pwent(&response.data.pw); + if (ret == NSS_STATUS_SUCCESS) { + return fill_pwent(&response.data.pw); } return NULL; } @@ -398,14 +351,20 @@ wb_aix_init (struct secmethod_table *methods) { memset(methods, 0, sizeof(*methods)); - /* identification methods, this is the minimum requried for a - working module */ + /* identification methods */ methods->method_getgrgid = wb_aix_getgrgid; methods->method_getgrnam = wb_aix_getgrnam; methods->method_getgrset = wb_aix_getgrset; methods->method_getpwnam = wb_aix_getpwnam; methods->method_getpwuid = wb_aix_getpwuid; - + + /* support methods + methods->method_open = wb_aix_open; + methods->method_close = wb_aix_close; + */ + return AUTH_SUCCESS; } + + |