Deleted Added
full compact
afslog.c (78527) afslog.c (120945)
1/*
1/*
2 * Copyright (c) 1997-2001 Kungliga Tekniska H�gskolan
2 * Copyright (c) 1997-2003 Kungliga Tekniska H�gskolan
3 * (Royal Institute of Technology, Stockholm, Sweden).
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 *
10 * 1. Redistributions of source code must retain the above copyright

--- 17 unchanged lines hidden (view full) ---

28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 * SUCH DAMAGE.
32 */
33
34#ifdef HAVE_CONFIG_H
35#include <config.h>
3 * (Royal Institute of Technology, Stockholm, Sweden).
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 *
10 * 1. Redistributions of source code must retain the above copyright

--- 17 unchanged lines hidden (view full) ---

28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 * SUCH DAMAGE.
32 */
33
34#ifdef HAVE_CONFIG_H
35#include <config.h>
36RCSID("$Id: afslog.c,v 1.16 2001/05/16 22:10:15 assar Exp $");
36RCSID("$Id: afslog.c,v 1.21.2.1 2003/04/23 18:04:26 lha Exp $");
37#endif
38#include <ctype.h>
37#endif
38#include <ctype.h>
39#ifdef KRB5
39#include <krb5.h>
40#include <krb5.h>
41#endif
42#ifdef KRB4
43#include <krb.h>
44#endif
40#include <kafs.h>
41#include <roken.h>
42#include <getarg.h>
43#include <err.h>
44
45static int help_flag;
46static int version_flag;
47#if 0
48static int create_user;
49#endif
50static getarg_strings cells;
51static char *realm;
52static getarg_strings files;
53static int unlog_flag;
54static int verbose;
45#include <kafs.h>
46#include <roken.h>
47#include <getarg.h>
48#include <err.h>
49
50static int help_flag;
51static int version_flag;
52#if 0
53static int create_user;
54#endif
55static getarg_strings cells;
56static char *realm;
57static getarg_strings files;
58static int unlog_flag;
59static int verbose;
60#ifdef KRB4
61static int use_krb4 = 1;
62#endif
63#ifdef KRB5
64static int use_krb5 = 1;
65#endif
55
56struct getargs args[] = {
66
67struct getargs args[] = {
57 { "cell", 'c', arg_strings, &cells, "cells to get tokens for", "cells" },
58 { "file", 'p', arg_strings, &files, "files to get tokens for", "paths" },
68 { "cell", 'c', arg_strings, &cells, "cells to get tokens for", "cell" },
69 { "file", 'p', arg_strings, &files, "files to get tokens for", "path" },
59 { "realm", 'k', arg_string, &realm, "realm for afs cell", "realm" },
60 { "unlog", 'u', arg_flag, &unlog_flag, "remove tokens" },
70 { "realm", 'k', arg_string, &realm, "realm for afs cell", "realm" },
71 { "unlog", 'u', arg_flag, &unlog_flag, "remove tokens" },
72#ifdef KRB4
73 { "v4", 0, arg_negative_flag, &use_krb4, "use Kerberos 4" },
74#endif
75#ifdef KRB5
76 { "v5", 0, arg_negative_flag, &use_krb5, "use Kerberos 5" },
77#endif
61#if 0
62 { "create-user", 0, arg_flag, &create_user, "create user if not found" },
63#endif
64 { "verbose",'v', arg_flag, &verbose },
65 { "version", 0, arg_flag, &version_flag },
66 { "help", 'h', arg_flag, &help_flag },
67};
68
69static int num_args = sizeof(args) / sizeof(args[0]);
70
78#if 0
79 { "create-user", 0, arg_flag, &create_user, "create user if not found" },
80#endif
81 { "verbose",'v', arg_flag, &verbose },
82 { "version", 0, arg_flag, &version_flag },
83 { "help", 'h', arg_flag, &help_flag },
84};
85
86static int num_args = sizeof(args) / sizeof(args[0]);
87
88#ifdef KRB5
89krb5_context context;
90krb5_ccache id;
91#endif
92
71static const char *
93static const char *
72expand_cell_name(const char *cell)
94expand_one_file(FILE *f, const char *cell)
73{
95{
74 FILE *f;
75 static char buf[128];
96 static char buf[1024];
76 char *p;
77
97 char *p;
98
78 f = fopen(_PATH_CELLSERVDB, "r");
79 if(f == NULL)
80 return cell;
81 while (fgets (buf, sizeof(buf), f) != NULL) {
99 while (fgets (buf, sizeof(buf), f) != NULL) {
82 if(buf[0] == '>'){
83 for(p=buf; *p && !isspace((unsigned char)*p) && *p != '#'; p++)
100 if(buf[0] == '>') {
101 for(p = buf; *p && !isspace((unsigned char)*p) && *p != '#'; p++)
84 ;
85 *p = '\0';
102 ;
103 *p = '\0';
86 if(strstr(buf, cell)){
87 fclose(f);
104 if(strncmp(buf + 1, cell, strlen(cell)) == 0)
88 return buf + 1;
105 return buf + 1;
89 }
90 }
106 }
91 buf[0] = 0;
107 buf[0] = '\0';
92 }
108 }
93 fclose(f);
109 return NULL;
110}
111
112static const char *
113expand_cell_name(const char *cell)
114{
115 FILE *f;
116 const char *c;
117 const char **fn, *files[] = { _PATH_CELLSERVDB,
118 _PATH_ARLA_CELLSERVDB,
119 _PATH_OPENAFS_DEBIAN_CELLSERVDB,
120 _PATH_ARLA_DEBIAN_CELLSERVDB,
121 NULL };
122 for(fn = files; *fn; fn++) {
123 f = fopen(*fn, "r");
124 if(f == NULL)
125 continue;
126 c = expand_one_file(f, cell);
127 fclose(f);
128 if(c)
129 return c;
130 }
94 return cell;
95}
96
97#if 0
98static int
99createuser (char *cell)
100{
101 char cellbuf[64];

--- 27 unchanged lines hidden (view full) ---

129 DEBUG("Executing %s", cmd);
130 return system(cmd);
131}
132#endif
133
134static void
135usage(int ecode)
136{
131 return cell;
132}
133
134#if 0
135static int
136createuser (char *cell)
137{
138 char cellbuf[64];

--- 27 unchanged lines hidden (view full) ---

166 DEBUG("Executing %s", cmd);
167 return system(cmd);
168}
169#endif
170
171static void
172usage(int ecode)
173{
137 arg_printusage(args, num_args, NULL, "[cell]... [path]...");
174 arg_printusage(args, num_args, NULL, "[cell|path]...");
138 exit(ecode);
139}
140
175 exit(ecode);
176}
177
178struct cell_list {
179 char *cell;
180 struct cell_list *next;
181} *cell_list;
182
141static int
183static int
142afslog_cell(krb5_context context, krb5_ccache id,
143 const char *cell, int expand)
184afslog_cell(const char *cell, int expand)
144{
185{
186 struct cell_list *p, **q;
145 const char *c = cell;
146 if(expand){
147 c = expand_cell_name(cell);
148 if(c == NULL){
187 const char *c = cell;
188 if(expand){
189 c = expand_cell_name(cell);
190 if(c == NULL){
149 krb5_warnx(context, "No cell matching \"%s\" found.", cell);
191 warnx("No cell matching \"%s\" found.", cell);
150 return -1;
151 }
192 return -1;
193 }
152 if(verbose)
153 krb5_warnx(context, "Cell \"%s\" expanded to \"%s\"", cell, c);
194 if(verbose && strcmp(c, cell) != 0)
195 warnx("Cell \"%s\" expanded to \"%s\"", cell, c);
154 }
196 }
155 return krb5_afslog(context, id, c, realm);
197 /* add to list of cells to get tokens for, and also remove
198 duplicates; the actual afslog takes place later */
199 for(p = cell_list, q = &cell_list; p; q = &p->next, p = p->next)
200 if(strcmp(p->cell, c) == 0)
201 return 0;
202 p = malloc(sizeof(*p));
203 if(p == NULL)
204 return -1;
205 p->cell = strdup(c);
206 if(p->cell == NULL) {
207 free(p);
208 return -1;
209 }
210 p->next = NULL;
211 *q = p;
212 return 0;
156}
157
158static int
213}
214
215static int
159afslog_file(krb5_context context, krb5_ccache id,
160 const char *path)
216afslog_file(const char *path)
161{
162 char cell[64];
163 if(k_afs_cell_of_file(path, cell, sizeof(cell))){
217{
218 char cell[64];
219 if(k_afs_cell_of_file(path, cell, sizeof(cell))){
164 krb5_warnx(context, "No cell found for file \"%s\".", path);
220 warnx("No cell found for file \"%s\".", path);
165 return -1;
166 }
167 if(verbose)
221 return -1;
222 }
223 if(verbose)
168 krb5_warnx(context, "File \"%s\" lives in cell \"%s\"", path, cell);
169 return afslog_cell(context, id, cell, 0);
224 warnx("File \"%s\" lives in cell \"%s\"", path, cell);
225 return afslog_cell(cell, 0);
170}
171
226}
227
228static int
229do_afslog(const char *cell)
230{
231 int k5ret, k4ret;
232
233 k5ret = k4ret = 0;
234
235#ifdef KRB5
236 if(context != NULL && id != NULL && use_krb5) {
237 k5ret = krb5_afslog(context, id, cell, NULL);
238 if(k5ret == 0)
239 return 0;
240 }
241#endif
242#if KRB4
243 if (use_krb4) {
244 k4ret = krb_afslog(cell, NULL);
245 if(k4ret == 0)
246 return 0;
247 }
248#endif
249#ifdef KRB5
250 if (k5ret)
251 warnx("krb5_afslog(%s): %s", cell, krb5_get_err_text(context, k5ret));
252#endif
253#ifdef KRB4
254 if (k4ret)
255 warnx("krb_afslog(%s): %s", cell, krb_get_err_text(k4ret));
256#endif
257 if (k5ret || k4ret)
258 return 1;
259 return 0;
260}
261
262static void
263log_func(void *ctx, const char *str)
264{
265 fprintf(stderr, "%s\n", str);
266}
267
172int
173main(int argc, char **argv)
174{
175 int optind = 0;
268int
269main(int argc, char **argv)
270{
271 int optind = 0;
176 krb5_context context;
177 krb5_ccache id;
178 int i;
179 int num;
180 int ret = 0;
272 int i;
273 int num;
274 int ret = 0;
275 int failed = 0;
276 struct cell_list *p;
181
182 setprogname(argv[0]);
183
184 if(getarg(args, num_args, argc, argv, &optind))
185 usage(1);
186 if(help_flag)
187 usage(0);
188 if(version_flag) {
189 print_version(NULL);
190 exit(0);
191 }
192
277
278 setprogname(argv[0]);
279
280 if(getarg(args, num_args, argc, argv, &optind))
281 usage(1);
282 if(help_flag)
283 usage(0);
284 if(version_flag) {
285 print_version(NULL);
286 exit(0);
287 }
288
193 ret = krb5_init_context(&context);
194 if (ret)
195 errx (1, "krb5_init_context failed: %d", ret);
196 if(!k_hasafs())
289 if(!k_hasafs())
197 krb5_errx(context, 1,
198 "AFS doesn't seem to be present on this machine");
290 errx(1, "AFS does not seem to be present on this machine");
199
200 if(unlog_flag){
201 k_unlog();
202 exit(0);
203 }
291
292 if(unlog_flag){
293 k_unlog();
294 exit(0);
295 }
204 krb5_cc_default(context, &id);
296#ifdef KRB5
297 ret = krb5_init_context(&context);
298 if (ret)
299 context = NULL;
300 else
301 if(krb5_cc_default(context, &id) != 0)
302 id = NULL;
303#endif
304
305 if (verbose)
306 kafs_set_verbose(log_func, NULL);
307
205 num = 0;
206 for(i = 0; i < files.num_strings; i++){
308 num = 0;
309 for(i = 0; i < files.num_strings; i++){
207 afslog_file(context, id, files.strings[i]);
310 afslog_file(files.strings[i]);
208 num++;
311 num++;
209 free_getarg_strings (&files);
210 }
312 }
313 free_getarg_strings (&files);
211 for(i = 0; i < cells.num_strings; i++){
314 for(i = 0; i < cells.num_strings; i++){
212 afslog_cell(context, id, cells.strings[i], 1);
315 afslog_cell(cells.strings[i], 1);
213 num++;
316 num++;
214 free_getarg_strings (&cells);
215 }
317 }
318 free_getarg_strings (&cells);
216 for(i = optind; i < argc; i++){
217 num++;
218 if(strcmp(argv[i], ".") == 0 ||
219 strcmp(argv[i], "..") == 0 ||
220 strchr(argv[i], '/') ||
221 access(argv[i], F_OK) == 0)
319 for(i = optind; i < argc; i++){
320 num++;
321 if(strcmp(argv[i], ".") == 0 ||
322 strcmp(argv[i], "..") == 0 ||
323 strchr(argv[i], '/') ||
324 access(argv[i], F_OK) == 0)
222 afslog_file(context, id, argv[i]);
325 afslog_file(argv[i]);
223 else
326 else
224 afslog_cell(context, id, argv[i], 1);
327 afslog_cell(argv[i], 1);
225 }
226 if(num == 0) {
328 }
329 if(num == 0) {
227 krb5_afslog(context, id, NULL, NULL);
330 if(do_afslog(NULL))
331 failed++;
332 } else
333 for(p = cell_list; p; p = p->next) {
334 if(verbose)
335 warnx("Getting tokens for cell \"%s\"", p->cell);
336 if(do_afslog(p->cell))
337 failed++;
228 }
229
338 }
339
230 return ret;
340 return failed;
231}
341}