|
rpm-build |
0a0c83 |
#include "config.h"
|
|
rpm-build |
0a0c83 |
#include <sys/types.h>
|
|
rpm-build |
0a0c83 |
#include <stdio.h>
|
|
rpm-build |
0a0c83 |
#include <string.h>
|
|
rpm-build |
0a0c83 |
#include <stdlib.h>
|
|
rpm-build |
0a0c83 |
#include <errno.h>
|
|
rpm-build |
0a0c83 |
#include <libgen.h>
|
|
rpm-build |
0a0c83 |
#include <limits.h>
|
|
rpm-build |
0a0c83 |
#include <grp.h>
|
|
rpm-build |
0a0c83 |
|
|
rpm-build |
0a0c83 |
#define TEST_GROUP "test/test.group"
|
|
rpm-build |
0a0c83 |
static char grfile[PATH_MAX];
|
|
rpm-build |
0a0c83 |
static void setup_grfile() __attribute__((constructor));
|
|
rpm-build |
0a0c83 |
|
|
rpm-build |
0a0c83 |
static void setup_grfile() {
|
|
rpm-build |
0a0c83 |
snprintf(grfile, sizeof(grfile), "%s/%s", BASEDIR, TEST_GROUP);
|
|
rpm-build |
0a0c83 |
}
|
|
rpm-build |
0a0c83 |
|
|
rpm-build |
0a0c83 |
#define ALIGN_MASK(x, mask) (((x) + (mask)) & ~(mask))
|
|
rpm-build |
0a0c83 |
#define ALIGN(x, a) ALIGN_MASK(x, (typeof(x))(a) - 1)
|
|
rpm-build |
0a0c83 |
|
|
rpm-build |
0a0c83 |
static int test_getgrent_r(FILE *file, struct group *grp, char *buf,
|
|
rpm-build |
0a0c83 |
size_t buflen, struct group **result)
|
|
rpm-build |
0a0c83 |
{
|
|
rpm-build |
0a0c83 |
char *line, *str, *remain;
|
|
rpm-build |
0a0c83 |
int count, index = 0;
|
|
rpm-build |
0a0c83 |
int gr_mem_cnt = 0;
|
|
rpm-build |
0a0c83 |
|
|
rpm-build |
0a0c83 |
*result = NULL;
|
|
rpm-build |
0a0c83 |
|
|
rpm-build |
0a0c83 |
line = fgets(buf, buflen, file);
|
|
rpm-build |
0a0c83 |
if (!line)
|
|
rpm-build |
0a0c83 |
return 0;
|
|
rpm-build |
0a0c83 |
|
|
rpm-build |
0a0c83 |
/* We'll stuff the gr_mem array in the remaining space in the buffer */
|
|
rpm-build |
0a0c83 |
remain = buf + ALIGN(line + strlen(line) - buf, sizeof(char *));
|
|
rpm-build |
0a0c83 |
grp->gr_mem = (char **)remain;
|
|
rpm-build |
0a0c83 |
count = (buf + buflen - remain) / sizeof (char *);
|
|
rpm-build |
0a0c83 |
if (!count) {
|
|
rpm-build |
0a0c83 |
errno = ERANGE;
|
|
rpm-build |
0a0c83 |
return -1;
|
|
rpm-build |
0a0c83 |
}
|
|
rpm-build |
0a0c83 |
|
|
rpm-build |
0a0c83 |
grp->gr_mem[--count] = NULL;
|
|
rpm-build |
0a0c83 |
|
|
rpm-build |
0a0c83 |
while ((str = strtok(line, ":"))) {
|
|
rpm-build |
0a0c83 |
char *ptr;
|
|
rpm-build |
0a0c83 |
switch (index++) {
|
|
rpm-build |
0a0c83 |
case 0:
|
|
rpm-build |
0a0c83 |
grp->gr_name = str;
|
|
rpm-build |
0a0c83 |
break;
|
|
rpm-build |
0a0c83 |
case 1:
|
|
rpm-build |
0a0c83 |
grp->gr_passwd = str;
|
|
rpm-build |
0a0c83 |
break;
|
|
rpm-build |
0a0c83 |
case 2:
|
|
rpm-build |
0a0c83 |
errno = 0;
|
|
rpm-build |
0a0c83 |
grp->gr_gid = strtol(str, NULL, 10);
|
|
rpm-build |
0a0c83 |
if (errno)
|
|
rpm-build |
0a0c83 |
return -1;
|
|
rpm-build |
0a0c83 |
break;
|
|
rpm-build |
0a0c83 |
case 3:
|
|
rpm-build |
0a0c83 |
while ((str = strtok_r(str, ",", &ptr))) {
|
|
rpm-build |
0a0c83 |
if (count-- <= 0) {
|
|
rpm-build |
0a0c83 |
errno = ERANGE;
|
|
rpm-build |
0a0c83 |
return -1;
|
|
rpm-build |
0a0c83 |
}
|
|
rpm-build |
0a0c83 |
grp->gr_mem[gr_mem_cnt++] = str;
|
|
rpm-build |
0a0c83 |
str = NULL;
|
|
rpm-build |
0a0c83 |
}
|
|
rpm-build |
0a0c83 |
}
|
|
rpm-build |
0a0c83 |
line = NULL;
|
|
rpm-build |
0a0c83 |
}
|
|
rpm-build |
0a0c83 |
|
|
rpm-build |
0a0c83 |
*result = grp;
|
|
rpm-build |
0a0c83 |
|
|
rpm-build |
0a0c83 |
return 0;
|
|
rpm-build |
0a0c83 |
}
|
|
rpm-build |
0a0c83 |
|
|
rpm-build |
0a0c83 |
static int test_getgr_match(struct group *grp, char *buf, size_t buflen,
|
|
rpm-build |
0a0c83 |
struct group **result,
|
|
rpm-build |
0a0c83 |
int (*match)(const struct group *, const void *),
|
|
rpm-build |
0a0c83 |
const void *data)
|
|
rpm-build |
0a0c83 |
{
|
|
rpm-build |
0a0c83 |
FILE *file;
|
|
rpm-build |
0a0c83 |
struct group *_result;
|
|
rpm-build |
0a0c83 |
|
|
rpm-build |
0a0c83 |
*result = NULL;
|
|
rpm-build |
0a0c83 |
|
|
rpm-build |
0a0c83 |
file = fopen(grfile, "r");
|
|
rpm-build |
0a0c83 |
if (!file) {
|
|
rpm-build |
0a0c83 |
errno = EBADF;
|
|
rpm-build |
0a0c83 |
return -1;
|
|
rpm-build |
0a0c83 |
}
|
|
rpm-build |
0a0c83 |
|
|
rpm-build |
0a0c83 |
errno = 0;
|
|
rpm-build |
0a0c83 |
while (!test_getgrent_r(file, grp, buf, buflen, &_result)) {
|
|
rpm-build |
0a0c83 |
if (!_result)
|
|
rpm-build |
0a0c83 |
break;
|
|
rpm-build |
0a0c83 |
else if (match(grp, data)) {
|
|
rpm-build |
0a0c83 |
*result = grp;
|
|
rpm-build |
0a0c83 |
break;
|
|
rpm-build |
0a0c83 |
}
|
|
rpm-build |
0a0c83 |
}
|
|
rpm-build |
0a0c83 |
|
|
rpm-build |
0a0c83 |
fclose(file);
|
|
rpm-build |
0a0c83 |
if (!errno && !*result)
|
|
rpm-build |
0a0c83 |
errno = ENOENT;
|
|
rpm-build |
0a0c83 |
if (errno)
|
|
rpm-build |
0a0c83 |
return -1;
|
|
rpm-build |
0a0c83 |
return 0;
|
|
rpm-build |
0a0c83 |
}
|
|
rpm-build |
0a0c83 |
|
|
rpm-build |
0a0c83 |
static int match_name(const struct group *grp, const void *data)
|
|
rpm-build |
0a0c83 |
{
|
|
rpm-build |
0a0c83 |
const char *name = data;
|
|
rpm-build |
0a0c83 |
return !strcmp(grp->gr_name, name);
|
|
rpm-build |
0a0c83 |
}
|
|
rpm-build |
0a0c83 |
|
|
rpm-build |
0a0c83 |
EXPORT
|
|
rpm-build |
0a0c83 |
int getgrnam_r(const char *name, struct group *grp, char *buf, size_t buflen,
|
|
rpm-build |
0a0c83 |
struct group **result)
|
|
rpm-build |
0a0c83 |
{
|
|
rpm-build |
0a0c83 |
return test_getgr_match(grp, buf, buflen, result, match_name, name);
|
|
rpm-build |
0a0c83 |
}
|
|
rpm-build |
0a0c83 |
|
|
rpm-build |
0a0c83 |
EXPORT
|
|
rpm-build |
0a0c83 |
struct group *getgrnam(const char *name)
|
|
rpm-build |
0a0c83 |
{
|
|
rpm-build |
0a0c83 |
static char buf[16384];
|
|
rpm-build |
0a0c83 |
static struct group grp;
|
|
rpm-build |
0a0c83 |
struct group *result;
|
|
rpm-build |
0a0c83 |
|
|
rpm-build |
0a0c83 |
(void) getgrnam_r(name, &grp, buf, sizeof(buf), &result);
|
|
rpm-build |
0a0c83 |
return result;
|
|
rpm-build |
0a0c83 |
}
|
|
rpm-build |
0a0c83 |
|
|
rpm-build |
0a0c83 |
static int match_gid(const struct group *grp, const void *data)
|
|
rpm-build |
0a0c83 |
{
|
|
rpm-build |
0a0c83 |
gid_t gid = *(gid_t *)data;
|
|
rpm-build |
0a0c83 |
return grp->gr_gid == gid;
|
|
rpm-build |
0a0c83 |
}
|
|
rpm-build |
0a0c83 |
|
|
rpm-build |
0a0c83 |
EXPORT
|
|
rpm-build |
0a0c83 |
int getgrgid_r(gid_t gid, struct group *grp, char *buf, size_t buflen,
|
|
rpm-build |
0a0c83 |
struct group **result)
|
|
rpm-build |
0a0c83 |
{
|
|
rpm-build |
0a0c83 |
return test_getgr_match(grp, buf, buflen, result, match_gid, &gid;;
|
|
rpm-build |
0a0c83 |
}
|
|
rpm-build |
0a0c83 |
|
|
rpm-build |
0a0c83 |
EXPORT
|
|
rpm-build |
0a0c83 |
struct group *getgrgid(gid_t gid)
|
|
rpm-build |
0a0c83 |
{
|
|
rpm-build |
0a0c83 |
static char buf[16384];
|
|
rpm-build |
0a0c83 |
static struct group grp;
|
|
rpm-build |
0a0c83 |
struct group *result;
|
|
rpm-build |
0a0c83 |
|
|
rpm-build |
0a0c83 |
(void) getgrgid_r(gid, &grp, buf, sizeof(buf), &result);
|
|
rpm-build |
0a0c83 |
return result;
|
|
rpm-build |
0a0c83 |
}
|