|
|
1.1 root 1: /* ftamd-trans.c - FTAM responder -- transfer */
2:
3: #ifndef lint
4: static char *rcsid = "$Header: /f/osi/ftam2/RCS/ftamd-trans.c,v 7.2 90/07/01 21:03:28 mrose Exp $";
5: #endif
6:
7: /*
8: * $Header: /f/osi/ftam2/RCS/ftamd-trans.c,v 7.2 90/07/01 21:03:28 mrose Exp $
9: *
10: *
11: * $Log: ftamd-trans.c,v $
12: * Revision 7.2 90/07/01 21:03:28 mrose
13: * pepsy
14: *
15: * Revision 7.1 90/01/16 20:43:01 mrose
16: * last check-out
17: *
18: * Revision 7.0 89/11/23 21:54:33 mrose
19: * Release 6.0
20: *
21: */
22:
23: /*
24: * NOTICE
25: *
26: * Acquisition, use, and distribution of this module and related
27: * materials are subject to the restrictions of a license agreement.
28: * Consult the Preface in the User's Manual for the full terms of
29: * this agreement.
30: *
31: */
32:
33: #include <stdio.h>
34: #include "FTAM-types.h"
35: #include "ftamsystem.h"
36: #if defined(SYS5) && !defined(HPUX)
37: #include <sys/times.h>
38: #define TMS
39: #endif
40:
41: /* DATA */
42:
43: static int nbytes;
44:
45: long lseek ();
46:
47:
48: /* TRANSFER */
49:
50: int ftam_bulkbeginindication (ftg)
51: struct FTAMgroup *ftg;
52: {
53: int state;
54: struct FTAMgroup ftms;
55: struct FTAMgroup *ftm = &ftms;
56: struct FTAMindication ftis;
57: register struct FTAMindication *fti = &ftis;
58:
59: ftam_selection (ftg, ftm);
60:
61: if (ftm -> ftg_flags & FTG_SELECT)
62: state = ftm -> ftg_select.ftse_state;
63: else
64: state = ftm -> ftg_create.ftce_state;
65: if ((state != FSTATE_SUCCESS
66: || ((ftm -> ftg_flags & FTG_OPEN)
67: && ftm -> ftg_open.ftop_state != FSTATE_SUCCESS))
68: && myfd != NOTOK) {
69: #ifndef BRIDGE
70: unlock ();
71: #endif
72: (void) close (myfd);
73: myfd = NOTOK;
74: }
75:
76: if (FBulkBeginResponse (ftamfd, ftm, fti) == NOTOK)
77: ftam_adios (&fti -> fti_abort, "F-BULK-BEGIN.RESPONSE");
78:
79: FTGFREE (ftg);
80: }
81:
82: /* */
83:
84: /* we really pay the price here for not keeping more constraint set
85: information in the vfs structure...
86:
87: regular files have the unstructured constraint set
88: access context US
89:
90: directory files have the sequential flat constraint set
91: access context UA (is forced)
92:
93: Hence, when FADUs are transmitted, only data elements of type
94:
95: File-Contents-Data-Element
96:
97: are sent.
98: */
99:
100:
101: int ftam_readwriteindication (ftrw)
102: struct FTAMreadwrite *ftrw;
103: {
104: int result;
105: register struct FADUidentity *fa = &ftrw -> ftrw_identity;
106: struct FTAMdiagnostic diags[NFDIAG];
107: struct FTAMdiagnostic *dp = diags;
108: struct FTAMindication ftis;
109: register struct FTAMindication *fti = &ftis;
110:
111: mylocation = *fa; /* struct copy */
112: mylevel = ftrw -> ftrw_level;
113:
114: #ifdef BRIDGE
115: myoperation = ftrw -> ftrw_operation;
116: if (ftp_type (myvf - vfs) == NOTOK
117: && myoperation == FA_OPS_READ
118: && (mycontext = ftrw -> ftrw_context) != myvf -> vf_context) {
119: #else
120: if ((myoperation = ftrw -> ftrw_operation) == FA_OPS_READ
121: && (mycontext = ftrw -> ftrw_context) != myvf -> vf_context) {
122: #endif
123: dp -> ftd_type = DIAG_PERM;
124: dp -> ftd_identifier = FS_ACC_CTXSUPRT;
125: dp -> ftd_observer = dp -> ftd_source = EREF_RFSU;
126: dp -> ftd_delay = DIAG_NODELAY;
127: dp -> ftd_cc = 0;
128: dp++;
129:
130: goto do_cancel;
131: }
132:
133: switch (myvf - vfs) {
134: case VFS_UBF:
135: case VFS_UTF:
136: default:
137: if (fa -> fa_type != FA_FIRSTLAST
138: || fa -> fa_firstlast != FA_FIRST) {
139: dp -> ftd_type = DIAG_PERM;
140: dp -> ftd_identifier = FS_ACC_FADULOC;
141: dp -> ftd_observer = EREF_RFSU, dp -> ftd_source = EREF_IFSU;
142: dp -> ftd_delay = DIAG_NODELAY;
143: dp -> ftd_cc = 0;
144: dp++;
145:
146: goto do_cancel;
147: }
148: break;
149: }
150:
151: switch (myoperation) {
152: case FA_OPS_READ:
153: default:
154: advise (LLOG_NOTICE, NULLCP, "read %s", myfile);
155: break;
156:
157: case FA_OPS_INSERT: /* not valid on an FDF */
158: dp -> ftd_type = DIAG_PERM;
159: dp -> ftd_identifier = FS_ACC_INSERT;
160: dp -> ftd_observer = dp -> ftd_source = EREF_RFSU;
161: dp -> ftd_delay = DIAG_NODELAY;
162: dp -> ftd_cc = 0;
163: dp++;
164: goto do_cancel;
165:
166: case FA_OPS_REPLACE:
167: #ifdef BRIDGE
168: if ((myfd = ftp_write (myfile)) == NOTOK) {
169: #else
170: if (statok && myst.st_size == 0)
171: goto replace;
172: #ifdef SUNOS4
173: if (ftruncate (myfd, (off_t) 0) == NOTOK) {
174: #else
175: if (ftruncate (myfd, 0) == NOTOK) {
176: #endif
177: #endif
178: bad_operation: ;
179: dp -> ftd_type = DIAG_PERM;
180: dp -> ftd_identifier = myoperation == FA_OPS_REPLACE
181: ? FS_ACC_REPLACE : FS_ACC_INSERT;
182: dp -> ftd_observer = dp -> ftd_source = EREF_RFSU;
183: dp -> ftd_delay = DIAG_NODELAY;
184: #ifdef BRIDGE
185: (void) strcpy (dp -> ftd_data, ftp_error);
186: #else
187: (void) strcpy (dp -> ftd_data, sys_errname (errno));
188: #endif
189: dp -> ftd_cc = strlen (dp -> ftd_data);
190: dp++;
191: goto do_cancel;
192: }
193: #ifndef BRIDGE
194: replace: ;
195: #endif
196: advise (LLOG_NOTICE, NULLCP, "replace %s", myfile);
197: break;
198:
199: case FA_OPS_EXTEND:
200: #ifdef BRIDGE
201: if ((myfd = ftp_append (myfile)) == NOTOK)
202: #else
203: if (lseek (myfd, 0L, L_XTND) == (long) NOTOK)
204: #endif
205: goto bad_operation;
206: advise (LLOG_NOTICE, NULLCP, "extend %s", myfile);
207: break;
208: }
209:
210: FTRWFREE (ftrw);
211:
212: timer (nbytes = 0, NULLCP);
213: if (myoperation != FA_OPS_READ)
214: return;
215:
216: switch (myvf - vfs) {
217: case VFS_UTF:
218: case VFS_UBF:
219: default:
220: result = uxfget (&dp);
221: break;
222:
223: case VFS_FDF:
224: result = fdfget (&dp);
225: break;
226: }
227:
228: if (result != NOTOK)
229: return;
230:
231: do_cancel: ;
232: FTRWFREE (ftrw);
233:
234: if (FCancelRequest (ftamfd, FACTION_PERM, NULLPE, diags, dp - diags, fti)
235: == NOTOK)
236: ftam_adios (&fti -> fti_abort, "F-CANCEL-REQUEST");
237:
238: if (fti -> fti_type == FTI_CANCEL) {
239: register struct FTAMcancel *ftcn = &fti -> fti_cancel;
240:
241: advise (LLOG_NOTICE, NULLCP, "F-CANCEL.RESPONSE: %d",
242: ftcn -> ftcn_action);
243: ftam_diag (ftcn -> ftcn_diags, ftcn -> ftcn_ndiag);
244: FTCNFREE (ftcn);
245: }
246: }
247:
248: /* */
249:
250: static uxfget (diags)
251: register struct FTAMdiagnostic **diags;
252: {
253: register int n;
254: int bsize,
255: effector,
256: gd,
257: magic,
258: nc,
259: size;
260: PE pe,
261: de;
262: register struct FTAMdiagnostic *dp = *diags;
263: struct FTAMindication ftis;
264: register struct FTAMindication *fti = &ftis;
265: register struct FTAMabort *fta = &fti -> fti_abort;
266: register struct type_DOCS_FTAM__1__Parameters *p1;
267: register struct type_DOCS_FTAM__3__Parameters *p3;
268: FILE *fp;
269: #ifdef BRIDGE
270: char line[BUFSIZ];
271: #endif
272:
273: #ifdef BRIDGE
274: /* try opening file for ftp read */
275: if ((myfd = ftp_read (myfile)) == NOTOK){
276: dp -> ftd_type = DIAG_PERM;
277: dp -> ftd_identifier = FS_ACC_LCL;
278: dp -> ftd_observer = dp -> ftd_source = EREF_RFSU;
279: dp -> ftd_delay = DIAG_NODELAY;
280: (void) strcpy (dp -> ftd_data, "failed file access on remote host");
281: dp -> ftd_cc = strlen (dp -> ftd_data);
282: dp++;
283:
284: *diags = dp;
285: return NOTOK;
286: }
287: #endif
288:
289: effector = 1;
290: switch (myvf - vfs) {
291: case VFS_UTF:
292: p1 = (struct type_DOCS_FTAM__1__Parameters *) myparam;
293: if ((gd = dup (myfd)) == NOTOK
294: || (fp = fdopen (gd, "r")) == NULL) {
295: if (gd != NOTOK)
296: (void) close (gd);
297: if (myfd != NOTOK){
298: #ifdef BRIDGE
299: (void) close (myfd);
300: myfd = NOTOK;
301: (void) ftp_reply ();
302: #endif
303: }
304: goto no_mem;
305: }
306:
307: {
308: PElementID id;
309:
310: if (p1 -> optionals
311: & opt_DOCS_FTAM__1__Parameters_universal__class__number)
312: id = (PElementID) p1 -> universal__class__number;
313: else
314: id = PE_DEFN_GFXS;
315:
316: pe = pe_alloc (PE_CLASS_UNIV, PE_FORM_PRIM, id);
317:
318: switch (pe -> pe_id) {
319: case PE_DEFN_GFXS:
320: if (getenv ("HP-FTAM")) {
321: effector = 1;
322: break;
323: } /* else fall... */
324: case PE_DEFN_PRTS:
325: case PE_DEFN_VISS:
326: effector = 0;
327: break;
328:
329: case PE_DEFN_T61S:
330: case PE_DEFN_VTXS:
331: case PE_DEFN_IA5S:
332: case PE_DEFN_GENS:
333: effector = 1;
334: break;
335:
336: default:
337: break;
338: }
339: }
340: if ((magic = fadusize - MAGIC_OCTET1) < 0)
341: magic = 0;
342: break;
343:
344: case VFS_UBF:
345: p3 = (struct type_DOCS_FTAM__3__Parameters *) myparam;
346: /* and fall */
347: default:
348: fp = NULL;
349:
350: pe = pe_alloc (PE_CLASS_UNIV, PE_FORM_PRIM, PE_PRIM_OCTS);
351: if ((magic = fadusize - MAGIC_SINGLE) < 0)
352: magic = 0;
353: break;
354: }
355: if (pe == NULLPE)
356: goto no_mem;
357: pe -> pe_context = myvf -> vf_id;
358:
359: #ifdef BRIDGE
360: bsize = BUFSIZ << 2;
361: size = magic >= bsize ? magic : bsize;
362: if (size > bsize)
363: size -= size % bsize;
364: #else
365: #ifndef MAXBSIZE
366: bsize = BUFSIZ;
367: #else
368: bsize = myst.st_blksize > 0 ? myst.st_blksize : BUFSIZ;
369: #endif
370: size = (1024 <= magic && magic < bsize) ? magic : bsize;
371: #endif
372: switch (myvf - vfs) {
373: case VFS_UTF:
374: if ((p1 -> optionals
375: & opt_DOCS_FTAM__1__Parameters_maximum__string__length)
376: && p1 -> maximum__string__length > 0)
377: size = p1 -> maximum__string__length;
378: break;
379:
380: case VFS_UBF:
381: if ((p3 -> optionals
382: & opt_DOCS_FTAM__3__Parameters_maximum__string__length)
383: && p3 -> maximum__string__length > 0)
384: size = p3 -> maximum__string__length;
385: /* and fall */
386: default:
387: break;
388: }
389:
390: if (debug)
391: advise (LLOG_DEBUG, NULLCP, "effector=%d id=0x%x size=%d",
392: effector, pe -> pe_id, size);
393:
394: if ((pe -> pe_prim = PEDalloc (pe -> pe_len = size)) == NULLPED) {
395: no_mem: ;
396: dp -> ftd_type = DIAG_PERM;
397: dp -> ftd_identifier = FS_ACC_LCL;
398: dp -> ftd_observer = dp -> ftd_source = EREF_RFSU;
399: dp -> ftd_delay = DIAG_NODELAY;
400: (void) strcpy (dp -> ftd_data, "out of memory");
401: dp -> ftd_cc = strlen (dp -> ftd_data);
402: dp++;
403:
404: error_return: ;
405: (void) de2fadu (NULLPE, 0);
406: if (pe)
407: pe_free (pe);
408: if (fp)
409: (void) fclose (fp);
410: *diags = dp;
411: return NOTOK;
412: }
413:
414: for (;;) {
415: register char *bp,
416: *ep;
417:
418: for (ep = (bp = (char *) pe -> pe_prim) + size - (fp ? 2 : 0), nc = 0;
419: bp < ep; ) {
420: if (fp) {
421: register char *cp;
422:
423: #ifdef BRIDGE
424: if (strlen (line) || fgets (line, BUFSIZ, fp)) {
425: if ((strlen (line) + 1) < (ep - bp + 1)) {
426: (void) strcpy (bp, line);
427: line[0] = NULL;
428: }
429: else
430: break;
431: }
432: else {
433: n = (ferror (fp) && !feof (fp)) ? NOTOK : OK;
434: break;
435: }
436: #else
437: if (fgets (bp, ep - bp + 1, fp) == NULL) {
438: n = (ferror (fp) && !feof (fp)) ? NOTOK : OK;
439: break;
440: }
441: #endif
442: cp = bp + strlen (bp) - 1;
443: if (!effector) {
444: if (*cp == '\n') {
445: #ifndef BRIDGE
446: *cp = NULL;
447: #else
448: if (cp > bp) {
449: if (*--cp == '\r')
450: *cp = NULL;
451: else
452: *++cp = NULL;
453: }
454: else
455: *cp = NULL;
456: #endif
457: n = cp - bp;
458: bp = cp;
459: }
460: else { /* XXX: losing! */
461: n = cp - bp + 1;
462: bp = cp + 1;
463: }
464: }
465: else {
466: if (*cp == '\n') {
467: #ifndef BRIDGE
468: *cp++ = '\r';
469: #endif
470: *cp++ = '\n';
471: n = cp - bp;
472: bp = cp;
473: nc++;
474: continue;
475: }
476:
477: n = cp - bp + 1;
478: bp = cp + 1;
479: }
480: }
481: else {
482: switch (n = read (myfd, bp, ep - bp)) {
483: case NOTOK:
484: case OK:
485: break;
486:
487: default:
488: bp += n;
489: continue;
490: }
491: }
492: break;
493: }
494: if (n == NOTOK || (n = bp - (char *) pe -> pe_prim) == 0)
495: break;
496: pe -> pe_len = n;
497:
498: if (fp && !effector) {
499: if ((de = pe_cpy (pe)) == NULLPE)
500: goto no_mem;
501: }
502: else
503: de = pe;
504:
505: if (debug)
506: if (fp) {
507: WATCHP (DOCS_FTAM__1__Datatype1, de, 0);
508: }
509: else
510: WATCHP (DOCS_FTAM__3__Datatype1, de, 0);
511:
512:
513: switch (de2fadu (de, pe != de ? 1 : 0)) {
514: case NOTOK:
515: dp -> ftd_type = DIAG_PERM;
516: dp -> ftd_identifier = FS_ACC_LCL;
517: dp -> ftd_observer = dp -> ftd_source = EREF_RFSU;
518: dp -> ftd_delay = DIAG_NODELAY;
519: dp -> ftd_cc = 0;
520: dp++;
521: goto error_return;
522:
523: case OK:
524: default:
525: nbytes += (n - nc), nc = 0;
526: continue;
527:
528: case DONE:
529: break;
530: }
531: break;
532: }
533:
534: pe_free (pe);
535:
536: if (fp)
537: (void) fclose (fp);
538:
539: if (n == DONE)
540: return DONE;
541:
542: if (n == NOTOK) {
543: dp -> ftd_type = DIAG_PERM;
544: dp -> ftd_identifier = FS_ACC_LCLDEV;
545: dp -> ftd_observer = dp -> ftd_source = EREF_RFSU;
546: dp -> ftd_delay = DIAG_NODELAY;
547: (void) strcpy (dp -> ftd_data, sys_errname (errno));
548: dp -> ftd_cc = strlen (dp -> ftd_data);
549: dp++;
550:
551: *diags = dp;
552:
553: (void) de2fadu (NULLPE, 0);
554: return NOTOK;
555: }
556:
557: n = de2fadu (NULLPE, 1);
558:
559: if (n != DONE) {
560: timer (nbytes, "sent");
561:
562: if (FDataEndRequest (ftamfd, FACTION_SUCCESS,
563: (struct FTAMdiagnostic *) 0, 0, fti) == NOTOK)
564: ftam_adios (fta, "F-DATA-END.REQUEST");
565: }
566:
567: return n;
568: }
569:
570: /* */
571:
572: static fdfget (diags)
573: register struct FTAMdiagnostic **diags;
574: {
575: int names,
576: len,
577: n;
578: char *pp,
579: path[MAXPATHLEN];
580: PE pe;
581: #ifdef BRIDGE
582: int dd;
583: FILE *df;
584: char *ptr,
585: line[BUFSIZ];
586: #else
587: register struct dirent *d;
588: register DIR *dd;
589: #endif
590: struct stat st;
591: register struct FTAMdiagnostic *dp = *diags;
592: struct FTAMindication ftis;
593: register struct FTAMindication *fti = &ftis;
594: register struct FTAMabort *fta = &fti -> fti_abort;
595: register struct type_DOCS_NBS__9__Parameters *p9;
596: struct type_DOCS_NBS__9__Datatype1 *d9;
597:
598: if (strcmp (myfile, ".") == 0) {
599: pp = path;
600: *pp = NULL;
601: len = 0;
602: }
603: else
604: #ifdef apollo
605: if (strcmp (myfile, "/") == 0 || strcmp (myfile, "//") == 0) {
606: (void) sprintf (pp = path, "%s", myfile);
607: pp += (len = strlen (pp));
608: }
609: else
610: #endif
611: {
612: (void) sprintf (pp = path, "%s/", myfile);
613: pp += (len = strlen (pp));
614: }
615:
616: pe = NULLPE;
617:
618: #ifdef BRIDGE
619: if ((dd = ftp_ls (myfile)) == NOTOK || (df = fdopen (dd,"r")) == NULL) {
620: #else
621: if ((dd = opendir (myfile)) == NULL) {
622: #endif
623: no_mem: ;
624: dp -> ftd_type = DIAG_PERM;
625: dp -> ftd_identifier = FS_ACC_LCL;
626: dp -> ftd_observer = dp -> ftd_source = EREF_RFSU;
627: dp -> ftd_delay = DIAG_NODELAY;
628: (void) strcpy (dp -> ftd_data, "out of memory");
629: dp -> ftd_cc = strlen (dp -> ftd_data);
630: dp++;
631:
632: error_return: ;
633: (void) de2fadu (NULLPE, 0);
634: if (pe)
635: pe_free (pe);
636: #ifdef BRIDGE
637: if (dd) {
638: (void) close (dd);
639: (void) ftp_reply ();
640: }
641: #else
642: if (dd)
643: (void) closedir (dd);
644: #endif
645: *diags = dp;
646: return NOTOK;
647: }
648:
649:
650: p9 = (struct type_DOCS_NBS__9__Parameters *) myparam;
651: if (fdf_p2names (ftamfd, p9, &names, fti) == NOTOK) {
652: register struct FTAMdiagnostic *d2 = fti -> fti_abort.fta_diags;
653:
654: dp = d2; /* struct copy */
655: dp++;
656: goto error_return;
657: }
658:
659: n = OK;
660: #ifdef BRIDGE
661: while (fgets(line, BUFSIZ, df)) {
662: #else
663: for (errno = 0; d = readdir (dd); errno = 0) {
664: #endif
665: struct FTAMattributes fas;
666: register struct FTAMattributes *fa = &fas;
667: #ifndef BRIDGE
668: register struct vfsmap *vf;
669: #endif
670:
671: #ifdef BRIDGE
672: if (ptr = rindex(line,'\r'))
673: *ptr = '\0';
674: #endif
675:
676: if (debug)
677: #ifdef BRIDGE
678: advise (LLOG_DEBUG, NULLCP, "len=%d name=\"%s\"",
679: strlen(line), line);
680: #else
681: advise (LLOG_DEBUG, NULLCP, "ino=%ld len=%d name=\"%s\"",
682: d -> d_ino, strlen (d -> d_name), d -> d_name);
683: #endif
684:
685: #ifndef BRIDGE
686: if (!d -> d_ino)
687: continue;
688: #endif
689:
690: #ifdef BRIDGE
691: if (len + strlen (line) >= MAXPATHLEN)
692: #else
693: if (len + strlen (d -> d_name) >= MAXPATHLEN)
694: #endif
695: continue;
696:
697: #ifdef BRIDGE
698: (void) strcpy (pp, line);
699: #else
700: (void) strcpy (pp, d -> d_name);
701: #endif
702:
703: #ifndef BRIDGE
704: if (stat (path, &st) == NOTOK
705: || (vf = st2vfs (NOTOK, path, &st, NULLOID, ftamfd)) == NULL)
706: continue;
707: #endif
708:
709: bzero ((char *) fa, sizeof *fa);
710: *diags = dp;
711: #ifdef BRIDGE
712: (void) readattrs (names, fa, vfs[VFS_UTF].vf_oid, NULLPE, path, &st,
713: diags);
714: #else
715: (void) readattrs (names, fa, vf -> vf_oid, NULLPE, path, &st, diags);
716: #endif
717: dp = *diags;
718:
719: if (fdf_attrs2d (ftamfd, fa, &d9, fti) == NOTOK) {
720: register struct FTAMdiagnostic *d2 = fti -> fti_abort.fta_diags;
721:
722: dp = d2; /* struct copy */
723: dp++;
724: goto error_return;
725: }
726:
727: if (encode_DOCS_NBS__9__Datatype1 (&pe, 1, 0, NULLCP, d9) == NOTOK) {
728: dp -> ftd_type = DIAG_PERM;
729: dp -> ftd_identifier = FS_ACC_LCL;
730: dp -> ftd_observer = dp -> ftd_source = EREF_RFSU;
731: dp -> ftd_delay = DIAG_NODELAY;
732: (void) sprintf (dp -> ftd_data, "error encoding Datatype1: %s",
733: PY_pepy);
734: dp -> ftd_cc = strlen (dp -> ftd_data);
735: dp++;
736:
737: free_DOCS_NBS__9__Datatype1 (d9);
738: goto error_return;
739: }
740: pe -> pe_context = myvf -> vf_id;
741:
742: if (debug)
743: WATCHP (DOCS_NBS__9__Datatype1, pe, 0);
744:
745: n = de2fadu (pe, 1), pe = NULLPE;
746: switch (n) {
747: case NOTOK:
748: goto no_mem;
749:
750: case OK:
751: default:
752: continue;
753:
754: case DONE:
755: break;
756: }
757: break;
758: }
759:
760: #ifdef BRIDGE
761: (void) fclose (df);
762: (void) close (dd);
763: (void) ftp_reply ();
764: #else
765: if (errno != 0) {
766: dp -> ftd_type = DIAG_PERM;
767: dp -> ftd_identifier = FS_ACC_LCL;
768: dp -> ftd_observer = dp -> ftd_source = EREF_RFSU;
769: dp -> ftd_delay = DIAG_NODELAY;
770: (void) sprintf (dp -> ftd_data, "%s: %s", myfile, sys_errname (errno));
771: dp -> ftd_cc = strlen (dp -> ftd_data);
772: dp++;
773:
774: goto error_return;
775:
776: }
777: (void) closedir (dd);
778: #endif
779:
780: if (n == OK)
781: n = de2fadu (NULLPE, 1);
782:
783: switch (n) {
784: case DONE:
785: return DONE;
786:
787: case OK:
788: default:
789: if (FDataEndRequest (ftamfd, FACTION_SUCCESS,
790: (struct FTAMdiagnostic *) 0, 0, fti) == NOTOK)
791: ftam_adios (fta, "F-DATA-END.REQUEST");
792: return OK;
793: }
794: }
795:
796: /* */
797:
798: static int de2fadu (pe, concat)
799: PE pe;
800: int concat;
801: {
802: struct FTAMindication ftis;
803: register struct FTAMindication *fti = &ftis;
804: register struct FTAMabort *fta = &fti -> fti_abort;
805: static int ninfo = 0;
806: static int size = 0;
807: static PE info[NPDATA];
808:
809: if (pe == NULLPE) {
810: if (concat
811: && ninfo > 0
812: && FDataRequest (ftamfd, info, ninfo, fti) == NOTOK)
813: ftam_adios (fta, "F-DATA.REQUEST");
814:
815: while (ninfo > 0)
816: pe_free (info[--ninfo]);
817: size = 0;
818:
819: return OK;
820: }
821:
822: if (concat) {
823: int flush,
824: n;
825:
826: if (size + (n = ps_get_abs (pe) + MAGIC_OCTET2) >= fadusize
827: && ninfo > 0) {
828: if (debug)
829: advise (LLOG_DEBUG, NULLCP,
830: "de2fadu flushing on %d FADUs, estimated size %d/%d",
831: ninfo, size, fadusize);
832:
833: (void) de2fadu (NULLPE, 1);
834: flush = 1;
835: }
836: else
837: flush = 0;
838:
839: info[ninfo++] = pe;
840: size += n;
841:
842: if (ninfo < NPDATA && size < fadusize) {
843: if (!flush)
844: return OK;
845: }
846: else {
847: if (FDataRequest (ftamfd, info, ninfo, fti) == NOTOK)
848: ftam_adios (fta, "F-DATA.REQUEST");
849:
850: while (ninfo > 0)
851: pe_free (info[--ninfo]);
852: size = 0;
853: }
854: }
855: else
856: if (FDataRequest (ftamfd, &pe, 1, fti) == NOTOK)
857: ftam_adios (fta, "F-DATA.REQUEST");
858:
859: if (FWaitRequest (ftamfd, OK, fti) == NOTOK) {
860: if (fta -> fta_peer
861: || fta -> fta_action != FACTION_TRANS
862: || fta -> fta_ndiag < 1
863: || fta -> fta_diags[0].ftd_type != DIAG_TRANS
864: || fta -> fta_diags[0].ftd_identifier != FS_PRO_TIMEOUT)
865: ftam_adios (fta, "F-WAIT.REQUEST");
866:
867: return OK;
868: }
869:
870: if (fti -> fti_type == FTI_CANCEL) {
871: register struct FTAMcancel *ftcn = &fti -> fti_cancel;
872:
873: advise (LLOG_NOTICE, NULLCP, "F-CANCEL.INDICATION: %d",
874: ftcn -> ftcn_action);
875: ftam_diag (ftcn -> ftcn_diags, ftcn -> ftcn_ndiag);
876: FTCNFREE (ftcn);
877:
878: if (FCancelResponse (ftamfd, FACTION_SUCCESS, NULLPE,
879: (struct FTAMdiagnostic *) 0, 0, fti) == NOTOK)
880: ftam_adios (fta, "F-CANCEL.RESPONSE");
881: }
882:
883: return DONE;
884: }
885:
886: /* */
887:
888: int ftam_dataindication (px)
889: register struct PSAPdata *px;
890: {
891: register int i;
892: int effector,
893: n;
894: register PE pe,
895: *pep;
896: struct FTAMdiagnostic diags[NFDIAG];
897: register struct FTAMdiagnostic *dp = diags;
898: struct FTAMindication ftis;
899: register struct FTAMindication *fti = &ftis;
900:
901: effector = 1;
902: switch (myvf - vfs) {
903: case VFS_UBF:
904: default:
905: break;
906:
907: case VFS_UTF:
908: {
909: PElementID id;
910: register struct type_DOCS_FTAM__1__Parameters *p1 =
911: (struct type_DOCS_FTAM__1__Parameters *) myparam;
912:
913: if (p1 -> optionals
914: & opt_DOCS_FTAM__1__Parameters_universal__class__number)
915: id = (PElementID) p1 -> universal__class__number;
916: else
917: id = PE_DEFN_GFXS;
918: switch (id) {
919: case PE_DEFN_GFXS:
920: if (getenv ("HP-FTAM")) {
921: effector = 1;
922: break;
923: } /* else fall... */
924: case PE_DEFN_PRTS:
925: case PE_DEFN_VISS:
926: effector = 0;
927: break;
928:
929: case PE_DEFN_T61S:
930: case PE_DEFN_VTXS:
931: case PE_DEFN_IA5S:
932: case PE_DEFN_GENS:
933: effector = 1;
934: break;
935:
936: default:
937: break;
938: }
939: }
940: break;
941: }
942:
943: for (pep = px -> px_info, i = px -> px_ninfo - 1; i >= 0; pep++, i--) {
944: if ((pe = *pep) == NULLPE)
945: continue;
946:
947: switch (myvf - vfs) {
948: case VFS_UBF:
949: default:
950: if (debug)
951: WATCHP (DOCS_FTAM__3__Datatype1, pe, 1);
952: n = de2fd (myfd, pe, 0, 0);
953: break;
954:
955: case VFS_UTF:
956: if (debug)
957: WATCHP (DOCS_FTAM__1__Datatype1, pe, 1);
958: n = de2fd (myfd, pe, 1, effector);
959: break;
960: }
961:
962: if (n != NOTOK) {
963: nbytes += n;
964: continue;
965: }
966:
967: dp -> ftd_type = DIAG_PERM;
968: switch (errno) {
969: case ENOSPC:
970: dp -> ftd_identifier = FS_ACC_LCLSPACE;
971: dp -> ftd_cc = 0;
972: break;
973:
974: case EIO:
975: case ENXIO:
976: dp -> ftd_identifier = FS_ACC_LCLDEV;
977: dp -> ftd_cc = 0;
978: break;
979:
980: default:
981: dp -> ftd_identifier = FS_ACC_WRITE;
982: (void) strcpy (dp -> ftd_data, sys_errname (errno));
983: dp -> ftd_cc = strlen (dp -> ftd_data);
984: break;
985: }
986: dp -> ftd_observer = dp -> ftd_source = EREF_RFSU;
987: dp -> ftd_delay = DIAG_NODELAY;
988: dp++;
989:
990: if (FCancelRequest (ftamfd, FACTION_PERM, NULLPE, diags, dp - diags,
991: fti) == NOTOK)
992: ftam_adios (&fti -> fti_abort, "F-CANCEL-REQUEST");
993:
994: if (fti -> fti_type == FTI_CANCEL) {
995: register struct FTAMcancel *ftcn = &fti -> fti_cancel;
996:
997: advise (LLOG_NOTICE, NULLCP, "F-CANCEL.RESPONSE: %d",
998: ftcn -> ftcn_action);
999: ftam_diag (ftcn -> ftcn_diags, ftcn -> ftcn_ndiag);
1000: FTCNFREE (ftcn);
1001: }
1002: break;
1003: }
1004:
1005: PXFREE (px);
1006: }
1007:
1008: /* */
1009:
1010: /* ARGSUSED */
1011:
1012: int ftam_dataendindication (ftda)
1013: struct FTAMdataend *ftda;
1014: {
1015: timer (nbytes, "received");
1016:
1017: #ifndef SYS5
1018: if (ftda -> ftda_action == FACTION_SUCCESS)
1019: (void) fsync (myfd);
1020: #endif
1021: }
1022:
1023: /* */
1024:
1025: int ftam_cancelindication (ftcn)
1026: register struct FTAMcancel *ftcn;
1027: {
1028: struct FTAMindication ftis;
1029: register struct FTAMindication *fti = &ftis;
1030:
1031: advise (LLOG_NOTICE, NULLCP, "F-CANCEL.INDICATION: %d",
1032: ftcn -> ftcn_action);
1033: ftam_diag (ftcn -> ftcn_diags, ftcn -> ftcn_ndiag);
1034: FTCNFREE (ftcn);
1035:
1036: if (FCancelResponse (ftamfd, FACTION_SUCCESS, NULLPE,
1037: (struct FTAMdiagnostic *) 0, 0, fti) == NOTOK)
1038: ftam_adios (&fti -> fti_abort, "F-CANCEL.RESPONSE");
1039: }
1040:
1041: /* */
1042:
1043: /* ARGSUSED */
1044:
1045: int ftam_transendindication (ftre)
1046: struct FTAMtransend *ftre;
1047: {
1048: struct FTAMindication ftis;
1049: register struct FTAMindication *fti = &ftis;
1050:
1051: if (FTransEndResponse (ftamfd, FACTION_SUCCESS, NULLPE,
1052: (struct FTAMdiagnostic *) 0, 0, fti) == NOTOK)
1053: ftam_adios (&fti -> fti_abort, "F-TRANSFER-END.RESPONSE");
1054: }
1055:
1056: /* */
1057:
1058: int ftam_bulkendindication (ftg)
1059: struct FTAMgroup *ftg;
1060: {
1061: struct FTAMgroup ftms;
1062: struct FTAMgroup *ftm = &ftms;
1063: struct FTAMindication ftis;
1064: register struct FTAMindication *fti = &ftis;
1065:
1066: ftam_selection (ftg, ftm);
1067:
1068: if (myfd != NOTOK) {
1069: #ifdef BRIDGE
1070: (void) close (myfd);
1071: (void) ftp_reply ();
1072: #else
1073: unlock ();
1074: (void) close (myfd);
1075: #endif
1076: myfd = NOTOK;
1077: }
1078:
1079: if (FBulkEndResponse (ftamfd, ftm, fti) == NOTOK)
1080: ftam_adios (&fti -> fti_abort, "F-BULK-END.RESPONSE");
1081:
1082: FTGFREE (ftg);
1083: }
1084:
1085: /* */
1086:
1087: #ifndef NBBY
1088: #define NBBY 8
1089: #endif
1090:
1091:
1092: #ifndef TMS
1093: timer (cc, action)
1094: int cc;
1095: char *action;
1096: {
1097: long ms;
1098: float bs;
1099: struct timeval stop,
1100: td;
1101: static struct timeval start;
1102:
1103: if (cc == 0) {
1104: (void) gettimeofday (&start, (struct timezone *) 0);
1105: return;
1106: }
1107: else
1108: (void) gettimeofday (&stop, (struct timezone *) 0);
1109:
1110: tvsub (&td, &stop, &start);
1111: ms = (td.tv_sec * 1000) + (td.tv_usec / 1000);
1112: bs = (((float) cc * NBBY * 1000) / (float) (ms ? ms : 1)) / NBBY;
1113:
1114: advise (LLOG_NOTICE, NULLCP,
1115: "%d bytes %s in %d.%02d seconds (%.2f Kbytes/s)",
1116: cc, action, td.tv_sec, td.tv_usec / 10000, bs / 1024);
1117: }
1118:
1119:
1120: static tvsub (tdiff, t1, t0)
1121: register struct timeval *tdiff,
1122: *t1,
1123: *t0;
1124: {
1125:
1126: tdiff -> tv_sec = t1 -> tv_sec - t0 -> tv_sec;
1127: tdiff -> tv_usec = t1 -> tv_usec - t0 -> tv_usec;
1128: if (tdiff -> tv_usec < 0)
1129: tdiff -> tv_sec--, tdiff -> tv_usec += 1000000;
1130: }
1131:
1132: #else
1133: #ifndef HZ
1134: #define HZ 60
1135: #endif
1136:
1137:
1138: long times ();
1139:
1140:
1141: static timer (cc, action)
1142: int cc;
1143: char *action;
1144: {
1145: long ms;
1146: float bs;
1147: long stop,
1148: td,
1149: secs,
1150: msecs;
1151: struct tms tm;
1152: static long start;
1153:
1154: if (cc == 0) {
1155: start = times (&tm);
1156: return;
1157: }
1158: else
1159: stop = times (&tm);
1160:
1161: td = stop - start;
1162: secs = td / HZ, msecs = (td % HZ) * 1000 / HZ;
1163: ms = (secs * 1000) + msecs;
1164: bs = (((float) cc * NBBY * 1000) / (float) (ms ? ms : 1)) / NBBY;
1165:
1166: advise (LLOG_NOTICE, NULLCP,
1167: "%d bytes %s in %d.%02d seconds (%.2f Kbytes/s)",
1168: cc, action, secs, msecs / 10, bs / 1024);
1169: }
1170: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.