2 Proprietary Rand Corporation
, 1981.
3 Further distribution of
this software
4 subject to the terms of the Rand
12 #include <sys/types.h>
18 struct shome
{ /* Internal name/uid/home database */
27 struct mailname
*m_next
;
33 extern char _sobuf
[]; /* MLW standard out buffer */
38 register int i
, list
= 0;
39 register struct mailname
*lp
;
43 printf("Usage: ali [-l] name ...\n");
46 if(argc
> 1 && strcmp(argv
[1], "-l") == 0) {
50 setbuf(stdout
, _sobuf
);
52 for(i
= 1; i
< argc
; i
++)
54 alias(); /* Map names if needed */
55 for(lp
= addrlist
.m_next
; lp
; lp
= lp
->m_next
) {
56 if(home(lp
->m_name
)) {
58 printf("%s\n", lp
->m_name
);
60 printf("%s%s", lp
->m_name
, lp
->m_next
?", ":"");
61 if(stdout
->_cnt
< BUFSIZ
- 65) {
62 printf("\n"); VOID
fflush(stdout
);
67 if(!list
&& stdout
->_cnt
&& stdout
->_cnt
< BUFSIZ
) {
68 printf("\n"); VOID
fflush(stdout
);
70 for(lp
= addrlist
.m_next
; lp
; lp
= lp
->m_next
)
71 if(home(lp
->m_name
) == NULL
)
72 fprintf(stderr
, "Ali: Unknown User: %s.\n", lp
->m_name
);
79 register struct mailname
*mp
;
82 /*** printf("insert(%s)\n", name); ***/
84 for(mp
= &addrlist
; mp
->m_next
; mp
= mp
->m_next
)
85 if(uleq(name
, mp
->m_next
->m_name
))
86 return; /* Don't insert existing name! */
87 mp
->m_next
= (struct mailname
*) malloc(sizeof *mp
->m_next
);
90 mp
->m_name
= getcpy(name
);
95 register struct passwd
*pw
;
96 register struct shome
*h
, *ph
;
97 struct passwd
*getpwent();
100 ph
= (struct shome
*) &homes
;
101 while((pw
= getpwent()) != NULL
) {
102 h
= (struct shome
*) malloc(sizeof *h
);
104 h
->h_name
= malloc((unsigned)strlen(pw
->pw_name
)+1);
105 strcpy(h
->h_name
, pw
->pw_name
);
106 h
->h_uid
= pw
->pw_uid
;
107 h
->h_gid
= pw
->pw_gid
;
108 h
->h_home
= malloc((unsigned)strlen(pw
->pw_dir
)+1);
109 strcpy(h
->h_home
, pw
->pw_dir
);
119 register struct shome
*h
;
121 if (index(name
, '@') ||
124 return (homes
); /* WARNING! Depends on return value */
125 /* being indifferent! */
127 for(h
= homes
; h
; h
= h
->h_next
)
128 if(uleq(name
, h
->h_name
))
133 aleq(string
, aliasent
)
134 register char *string
, *aliasent
;
141 else if((c
|040) != (*aliasent
|040))
145 return(*aliasent
== 0 | *aliasent
== '*');
149 /* alias implementation below...
154 #define GROUP "/etc/group"
155 char *AliasFile
= "/etc/MailAliases";
167 while(isspace(*ptr
) || *ptr
== ',' || *ptr
== ':')
169 while(isalnum(*ptr
) || *ptr
== '/' || *ptr
== '-' ||
170 *ptr
== '!' || *ptr
== '@' || *ptr
== ' ' ||
171 *ptr
== '.' || *ptr
== '*')
195 register char *cp
, *pp
;
196 register struct mailname
*lp
;
197 char line
[256], pbuf
[64];
200 if((a
= fopen(AliasFile
, "r")) == NULL
) {
201 fprintf(stderr
, "Can't open alias file ");
205 while(fgets(line
, sizeof line
, a
)) {
206 if(line
[0] == ';' || line
[0] == '\n') /* Comment Line */
208 if((pp
= parse(line
, pbuf
)) == NULL
) {
209 oops
: fprintf(stderr
, "Bad alias file %s\n", AliasFile
);
210 fprintf(stderr
, "Line: %s", line
);
213 for(lp
= &addrlist
; lp
->m_next
; lp
= lp
->m_next
) {
214 if(aleq(lp
->m_next
->m_name
, pp
)) {
216 if(!(cp
= advance()) ||
217 !(pp
= parse(cp
, pbuf
)))
220 case '<': /* From file */
222 if((pp
= parse(cp
, pbuf
)) == NULL
)
226 case '=': /* UNIX group */
228 if((pp
= parse(cp
, pbuf
)) == NULL
)
232 case '*': /* ALL Users */
235 default: /* Simple list */
238 if(!(cp
= advance()) ||
239 !(pp
= parse(cp
, pbuf
)))
253 register char *cp
, *pp
;
254 char line
[128], pbuf
[64];
257 /*** printf("addfile(%s)\n", file); ***/
258 if((f
= fopen(file
, "r")) == NULL
) {
259 fprintf(stderr
, "Can't open ");
263 while(fgets(line
, sizeof line
, f
)) {
265 while(pp
= parse(cp
, pbuf
)) {
276 register char *cp
, *pp
;
278 char line
[128], pbuf
[64], *rindex();
281 /*** printf("addgroup(%s)\n", group); ***/
282 if((f
= fopen(GROUP
, "r")) == NULL
) {
283 fprintf(stderr
, "Can't open ");
287 while(fgets(line
, sizeof line
, f
)) {
288 pp
= parse(line
, pbuf
);
289 if(strcmp(pp
, group
) == 0) {
290 cp
= rindex(line
, ':');
291 while(pp
= parse(cp
, pbuf
)) {
299 fprintf(stderr
, "Group: %s non-existent\n", group
);
307 register struct shome
*h
;
309 /*** printf("addall()\n"); ***/
310 for(h
= homes
; h
; h
= h
->h_next
)
311 if(h
->h_uid
>= EVERYONE
)
315 remove(mp
) /* Remove NEXT from argument node! */
316 register struct mailname
*mp
;
318 register struct mailname
*rp
;
321 mp
->m_next
= rp
->m_next
;
322 cndfree((char *)rp
->m_name
);