mbr_check_membership.c [plain text]
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>
#include <errno.h>
#include <string.h>
#include "../libmicro.h"
#include <membership.h>
#include <pwd.h>
#include <uuid/uuid.h>
#if DEBUG
# define debug(fmt, args...) (void) fprintf(stderr, fmt "\n" , ##args)
#else
# define debug(fmt, args...)
#endif
typedef struct {
} tsd_t;
#define INVALID_ID -1
static uid_t uid_min = INVALID_ID;
static gid_t gid_min = INVALID_ID;;
static int uid_range = 0; static int gid_range = 0;
static uuid_t *u_uuid_list = NULL; static uuid_t *g_uuid_list = NULL;
int
benchmark_init()
{
debug("benchmark_init");
(void) sprintf(lm_optstr, "g:u:");
lm_tsdsize = sizeof(tsd_t);
lm_defB = 100;
(void) sprintf(lm_usage,
"\n ------- mbr_check_membership specific options\n"
" [-u UID range (min-max)]\n"
" [-g GID or GID range (gid or min-max)]\n"
"\n" );
return (0);
}
int
parse_range(uint *min, int *offset, char *buf)
{
char *value, *tmp_ptr = strdup(buf);
int range=0;
debug("parse_range");
value = strsep(&tmp_ptr, "-");
*min = atoi(value);
debug("min = %d", *min);
if (tmp_ptr) {
value = strsep(&tmp_ptr, "-");
range = atoi(value);
if (range < *min) {
printf("max id should be larger than min id\n");
return -1;
}
*offset = range - *min;
debug("range = %d", *offset);
}
return 0;
}
int
benchmark_optswitch(int opt, char *optarg)
{
debug("benchmark_optswitch");
switch (opt) {
case 'g': return parse_range( &gid_min, &gid_range, optarg);
break;
case 'u': return parse_range( &uid_min, &uid_range, optarg);
break;
default:
return -1;
}
return 0;
}
int
benchmark_initrun(void *tsd)
{
int i;
debug("benchmark_initrun");
if (uid_min == INVALID_ID || gid_min == INVALID_ID) {
printf("Both -u and -g need to be specified\n");
return -1;
}
u_uuid_list = malloc( sizeof(*u_uuid_list) * (uid_range+1) );
g_uuid_list = malloc( sizeof(*g_uuid_list) * (gid_range+1) );
for (i = 0; i <= uid_range; i++) {
if (mbr_uid_to_uuid(uid_min+i, u_uuid_list[i])) {
printf("error converting uid %d to UUID\n", uid_min+i);
return -1;
}
}
for (i = 0; i <= gid_range; i++) {
if (mbr_gid_to_uuid(gid_min+i, g_uuid_list[i])) {
printf("error converting gid %d to UUID\n", gid_min+i);
return -1;
}
}
return (0);
}
int
benchmark(void *tsd, result_t *res)
{
int i, index, gindex, err, isMember=0;
#ifdef DEBUG
uid_t uid;
int id_type;
#endif
res->re_errors = 0;
for (i = 0; i < lm_optB; i++) {
index = random() % (uid_range+1);
gindex = random() % (gid_range+1);
err = mbr_check_membership(u_uuid_list[index], g_uuid_list[gindex], &isMember);
#ifdef DEBUG
#endif
if (err) {
if (err == EIO) {
debug("mbr_check_membership returned EIO. Unable to communicate with DS daemon");
}
else if (err == ENOENT) {
debug("mbr_check_membership returned ENOENT. User not found");
}
else {
debug("error: %s", strerror(err));
}
res->re_errors++;
}
}
res->re_count = i;
return (0);
}
int
benchmark_finirun(void *tsd)
{
debug("benchmark_result: deallocating structures");
free(u_uuid_list);
free(g_uuid_list);
return (0);
}
char *
benchmark_result()
{
static char result = '\0';
debug("benchmark_result");
return (&result);
}