Blame test/test_passwd.c

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 <pwd.h>
rpm-build 0a0c83
rpm-build 0a0c83
#define TEST_PASSWD "test/test.passwd"
rpm-build 0a0c83
static char pwfile[PATH_MAX];
rpm-build 0a0c83
static void setup_pwfile() __attribute__((constructor));
rpm-build 0a0c83
rpm-build 0a0c83
static void setup_pwfile() {
rpm-build 0a0c83
	snprintf(pwfile, sizeof(pwfile), "%s/%s", BASEDIR, TEST_PASSWD);
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_getpwent_r(FILE *file, struct passwd *pwd, char *buf,
rpm-build 0a0c83
			   size_t buflen, struct passwd **result)
rpm-build 0a0c83
{
rpm-build 0a0c83
	char *str, *line;
rpm-build 0a0c83
	int index = 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
rpm-build 0a0c83
	while ((str = strtok(line, ":"))) {
rpm-build 0a0c83
		switch (index++) {
rpm-build 0a0c83
		case 0:
rpm-build 0a0c83
			pwd->pw_name = str;
rpm-build 0a0c83
			break;
rpm-build 0a0c83
		case 1:
rpm-build 0a0c83
			pwd->pw_passwd = str;
rpm-build 0a0c83
			break;
rpm-build 0a0c83
		case 2:
rpm-build 0a0c83
			errno = 0;
rpm-build 0a0c83
			pwd->pw_uid = 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
			errno = 0;
rpm-build 0a0c83
			pwd->pw_gid = strtol(str, NULL, 10);
rpm-build 0a0c83
			if (errno)
rpm-build 0a0c83
				return -1;
rpm-build 0a0c83
			break;
rpm-build 0a0c83
		case 4:
rpm-build 0a0c83
			pwd->pw_gecos = str;
rpm-build 0a0c83
			break;
rpm-build 0a0c83
		case 5:
rpm-build 0a0c83
			pwd->pw_dir = str;
rpm-build 0a0c83
			break;
rpm-build 0a0c83
		case 6:
rpm-build 0a0c83
			pwd->pw_shell = str;
rpm-build 0a0c83
			break;
rpm-build 0a0c83
		}
rpm-build 0a0c83
		line = NULL;
rpm-build 0a0c83
	}
rpm-build 0a0c83
rpm-build 0a0c83
	*result = pwd;
rpm-build 0a0c83
rpm-build 0a0c83
	return 0;
rpm-build 0a0c83
}
rpm-build 0a0c83
rpm-build 0a0c83
static int test_getpw_match(struct passwd *pwd, char *buf, size_t buflen,
rpm-build 0a0c83
			    struct passwd **result,
rpm-build 0a0c83
			    int (*match)(const struct passwd *, const void *),
rpm-build 0a0c83
			    const void *data)
rpm-build 0a0c83
{
rpm-build 0a0c83
	FILE *file;
rpm-build 0a0c83
	struct passwd *_result;
rpm-build 0a0c83
rpm-build 0a0c83
	*result = NULL;
rpm-build 0a0c83
rpm-build 0a0c83
	file = fopen(pwfile, "r");
rpm-build 0a0c83
	if (!file) {
rpm-build 0a0c83
		fprintf(stderr, "Failed to open %s\n", pwfile);
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_getpwent_r(file, pwd, buf, buflen, &_result)) {
rpm-build 0a0c83
		if (!_result)
rpm-build 0a0c83
			break;
rpm-build 0a0c83
		else if (match(pwd, data)) {
rpm-build 0a0c83
			*result = pwd;
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 passwd *pwd, const void *data)
rpm-build 0a0c83
{
rpm-build 0a0c83
	const char *name = data;
rpm-build 0a0c83
	return !strcmp(pwd->pw_name, name);
rpm-build 0a0c83
}
rpm-build 0a0c83
rpm-build 0a0c83
EXPORT
rpm-build 0a0c83
int getpwnam_r(const char *name, struct passwd *pwd, char *buf, size_t buflen,
rpm-build 0a0c83
	       struct passwd **result)
rpm-build 0a0c83
{
rpm-build 0a0c83
	return test_getpw_match(pwd, buf, buflen, result, match_name, name);
rpm-build 0a0c83
}
rpm-build 0a0c83
rpm-build 0a0c83
EXPORT
rpm-build 0a0c83
struct passwd *getpwnam(const char *name)
rpm-build 0a0c83
{
rpm-build 0a0c83
	static char buf[16384];
rpm-build 0a0c83
	static struct passwd pwd;
rpm-build 0a0c83
	struct passwd *result;
rpm-build 0a0c83
rpm-build 0a0c83
	(void) getpwnam_r(name, &pwd, buf, sizeof(buf), &result);
rpm-build 0a0c83
	return result;
rpm-build 0a0c83
}
rpm-build 0a0c83
rpm-build 0a0c83
static int match_uid(const struct passwd *pwd, const void *data)
rpm-build 0a0c83
{
rpm-build 0a0c83
	uid_t uid = *(uid_t *)data;
rpm-build 0a0c83
	return pwd->pw_uid == uid;
rpm-build 0a0c83
}
rpm-build 0a0c83
rpm-build 0a0c83
EXPORT
rpm-build 0a0c83
int getpwuid_r(uid_t uid, struct passwd *pwd, char *buf, size_t buflen,
rpm-build 0a0c83
	       struct passwd **result)
rpm-build 0a0c83
{
rpm-build 0a0c83
	return test_getpw_match(pwd, buf, buflen, result, match_uid, &uid);
rpm-build 0a0c83
}
rpm-build 0a0c83
rpm-build 0a0c83
EXPORT
rpm-build 0a0c83
struct passwd *getpwuid(uid_t uid)
rpm-build 0a0c83
{
rpm-build 0a0c83
	static char buf[16384];
rpm-build 0a0c83
	static struct passwd pwd;
rpm-build 0a0c83
	struct passwd *result;
rpm-build 0a0c83
rpm-build 0a0c83
	(void) getpwuid_r(uid, &pwd, buf, sizeof(buf), &result);
rpm-build 0a0c83
	return result;
rpm-build 0a0c83
}