|
|
1.1 root 1: /* ftamsbr.c - FTAM subroutines */
2:
3: #ifndef lint
4: static char *rcsid = "$Header: /f/osi/ftam2/RCS/ftamsbr.c,v 7.1 90/07/01 21:03:31 mrose Exp $";
5: #endif
6:
7: /*
8: * $Header: /f/osi/ftam2/RCS/ftamsbr.c,v 7.1 90/07/01 21:03:31 mrose Exp $
9: *
10: *
11: * $Log: ftamsbr.c,v $
12: * Revision 7.1 90/07/01 21:03:31 mrose
13: * pepsy
14: *
15: * Revision 7.0 89/11/23 21:54:37 mrose
16: * Release 6.0
17: *
18: */
19:
20: /*
21: * NOTICE
22: *
23: * Acquisition, use, and distribution of this module and related
24: * materials are subject to the restrictions of a license agreement.
25: * Consult the Preface in the User's Manual for the full terms of
26: * this agreement.
27: *
28: */
29:
30:
31: #include <ctype.h>
32: #include <stdio.h>
33: #include "ftamsbr.h"
34:
35: #ifdef BRIDGE
36: extern int vfs_fdf;
37: #endif
38:
39: extern struct vfsmap vfs[];
40:
41: /* */
42:
43: #ifdef BRIDGE
44: /* ARGSUSED */
45: #endif
46:
47: struct vfsmap *st2vfs (fd, file, st, proposed, ftamfd)
48: int fd;
49: char *file;
50: struct stat *st;
51: OID proposed;
52: int ftamfd;
53: {
54: #ifndef BRIDGE
55: register int fmt;
56: register struct vfsmap *lf;
57: #endif
58: register struct vfsmap *vf;
59:
60: #ifndef BRIDGE
61: fmt = st -> st_mode & S_IFMT;
62: #else
63: /* Return the suggested TYPE or Unstructured Text type for FTP bridge */
64: /* if during ftp_exist got multiple listing, return directory type */
65: if (ftp_directory)
66: return &vfs[vfs_fdf];
67: #endif
68:
69: if (proposed) {
70: for (vf = vfs; vf -> vf_entry; vf++)
71: if (vf -> vf_oid && oid_cmp (vf -> vf_oid, proposed) == 0) {
72: #ifdef BRIDGE
73: return vf;
74: }
75: #else
76: if ((vf -> vf_flags & VF_OK) && vf -> vf_mode == fmt) {
77: if (vf -> vf_peek
78: && (*vf -> vf_peek) (vf, fd, file, st, ftamfd)
79: == NOTOK)
80: break;
81:
82: return vf;
83: }
84:
85: break;
86: }
87:
88: if (!vf -> vf_entry)
89: return NULL;
90: #endif
91: }
92: #ifndef BRIDGE
93: else {
94: for (lf = vfs; lf -> vf_entry; lf++)
95: continue;
96: lf--;
97:
98: for (vf = lf; vf >= vfs; vf--)
99: if ((vf -> vf_flags & VF_OK) && vf -> vf_mode == fmt) {
100: if (vf -> vf_peek
101: && (*vf -> vf_peek) (vf, fd, file, st, ftamfd) != DONE)
102: continue;
103:
104: return vf;
105: }
106:
107: for (vf = lf; vf >= vfs; vf--)
108: if ((vf -> vf_flags & VF_OK)
109: && vf -> vf_mode == fmt
110: && vf -> vf_simplify != VFS_XXX)
111: break;
112: if (vf < vfs)
113: return NULL;
114: }
115:
116: /* let's hope there aren't any simplification loops! */
117:
118: while (vf -> vf_simplify != VFS_XXX) {
119: vf = &vfs[vf -> vf_simplify];
120:
121: if (vf -> vf_flags & VF_OK) {
122: if (vf -> vf_peek)
123: (void) (*vf -> vf_peek) (vf, fd, file, st, ftamfd);
124: return vf;
125: }
126: }
127:
128: return NULL;
129: #else
130: return &vfs[ftp_default];
131: #endif
132: }
133:
134: /* */
135:
136: int binarycheck (param, data)
137: caddr_t param;
138: char *data;
139: {
140: register struct type_DOCS_FTAM__3__Parameters *p3 =
141: (struct type_DOCS_FTAM__3__Parameters *) param;
142:
143: if (p3 -> optionals
144: & opt_DOCS_FTAM__3__Parameters_maximum__string__length) {
145: if (getenv ("UNISYS-FTAM"))
146: p3 -> maximum__string__length = 0;
147: else
148: p3 -> optionals &=
149: ~opt_DOCS_FTAM__3__Parameters_maximum__string__length;
150: }
151:
152: if ((p3 -> optionals
153: & opt_DOCS_FTAM__3__Parameters_string__significanz)
154: && p3 -> string__significanz
155: == int_DOCS_string__significanz_fixed) {
156: (void) strcpy (data,
157: "filestore does not support fixed-length strings");
158: return NOTOK;
159: }
160:
161:
162: return OK;
163: }
164:
165: /* */
166:
167: int textcheck (param, data)
168: caddr_t param;
169: char *data;
170: {
171: register struct type_DOCS_FTAM__1__Parameters *p1 =
172: (struct type_DOCS_FTAM__1__Parameters *) param;
173:
174: if (!(p1 -> optionals
175: & opt_DOCS_FTAM__1__Parameters_universal__class__number)) {
176: p1 -> optionals |= opt_DOCS_FTAM__1__Parameters_universal__class__number;
177: p1 -> universal__class__number = PE_DEFN_GENS;
178: }
179: switch (p1 -> universal__class__number) {
180: case PE_DEFN_GFXS:
181: case PE_DEFN_IA5S:
182: case PE_DEFN_GENS:
183: break;
184:
185: default:
186: (void) sprintf (data,
187: "filestore does not support strings of universal class number %d",
188: p1 -> universal__class__number);
189: return NOTOK;
190: }
191:
192: if (p1 -> optionals
193: & opt_DOCS_FTAM__1__Parameters_maximum__string__length) {
194: if (getenv ("UNISYS-FTAM")) {
195: p1 -> maximum__string__length = 0;
196: }
197: else
198: p1 -> optionals &=
199: ~opt_DOCS_FTAM__1__Parameters_maximum__string__length;
200: }
201:
202: if ((p1 -> optionals
203: & opt_DOCS_FTAM__1__Parameters_string__significance)
204: && p1 -> string__significance
205: == int_DOCS_string__significance_fixed) {
206: (void) strcpy (data,
207: "filestore does not support fixed-length strings");
208: return NOTOK;
209: }
210:
211:
212: return OK;
213: }
214:
215: /* */
216:
217: /* ARGSUSED */
218:
219: int binarypeek (vf, fd, file, st, ftamfd)
220: register struct vfsmap *vf;
221: int fd;
222: char *file;
223: struct stat *st;
224: int ftamfd;
225: {
226: static struct type_DOCS_FTAM__3__Parameters p3s;
227: register struct type_DOCS_FTAM__3__Parameters *p3 = &p3s;
228:
229: if (vf -> vf_parameter && (vf -> vf_flags & VF_PARM))
230: fre_obj (vf -> vf_parameter, _ZDOCS_mod.md_dtab[vf -> vf_number],
231: &_ZDOCS_mod);
232:
233: vf -> vf_parameter = (caddr_t) p3, vf -> vf_flags &= ~VF_PARM;
234:
235: p3 -> optionals = 0;
236:
237: if (getenv ("UNISYS-FTAM")) {
238: p3 -> optionals |=opt_DOCS_FTAM__3__Parameters_maximum__string__length;
239: p3 -> maximum__string__length = 0;
240: }
241:
242: p3 -> optionals |= opt_DOCS_FTAM__3__Parameters_string__significanz;
243: p3 -> string__significanz = int_DOCS_string__significanz_not__significant;
244:
245: return DONE;
246: }
247:
248: /* */
249:
250: /* Various textual repetories. In addition to the prohibited characters, on
251: UNIX we disallow CRs. This avoids funny CR-LF mappings. */
252:
253: /* Here's the assumptions we make for whether format-effectors are used:
254:
255: PrintableString - no
256: TeletexString - yes
257: VideotexString - yes (?)
258: IA5String - yes
259: GraphicString - no (?)
260: VisibleString - no (?)
261: GeneralString - yes (?)
262:
263: */
264:
265:
266: #define isIA5(c) (isprint (c) || (isspace (c) && (c) != '\r'))
267:
268:
269: /* ARGSUSED */
270:
271: int textpeek (vf, fd, file, st, ftamfd)
272: register struct vfsmap *vf;
273: int fd;
274: char *file;
275: struct stat *st;
276: int ftamfd;
277: {
278: #ifndef BRIDGE
279: int gd,
280: n;
281: register char *cp;
282: char buffer[BLKSIZE];
283: long pos;
284: #endif
285: static struct type_DOCS_FTAM__1__Parameters p1s;
286: register struct type_DOCS_FTAM__1__Parameters *p1 = &p1s;
287:
288: if (vf -> vf_parameter && (vf -> vf_flags & VF_PARM))
289: fre_obj (vf -> vf_parameter, _ZDOCS_mod.md_dtab[vf -> vf_number],
290: &_ZDOCS_mod);
291:
292: vf -> vf_parameter = (caddr_t) p1, vf -> vf_flags &= ~VF_PARM;
293:
294: p1 -> optionals = 0;
295:
296: p1 -> optionals |= opt_DOCS_FTAM__1__Parameters_universal__class__number;
297: p1 -> universal__class__number = PE_DEFN_GENS;
298:
299: if (getenv ("UNISYS-FTAM")) {
300: p1 -> optionals |=opt_DOCS_FTAM__1__Parameters_maximum__string__length;
301: p1 -> maximum__string__length = 0;
302: }
303:
304: p1 -> optionals |= opt_DOCS_FTAM__1__Parameters_string__significance;
305: switch (p1 -> universal__class__number) {
306: case PE_DEFN_GFXS:
307: if (getenv ("HP-FTAM")) {
308: p1 -> string__significance =
309: int_DOCS_string__significance_not__significant;
310: break;
311: } /* else fall... */
312: case PE_DEFN_PRTS:
313: case PE_DEFN_VISS:
314: p1 -> string__significance =
315: int_DOCS_string__significance_variable;
316: break;
317:
318: case PE_DEFN_T61S:
319: case PE_DEFN_VTXS:
320: case PE_DEFN_IA5S:
321: case PE_DEFN_GENS:
322: p1 -> string__significance =
323: int_DOCS_string__significance_not__significant;
324: break;
325: }
326:
327: #ifndef BRIDGE
328: if ((gd = fd) == NOTOK
329: && (file == NULLCP || (gd = open (file, O_RDONLY)) == NOTOK))
330: return OK;
331:
332: if (fd != NOTOK) {
333: pos = lseek (gd, 0L, L_INCR);
334: (void) lseek (gd, 0L, L_SET);
335: }
336: #ifndef MAXBSIZE
337: n = read (gd, buffer, sizeof buffer);
338: #else
339: n = 0 < st -> st_blksize && st -> st_blksize <= sizeof buffer
340: ? st -> st_blksize : sizeof buffer;
341: n = read (gd, buffer, n);
342: #endif
343: if (fd != NOTOK && pos != -1L)
344: (void) lseek (gd, pos, L_SET);
345:
346: if (fd == NOTOK)
347: (void) close (gd);
348:
349: for (cp = buffer + n - 1; cp >= buffer; cp--)
350: if (!isIA5 (*cp))
351: return NOTOK;
352: return DONE;
353: #else
354: return OK;
355: #endif
356: }
357:
358: /* */
359:
360: /* ARGSUSED */
361:
362: int fdfpeek (vf, fd, file, st, ftamfd)
363: register struct vfsmap *vf;
364: int fd;
365: char *file;
366: struct stat *st;
367: int ftamfd;
368: {
369: struct type_DOCS_NBS__9__Parameters *p9;
370: struct FTAMindication ftis;
371:
372: if (vf -> vf_parameter && (vf -> vf_flags & VF_PARM))
373: fre_obj (vf -> vf_parameter, _ZDOCS_mod.md_dtab[vf -> vf_number],
374: &_ZDOCS_mod);
375:
376: vf -> vf_parameter = NULLCP, vf -> vf_flags &= ~VF_PARM;
377:
378: if (fdf_names2p (ftamfd, FA_RDATTR, &p9, &ftis) == NOTOK)
379: return NOTOK;
380:
381: vf -> vf_parameter = (caddr_t) p9;
382:
383: return DONE;
384: }
385:
386: /* */
387:
388: /* If text, then need to worry about ESCape sequences for the various
389: repetoires (thank you, Digital!) For now, we'll recognize G0 and G1 from
390: the 8859-1 (latin) alphabet. Note that when sending a file, we do not
391: generate escape sequences...
392: */
393:
394:
395: int de2fd (fd, pe, text, effector)
396: int fd;
397: PE pe;
398: int text,
399: effector;
400: {
401: register int i,
402: n;
403: register char *bp,
404: *cp,
405: *ep;
406: register PE p;
407:
408: if (pe -> pe_form == PE_FORM_CONS) {
409: for (p = pe -> pe_cons, n = 0; p; p = p -> pe_next, n += i)
410: if ((i = de2fd (fd, p, text, 1)) == NOTOK)
411: return NOTOK;
412: goto outside;
413: }
414:
415: if (!text) {
416: n = pe -> pe_len;
417: if (write (fd, (char *) pe -> pe_prim, n) != n)
418: return NOTOK;
419: goto outside;
420: }
421:
422: n = 0;
423: cp = (char *) pe -> pe_prim;
424: for (ep = (bp = cp) + pe -> pe_len; bp < ep;)
425: switch (*bp) {
426: #ifndef BRIDGE
427: case '\r':
428: if (!effector) {
429: bp++;
430: break;
431: }
432: *bp++ = '\n';
433: i = bp - cp;
434: if (write (fd, cp, i) != i)
435: return NOTOK;
436: cp = ++bp, n += i;
437: break;
438: #endif
439:
440: case 033:
441: switch (*++bp) {
442: case 0x28: /* G0: 02/08 04/02 */
443: if (*++bp == 0x42) {
444: register char *dp;
445:
446: write_it: ;
447: dp = bp - 2;
448: if ((i = (dp - cp)) > 0
449: && write (fd, cp, i) != i)
450: return NOTOK;
451: cp = ++bp, n += i;
452: }
453: else
454: bp--;
455: break;
456:
457: case 0x2d: /* G1: 02/13 04/01 */
458: if (*++bp == 0x41)
459: goto write_it;
460: else
461: bp--;
462: break;
463:
464: default: /* unknown, pass it on... */
465: break;
466: }
467: break;
468:
469: default:
470: bp++;
471: break;
472: }
473:
474: if (i = bp - cp) {
475: if (write (fd, cp, i) != i)
476: return NOTOK;
477:
478: n += i;
479: }
480:
481: outside: ;
482: if (text && !effector) {
483: #ifndef BRIDGE
484: if (write (fd, "\n", 1) != 1)
485: #else
486: if (write (fd, "\r\n", 2) != 2)
487: #endif
488: return NOTOK;
489: }
490:
491: return n;
492: }
493:
494: /* */
495:
496: /* right from MH's sbr/path.c... */
497:
498: #define CWD "./"
499: #define NCWD (sizeof CWD - 1)
500: #define DOT "."
501: #define DOTDOT ".."
502: #define PWD "../"
503: #define NPWD (sizeof PWD - 1)
504:
505:
506: int compath (f)
507: register char *f;
508: {
509: register char *cp,
510: *dp;
511:
512: if (*f != '/')
513: return;
514:
515: for (cp = f; *cp;)
516: if (*cp == '/') {
517: switch (*++cp) {
518: case NULL:
519: if (--cp > f)
520: *cp = NULL;
521: break;
522:
523: case '/':
524: #ifdef apollo
525: if ((f+1) == cp) {
526: cp++;
527: continue;
528: }
529: #endif
530: for (dp = cp; *dp == '/'; dp++)
531: continue;
532: (void) strcpy (cp--, dp);
533: continue;
534:
535: case '.':
536: if (strcmp (cp, DOT) == 0) {
537: if (cp > f + 1)
538: cp--;
539: *cp = NULL;
540: break;
541: }
542: if (strcmp (cp, DOTDOT) == 0) {
543: for (cp -= 2; cp > f; cp--)
544: if (*cp == '/')
545: break;
546: if (cp <= f)
547: cp = f + 1;
548: *cp = NULL;
549: break;
550: }
551: if (strncmp (cp, PWD, NPWD) == 0) {
552: for (dp = cp - 2; dp > f; dp--)
553: if (*dp == '/')
554: break;
555: if (dp <= f)
556: dp = f;
557: (void) strcpy (dp, cp + NPWD - 1);
558: cp = dp;
559: continue;
560: }
561: if (strncmp (cp, CWD, NCWD) == 0) {
562: (void) strcpy (cp - 1, cp + NCWD - 1);
563: cp--;
564: continue;
565: }
566: continue;
567:
568: default:
569: cp++;
570: continue;
571: }
572: break;
573: }
574: else
575: cp++;
576: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.