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