summaryrefslogtreecommitdiff
path: root/source3/nsswitch/winbind_nss_aix.c
diff options
context:
space:
mode:
Diffstat (limited to 'source3/nsswitch/winbind_nss_aix.c')
-rw-r--r--source3/nsswitch/winbind_nss_aix.c297
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;
}
+
+