Commit | Line | Data |
---|---|---|
6f28518c KM |
1 | static char sccsid[] = "@(#)environ.c 4.1 (Berkeley) %G%"; |
2 | ||
3 | /* sccs id variable */ | |
4 | static char *env_sid = "@(#)environ.c 1.2"; | |
5 | ||
6 | # include "defs.h" | |
7 | ||
8 | /* | |
9 | environ.c | |
10 | ||
11 | examine the environment variables and see if they | |
12 | have network login name and password information | |
13 | */ | |
14 | ||
15 | envloginpasswd(mch,sn,spasswd) | |
16 | register char *sn, *spasswd;{ | |
17 | register char *senv; | |
18 | char stemp[30], fgetlogin; | |
19 | char *envlook(); | |
20 | # ifdef V6 | |
21 | return; /* doesn't work on V6 */ | |
22 | # endif | |
23 | senv = envlook(mch); | |
24 | if(senv == NULL)return; | |
25 | if(!isalpha(senv[0]))return; /* not login name, ignore */ | |
26 | fgetlogin = (sn[0] == 0); | |
27 | while(*senv && *senv != ','){ | |
28 | if(fgetlogin)*sn++ = *senv; | |
29 | else if(*sn++ != *senv)return; | |
30 | senv++; | |
31 | } | |
32 | strcpy(stemp,++senv); | |
33 | mkpwclear(stemp,mch,spasswd); | |
34 | } | |
35 | extern char **environ; | |
36 | char *envlook(mch){ | |
37 | static char svalue[100]; | |
38 | register char *s, *sv, **env; | |
39 | env = environ; | |
40 | while(*env != NULL){ | |
41 | s = *env++; | |
42 | if(s[0] == 'M' && s[1] == 'A' && s[2] == 'C' && s[3] == 'H'){ | |
43 | sv = s+4; | |
44 | while(*sv && *sv != '=')sv++; | |
45 | *sv++ = 0; | |
46 | if(lookup(s+4) == mch){ | |
47 | strcpy(svalue,sv); | |
48 | return(svalue); | |
49 | } | |
50 | } | |
51 | } | |
52 | return(NULL); | |
53 | } | |
54 | /* | |
55 | reverse the sfrom string, copying into sto. | |
56 | sfrom and sto may not be the same string | |
57 | */ | |
58 | sreverse(sto,sfrom) | |
59 | register char *sto, *sfrom; | |
60 | { | |
61 | register int i; | |
62 | i = strlen(sfrom); | |
63 | while(i >= 0) | |
64 | *sto++ = sfrom[i--]; | |
65 | } | |
66 | /* | |
67 | mkenvkey | |
68 | ||
69 | make key to encrypt environment passwds. | |
70 | return NULL if error | |
71 | */ | |
72 | static char *mkenvkey(mch) | |
73 | char mch; | |
74 | { | |
75 | static char skey[40]; | |
76 | register struct utmp *putmp; | |
77 | char stemp[40], stemp1[40], sttyname[30]; | |
78 | register char *sk,*p; | |
79 | ||
80 | if(isatty(2))strcpy(sttyname,ttyname(2)); | |
81 | else if(isatty(0))strcpy(sttyname,ttyname(0)); | |
82 | else if(isatty(1))strcpy(sttyname,ttyname(1)); | |
83 | else return(NULL); | |
84 | putmp = getutmp(sttyname); | |
85 | if(putmp == NULL) return(NULL); | |
86 | sk = skey; | |
87 | p = putmp->ut_line; | |
88 | while(*p)*sk++ = *p++; | |
89 | *sk++ = mch; | |
90 | sprintf(stemp,"%ld",putmp->ut_time); | |
91 | sreverse(stemp1,stemp); | |
92 | p = stemp1; | |
93 | while(*p)*sk++ = *p++; | |
94 | *sk = 0; | |
95 | return(skey); | |
96 | } | |
97 | /* | |
98 | make an encrypted passwd | |
99 | */ | |
100 | mkpwunclear(spasswd,mch,sencpasswd) | |
101 | char mch,*spasswd,*sencpasswd; | |
102 | { | |
103 | register char *skey; | |
104 | if(spasswd[0] == 0){ | |
105 | sencpasswd[0] = 0; | |
106 | return; | |
107 | } | |
108 | skey = mkenvkey(mch); | |
109 | if(skey == NULL){ | |
110 | fprintf(stderr,"Can't make key\n"); | |
111 | exit(EX_OSERR); | |
112 | } | |
113 | nbsencrypt(spasswd,skey,sencpasswd); | |
114 | } | |
115 | /* | |
116 | make an unecrypted passwd | |
117 | */ | |
118 | mkpwclear(sencpasswd,mch,spasswd) | |
119 | char mch,*spasswd,*sencpasswd; | |
120 | { | |
121 | register char *skey; | |
122 | if(sencpasswd[0] == 0){ | |
123 | spasswd[0] = 0; | |
124 | return; | |
125 | } | |
126 | skey = mkenvkey(mch); | |
127 | if(skey == NULL){ | |
128 | fprintf(stderr,"Can't make key\n"); | |
129 | exit(EX_OSERR); | |
130 | } | |
131 | nbsdecrypt(sencpasswd,skey,spasswd); | |
132 | } |