|
|
1.1 root 1: /*
2: * Copyright (c) 1985 Regents of the University of California.
3: * All rights reserved.
4: *
5: * Redistribution and use in source and binary forms are permitted
6: * provided that the above copyright notice and this paragraph are
7: * duplicated in all such forms and that any documentation,
8: * advertising materials, and other materials related to such
9: * distribution and use acknowledge that the software was developed
10: * by the University of California, Berkeley. The name of the
11: * University may not be used to endorse or promote products derived
12: * from this software without specific prior written permission.
13: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
14: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
15: * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
16: */
17:
18: #ifndef lint
19: static char sccsid[] = "@(#)ruserpass.c 1.5 (Berkeley) 6/29/88";
20: #endif /* not lint */
21:
22: struct macel {
23: char mac_name[9]; /* macro name */
24: char *mac_start; /* start of macro in macbuf */
25: char *mac_end; /* end of macro in macbuf */
26: };
27:
28: extern int macnum, proxy; /* number of defined macros */
29: extern struct macel macros[16], *macpt;
30: extern char macbuf[4096];
31:
32: #include <stdio.h>
33: #include <utmp.h>
34: #include <ctype.h>
35: #include <sys/types.h>
36: #include <sys/stat.h>
37: #include <errno.h>
38:
39: char *renvlook(), *malloc(), *index(), *getenv(), *getpass(), *getlogin();
40: char *strcpy();
41: struct utmp *getutmp();
42: static FILE *cfile;
43:
44: ruserpass(host, aname, apass, aacct)
45: char *host, **aname, **apass, **aacct;
46: {
47:
48: /* renv(host, aname, apass, aacct);
49: if (*aname == 0 || *apass == 0) */
50: return(rnetrc(host, aname, apass, aacct));
51: }
52:
53: #define DEFAULT 1
54: #define LOGIN 2
55: #define PASSWD 3
56: #define ACCOUNT 4
57: #define MACDEF 5
58: #define ID 10
59: #define MACHINE 11
60:
61: static char tokval[100];
62:
63: static struct toktab {
64: char *tokstr;
65: int tval;
66: } toktab[]= {
67: "default", DEFAULT,
68: "login", LOGIN,
69: "password", PASSWD,
70: "account", ACCOUNT,
71: "machine", MACHINE,
72: "macdef", MACDEF,
73: 0, 0
74: };
75:
76: static
77: rnetrc(host, aname, apass, aacct)
78: char *host, **aname, **apass, **aacct;
79: {
80: char *hdir, buf[BUFSIZ], *tmp;
81: int t, i, c;
82: struct stat stb;
83: extern int errno;
84:
85: hdir = getenv("HOME");
86: if (hdir == NULL)
87: hdir = ".";
88: (void) sprintf(buf, "%s/.netrc", hdir);
89: cfile = fopen(buf, "r");
90: if (cfile == NULL) {
91: if (errno != ENOENT)
92: perror(buf);
93: return(0);
94: }
95: next:
96: while ((t = token())) switch(t) {
97:
98: case DEFAULT:
99: (void) token();
100: continue;
101:
102: case MACHINE:
103: if (token() != ID || strcmp(host, tokval))
104: continue;
105: while ((t = token()) && t != MACHINE) switch(t) {
106:
107: case LOGIN:
108: if (token())
109: if (*aname == 0) {
110: *aname = malloc((unsigned) strlen(tokval) + 1);
111: (void) strcpy(*aname, tokval);
112: } else {
113: if (strcmp(*aname, tokval))
114: goto next;
115: }
116: break;
117: case PASSWD:
118: if (fstat(fileno(cfile), &stb) >= 0
119: && (stb.st_mode & 077) != 0) {
120: fprintf(stderr, "Error - .netrc file not correct mode.\n");
121: fprintf(stderr, "Remove password or correct mode.\n");
122: return(-1);
123: }
124: if (token() && *apass == 0) {
125: *apass = malloc((unsigned) strlen(tokval) + 1);
126: (void) strcpy(*apass, tokval);
127: }
128: break;
129: case ACCOUNT:
130: if (fstat(fileno(cfile), &stb) >= 0
131: && (stb.st_mode & 077) != 0) {
132: fprintf(stderr, "Error - .netrc file not correct mode.\n");
133: fprintf(stderr, "Remove account or correct mode.\n");
134: return(-1);
135: }
136: if (token() && *aacct == 0) {
137: *aacct = malloc((unsigned) strlen(tokval) + 1);
138: (void) strcpy(*aacct, tokval);
139: }
140: break;
141: case MACDEF:
142: if (proxy) {
143: return(0);
144: }
145: while ((c=getc(cfile)) != EOF && c == ' ' || c == '\t');
146: if (c == EOF || c == '\n') {
147: printf("Missing macdef name argument.\n");
148: return(-1);
149: }
150: if (macnum == 16) {
151: printf("Limit of 16 macros have already been defined\n");
152: return(-1);
153: }
154: tmp = macros[macnum].mac_name;
155: *tmp++ = c;
156: for (i=0; i < 8 && (c=getc(cfile)) != EOF &&
157: !isspace(c); ++i) {
158: *tmp++ = c;
159: }
160: if (c == EOF) {
161: printf("Macro definition missing null line terminator.\n");
162: return(-1);
163: }
164: *tmp = '\0';
165: if (c != '\n') {
166: while ((c=getc(cfile)) != EOF && c != '\n');
167: }
168: if (c == EOF) {
169: printf("Macro definition missing null line terminator.\n");
170: return(-1);
171: }
172: if (macnum == 0) {
173: macros[macnum].mac_start = macbuf;
174: }
175: else {
176: macros[macnum].mac_start = macros[macnum-1].mac_end + 1;
177: }
178: tmp = macros[macnum].mac_start;
179: while (tmp != macbuf + 4096) {
180: if ((c=getc(cfile)) == EOF) {
181: printf("Macro definition missing null line terminator.\n");
182: return(-1);
183: }
184: *tmp = c;
185: if (*tmp == '\n') {
186: if (*(tmp-1) == '\0') {
187: macros[macnum++].mac_end = tmp - 1;
188: break;
189: }
190: *tmp = '\0';
191: }
192: tmp++;
193: }
194: if (tmp == macbuf + 4096) {
195: printf("4K macro buffer exceeded\n");
196: return(-1);
197: }
198: break;
199: default:
200: fprintf(stderr, "Unknown .netrc keyword %s\n", tokval);
201: break;
202: }
203: goto done;
204: }
205: done:
206: (void) fclose(cfile);
207: return(0);
208: }
209:
210: static
211: token()
212: {
213: char *cp;
214: int c;
215: struct toktab *t;
216:
217: if (feof(cfile))
218: return (0);
219: while ((c = getc(cfile)) != EOF &&
220: (c == '\n' || c == '\t' || c == ' ' || c == ','))
221: continue;
222: if (c == EOF)
223: return (0);
224: cp = tokval;
225: if (c == '"') {
226: while ((c = getc(cfile)) != EOF && c != '"') {
227: if (c == '\\')
228: c = getc(cfile);
229: *cp++ = c;
230: }
231: } else {
232: *cp++ = c;
233: while ((c = getc(cfile)) != EOF
234: && c != '\n' && c != '\t' && c != ' ' && c != ',') {
235: if (c == '\\')
236: c = getc(cfile);
237: *cp++ = c;
238: }
239: }
240: *cp = 0;
241: if (tokval[0] == 0)
242: return (0);
243: for (t = toktab; t->tokstr; t++)
244: if (!strcmp(t->tokstr, tokval))
245: return (t->tval);
246: return (ID);
247: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.