fiss

Friedel's Initialization and Service Supervision
Log | Files | Refs | LICENSE

parse.c (1319B)


      1 #include "parse.h"
      2 
      3 #include <fcntl.h>
      4 #include <grp.h>
      5 #include <pwd.h>
      6 #include <stdio.h>
      7 #include <stdlib.h>
      8 #include <string.h>
      9 #include <unistd.h>
     10 
     11 
     12 /* uid:gid[:gid[:gid]...] */
     13 static int parse_ugid_num(char* str, uid_t* uid, gid_t* gids) {
     14 	int   i;
     15 	char* end;
     16 
     17 	*uid = strtoul(str, &end, 10);
     18 
     19 	if (*end != ':')
     20 		return -1;
     21 
     22 	str = end + 1;
     23 	for (i = 0; i < 60; ++i, ++str) {
     24 		gids[i++] = strtoul(str, &end, 10);
     25 
     26 		if (*end != ':')
     27 			break;
     28 
     29 		str = end + 1;
     30 	}
     31 
     32 	if (*str != '\0')
     33 		return -1;
     34 
     35 	return i;
     36 }
     37 
     38 int parse_ugid(char* str, uid_t* uid, gid_t* gids) {
     39 	struct passwd* pwd;
     40 	struct group*  gr;
     41 	char*          end;
     42 	char*          groupstr = NULL;
     43 	int            gid_size = 0;
     44 	char*          next;
     45 
     46 	if (str[0] == ':')
     47 		return parse_ugid_num(str + 1, uid, gids);
     48 
     49 	if ((end = strchr(str, ':')) != NULL) {
     50 		end[0]   = '\0';
     51 		groupstr = end + 1;
     52 	}
     53 
     54 	if ((pwd = getpwnam(str)) == NULL) {
     55 		return -1;
     56 	}
     57 	*uid = pwd->pw_uid;
     58 
     59 	if (groupstr == NULL) {
     60 		gids[0] = pwd->pw_gid;
     61 		return 1;
     62 	}
     63 
     64 	next = groupstr;
     65 
     66 	while (next && gid_size < 60) {
     67 		groupstr = next;
     68 		if ((end = strchr(groupstr, ':')) != NULL) {
     69 			end[0] = '\0';
     70 			next   = end + 1;
     71 		} else {
     72 			next = NULL;
     73 		}
     74 		if ((gr = getgrnam(groupstr)) == NULL)
     75 			return -1;
     76 
     77 		gids[gid_size++] = gr->gr_gid;
     78 	}
     79 
     80 	return gid_size;
     81 }