MODRET authfile_getgrent(cmd_rec *cmd) { struct group *grp = NULL; grp = af_getgrent(); return grp ? mod_create_data(cmd, grp) : PR_DECLINED(cmd); }
static struct group *af_getgrgid(gid_t gid) { struct group *grp = NULL; if (af_setgrent() < 0) return NULL; while ((grp = af_getgrent()) != NULL) { if (grp->gr_gid == gid) { /* Found the requested GID */ break; } } return grp; }
static struct group *af_getgrnam(const char *name) { struct group *grp = NULL; if (af_setgrent() < 0) return NULL; while ((grp = af_getgrent()) != NULL) { if (strcmp(name, grp->gr_name) == 0) { /* Found the requested group */ break; } } return grp; }
MODRET authfile_getgrnam(cmd_rec *cmd) { struct group *grp = NULL; const char *name = cmd->argv[0]; if (af_setgrent() < 0) return PR_DECLINED(cmd); while ((grp = af_getgrent()) != NULL) { if (strcmp(name, grp->gr_name) == 0) { /* Found the name requested */ break; } } return grp ? mod_create_data(cmd, grp) : PR_DECLINED(cmd); }
static struct group *af_getgrgid(pool *p, gid_t gid) { struct group *grp = NULL; if (af_setgrent(p) < 0) { return NULL; } while ((grp = af_getgrent(p)) != NULL) { pr_signals_handle(); if (grp->gr_gid == gid) { /* Found the requested GID */ break; } } return grp; }
static struct group *af_getgrnam(pool *p, const char *name) { struct group *grp = NULL; if (af_setgrent(p) < 0) { return NULL; } while ((grp = af_getgrent(p)) != NULL) { pr_signals_handle(); if (strcmp(name, grp->gr_name) == 0) { /* Found the requested group */ break; } } return grp; }
MODRET authfile_getgroups(cmd_rec *cmd) { struct passwd *pwd = NULL; struct group *grp = NULL; array_header *gids = NULL, *groups = NULL; char *name = cmd->argv[0]; if (name == NULL) { return PR_DECLINED(cmd); } if (af_setpwent() < 0) { return PR_DECLINED(cmd); } if (af_setgrent() < 0) { return PR_DECLINED(cmd); } /* Check for NULLs */ if (cmd->argv[1]) gids = (array_header *) cmd->argv[1]; if (cmd->argv[2]) groups = (array_header *) cmd->argv[2]; /* Retrieve the necessary info. */ pwd = af_getpwnam(name); if (pwd == NULL) { return PR_DECLINED(cmd); } /* Populate the first group ID and name. */ if (gids) { *((gid_t *) push_array(gids)) = pwd->pw_gid; } if (groups && (grp = af_getgrgid(pwd->pw_gid)) != NULL) { *((char **) push_array(groups)) = pstrdup(session.pool, grp->gr_name); } af_setgrent(); /* This is where things get slow, expensive, and ugly. Loop through * everything, checking to make sure we haven't already added it. */ while ((grp = af_getgrent()) != NULL && grp->gr_mem) { char **gr_mems = NULL; pr_signals_handle(); /* Loop through each member name listed */ for (gr_mems = grp->gr_mem; *gr_mems; gr_mems++) { /* If it matches the given username... */ if (strcmp(*gr_mems, pwd->pw_name) == 0) { /* ...add the GID and name */ if (gids) *((gid_t *) push_array(gids)) = grp->gr_gid; if (groups) *((char **) push_array(groups)) = pstrdup(session.pool, grp->gr_name); } } } if (gids && gids->nelts > 0) { return mod_create_data(cmd, (void *) &gids->nelts); } else if (groups && groups->nelts > 0) { return mod_create_data(cmd, (void *) &groups->nelts); } return PR_DECLINED(cmd); }