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

📄 ruserpass.c

📁 操作系统SunOS 4.1.3版本的源码
💻 C
字号:
#if !defined(lint) && defined(SCCSIDS)static	char sccsid[] = "@(#)ruserpass.c 1.1 92/07/30 SMI"; /* from UCB 4.2 82/10/10 */#endif#include <stdio.h>#include <ctype.h>#include <sys/types.h>#include <sys/stat.h>#include <errno.h>char	*malloc(), *index(), *getenv(), *getpass(), *getlogin();#define	DEFAULT	1#define	LOGIN	2#define	PASSWD	3#define	NOTIFY	4#define	WRITE	5#define	YES	6#define	NO	7#define	COMMAND	8#define	FORCE	9#define	ID	10#define	MACHINE	11#define	MAXTOKEN  11#define NTOKENS	(MAXTOKEN - 1 + 2 + 1)	/* two duplicates and null, minus id */static struct ruserdata {	char tokval[100];	struct toktab {		char *tokstr;		int tval;	} toktab[NTOKENS];	FILE *cfile;} *ruserdata, *_ruserdata();static struct ruserdata *_ruserdata(){	register struct ruserdata *d = ruserdata;	struct toktab *t;	if (d == 0) {		if ((d = (struct ruserdata *) 			calloc(1, sizeof(struct ruserdata))) == NULL) {				return(NULL);		}		ruserdata = d;		t = d->toktab;		t->tokstr = "default";  t++->tval = DEFAULT;		t->tokstr = "login";    t++->tval = LOGIN;		t->tokstr = "password"; t++->tval = PASSWD;		t->tokstr = "notify";   t++->tval = NOTIFY;		t->tokstr = "write";    t++->tval = WRITE;		t->tokstr = "yes";      t++->tval = YES;		t->tokstr = "y";        t++->tval = YES;		t->tokstr = "no";       t++->tval = NO;		t->tokstr = "n";        t++->tval = NO;		t->tokstr = "command";  t++->tval = COMMAND;		t->tokstr = "force";    t++->tval = FORCE;		t->tokstr = "machine";  t++->tval = MACHINE;		t->tokstr = 0;          t->tval = 0;	}	return(d);}_ruserpass(host, aname, apass)	char *host, **aname, **apass;{	if (*aname == 0 || *apass == 0)		rnetrc(host, aname, apass);	if (*aname == 0) {		char *myname = getlogin();		*aname = malloc(16);		printf("Name (%s:%s): ", host, myname);		fflush(stdout);		if (read(2, *aname, 16) <= 0)			exit(1);		if ((*aname)[0] == '\n')			*aname = myname;		else			if (index(*aname, '\n'))				*index(*aname, '\n') = 0;	}	if (*aname && *apass == 0) {		printf("Password (%s:%s): ", host, *aname);		fflush(stdout);		*apass = getpass("");	}}staticrnetrc(host, aname, apass)	char *host, **aname, **apass;{	register struct ruserdata *d = _ruserdata();	char *hdir, buf[BUFSIZ];	int t;	struct stat stb;	extern int errno;	if (d == 0)		return;	hdir = getenv("HOME");	if (hdir == NULL)		hdir = ".";	sprintf(buf, "%s/.netrc", hdir);	d->cfile = fopen(buf, "r");	if (d->cfile == NULL) {		if (errno != ENOENT)			perror(buf);		return;	}next:	while ((t = token())) switch(t) {	case DEFAULT:		(void) token();		continue;	case MACHINE:		if (token() != ID || strcmp(host, d->tokval))			continue;		while ((t = token()) && t != MACHINE) switch(t) {		case LOGIN:			if (token())				if (*aname == 0) { 					*aname = malloc(strlen(d->tokval) + 1);					strcpy(*aname, d->tokval);				} else {					if (strcmp(*aname, d->tokval))						goto next;				}			break;		case PASSWD:			if (fstat(fileno(d->cfile), &stb) >= 0			    && (stb.st_mode & 077) != 0) {	fprintf(stderr, "Error - .netrc file not correct mode.\n");	fprintf(stderr, "Remove password or correct mode.\n");				exit(1);			}			if (token() && *apass == 0) {				*apass = malloc(strlen(d->tokval) + 1);				strcpy(*apass, d->tokval);			}			break;		case COMMAND:		case NOTIFY:		case WRITE:		case FORCE:			(void) token();			break;		default:	fprintf(stderr, "Unknown .netrc option %s\n", d->tokval);			break;		}		goto done;	}done:	fclose(d->cfile);}statictoken(){	register struct ruserdata *d = _ruserdata();	char *cp;	int c;	struct toktab *t;	if (d == 0)		return(0);	if (feof(d->cfile))		return (0);	while ((c = getc(d->cfile)) != EOF &&	    (c == '\n' || c == '\t' || c == ' ' || c == ','))		continue;	if (c == EOF)		return (0);	cp = d->tokval;	if (c == '"') {		while ((c = getc(d->cfile)) != EOF && c != '"') {			if (c == '\\')				c = getc(d->cfile);			*cp++ = c;		}	} else {		*cp++ = c;		while ((c = getc(d->cfile)) != EOF		    && c != '\n' && c != '\t' && c != ' ' && c != ',') {			if (c == '\\')				c = getc(d->cfile);			*cp++ = c;		}	}	*cp = 0;	if (d->tokval[0] == 0)		return (0);	for (t = d->toktab; t->tokstr; t++)		if (!strcmp(t->tokstr, d->tokval))			return (t->tval);	return (ID);}

⌨️ 快捷键说明

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