|
|
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.