xref: /csrg-svn/usr.bin/ftp/ruserpass.c (revision 26053)
1*26053Sminshall /*
2*26053Sminshall  * Copyright (c) 1985 Regents of the University of California.
3*26053Sminshall  * All rights reserved.  The Berkeley software License Agreement
4*26053Sminshall  * specifies the terms and conditions for redistribution.
5*26053Sminshall  */
6*26053Sminshall 
7*26053Sminshall #ifndef lint
8*26053Sminshall static char sccsid[] = "@(#)ruserpass.c	1.1 (Berkeley) 02/03/86";
9*26053Sminshall #endif not lint
10*26053Sminshall 
11*26053Sminshall 
12*26053Sminshall struct macel {
13*26053Sminshall 	char mac_name[9];	/* macro name */
14*26053Sminshall 	char *mac_start;	/* start of macro in macbuf */
15*26053Sminshall 	char *mac_end;		/* end of macro in macbuf */
16*26053Sminshall };
17*26053Sminshall 
18*26053Sminshall extern int macnum, proxy;			/* number of defined macros */
19*26053Sminshall extern struct macel macros[16], *macpt;
20*26053Sminshall extern char macbuf[4096];
21*26053Sminshall 
22*26053Sminshall #include <stdio.h>
23*26053Sminshall #include <utmp.h>
24*26053Sminshall #include <ctype.h>
25*26053Sminshall #include <sys/types.h>
26*26053Sminshall #include <sys/stat.h>
27*26053Sminshall #include <errno.h>
28*26053Sminshall 
29*26053Sminshall char	*renvlook(), *malloc(), *index(), *getenv(), *getpass(), *getlogin();
30*26053Sminshall struct	utmp *getutmp();
31*26053Sminshall static	FILE *cfile;
32*26053Sminshall 
33*26053Sminshall ruserpass(host, aname, apass, aacct)
34*26053Sminshall 	char *host, **aname, **apass, **aacct;
35*26053Sminshall {
36*26053Sminshall 
37*26053Sminshall 	/* renv(host, aname, apass, aacct);
38*26053Sminshall 	if (*aname == 0 || *apass == 0) */
39*26053Sminshall 		return(rnetrc(host, aname, apass, aacct));
40*26053Sminshall }
41*26053Sminshall 
42*26053Sminshall #define	DEFAULT	1
43*26053Sminshall #define	LOGIN	2
44*26053Sminshall #define	PASSWD	3
45*26053Sminshall #define	ACCOUNT 4
46*26053Sminshall #define MACDEF  5
47*26053Sminshall #define	ID	10
48*26053Sminshall #define	MACHINE	11
49*26053Sminshall 
50*26053Sminshall static char tokval[100];
51*26053Sminshall 
52*26053Sminshall static struct toktab {
53*26053Sminshall 	char *tokstr;
54*26053Sminshall 	int tval;
55*26053Sminshall } toktab[]= {
56*26053Sminshall 	"default",	DEFAULT,
57*26053Sminshall 	"login",	LOGIN,
58*26053Sminshall 	"password",	PASSWD,
59*26053Sminshall 	"account",	ACCOUNT,
60*26053Sminshall 	"machine",	MACHINE,
61*26053Sminshall 	"macdef",	MACDEF,
62*26053Sminshall 	0,		0
63*26053Sminshall };
64*26053Sminshall 
65*26053Sminshall static
66*26053Sminshall rnetrc(host, aname, apass, aacct)
67*26053Sminshall 	char *host, **aname, **apass, **aacct;
68*26053Sminshall {
69*26053Sminshall 	char *hdir, buf[BUFSIZ], *tmp, c;
70*26053Sminshall 	int t, i;
71*26053Sminshall 	struct stat stb;
72*26053Sminshall 	extern int errno;
73*26053Sminshall 
74*26053Sminshall 	hdir = getenv("HOME");
75*26053Sminshall 	if (hdir == NULL)
76*26053Sminshall 		hdir = ".";
77*26053Sminshall 	sprintf(buf, "%s/.ftprc", hdir);
78*26053Sminshall 	cfile = fopen(buf, "r");
79*26053Sminshall 	if (cfile == NULL) {
80*26053Sminshall 		if (errno != ENOENT)
81*26053Sminshall 			perror(buf);
82*26053Sminshall 		return(0);
83*26053Sminshall 	}
84*26053Sminshall next:
85*26053Sminshall 	while ((t = token())) switch(t) {
86*26053Sminshall 
87*26053Sminshall 	case DEFAULT:
88*26053Sminshall 		(void) token();
89*26053Sminshall 		continue;
90*26053Sminshall 
91*26053Sminshall 	case MACHINE:
92*26053Sminshall 		if (token() != ID || strcmp(host, tokval))
93*26053Sminshall 			continue;
94*26053Sminshall 		while ((t = token()) && t != MACHINE) switch(t) {
95*26053Sminshall 
96*26053Sminshall 		case LOGIN:
97*26053Sminshall 			if (token())
98*26053Sminshall 				if (*aname == 0) {
99*26053Sminshall 					*aname = malloc(strlen(tokval) + 1);
100*26053Sminshall 					strcpy(*aname, tokval);
101*26053Sminshall 				} else {
102*26053Sminshall 					if (strcmp(*aname, tokval))
103*26053Sminshall 						goto next;
104*26053Sminshall 				}
105*26053Sminshall 			break;
106*26053Sminshall 		case PASSWD:
107*26053Sminshall 			if (fstat(fileno(cfile), &stb) >= 0
108*26053Sminshall 			    && (stb.st_mode & 077) != 0) {
109*26053Sminshall 	fprintf(stderr, "Error - .ftprc file not correct mode.\n");
110*26053Sminshall 	fprintf(stderr, "Remove password or correct mode.\n");
111*26053Sminshall 				return(-1);
112*26053Sminshall 			}
113*26053Sminshall 			if (token() && *apass == 0) {
114*26053Sminshall 				*apass = malloc(strlen(tokval) + 1);
115*26053Sminshall 				strcpy(*apass, tokval);
116*26053Sminshall 			}
117*26053Sminshall 			break;
118*26053Sminshall 		case ACCOUNT:
119*26053Sminshall 			if (fstat(fileno(cfile), &stb) >= 0
120*26053Sminshall 			    && (stb.st_mode & 077) != 0) {
121*26053Sminshall 	fprintf(stderr, "Error - .ftprc file not correct mode.\n");
122*26053Sminshall 	fprintf(stderr, "Remove account or correct mode.\n");
123*26053Sminshall 				return(-1);
124*26053Sminshall 			}
125*26053Sminshall 			if (token() && *aacct == 0) {
126*26053Sminshall 				*aacct = malloc(strlen(tokval) + 1);
127*26053Sminshall 				strcpy(*aacct, tokval);
128*26053Sminshall 			}
129*26053Sminshall 			break;
130*26053Sminshall 		case MACDEF:
131*26053Sminshall 			if (proxy) {
132*26053Sminshall 				return(0);
133*26053Sminshall 			}
134*26053Sminshall 			while ((c=getc(cfile)) != EOF && c == ' ' || c == '\t');
135*26053Sminshall 			if (c == EOF || c == '\n') {
136*26053Sminshall 				printf("Missing macdef name argument.\n");
137*26053Sminshall 				return(-1);
138*26053Sminshall 			}
139*26053Sminshall 			if (macnum == 16) {
140*26053Sminshall 				printf("Limit of 16 macros have already been defined\n");
141*26053Sminshall 				return(-1);
142*26053Sminshall 			}
143*26053Sminshall 			tmp = macros[macnum].mac_name;
144*26053Sminshall 			*tmp++ = c;
145*26053Sminshall 			for (i=0; i < 8 && (c=getc(cfile)) != EOF &&
146*26053Sminshall 			    !isspace(c); ++i) {
147*26053Sminshall 				*tmp++ = c;
148*26053Sminshall 			}
149*26053Sminshall 			if (c == EOF) {
150*26053Sminshall 				printf("Macro definition missing null line terminator.\n");
151*26053Sminshall 				return(-1);
152*26053Sminshall 			}
153*26053Sminshall 			*tmp = '\0';
154*26053Sminshall 			if (c != '\n') {
155*26053Sminshall 				while ((c=getc(cfile)) != EOF && c != '\n');
156*26053Sminshall 			}
157*26053Sminshall 			if (c == EOF) {
158*26053Sminshall 				printf("Macro definition missing null line terminator.\n");
159*26053Sminshall 				return(-1);
160*26053Sminshall 			}
161*26053Sminshall 			if (macnum == 0) {
162*26053Sminshall 				macros[macnum].mac_start = macbuf;
163*26053Sminshall 			}
164*26053Sminshall 			else {
165*26053Sminshall 				macros[macnum].mac_start = macros[macnum-1].mac_end + 1;
166*26053Sminshall 			}
167*26053Sminshall 			tmp = macros[macnum].mac_start;
168*26053Sminshall 			while (tmp != macbuf + 4096) {
169*26053Sminshall 				if ((c=getc(cfile)) == EOF) {
170*26053Sminshall 				printf("Macro definition missing null line terminator.\n");
171*26053Sminshall 					return(-1);
172*26053Sminshall 				}
173*26053Sminshall 				*tmp = c;
174*26053Sminshall 				if (*tmp == '\n') {
175*26053Sminshall 					if (*(tmp-1) == '\0') {
176*26053Sminshall 					   macros[macnum++].mac_end = tmp - 1;
177*26053Sminshall 					   break;
178*26053Sminshall 					}
179*26053Sminshall 					*tmp = '\0';
180*26053Sminshall 				}
181*26053Sminshall 				tmp++;
182*26053Sminshall 			}
183*26053Sminshall 			if (tmp == macbuf + 4096) {
184*26053Sminshall 				printf("4K macro buffer exceeded\n");
185*26053Sminshall 				return(-1);
186*26053Sminshall 			}
187*26053Sminshall 			break;
188*26053Sminshall 		default:
189*26053Sminshall 	fprintf(stderr, "Unknown .ftprc keyword %s\n", tokval);
190*26053Sminshall 			break;
191*26053Sminshall 		}
192*26053Sminshall 		goto done;
193*26053Sminshall 	}
194*26053Sminshall done:
195*26053Sminshall 	fclose(cfile);
196*26053Sminshall }
197*26053Sminshall 
198*26053Sminshall static
199*26053Sminshall token()
200*26053Sminshall {
201*26053Sminshall 	char *cp;
202*26053Sminshall 	int c;
203*26053Sminshall 	struct toktab *t;
204*26053Sminshall 
205*26053Sminshall 	if (feof(cfile))
206*26053Sminshall 		return (0);
207*26053Sminshall 	while ((c = getc(cfile)) != EOF &&
208*26053Sminshall 	    (c == '\n' || c == '\t' || c == ' ' || c == ','))
209*26053Sminshall 		continue;
210*26053Sminshall 	if (c == EOF)
211*26053Sminshall 		return (0);
212*26053Sminshall 	cp = tokval;
213*26053Sminshall 	if (c == '"') {
214*26053Sminshall 		while ((c = getc(cfile)) != EOF && c != '"') {
215*26053Sminshall 			if (c == '\\')
216*26053Sminshall 				c = getc(cfile);
217*26053Sminshall 			*cp++ = c;
218*26053Sminshall 		}
219*26053Sminshall 	} else {
220*26053Sminshall 		*cp++ = c;
221*26053Sminshall 		while ((c = getc(cfile)) != EOF
222*26053Sminshall 		    && c != '\n' && c != '\t' && c != ' ' && c != ',') {
223*26053Sminshall 			if (c == '\\')
224*26053Sminshall 				c = getc(cfile);
225*26053Sminshall 			*cp++ = c;
226*26053Sminshall 		}
227*26053Sminshall 	}
228*26053Sminshall 	*cp = 0;
229*26053Sminshall 	if (tokval[0] == 0)
230*26053Sminshall 		return (0);
231*26053Sminshall 	for (t = toktab; t->tokstr; t++)
232*26053Sminshall 		if (!strcmp(t->tokstr, tokval))
233*26053Sminshall 			return (t->tval);
234*26053Sminshall 	return (ID);
235*26053Sminshall }
236