⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mknetid.c

📁 操作系统SunOS 4.1.3版本的源码
💻 C
字号:
#ifndef lintstatic char sccsid[] = "@(#)mknetid.c 1.1 92/07/30 Copyr 1990 Sun Micro";#endif/* * Copyright (C) 1990, Sun Microsystems, Inc. *//* * Network name to unix credential database generator. * Uses /etc/passwd, /etc/group, /etc/hosts and /etc/netid to * create the database. * * If some user appears in passwd, they get an entry like: *	sun.<uid>@<domainname>	<uid>:<gid1>,<gid2>,... * If some host appears in hosts, it gets an entry like: *	sun.<hostname>@<domainname>	0:<hostname> * * The file /etc/netid is used to add other domains (possibly non-unix) * to the database. */#include <stdio.h>#include <pwd.h>#include <grp.h>#include <sys/param.h>#include <rpc/rpc.h>#include <rpc/key_prot.h>#define MAXNAMELEN 256#define MAXLINELEN 1024#define MAXDOMAINLEN 32#define GRPTABSIZE	256		/* size of group table */#define PRNTABSIZE 4096		/* size of printed item table */#define NUMGIDS	(NGROUPS + 1)	/* group-access-list + gid */extern char **getline();extern char *malloc();extern char *strcpy();/* * The group list * Store username and groups to which he/she belongs */struct group_list {	char *user;	int group_len;	int groups[NUMGIDS];	struct group_list *next;};/* * General purpose list of strings */struct string_list {	char *str;	struct string_list *next;};static FILE *openfile();static char *scanargs();static int atoi();static char *cmdname;	/* name of this program */static int quietmode;	/* quiet mode: don't print error messages */static char *curfile;	/* name of file we are parsing */static int curline;		/* current line parsed in this file */static struct group_list *groups[GRPTABSIZE];	/* group table */static struct string_list *printed[PRNTABSIZE];	/* printed item table */static char domain[MAXDOMAINLEN];	/* name of our domain */static char PASSWD[] = "/etc/passwd";	/* default passwd database */static char IDMAP[] = "/etc/idmap";		/* default net-id map database */static char GROUP[] = "/etc/group";		/* default group database */static char HOSTS[] = "/etc/hosts";		/* default hosts database */static char *pwdfile = PASSWD;	/* password file to parse */static char *grpfile = GROUP;	/* group file */static char *hostfile = HOSTS;	/* hosts file */static char *mapfile = IDMAP;	/* network id file *//* * Various separaters */static char WHITE[] = "\t ";	static char COLON[] = ":";static char COMMA[] = ",";main(argc, argv)	int argc;	char *argv[];{	FILE *pf, *mf, *gf, *hf;	cmdname = argv[0];	if (!parseargs(argc, argv)) {		(void) fprintf(stderr,			"usage: %s [-q] [-pghm filename]\n", cmdname);		exit(1);	}	(void) getdomainname(domain, sizeof(domain));	pf = openfile(pwdfile);	gf = openfile(grpfile);	hf = openfile(hostfile);	mf = fopen(mapfile, "r");	if (mf != NULL) {		domapfile(mapfile, mf);	}	dogrpfile(grpfile, gf);	dopwdfile(pwdfile, pf);	dohostfile(hostfile, hf);	exit(0);	/* NOTREACHED */}/* * Parse the network id mapping file */domapfile(mapfile, mf)	char *mapfile;	FILE *mf;{	char **lp;	char line[MAXLINELEN];	char name[MAXNAMELEN];	int uid, gid;	curfile = mapfile;	curline = 0;	while (lp = getline(line, sizeof(line), mf, &curline, "#")) {		check_getname(lp, name, WHITE, WHITE, "#");		if (wasprinted(name)) {			multdef(name);			continue;		}		put_s(name); 		(void) putchar(' ');		check_getname(lp, name, WHITE, COLON, "#");		uid = Atoi(name);		put_d(uid); 		(void) putchar(':');		if (uid == 0) {			check_getname(lp, name, WHITE, "\t\n ", "#");			put_s(name); 			(void) putchar(' ');		} else {			check_getname(lp, name, WHITE, ",\n", "#");			gid = Atoi(name);			put_d(gid);			while (getname(name, sizeof(name), WHITE, ",\n", lp, 				       "#") >= 0) {				gid = Atoi(name);				(void) putchar(','); 				put_d(gid);			}		}		(void) putchar('\n');	}}/* * Parse the groups file */dogrpfile(grpfile, gf)	char *grpfile;	FILE *gf;{	char **lp;	char line[MAXLINELEN];	char name[MAXNAMELEN];	int gid;	curfile = grpfile;	curline = 0;	while (lp = getline(line, sizeof(line), gf, &curline, "")) {		check_getname(lp, name, WHITE, COLON, "");		if (name[0] == '+') {			continue;		}		check_getname(lp, name, WHITE, COLON, "");	/* ignore passwd */		check_getname(lp, name, WHITE, COLON, "");		gid = Atoi(name);		while (getname(name, sizeof(name), WHITE, COMMA, lp, 			       "") >= 0) {			storegid(gid, name);		}	}}/* * Parse the password file  */dopwdfile(pwdfile, pf)	char *pwdfile;	FILE *pf;{	char **lp;	char line[MAXLINELEN];	char name[MAXNAMELEN];	char user[MAXNAMELEN];	int uid, gid;	curfile = pwdfile;	curline = 0;	while (lp = getline(line, sizeof(line), pf, &curline, "")) {		check_getname(lp, user, WHITE, COLON, ""); 	/* username */		if (user[0] == '-' || user[0] == '+') {			continue;	/* NIS entry */		}		check_getname(lp, name, WHITE, COLON, ""); /* ignore passwd */		check_getname(lp, name, WHITE, COLON, ""); /* but get uid */		uid = Atoi(name);		user2netname(name, uid, domain);		if (wasprinted(name)) {			multdef(name);			continue;		}		put_s(name); 		(void) putchar(' ');		check_getname(lp, name, WHITE, COLON, "");		gid = Atoi(name);		put_d(uid); 		(void) putchar(':');		printgroups(user, gid);	}}/* * Parse the hosts file */dohostfile(hostfile, hf)	char *hostfile;	FILE *hf;{	char **lp;	char line[MAXLINELEN];	char name[MAXNAMELEN];	char netname[MAXNETNAMELEN];	curfile = hostfile;	curline = 0;	while (lp = getline(line, sizeof(line), hf, &curline, "#")) {		check_getname(lp, name, WHITE, WHITE, "#");		if (getname(name, MAXNAMELEN, WHITE, WHITE, lp, "#") != 1) {			continue;		}		host2netname(netname, name, domain);		if (wasprinted(netname)) {			multdef(netname);			continue;		}		(void) printf("%s 0:%.*s\n", netname, sizeof(name), name);	}}/* * Open a file, exit on failure */static FILE *openfile(fname)	char *fname;{	FILE *f;	f = fopen(fname, "r");	if (f == NULL) {		(void) fprintf(stderr, "%s: can't open %s\n", cmdname, fname);		exit(1);	}	return (f);}/* * Print syntax error message, then exit */syntaxerror(){	(void) fprintf(stderr, "%s: syntax error in file \"%s\", line %d\n", 	    cmdname, curfile, curline);	exit(1);}/* * an atoi() that prints a message and exits upong failure */static intAtoi(str)	char *str;{	int res;	if (!sscanf(str, "%d", &res)) {		syntaxerror();	}	return (res);}/* * Attempt to get a token from a file, print a message and exit upon failure */check_getname(lp, name, skip, term, com)	char **lp;	char *name;	char *skip;	char *term;	char *com;{	if (getname(name, MAXNAMELEN, skip, term, lp, com) != 1) {		syntaxerror();	}}/* * Something was defined more than once */multdef(name)	char *name;{	if (!quietmode) {		(void) fprintf(stderr, 	    	"%s: %s multiply defined, other definitions ignored\n", 	    	cmdname, name);	}}statichash(str, size)	unsigned char *str;	int size;{	unsigned val;	int flip;	val = 0;	flip = 0;	while (*str) {		if (flip) {			val ^= (*str++ << 6);		} else {			val ^= *str++;		}		flip = !flip;	}	return (val % size);}/* * Check if an item has been printed * If not, store the item into the printed item table */static wasprinted(name)	char *name;{	struct string_list *s;	int val;	val = hash((unsigned char *) name, PRNTABSIZE);	for (s = printed[val]; s != NULL && strcmp(s->str, name) ; s = s->next)		;	if (s != NULL) {		return (1);	}	s = (struct string_list *) malloc(sizeof(struct string_list));	s->str = malloc((unsigned) strlen(name) + 1);	(void) strcpy(s->str, name);	s->next = printed[val];	printed[val] = s;	return (0);}/* * Add gid to the list of a user's groups */storegid(gid, user)	int gid;	char *user;{	struct group_list *g;	int i;	int val;	val = hash((unsigned char *) user, GRPTABSIZE);	for (g = groups[val]; g != NULL && strcmp(g->user, user); g = g->next)		;	if (g == NULL) {		g = (struct group_list *) malloc(sizeof(struct group_list));		g->user = malloc((unsigned) strlen(user) + 1);		(void) strcpy(g->user, user);		g->group_len = 1;		g->groups[0] = gid;		g->next = groups[val];		groups[val] = g;	} else {		if (g->group_len > NUMGIDS) {			(void) fprintf(stderr, "%s: %s's groups exceed %d\n",				cmdname, user, NUMGIDS);			return;		}		for (i = 0; i < g->group_len; i++) {			if (g->groups[i] == gid) {				return;			}		}		g->groups[g->group_len++] = gid;	}}/* * print out a user's groups */printgroups(user, gid)	char *user;	int gid;{	struct group_list *g;	int i;	int val;	val = hash((unsigned char *) user, GRPTABSIZE);	for (g = groups[val]; g != NULL && strcmp(g->user, user); g = g->next)		;	put_d(gid);	if (g != NULL) {		for (i = 0; i < g->group_len; i++) {			if (gid != g->groups[i]) {				(void) putchar(','); 				put_d(g->groups[i]);			}		}	}	(void) putchar('\n');}/* * Parse command line arguments */parseargs(argc, argv)	int argc;	char *argv[];{	int i;	int j;	static struct {		char letter;		char *standard;		char **filename;	} whattodo[] = {		{ 'p', PASSWD, &pwdfile },		{ 'g', GROUP, &grpfile },		{ 'm', IDMAP, &mapfile },		{ 'h', HOSTS, &hostfile }	};	#define TABSIZE  sizeof(whattodo)/sizeof(whattodo[0])	for (i = 1; i < argc; i++) {		if (argv[i][0] == '-') {			if (argv[i][2] != 0) {				return (0);			}			if (argv[i][1] == 'q') {				quietmode = 1;				continue;			}			for (j = 0; j < TABSIZE; j++) {				if (whattodo[j].letter == argv[i][1]) {					if (*whattodo[j].filename != whattodo[j].standard) {						return (0);					}					if (++i == argc) {						return (0);					}					*whattodo[j].filename = argv[i];					break;				}			}			if (j == TABSIZE) {				return (0);			}		}	}	return (1);}/* * Print a string, quickly */put_s(s)	char *s;{	(void) fwrite(s, strlen(s), 1, stdout);}/* * Print an integer, quickly */put_d(d)	int d;{	char buf[20];	char *p;	if (d == 0) {		(void) putchar('0');		return;	}	if (d < 0) {		(void) putchar('-');		d = -d;	}	p = buf + sizeof(buf);	*--p = 0;	while (d > 0) {		*--p = (d % 10) + '0';		d /= 10;	}	put_s(p);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -