4129c87c983bd49c5d747cf48e2ae5bce03fde94
[openafs.git] / src / ptserver / readgroup.c
1 /*
2  * Copyright 2000, International Business Machines Corporation and others.
3  * All Rights Reserved.
4  * 
5  * This software has been released under the terms of the IBM Public
6  * License.  For details, see the LICENSE file in the top-level source
7  * directory or online at http://www.openafs.org/dl/license10.html
8  */
9
10 #include <afsconfig.h>
11 #include <afs/param.h>
12
13 RCSID("$Header$");
14
15 #include <stdio.h>
16 #ifndef AFS_NT40_ENV
17 #include <strings.h>
18 #else
19 #include <WINNT/afsevent.h>
20 #endif
21 #include <ctype.h>
22 #include <rx/rx.h>
23 #include <rx/xdr.h>
24 #include <afs/cellconfig.h>
25 #include <afs/afsutil.h>
26 #include "ptclient.h"
27 #include "pterror.h"
28
29 int verbose = 0;
30 void skip();
31
32 void
33 report_error (code, name, gname)
34   afs_int32 code;
35   char *name;
36   char *gname;
37 {
38     if (code == 0) {
39         if (verbose) printf("  added %s to %s.\n",name,gname);
40     } else if (code == PRIDEXIST) {
41         if (verbose) printf ("  user %s already on group %s\n", name, gname);
42     } else {
43         fprintf(stderr,"Couldn't add %s to %s!\n",name,gname);
44         fprintf(stderr,"%s (%d).\n",pr_ErrorMsg(code),code);
45     }
46 }
47
48 int osi_audit()
49 {
50 /* OK, this REALLY sucks bigtime, but I can't tell who is calling
51  * afsconf_CheckAuth easily, and only *SERVERS* should be calling osi_audit
52  * anyway.  It's gonna give somebody fits to debug, I know, I know.
53  */
54 return 0;
55 }
56
57 #include "AFS_component_version_number.c"
58
59 main(argc,argv)
60 afs_int32 argc;
61 char **argv;
62 {
63     register afs_int32 code;
64     char name[PR_MAXNAMELEN];
65     char gname[PR_MAXNAMELEN];
66     char owner[PR_MAXNAMELEN];
67     afs_int32 id;
68     char buf[3000];
69     FILE *fp;
70     char *ptr;
71     char *tmp;
72     char *cellname;
73     namelist lnames;
74     afs_int32 i;
75     afs_int32 fail = 0;
76
77     if (argc < 2) {
78         fprintf(stderr,"Usage: readgroup [-v] [-c cellname] groupfile.\n");
79         exit(0);
80     }
81     cellname = 0;
82     for (i = 1;i<argc;i++) {
83         if (!strcmp(argv[i],"-v"))
84             verbose = 1;
85         else {
86             if (!strcmp(argv[i],"-c")) {
87                 cellname = (char *)malloc(100);
88                 strncpy(cellname,argv[++i],100);
89             }
90             else
91                 strncpy(buf,argv[i],150);
92         }
93     }
94     code = pr_Initialize(2, AFSDIR_CLIENT_ETC_DIRPATH, cellname);
95     if (code) {
96         fprintf(stderr,"pr_Initialize failed .. exiting.\n");
97         fprintf(stderr,"%s (%d).\n",pr_ErrorMsg(code),code);
98         exit(1);
99     }
100     
101     if ((fp = fopen(buf,"r")) == NULL) {
102         fprintf(stderr,"Couldn't open %s.\n",argv[1]);
103         exit(1);
104     }
105
106     while ((tmp = fgets(buf,3000,fp)) != NULL) {
107         /* group file lines must either have the name of a group or a tab or blank space at beginning */
108         if (buf[0] == '\n') break;
109         if (buf[0] != ' ' && buf[0] != '\t') {
110             /* grab the group name */
111             memset(gname, 0, PR_MAXNAMELEN);
112             memset(owner, 0, PR_MAXNAMELEN);
113             sscanf(buf,"%s %d",gname,&id);
114             tmp = buf;
115             skip(&tmp);
116             skip(&tmp);
117             stolower(gname);
118             ptr = strchr(gname, ':');
119             strncpy(owner,gname,ptr-gname);
120             if (strcmp(owner,"system") == 0)
121                 strncpy(owner,"system:administrators",PR_MAXNAMELEN);
122             fail = 0;
123             if (verbose)
124                 printf("Group is %s, owner is %s, id is %d.\n",gname,owner,id);
125             code = pr_CreateGroup(gname,owner,&id);
126             if (code != 0) {
127                 if (code != PRIDEXIST) { /* already exists */
128                     fprintf(stderr,"Failed to create group %s with id %d!\n",gname,id);
129                     fprintf(stderr,"%s (%d).\n",pr_ErrorMsg(code),code);
130                 }
131                 if (code != PREXIST && code != PRIDEXIST) {  /* we won't add users if it's not there */
132                     fail = 1;
133                 }
134             }
135             if (!fail) {
136                 /* read members out of buf and add to the group */
137                 memset(name, 0, PR_MAXNAMELEN);
138                 while (sscanf(tmp,"%s",name) != EOF) {
139                     if (strchr(name,':') == NULL) {
140                         /* then it's not a group */
141                         code = pr_AddToGroup(name,gname);
142                         report_error (code, name, gname);
143                     }
144                     else {
145                         /* add the members of a group to the group */
146                         if (verbose)
147                             printf("Adding %s to %s.\n",lnames.namelist_val[i],gname);
148                         code = pr_ListMembers(name,&lnames);
149                         if (code) {
150                             fprintf(stderr,"Couldn't get the members for %s to add to %s.\n",name,gname);
151                             fprintf(stderr,"%s (%d).\n",pr_ErrorMsg(code),code);
152                         }
153                         for (i=0;i<lnames.namelist_len;i++) {
154                             code = pr_AddToGroup(lnames.namelist_val[i],gname);
155                             report_error (code, lnames.namelist_val[i], gname);
156                         }
157                         if (lnames.namelist_val) free(lnames.namelist_val);
158                     }
159                     memset(name, 0, PR_MAXNAMELEN);
160                     skip(&tmp);
161                 }
162             }
163         }
164         else {  /* must have more names to add */
165             /* if we couldn't create the group, and it wasn't already there, don't try to add more users */
166             if (fail) continue;
167             /* read members out of buf and add to the group */
168             memset(name, 0, PR_MAXNAMELEN);
169             tmp = buf;
170             tmp++;
171             while (sscanf(tmp,"%s",name) != EOF) {
172                 if (strchr(name,':') == NULL) {
173                     /* then it's not a group */
174                     code = pr_AddToGroup(name,gname);
175                     report_error (code, name, gname);
176                 }
177                 else {
178                     /* add the members of a group to the group */
179                     code = pr_ListMembers(name,&lnames);
180                     if (code) {
181                         fprintf(stderr,"Couldn't get the members for %s to add to %s.\n",name,gname);
182                         fprintf(stderr,"%s (%d).\n",pr_ErrorMsg(code),code);
183                     }
184                     for (i=0;i<lnames.namelist_len;i++) {
185                         if (verbose)
186                             printf("Adding %s to %s.\n",lnames.namelist_val[i],gname);
187                         code = pr_AddToGroup(lnames.namelist_val[i],gname);
188                         report_error (code, lnames.namelist_val[i], gname);
189                     }
190                     if (lnames.namelist_val) free(lnames.namelist_val);
191                 }
192                 memset(name, 0, PR_MAXNAMELEN);
193                 skip(&tmp);
194             }
195         }
196     }
197 }
198
199 void
200 skip(s)
201 char **s;
202 {
203     while (**s != ' ' && **s != '\t' && **s != '\0') (*s)++;
204     while (**s == ' ' || **s == '\t') (*s)++;
205 }