|
|
1.1 root 1: /* ftam-put.c - interactive initiator FTAM -- "put" */
2:
3: #ifndef lint
4: static char *rcsid = "$Header: /f/osi/ftam2/RCS/ftam-put.c,v 7.3 90/07/01 21:03:16 mrose Exp $";
5: #endif
6:
7: /*
8: * $Header: /f/osi/ftam2/RCS/ftam-put.c,v 7.3 90/07/01 21:03:16 mrose Exp $
9: *
10: *
11: * $Log: ftam-put.c,v $
12: * Revision 7.3 90/07/01 21:03:16 mrose
13: * pepsy
14: *
15: * Revision 7.2 90/01/16 22:37:17 mrose
16: * very last time
17: *
18: * Revision 7.1 90/01/11 18:35:43 mrose
19: * real-sync
20: *
21: * Revision 7.0 89/11/23 21:54:24 mrose
22: * Release 6.0
23: *
24: */
25:
26: /*
27: * NOTICE
28: *
29: * Acquisition, use, and distribution of this module and related
30: * materials are subject to the restrictions of a license agreement.
31: * Consult the Preface in the User's Manual for the full terms of
32: * this agreement.
33: *
34: */
35:
36:
37: #include <errno.h>
38: #include <stdio.h>
39: #include "ftamuser.h"
40:
41:
42:
43: /* */
44:
45: int f_put (vec)
46: char **vec;
47: {
48: int append;
49: #ifdef BRIDGE
50: int result;
51: register char *dst;
52: #else
53: int sglobbed;
54: register char *bp,
55: *dst,
56: **gp,
57: **src;
58: char *freedst = NULL,
59: buffer[BUFSIZ];
60: #endif
61:
62: append = strcmp (*vec, "append") == 0;
63:
64: if (*++vec == NULL) {
65: #ifdef BRIDGE
66: return NOTOK;
67: #else
68: if (getline ("source: ", buffer) == NOTOK || str2vec (buffer, vec) < 1)
69: return OK;
70: dst = NULL;
71: #endif
72: }
73: else {
74: #ifdef BRIDGE
75: dst = *vec;
76: #else
77: register char **ap;
78:
79: for (ap = vec; *ap; ap++)
80: continue;
81: if (--ap != vec)
82: dst = *ap, *ap = NULL;
83: else
84: dst = NULL;
85: #endif
86: }
87: #ifndef BRIDGE
88: if (!(src = xglob (vec, 0)))
89: return OK;
90: sglobbed = xglobbed;
91:
92: if (dst == NULL) {
93: if (getline ("destination: ", buffer) == NOTOK) {
94: blkfree (src);
95: return OK;
96: }
97: switch (str2vec (buffer, vec)) {
98: case 0:
99: break;
100:
101: case 1:
102: dst = *vec;
103: break;
104:
105: default:
106: advise (NULLCP, "too many destinations");
107: goto out;
108: }
109: }
110: if (dst && !(dst = freedst = xglob1val (dst, 0)))
111: goto out;
112:
113: if (src[1] == NULL) {
114: if (interrupted)
115: goto out;
116:
117: if (dst == NULL) {
118: switch (realstore) {
119: case RFS_UNIX:
120: if (dst = rindex (*src, '/'))
121: dst++;
122: if (dst == NULL || *dst == NULL)
123: dst = *src;
124: break;
125:
126: default:
127: dst = *src;
128: break;
129: }
130: dst = str2file (dst);
131:
132: ask_it: ;
133: if (query)
134: switch (ask ("%s %s %s", append ? "append" : "put", *src,
135: dst)) {
136: case NOTOK:
137: goto out;
138:
139: case OK:
140: default:
141: break;
142:
143: case DONE:
144: goto out;
145: }
146: }
147: else
148: switch (realstore) {
149: case RFS_UNIX:
150: if (isdir (dst, NULLCP, 1) == NOTOK)
151: break;
152: #ifdef apollo
153: if (*dst == '/')
154: (void) sprintf (bp = buffer, "%s", dst);
155: else
156: #endif
157: (void) sprintf (bp = buffer, "%s/", dst);
158: bp += strlen (bp);
159: if (dst = rindex (*src, '/'))
160: dst++;
161: if (dst == NULL || *dst == NULL)
162: dst = *src;
163: (void) strcpy (bp, dst);
164: dst = buffer;
165: goto ask_it;
166:
167: default:
168: break;
169: }
170:
171: dst = str2file (dst);
172: (void) put (*src, dst, append);
173: goto out;
174: }
175:
176: switch (realstore) {
177: case RFS_UNKNOWN:
178: advise (NULLCP, "%s", rs_unknown);
179: goto out;
180:
181: case RFS_UNIX:
182: if (dst)
183: #ifdef apollo
184: if (*(bp = str2file (dst)) == '/') {
185: (void) strcpy (buffer, bp);
186: bp = buffer;
187: }
188: else
189: #endif
190: (void) sprintf (bp = buffer, "%s/", str2file (dst));
191: else
192: if (rcwd)
193: (void) sprintf (bp = buffer, "%s", str2file (""));
194: else
195: (void) strcpy (bp = buffer, "./");
196: bp += strlen (bp);
197: break;
198:
199: default:
200: advise (NULLCP, "%s", rs_support);
201: goto out;
202: }
203:
204: if (isdir (str2file (buffer), NULLCP, 0) == NOTOK)
205: goto out;
206:
207: for (gp = src; *gp && !interrupted; gp++) {
208: switch (realstore) {
209: case RFS_UNIX:
210: if (dst = rindex (*gp, '/'))
211: dst++;
212: if (dst == NULL || *dst == NULL)
213: dst = *gp;
214: break;
215:
216: default:
217: dst = *gp;
218: break;
219: }
220: (void) strcpy (bp, dst);
221: dst = str2file (buffer);
222:
223: if (sglobbed) {
224: if (query)
225: switch (ask ("%s %s %s", append ? "append" : "put", *gp, dst)){
226: case NOTOK:
227: continue;
228:
229: case OK:
230: default:
231: break;
232:
233: case DONE:
234: goto out;
235: }
236: else
237: advise (NULLCP, "%s %s %s", append ? "append" : "put", *gp,
238: dst);
239: }
240:
241: (void) put (*gp, dst, append);
242:
243: if (ftamfd == NOTOK)
244: break;
245: }
246:
247: out: ;
248: blkfree (src);
249: if (freedst)
250: free (freedst);
251:
252: return OK;
253: #else
254: result = put (dst, append);
255: return result;
256: #endif
257: }
258:
259: /* */
260:
261: #ifdef BRIDGE
262: static int put (dst, append)
263: char *dst;
264: #else
265: static int put (src, dst, append)
266: char *src,
267: *dst;
268: #endif
269: int append;
270: {
271: int bsize,
272: fd,
273: magic,
274: result,
275: size;
276: PE pe;
277: #ifndef BRIDGE
278: struct stat st;
279: #endif
280: struct vfsmap *vf;
281:
282: #ifdef BRIDGE
283: if ((fd = dataconn (dst)) == NOTOK) {
284: advise (dst, "unable to open");
285: return NOTOK;
286: }
287: #else
288: if ((fd = open (src, O_RDONLY)) == NOTOK) {
289: advise (src, "unable to open");
290: return NOTOK;
291: }
292: #endif
293:
294: #ifndef BRIDGE
295: if (fstat (fd, &st) == NOTOK) {
296: advise (src, "unable to fstat");
297: you_lose: ;
298: (void) close (fd);
299: return NOTOK;
300: }
301: if ((st.st_mode & S_IFMT) != S_IFREG) {
302: advise (NULLCP, "%s: not a regular file", src);
303: goto you_lose;
304: }
305: #endif
306:
307: #ifdef BRIDGE
308: vf = &vfs[tmode];
309: #else
310: if ((vf = st2vfs (fd, src, &st, vfs[tmode].vf_oid, ftamfd)) == NULL) {
311: advise (NULLCP, "unable to determine document type for %s", src);
312: goto you_lose;
313: }
314: if (vf == &vfs[VFS_FDF]) {
315: advise (NULLCP, "%s is a %s", src, vf -> vf_text);
316: goto you_lose;
317: }
318: #endif
319: if (tmode != vf - vfs && tmode != VFS_DEF)
320: advise (NULLCP, "negotiating %s transfer", vf -> vf_text);
321:
322: if ((pe = pe_alloc (PE_CLASS_UNIV, PE_FORM_PRIM, PE_PRIM_OCTS))
323: == NULLPE) {
324: advise (NULLCP, "out of memory");
325: #ifdef BRIDGE
326: you_lose: ;
327: (void) close (fd);
328: return NOTOK;
329: #else
330: goto you_lose;
331: #endif
332: }
333:
334: switch (vf - vfs) {
335: case VFS_UTF:
336: if ((magic = fadusize - MAGIC_OCTET1) < 0)
337: magic = 0;
338: break;
339:
340: case VFS_UBF:
341: default:
342: if ((magic = fadusize - MAGIC_SINGLE) < 0)
343: magic = 0;
344: break;
345: }
346:
347: #ifdef BRIDGE
348: bsize = BUFSIZ << 2;
349: size = magic >= bsize ? magic : bsize;
350: if (size > bsize)
351: size -= size % bsize;
352: #else
353: #ifndef MAXBSIZE
354: bsize = BUFSIZ;
355: #else
356: bsize = st.st_blksize > 0 ? st.st_blksize : BUFSIZ;
357: #endif
358: size = (1024 <= magic && magic < bsize) ? magic : bsize;
359: #endif
360: if (watch) {
361: #ifndef BRIDGE
362: printf ("Selecting FADU size of %d\n", size);
363: printf ("based on blksize of %d and estimated integral FADU size of %d\n",
364: bsize, magic);
365: #endif
366: }
367:
368: if ((pe -> pe_prim = PEDalloc (pe -> pe_len = size)) == NULLPED) {
369: advise (NULLCP, "out of memory");
370: pe_free (pe);
371: goto you_lose;
372: }
373:
374: #ifdef BRIDGE
375: result = putaux (dst, append, fd, pe, vf, size);
376: #else
377: result = putaux (src, dst, append, fd, pe, vf, size);
378: #endif
379:
380: pe_free (pe);
381:
382: (void) close (fd);
383:
384: return result;
385: }
386:
387: /* */
388:
389: #ifdef BRIDGE
390: static int putaux (dst, append, fd, pe, vf, size)
391: char *dst;
392: #else
393: static int putaux (src, dst, append, fd, pe, vf, size)
394: char *src,
395: *dst;
396: #endif
397: int append,
398: fd;
399: PE pe;
400: struct vfsmap *vf;
401: int size;
402: {
403: register int n;
404: int cc,
405: effector,
406: gd,
407: nc,
408: reason,
409: result;
410: PE de,
411: param;
412: #ifdef BRIDGE
413: char line[BUFSIZ];
414: #endif
415: struct FADUidentity faduids;
416: register struct FADUidentity *faduid = &faduids;
417: struct FTAMgroup ftgs;
418: register struct FTAMgroup *ftg = &ftgs;
419: struct FTAMindication ftis;
420: register struct FTAMindication *fti = &ftis;
421: register struct FTAMabort *fta = &fti -> fti_abort;
422: FILE *fp;
423:
424: pe -> pe_context = vf -> vf_id;
425:
426: param = NULLPE;
427: if (vf -> vf_parameter
428: && enc_f (vf -> vf_number, &_ZDOCS_mod, ¶m, 1, 0, NULLCP,
429: vf -> vf_parameter) == NOTOK) {
430: advise (NULLCP, "unable to build document type parameter: %s",
431: PY_pepy);
432: return NOTOK;
433: }
434:
435: bzero ((char *) ftg, sizeof *ftg);
436: ftg -> ftg_flags |= FTG_BEGIN | FTG_END;
437: ftg -> ftg_threshold = 0;
438:
439: if (omode == FOVER_SELECT)
440: append = 1;
441: if (units & FUNIT_LIMITED) {
442: ftg -> ftg_flags |= FTG_CREATE;
443: {
444: register struct FTAMcreate *ftce = &ftg -> ftg_create;
445: register struct FTAMattributes *fa = &ftce -> ftce_attrs;
446:
447: ftce -> ftce_override = append ? FOVER_SELECT : omode;
448:
449: fa -> fa_present = FA_FILENAME;
450: fa -> fa_nfile = 0;
451: fa -> fa_files[fa -> fa_nfile++] = dst;
452:
453: fa -> fa_present |= FA_ACTIONS;
454: fa -> fa_permitted = FA_PERM_READ | FA_PERM_REPLACE
455: | FA_PERM_EXTEND | FA_PERM_READATTR
456: | FA_PERM_CHNGATTR | FA_PERM_DELETE
457: | FA_PERM_TRAV;
458:
459: fa -> fa_present |= FA_CONTENTS;
460: fa -> fa_contents = vf -> vf_oid;
461: fa -> fa_parameter = param;
462:
463: ftce -> ftce_access = append ? FA_PERM_EXTEND : FA_PERM_REPLACE;
464: FCINIT (&ftce -> ftce_conctl);
465: }
466: }
467: else {
468: ftg -> ftg_flags |= FTG_SELECT;
469: {
470: register struct FTAMselect *ftse = &ftg -> ftg_select;
471: register struct FTAMattributes *fa = &ftse -> ftse_attrs;
472:
473: if (!append && omode == FOVER_FAIL) {
474: advise (NULLCP,
475: "lack of limited-file-management conflicts with setting of \"override\" variable");
476: return NOTOK;
477: }
478:
479: fa -> fa_present = FA_FILENAME;
480: fa -> fa_nfile = 0;
481: fa -> fa_files[fa -> fa_nfile++] = dst;
482:
483: ftse -> ftse_access = append ? FA_PERM_EXTEND : FA_PERM_REPLACE;
484: FCINIT (&ftse -> ftse_conctl);
485: }
486: }
487:
488: ftg -> ftg_threshold++;
489:
490: ftg -> ftg_flags |= FTG_OPEN;
491: {
492: register struct FTAMopen *ftop = &ftg -> ftg_open;
493:
494: ftop -> ftop_contents = vf -> vf_oid;
495: ftop -> ftop_parameter = param;
496: FCINIT (&ftop -> ftop_conctl);
497: if (append) {
498: ftop -> ftop_mode = FA_PERM_EXTEND;
499: ftop -> ftop_conctl.fc_extendlock = FLOCK_EXCLUSIVE;
500: }
501: else {
502: ftop -> ftop_mode = FA_PERM_REPLACE;
503: ftop -> ftop_conctl.fc_replacelock = FLOCK_EXCLUSIVE;
504: }
505: }
506: ftg -> ftg_threshold++;
507:
508: result = FBulkBeginRequest (ftamfd, ftg, fti);
509:
510: if (param)
511: pe_free (param);
512:
513: if (result == NOTOK) {
514: ftam_advise (fta, "F-BULK-BEGIN.REQUEST");
515: return NOTOK;
516: }
517:
518: ftg = &fti -> fti_group;
519:
520: if (ftg -> ftg_flags & FTG_SELECT) {
521: register struct FTAMselect *ftse = &ftg -> ftg_select;
522:
523: ftam_diag (ftse -> ftse_diags, ftse -> ftse_ndiag, 1,
524: ftse -> ftse_action);
525: if (ftse -> ftse_state != FSTATE_SUCCESS)
526: goto you_lose;
527: }
528: else
529: if (ftg -> ftg_flags & FTG_CREATE) {
530: register struct FTAMcreate *ftce = &ftg -> ftg_create;
531:
532: ftam_diag (ftce -> ftce_diags, ftce -> ftce_ndiag, 1,
533: ftce -> ftce_action);
534: if (ftce -> ftce_state != FSTATE_SUCCESS)
535: goto you_lose;
536: }
537:
538: if (ftg -> ftg_flags & FTG_OPEN) {
539: register struct FTAMopen *ftop = &ftg -> ftg_open;
540:
541: ftam_diag (ftop -> ftop_diags, ftop -> ftop_ndiag, 1,
542: ftop -> ftop_action);
543: if (ftop -> ftop_state != FSTATE_SUCCESS)
544: goto you_lose;
545:
546: for (myvf = vfs; myvf -> vf_entry; myvf++)
547: if (oid_cmp (myvf -> vf_oid, ftop -> ftop_contents) == 0)
548: break;
549: switch (myvf - vfs) {
550: case VFS_UTF:
551: pe -> pe_id = (PElementID)
552: ((struct type_DOCS_FTAM__1__Parameters *)
553: myvf -> vf_parameter)
554: -> universal__class__number;
555: /* and fall... */
556: case VFS_UBF:
557: effector = 1;
558: if (ftop -> ftop_parameter && myvf -> vf_number >= 0) {
559: caddr_t parm = NULL;
560:
561: if (dec_f (myvf -> vf_number, &_ZDOCS_mod,
562: ftop -> ftop_parameter, 1, NULLIP, NULLVP,
563: &parm) == NOTOK)
564: advise (NULLCP,
565: "unable to parse document type parameter: %s",
566: PY_pepy);
567: else
568: switch (myvf - vfs) {
569: case VFS_UTF:
570: {
571: register struct type_DOCS_FTAM__1__Parameters *p1 =
572: (struct type_DOCS_FTAM__1__Parameters *)
573: parm;
574:
575: if (p1 -> optionals
576: & opt_DOCS_FTAM__1__Parameters_universal__class__number)
577: pe -> pe_id = (PElementID)
578: p1 -> universal__class__number;
579: else
580: pe -> pe_id = PE_DEFN_GFXS;
581: switch (pe -> pe_id) {
582: case PE_DEFN_GFXS:
583: if (getenv ("HP-FTAM")) {
584: effector = 1;
585: break;
586: } /* else fall... */
587: case PE_DEFN_PRTS:
588: case PE_DEFN_VISS:
589: effector = 0;
590: break;
591:
592: case PE_DEFN_T61S:
593: case PE_DEFN_VTXS:
594: case PE_DEFN_IA5S:
595: case PE_DEFN_GENS:
596: effector = 1;
597: break;
598:
599: default:
600: break;
601: }
602: }
603: break;
604:
605: case VFS_UBF:
606: default:
607: break;
608: }
609: if (parm)
610: fre_obj (parm, _ZDOCS_mod.md_dtab[myvf -> vf_number],
611: &_ZDOCS_mod);
612: }
613: if (debug)
614: advise (NULLCP, "effector=%d id=0x%x",
615: effector, pe -> pe_id);
616: if (myvf != vf || watch) {
617: advise (NULLCP, "%s transfer", myvf -> vf_text);
618: vf = myvf;
619: }
620: break;
621:
622: default:
623: vf = &vfs[VFS_UBF];
624: advise (NULLCP, "document type mismatch; assuming %s (%s)",
625: vf -> vf_text, vf -> vf_entry);
626: break;
627: }
628: }
629: myvf = vf;
630:
631: FTGFREE (ftg);
632:
633: faduid -> fa_type = FA_FIRSTLAST;
634: faduid -> fa_firstlast = FA_FIRST;
635: if (FReadWriteRequest (ftamfd, append ? FA_OPS_EXTEND : FA_OPS_REPLACE,
636: faduid, myvf -> vf_context, NOTOK, 0, fti) == NOTOK) {
637: ftam_advise (fta, "F-READWRITE.REQUEST");
638: return NOTOK;
639: }
640:
641: switch (myvf - vfs) {
642: case VFS_UTF:
643: if ((gd = dup (fd)) == NOTOK || (fp = fdopen (gd, "r")) == NULL) {
644: if (gd != NOTOK)
645: (void) close (gd);
646:
647: #ifdef BRIDGE
648: advise (dst, gd != NOTOK ? "fdopen failed" : "unable to dup");
649: #else
650: advise (src, gd != NOTOK ? "fdopen failed on"
651: : "unable to dup");
652: #endif
653: reason = FS_ACC_LCL;
654: goto do_cancel;
655: }
656: break;
657:
658: case VFS_UBF:
659: default:
660: fp = NULL;
661: break;
662: }
663:
664: cc = 0;
665: if (verbose)
666: timer (cc, NULLCP);
667: if (hash)
668: marks = BUFSIZ - 1;
669:
670: #ifdef BRIDGE
671: line[0] = '\0';
672: #endif
673:
674: for (;;) {
675: register char *bp,
676: *ep;
677:
678: if (!interrupted) {
679: int nfds;
680: fd_set wfds;
681:
682: nfds = 0;
683: FD_ZERO (&wfds);
684: /* interrupt causes EINTR */
685: if (FSelectMask (ftamfd, &wfds, &nfds, fti) == OK)
686: (void) xselect (nfds, NULLFD, &wfds, NULLFD, NOTOK);
687: }
688:
689: if (interrupted) {
690: advise (NULLCP, "cancelling transfer");
691:
692: reason = FS_GEN_INITIATOR;
693: errno = EINTR;
694: goto do_cancel;
695: }
696:
697: for (ep = (bp = (char *) pe -> pe_prim) + size - (fp ? 2 : 0), nc = 0;
698: bp < ep; ) {
699: if (fp) {
700: register char *cp;
701:
702: #ifdef BRIDGE
703: if (strlen (line) || fgets (line, BUFSIZ, fp)) {
704: if ((strlen(line) + 1) < (ep - bp - 1)) {
705: (void) strcpy (bp, line);
706: line[0] = NULL;
707: }
708: else
709: break;
710: }
711: else {
712: #else
713: if (fgets (bp, ep - bp + 1, fp) == NULL) {
714: #endif
715: n = (ferror (fp) && !feof (fp)) ? NOTOK : OK;
716: break;
717: }
718: cp = bp + strlen (bp) - 1;
719: if (!effector) {
720: if (*cp == '\n') {
721: #ifndef BRIDGE
722: *cp = NULL;
723: #else
724: if (cp > bp) {
725: if (*--cp == '\r')
726: *cp = NULL;
727: else
728: *++cp = NULL;
729: }
730: else
731: *cp = NULL;
732: #endif
733: n = cp - bp;
734: bp = cp;
735: }
736: else { /* XXX: losing! */
737: n = cp - bp + 1;
738: bp = cp + 1;
739: }
740: }
741: else {
742: if (*cp == '\n') {
743: #ifndef BRIDGE
744: *cp++ = '\r';
745: #endif
746: *cp++ = '\n';
747: n = cp - bp;
748: bp = cp;
749: nc++;
750: continue;
751: }
752:
753: n = cp - bp + 1;
754: bp = cp + 1;
755: }
756: }
757: else {
758: #ifdef BRIDGE
759: switch (n = read (fd, bp, ep - bp)) {
760: #else
761: switch (n = read (fd, bp, ep - bp)) {
762: #endif
763: case NOTOK:
764: case OK:
765: break;
766:
767: default:
768: bp += n;
769: continue;
770: }
771: }
772: break;
773: }
774: if (n == NOTOK || (n = bp - (char *) pe -> pe_prim) == 0)
775: break;
776: pe -> pe_len = n;
777:
778: if (fp && !effector) {
779: if ((de = pe_cpy (pe)) == NULLPE) {
780: reason = FS_ACC_LCL;
781: errno = ENOMEM;
782: goto do_cancel;
783: }
784: }
785: else
786: de = pe;
787:
788: if (debug) {
789: if (fp) {
790: WATCHP (DOCS_FTAM__1__Datatype1, de, 0);
791: }
792: else
793: WATCHP (DOCS_FTAM__3__Datatype1, de, 0);
794: }
795:
796: switch (de2fadu (de, pe != de ? 1 : 0)) {
797: case NOTOK:
798: if (fp)
799: (void) fclose (fp);
800: return NOTOK;
801:
802: case OK:
803: default:
804: if (verbose || hash)
805: cc += (n - nc), nc = 0;
806: if (hash) {
807: if (hash > 1)
808: printf ("%d\r", cc);
809: else
810: for (; marks < cc; marks += BUFSIZ)
811: (void) putchar ('#');
812: (void) fflush (stdout);
813: }
814: break;
815:
816: case DONE:
817: (void) de2fadu (NULLPE, 0);
818: goto done_transfer;
819: }
820: }
821:
822: if (verbose)
823: timer (cc, "sent");
824:
825: if (fp)
826: (void) fclose (fp);
827:
828: if (n == NOTOK) {
829: struct FTAMdiagnostic diags[NFDIAG];
830: register struct FTAMdiagnostic *dp;
831:
832: #ifdef BRIDGE
833: advise (dst, "error reading");
834: #else
835: advise (src, "error reading");
836: #endif
837: reason = FS_ACC_LCLDEV;
838:
839: do_cancel: ;
840: dp = diags;
841:
842: dp -> ftd_type = DIAG_PERM;
843: dp -> ftd_identifier = reason;
844: dp -> ftd_observer = dp -> ftd_source = EREF_IFSU;
845: dp -> ftd_delay = DIAG_NODELAY;
846: (void) strcpy (dp -> ftd_data, sys_errname (errno));
847: dp -> ftd_cc = strlen (dp -> ftd_data);
848: dp++;
849:
850: (void) de2fadu (NULLPE, 0);
851:
852: if (FCancelRequest (ftamfd, FACTION_PERM, NULLPE, diags, dp - diags,
853: fti) == NOTOK) {
854: ftam_advise (fta, "F-CANCEL.REQUEST");
855: return NOTOK;
856: }
857:
858: if (fti -> fti_type == FTI_CANCEL) {
859: register struct FTAMcancel *ftcn = &fti -> fti_cancel;
860:
861: ftam_diag (ftcn -> ftcn_diags, ftcn -> ftcn_ndiag, 1,
862: ftcn -> ftcn_action);
863: FTCNFREE (ftcn);
864: }
865:
866: goto done_transfer;
867: }
868:
869: if (n == OK)
870: n = de2fadu (NULLPE, 1);
871:
872: if (FDataEndRequest (ftamfd, FACTION_SUCCESS, (struct FTAMdiagnostic *) 0,
873: 0, fti) == NOTOK) {
874: ftam_advise (fta, "F-DATA-END.REQUEST");
875: return NOTOK;
876: }
877:
878: if (FTransEndRequest (ftamfd, NULLPE, fti) == NOTOK) {
879: ftam_advise (fta, "F-TRANSFER-END.REQUEST");
880: return NOTOK;
881: }
882:
883: switch (fti -> fti_type) {
884: case FTI_TRANSEND:
885: {
886: register struct FTAMtransend *ftre = &fti -> fti_transend;
887:
888: ftam_diag (ftre -> ftre_diags, ftre -> ftre_ndiag, 1,
889: ftre -> ftre_action);
890: FTREFREE (ftre);
891: }
892: break;
893:
894: case FTI_CANCEL:
895: {
896: register struct FTAMcancel *ftcn = &fti -> fti_cancel;
897:
898: advise (NULLCP, "data transfer canceled!");
899: ftam_diag (ftcn -> ftcn_diags, ftcn -> ftcn_ndiag, 1,
900: ftcn -> ftcn_action);
901: FTCNFREE (ftcn);
902:
903: if (FCancelResponse (ftamfd, FACTION_SUCCESS, NULLPE,
904: (struct FTAMdiagnostic *) 0, 0, fti) == NOTOK) {
905: ftam_advise (fta, "F-CANCEL.RESPONSE");
906: return NOTOK;
907: }
908: }
909: break;
910:
911: default:
912: adios (NULLCP, "unexpected indication type=%d", fti -> fti_type);
913: }
914:
915: done_transfer: ;
916: ftg = &ftgs;
917: bzero ((char *) ftg, sizeof *ftg);
918: ftg -> ftg_flags |= FTG_BEGIN | FTG_END;
919: ftg -> ftg_threshold = 0;
920:
921: ftg -> ftg_flags |= FTG_CLOSE;
922: ftg -> ftg_threshold++;
923:
924: ftg -> ftg_flags |= FTG_DESELECT;
925: ftg -> ftg_threshold++;
926:
927: if (FBulkEndRequest (ftamfd, ftg, fti) == NOTOK) {
928: ftam_advise (fta, "F-BULK-END.REQUEST");
929: return NOTOK;
930: }
931:
932: ftg = &fti -> fti_group;
933:
934: if (ftg -> ftg_flags & FTG_CLOSE) {
935: register struct FTAMclose *ftcl = &ftg -> ftg_close;
936:
937: ftam_diag (ftcl -> ftcl_diags, ftcl -> ftcl_ndiag, 1,
938: ftcl -> ftcl_action);
939: }
940:
941: if (ftg -> ftg_flags & FTG_DESELECT) {
942: register struct FTAMdeselect *ftde = &ftg -> ftg_deselect;
943:
944: ftam_diag (ftde -> ftde_diags, ftde -> ftde_ndiag, 1,
945: ftde -> ftde_action);
946: ftam_chrg (&ftde -> ftde_charges);
947: }
948:
949: FTGFREE (ftg);
950: return OK;
951:
952: you_lose: ;
953: FTGFREE (ftg);
954: return NOTOK;
955: }
956:
957: /* */
958:
959: int de2fadu (pe, concat)
960: PE pe;
961: int concat;
962: {
963: int result;
964: struct FTAMindication ftis;
965: register struct FTAMindication *fti = &ftis;
966: register struct FTAMabort *fta = &fti -> fti_abort;
967: static int ninfo = 0;
968: static int size = 0;
969: static PE info[NPDATA];
970:
971: if (pe == NULLPE) {
972: result = OK;
973: if (concat
974: && ninfo > 0
975: && FDataRequest (ftamfd, info, ninfo, fti) == NOTOK) {
976: ftam_advise (fta, "F-DATA.REQUEST");
977: result = NOTOK;
978: }
979:
980: while (ninfo > 0)
981: pe_free (info[--ninfo]);
982: size = 0;
983:
984: return result;
985: }
986:
987: if (concat) {
988: int flush,
989: n;
990:
991: if (size + (n = ps_get_abs (pe) + MAGIC_OCTET2) >= fadusize
992: && ninfo > 0) {
993: if (debug)
994: advise (NULLCP,
995: "de2fadu flushing on %d FADUs, estimated size %d/%d",
996: ninfo, size, fadusize);
997:
998: if ((result = de2fadu (NULLPE, 1)) != OK)
999: return result;
1000: flush = 1;
1001: }
1002: else
1003: flush = 0;
1004:
1005: info[ninfo++] = pe;
1006: size += n;
1007:
1008: if (ninfo < NPDATA && size < fadusize) {
1009: if (!flush)
1010: return OK;
1011: }
1012: else {
1013: if ((result = FDataRequest (ftamfd, info, ninfo, fti)) == NOTOK)
1014: ftam_advise (fta, "F-DATA.REQUEST");
1015:
1016: while (ninfo > 0)
1017: pe_free (info[--ninfo]);
1018: size = 0;
1019:
1020: if (result == NOTOK)
1021: return result;
1022: }
1023: }
1024: else
1025: if (FDataRequest (ftamfd, &pe, 1, fti) == NOTOK) {
1026: ftam_advise (fta, "F-DATA.REQUEST");
1027: return NOTOK;
1028: }
1029:
1030: if (FWaitRequest (ftamfd, OK, fti) == NOTOK) {
1031: if (fta -> fta_peer
1032: || fta -> fta_action != FACTION_TRANS
1033: || fta -> fta_ndiag < 1
1034: || fta -> fta_diags[0].ftd_type != DIAG_TRANS
1035: || fta -> fta_diags[0].ftd_identifier != FS_PRO_TIMEOUT) {
1036: ftam_advise (fta, "F-WAIT.REQUEST");
1037: return NOTOK;
1038: }
1039:
1040: return OK;
1041: }
1042:
1043: if (fti -> fti_type == FTI_CANCEL) {
1044: register struct FTAMcancel *ftcn = &fti -> fti_cancel;
1045:
1046: advise (NULLCP, "data transfer cancelled!");
1047: ftam_diag (ftcn -> ftcn_diags, ftcn -> ftcn_ndiag, 1,
1048: ftcn -> ftcn_action);
1049: FTCNFREE (ftcn);
1050:
1051: if (FCancelResponse (ftamfd, FACTION_SUCCESS, NULLPE,
1052: (struct FTAMdiagnostic *) 0, 0, fti) == NOTOK) {
1053: ftam_advise (fta, "F-CANCEL.RESPONSE");
1054: return NOTOK;
1055: }
1056: }
1057:
1058: return DONE;
1059: }
1060:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.