|
|
1.1 root 1: #ifndef lint
2: static char *rcsid = "$Header: vpfile.c,v 1.2 87/04/01 08:23:06 ed Exp $";
3: #endif lint
4:
5: /*
6: * Copyright (c) 1986, 1987 Xerox Corporation.
7: */
8:
9: /* $Log: vpfile.c,v $
10: * Revision 1.2 87/04/01 08:23:06 ed
11: * Changed for new MakeSecondaryCreds call.
12: *
13: * Revision 1.1 87/03/17 16:28:30 ed
14: * Initial revision
15: *
16: *
17: */
18:
19: #include <stdio.h>
20: #include <sys/file.h>
21: #include <sys/time.h>
22: #include <sys/param.h>
23: #include <sys/stat.h>
24: #include <netns/ns.h>
25: #include <netns/sp.h>
26: #include <xnscourier/FilingSubset1.h>
27: #include <xnscourier/Filing4.h>
28: #include <xnscourier/except.h>
29: #undef __Clearinghouse2 /* Filing4.h defs this */
30: #include <xnscourier/CH.h>
31: #include <xnscourier/filetypes.h>
32:
33: #define ROOT_DIRECTORY "/"
34:
35: CourierConnection *connected;
36: Clearinghouse3_ObjectName hostobjname;
37: Authentication3_Verifier verifier;
38:
39: /* the following 3 items make up the current session */
40: FilingSubset1_Session session; /* the current session */
41: Clearinghouse3_ObjectName username;
42: FilingSubset1_Handle rootHandle;
43: char cur_dir[512]= 0;
44: char cur_pathname[512]= 0;
45: char cur_name[512]= 0;
46: char *myhostname, mydir[512], olddir[512];
47:
48: static FilingSubset1_ControlSequence nullControls = {0,0};
49: static FilingSubset1_ScopeSequence nullScope = {0,0};
50:
51: /* global data used to communicate with BDT procedures
52: */
53: extern GetAttributeSequences(),
54: listproc();
55:
56: char *rindex(), *typetostring();
57: char *AttrToString();
58: Boolean AttrToBoolean();
59: LongCardinal AttrToLongCardinal();
60: Cardinal AttrToCardinal();
61:
62: static (*ProcEachSeq)();
63:
64: Boolean files_found= FALSE;
65: Boolean filing_subset= TRUE;
66: Boolean usefiling= TRUE;
67:
68: char *service, oldservice[100];
69:
70: main(argc, argv)
71: int argc;
72: char *argv[];
73: {
74: char *file, *rightbrkt;
75: char *malloc();
76: int i;
77: CourierConnection *hookup();
78: int opt;
79: extern int optind;
80: extern char *optarg;
81:
82: static char *options= "f";
83: static char *usage= "Usage: %s [-f] file1 ... filen\n";
84:
85: if ( argc < 1 ) {
86: fprintf(stderr, usage, argv[0]);
87: exit(1);
88: }
89:
90: gethostname(myhostname=malloc(100),100);
91: getwd(mydir);
92:
93: while ((opt= getopt(argc, argv, options)) != EOF)
94: switch (opt) {
95: case 'f':
96: usefiling= 0;
97: break;
98:
99: default:
100: fprintf(stderr, "Invalid command option -%c\n", opt);
101: exit(1);
102: }
103:
104: for ( ; optind < argc ; optind++ ) {
105: if ( getserviceandfile(argv[optind], &service, &file) == 0 ) {
106: fprintf(stderr, "Invalid name %s\n", argv[optind]);
107: exit(1);
108: }
109:
110: if ( service == 0 ) {
111: locallist(argv[optind]);
112: continue;
113: }
114: DURING {
115: if ( strcmp(oldservice, service) != 0 ) {
116: if ( (connected= hookup(service)) == (CourierConnection *)0 ) {
117: fprintf(stderr, "\nCan't connect to %s\n", service);
118: continue;
119: }
120: login(0,0);
121: strcpy(oldservice, service);
122:
123: printf("\n\n(%s):\n", service);
124: }
125:
126: remotelist(file);
127:
128: } HANDLER {
129: FilingErrMsg(Exception.Code, Exception.Message);
130: } END_HANDLER;
131:
132: }
133:
134: return(0);
135: }
136:
137: getserviceandfile(name, srvcptr, fileptr)
138: char *name;
139: char **srvcptr, **fileptr;
140: {
141: char *sptr, *fptr;
142: char *index();
143:
144: *srvcptr= 0;
145:
146: /*
147: * look for Xerox forms first:
148: * [host]filename
149: */
150:
151: if ( (sptr= index(name, '[')) != 0 ) {
152: if ( (fptr= index(sptr, ']')) != 0 ) {
153: *fptr= '\0';
154: *srvcptr= sptr + 1;
155: *fileptr= fptr + 1;
156: return(1);
157: } else
158: return(0);
159: }
160:
161: /*
162: * (host)filename
163: */
164:
165: if ( (sptr= index(name, '(')) != 0 ) {
166: if ( (fptr= index(sptr, ')')) != 0 ) {
167: *fptr= '\0';
168: *srvcptr= sptr + 1;
169: *fileptr= fptr + 1;
170: return(1);
171: } else
172: return(0);
173: }
174:
175: /*
176: * look for XNS style with trailing : delimiter
177: * (assumes no : in file name, use alternate spec instead)
178: * object:domain:organization:filename
179: * domain & organization are optional
180: */
181:
182: if ( (fptr= rindex(name, ':')) != 0 ) {
183: *fptr= '\0';
184: *srvcptr= name;
185: *fileptr= fptr + 1;
186: return(1);
187: }
188: return(1);
189: }
190:
191: copyhandle(dest,src)
192: FilingSubset1_Handle dest,src;
193: {
194: if (dest == (Unspecified *) 0) {
195: fprintf(stderr,"Oops. dest is null in copyhandle\n");
196: exit(1);
197: }
198: dest[0] = src[0];
199: dest[1] = src[1];
200: }
201:
202: getdirhandle(filename, handle)
203: char *filename;
204: FilingSubset1_Handle handle;
205: {
206: FilingSubset1_Attribute pathattr[1];
207: FilingSubset1_AttributeSequence attrseq;
208: FilingSubset1_OpenResults openresult;
209: Filing4_OpenResults openresult2;
210: char *slash;
211:
212: if (filename == (char *)0 || *filename == '\000' || (strcmp(filename, "/") == 0) ) {
213: strcpy(cur_pathname, "/");
214: strcpy(cur_name, "/");
215: if ( filing_subset )
216: copyhandle(handle,FilingSubset1_nullHandle);
217: else
218: copyhandle(handle,rootHandle);
219: printf("\n/ :\n\n");
220: return;
221: } else if ( filename[0] == '/' ) {
222: strcpy(cur_pathname, filename);
223: } else {
224: strcpy(cur_pathname, cur_dir);
225: if ( strcmp(cur_pathname, "/") != 0 )
226: strcat(cur_pathname, "/");
227: strcat(cur_pathname, filename);
228: }
229:
230: if ( (slash= rindex(cur_pathname,'/')) == NULL )
231: strcpy(cur_name, cur_pathname);
232: else
233: strcpy(cur_name, slash+1);
234:
235: if ( filing_subset ) {
236: copyhandle(handle, FilingSubset1_nullHandle);
237: } else {
238: if ( slash == cur_pathname) {
239: copyhandle(handle, rootHandle);
240: printf("\n/ :\n\n");
241: return;
242: }
243:
244: attrseq.length = 1;
245: attrseq.sequence = pathattr;
246: pathattr[0].type = FilingSubset1_pathname;
247: copyhandle(handle, FilingSubset1_nullHandle);
248: *slash= '\0'; /* separate pathname from name */
249: #ifdef XEROXFSCOMPATIBILITY
250: if ( cur_pathname[0] == '/' )
251: StringToAttr(cur_pathname+1, &pathattr[0]);
252: else
253: StringToAttr(cur_pathname, &pathattr[0]);
254: #else XEROXFSCOMPATIBILITY
255: StringToAttr(cur_pathname, &pathattr[0]);
256: #endif XEROXFSCOMPATIBILITY
257: printf("\n%s :\n\n",cur_pathname);
258: *slash= '/'; /* and put back */
259: alarm(0);
260: if ( filing_subset ) {
261: openresult = FilingSubset1_Open(connected, NULL, attrseq,
262: handle, nullControls,
263: session);
264: copyhandle(handle, openresult.file);
265: } else {
266: openresult2 = Filing4_Open(connected, NULL, attrseq,
267: handle, nullControls,
268: session);
269: copyhandle(handle, openresult2.file);
270: }
271: }
272: }
273:
274: freefilehandle(handle)
275: FilingSubset1_Handle handle;
276: {
277: if (handle[0] == FilingSubset1_nullHandle[0] &&
278: handle[1] == FilingSubset1_nullHandle[1])
279: return; /* don't free nullHandle */
280: if (handle[0] == rootHandle[0] &&
281: handle[1] == rootHandle[1])
282: return; /* don't free root directory */
283: alarm(0);
284: if ( filing_subset )
285: FilingSubset1_Close(connected, NULL, handle, session);
286: else
287: Filing4_Close(connected, NULL, handle, session);
288: }
289:
290: CourierConnection *
291: hookup(name)
292: char *name;
293: {
294: register struct ns_addr *hostaddr;
295: extern struct ns_addr *getXNSaddr();
296: Clearinghouse3_ObjectName defaultobjname;
297: static char hnamebuf[128];
298: CourierConnection *cconn;
299:
300: CH_NameDefault(&defaultobjname);
301: hostobjname = CH_StringToName(name, &defaultobjname);
302: if ((hostaddr = CH_LookupAddrDN( hostobjname, 0, hnamebuf, 128))) {
303: /* should check here to be sure host is a file service */
304: hostaddr->x_port = htons(5); /* ?? */
305: cconn = CourierOpen(hostaddr);
306: /* reset objname to flush wildcards */
307: /* clear_Clearinghouse3_ThreePartName(&hostobjname); */
308: hostobjname = CH_StringToName(hnamebuf, &defaultobjname);
309: }
310: return(cconn);
311: }
312:
313:
314: login(name,pwd)
315: char *pwd;
316: char *name;
317: {
318: FilingSubset1_Credentials credentials;
319: FilingSubset1_LogonResults logonresult;
320: FilingSubset1_LogonResults *resultptr= &logonresult;
321: Filing4_LogonResults logonresult2;
322: FilingSubset1_AttributeSequence attrseq;
323: FilingSubset1_OpenResults openresult;
324: Filing4_OpenResults openresult2;
325:
326:
327: if ( name != 0 )
328: username = CH_StringToName(name,&hostobjname);
329:
330: if ( usefiling ) {
331: usefiling= 0;
332: filing_subset= FALSE;
333: if ( name == 0 && pwd == 0 ) {
334: GetSimpleCredsAndVerifier(&username, 0,
335: &credentials.primary, &verifier);
336: } else {
337: MakeSimpleCredsAndVerifier(&username,pwd,
338: &credentials.primary, &verifier);
339: }
340: logonresult2= Filing4_Logon(connected, NULL, hostobjname,
341: credentials.primary, verifier);
342: resultptr= (FilingSubset1_LogonResults *) &logonresult2;
343:
344: } else {
345: usefiling= 0;
346: if ( name == 0 && pwd == 0 ) {
347: GetSimpleCredsAndVerifier(&username, 0, &credentials.primary, &verifier);
348: MakeSecondaryCreds(hostobjname.object, username.object, 0, &credentials.secondary);
349: } else {
350: MakeSimpleCredsAndVerifier(0, pwd, &credentials.primary, &verifier);
351: MakeSecondaryCreds(hostobjname.object, name, pwd, &credentials.secondary);
352: }
353: filing_subset= TRUE;
354: DURING
355: logonresult = FilingSubset1_Logon(connected, NULL, hostobjname,
356: credentials, verifier);
357: HANDLER {
358: switch (Exception.Code) {
359: case REJECT_ERROR:
360: filing_subset= FALSE;
361: logonresult2= Filing4_Logon(connected, NULL, hostobjname,
362: credentials.primary, verifier);
363: resultptr= (FilingSubset1_LogonResults *) &logonresult2;
364: break;
365: default:
366: RERAISE;
367: }
368: } END_HANDLER;
369: }
370:
371: if ( filing_subset )
372: session = resultptr->session;
373: else
374: session = resultptr->session;
375:
376: attrseq.length= 0;
377: attrseq.sequence= 0;
378: if ( filing_subset ) {
379: openresult= FilingSubset1_Open(connected, NULL, attrseq,
380: FilingSubset1_nullHandle, nullControls,
381: session);
382: copyhandle(rootHandle, openresult.file);
383: } else {
384: openresult2= Filing4_Open(connected, NULL, attrseq,
385: FilingSubset1_nullHandle, nullControls,
386: session);
387: copyhandle(rootHandle, openresult2.file);
388: }
389: strcpy(cur_dir, ROOT_DIRECTORY);
390: }
391:
392: remotelist(remote)
393: char *remote;
394: {
395: FilingSubset1_Handle dirhandle; /* note: an array */
396: FilingSubset1_AttributeTypeSequence typeseq;
397: FilingSubset1_AttributeType tsvals[10];
398: FilingSubset1_ScopeSequence scopeseq;
399: FilingSubset1_Scope scope;
400:
401: typeseq.length = 0; typeseq.sequence = tsvals;
402: scopeseq.length= 1; scopeseq.sequence= &scope;
403: scope.designator= FilingSubset1_filter;
404: scope.FilingSubset1_filter_case.designator= FilingSubset1_matches;
405: if ( filing_subset )
406: scope.FilingSubset1_filter_case.FilingSubset1_matches_case.attribute.type= FilingSubset1_pathname;
407: else
408: scope.FilingSubset1_filter_case.FilingSubset1_matches_case.attribute.type= FilingSubset1_name;
409:
410: getdirhandle(remote, dirhandle);
411:
412: if ( filing_subset )
413: StringToAttr(cur_pathname,&scope.FilingSubset1_filter_case.FilingSubset1_matches_case.attribute);
414: else
415: StringToAttr(cur_name,&scope.FilingSubset1_filter_case.FilingSubset1_matches_case.attribute);
416:
417: typeseq.length = 2;
418: typeseq.sequence[0] = FilingSubset1_pathname;
419: typeseq.sequence[1] = FilingSubset1_type;
420:
421: ProcEachSeq = listproc;
422: if ( filing_subset )
423: FilingSubset1_List(connected, GetAttributeSequences, dirhandle,
424: typeseq, scopeseq,
425: BulkData1_immediateSink, session);
426: else
427: Filing4_List(connected, GetAttributeSequences, dirhandle,
428: typeseq, scopeseq,
429: BulkData1_immediateSink, session);
430:
431:
432: if ( !files_found )
433: fprintf(stderr, "\n(%s)%s not found\n", service, remote);
434:
435: freefilehandle(dirhandle);
436:
437: }
438:
439: listproc(attr)
440: FilingSubset1_AttributeSequence attr;
441: {
442: int i;
443: FilingSubset1_AttributeType t;
444: char *thisname, *name;
445: LongCardinal thistype;
446:
447: files_found= TRUE;
448:
449: for (i = 0; i < attr.length; i++) {
450: t = attr.sequence[i].type;
451: if (t == FilingSubset1_name || t == FilingSubset1_pathname) {
452: thisname = AttrToString(&attr.sequence[i]);
453: } else if (t == FilingSubset1_type) {
454: thistype = AttrToLongCardinal(&attr.sequence[i]);
455: }
456: }
457:
458: if ( (name= rindex(thisname, '/')) == 0 )
459: name= thisname;
460: else
461: name++;
462:
463: printf(" %s:\t%s\n", name, typetostring(thistype));
464: clear_String(&thisname);
465: }
466:
467:
468: #define MAXPACKS 20
469: static
470: GetAttributeSequences(conn)
471: CourierConnection *conn;
472: {
473: int count, i;
474: Unspecified buffer[MAXWORDS*MAXPACKS], *bp, *bufend;
475: FilingSubset1_StreamOfAttributeSequence attrs;
476:
477: files_found= FALSE;
478:
479: bufend = buffer;
480: bp = buffer+((MAXWORDS-1)*MAXPACKS); /* end of available space */
481: while ((count = BDTread(conn, (char*)bufend,
482: MAXWORDS*sizeof(Unspecified))) > 0) {
483: bufend += count/sizeof(Unspecified);
484: if (bufend > bp) {
485: fprintf(stderr,"BDT read too big to fit\n");
486: BDTabort(conn);
487: /* should clear out stuff here if we knew how much */
488: }
489: }
490: bp = buffer;
491: while (bp < bufend) {
492: bp += internalize_FilingSubset1_StreamOfAttributeSequence(&attrs,bp);
493: if (0 == (int) attrs.designator) {
494: for (i=0; i < attrs.nextSegment_case.segment.length; i++) {
495: (*ProcEachSeq)(
496: attrs.nextSegment_case.segment.sequence[i]);
497: }
498: free(attrs.nextSegment_case.segment.sequence);
499: } else {
500: for (i = 0; i < attrs.lastSegment_case.length; i++) {
501: (*ProcEachSeq)(
502: attrs.lastSegment_case.sequence[i]);
503: }
504: free(attrs.lastSegment_case.sequence);
505: return;
506: }
507: }
508: }
509:
510:
511: locallist(file)
512: char *file;
513: {
514: FILE *fin, *fopen();
515: int type;
516: char *dir, *slash;
517:
518: if ( strcmp(oldservice, myhostname) != 0 ) {
519: printf("\n\n(%s):\n", myhostname);
520: strcpy(oldservice, myhostname);
521: }
522:
523: if ( (slash= rindex(file, '/')) == 0 ) {
524: dir= mydir;
525: } else {
526: *slash= '\0';
527: dir= (slash == file ? "/" : file);
528: }
529:
530: if ( strcmp(dir, olddir) != 0 ) {
531: printf("\n%s:\n\n", dir);
532: strcpy(olddir, dir);
533: }
534:
535: if ( slash ) *slash= '/';
536:
537: if ( access(file, R_OK | F_OK ) == -1 ) {
538: fprintf(stderr, " %s:\tError ", (slash ? slash+1 : file));
539: perror("");
540: return;
541: }
542:
543: type= get_type(file);
544:
545: printf(" %s:\t%s\n", (slash ? slash+1 : file), typetostring(type));
546:
547: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.