|
|
1.1 ! root 1: /* ftam-get.c - interactive initiator FTAM -- "get" */ ! 2: ! 3: #ifndef lint ! 4: static char *rcsid = "$Header: /f/osi/ftam2/RCS/ftam-get.c,v 7.2 90/07/01 21:03:08 mrose Exp $"; ! 5: #endif ! 6: ! 7: /* ! 8: * $Header: /f/osi/ftam2/RCS/ftam-get.c,v 7.2 90/07/01 21:03:08 mrose Exp $ ! 9: * ! 10: * ! 11: * $Log: ftam-get.c,v $ ! 12: * Revision 7.2 90/07/01 21:03:08 mrose ! 13: * pepsy ! 14: * ! 15: * Revision 7.1 90/01/11 23:48:39 mrose ! 16: * lint ! 17: * ! 18: * Revision 7.0 89/11/23 21:54:17 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: ! 34: #include <errno.h> ! 35: #include <stdio.h> ! 36: #include "ftamuser.h" ! 37: ! 38: /* */ ! 39: ! 40: static int effector; ! 41: ! 42: int ubffnx (); ! 43: struct vfsmap *findvf (); ! 44: ! 45: /* */ ! 46: ! 47: int f_get (vec) ! 48: char **vec; ! 49: { ! 50: #ifndef BRIDGE ! 51: int sglobbed; ! 52: register char *bp; ! 53: register char *dst, ! 54: **gp, ! 55: **src; ! 56: char *freedst = NULL, ! 57: buffer[BUFSIZ]; ! 58: struct stat st; ! 59: #endif ! 60: struct FADUidentity faduids; ! 61: register struct FADUidentity *faduid = &faduids; ! 62: struct vfsmap *vf = &vfs[tmode]; ! 63: ! 64: if (vf == &vfs[VFS_DEF] ! 65: && (!(units & FUNIT_LIMITED) ! 66: || (class != FCLASS_MANAGE && class != FCLASS_TM))) { ! 67: advise (NULLCP, ! 68: "unable to use \"default\" document type on this association"); ! 69: return OK; ! 70: } ! 71: ! 72: #ifdef BRIDGE ! 73: if (*++vec == NULL) ! 74: return NOTOK; ! 75: #else ! 76: if (*++vec == NULL) { ! 77: if (getline ("source: ", buffer) == NOTOK || str2vec (buffer, vec) < 1) ! 78: return OK; ! 79: dst = NULL; ! 80: } ! 81: else { ! 82: register char **ap; ! 83: ! 84: for (ap = vec; *ap; ap++) ! 85: continue; ! 86: if (--ap != vec) ! 87: dst = *ap, *ap = NULL; ! 88: else ! 89: dst = NULL; ! 90: } ! 91: if (!(src = xglob (vec, 1))) ! 92: return OK; ! 93: sglobbed = xglobbed; ! 94: ! 95: if (dst == NULL) { ! 96: if (getline ("destination: ", buffer) == NOTOK) { ! 97: blkfree (src); ! 98: return OK; ! 99: } ! 100: switch (str2vec (buffer, vec)) { ! 101: case 0: ! 102: break; ! 103: ! 104: case 1: ! 105: dst = *vec; ! 106: break; ! 107: ! 108: default: ! 109: advise (NULLCP, "too many destinations"); ! 110: goto out; ! 111: } ! 112: } ! 113: if (dst && !(dst = freedst = xglob1val (dst, 0))) ! 114: goto out; ! 115: #endif ! 116: ! 117: faduid -> fa_type = FA_FIRSTLAST; ! 118: faduid -> fa_firstlast = FA_FIRST; ! 119: ! 120: #ifdef BRIDGE ! 121: return getvf (*vec, *vec, faduid, vf, ubffnx); ! 122: #else ! 123: if (src[1] == NULL) { ! 124: if (interrupted) ! 125: goto out; ! 126: ! 127: if (dst == NULL) { ! 128: switch (realstore) { ! 129: case RFS_UNIX: ! 130: if (dst = rindex (*src, '/')) ! 131: dst++; ! 132: if (dst == NULL || *dst == NULL) ! 133: dst = *src; ! 134: break; ! 135: ! 136: default: ! 137: dst = *src; ! 138: break; ! 139: } ! 140: ! 141: ask_it: ; ! 142: if (query) ! 143: switch (ask ("get %s %s", *src, dst)) { ! 144: case NOTOK: ! 145: goto out; ! 146: ! 147: case OK: ! 148: default: ! 149: break; ! 150: ! 151: case DONE: ! 152: goto out; ! 153: } ! 154: } ! 155: else ! 156: if (stat (dst, &st) != NOTOK ! 157: && (st.st_mode & S_IFMT) == S_IFDIR) { ! 158: #ifdef apollo ! 159: if (*dst == '/') ! 160: (void) sprintf (bp = buffer, "%s", dst); ! 161: else ! 162: #endif ! 163: (void) sprintf (bp = buffer, "%s/", dst); ! 164: bp += strlen (bp); ! 165: switch (realstore) { ! 166: case RFS_UNIX: ! 167: if (dst = rindex (*src, '/')) ! 168: dst++; ! 169: if (dst == NULL || *dst == NULL) ! 170: dst = *src; ! 171: break; ! 172: ! 173: default: ! 174: break; ! 175: } ! 176: (void) strcpy (bp, dst); ! 177: dst = buffer; ! 178: goto ask_it; ! 179: } ! 180: ! 181: if (check_get (dst) != NOTOK) ! 182: (void) getvf (*src, dst, faduid, vf, ubffnx); ! 183: goto out; ! 184: } ! 185: ! 186: switch (realstore) { ! 187: case RFS_UNKNOWN: ! 188: advise (NULLCP, "%s", rs_unknown); ! 189: goto out; ! 190: ! 191: case RFS_UNIX: ! 192: #ifdef apollo ! 193: if (dst && dst[strlen (dst) - 1] == '/') ! 194: (void) sprintf (bp = buffer, "%s", dst); ! 195: else ! 196: #endif ! 197: (void) sprintf (bp = buffer, "%s/", dst ? dst : "."); ! 198: bp += strlen (bp); ! 199: break; ! 200: ! 201: default: ! 202: advise (NULLCP, "%s", rs_support); ! 203: goto out; ! 204: } ! 205: ! 206: if (stat (buffer, &st) == NOTOK) { ! 207: advise (dst, "unable to stat"); ! 208: goto out; ! 209: } ! 210: if ((st.st_mode & S_IFMT) != S_IFDIR) { ! 211: advise (NULLCP, "%s: not a directory"); ! 212: goto out; ! 213: } ! 214: ! 215: for (gp = src; *gp && !interrupted; gp++) { ! 216: switch (realstore) { ! 217: case RFS_UNIX: ! 218: if (dst = rindex (*gp, '/')) ! 219: dst++; ! 220: if (dst == NULL || *dst == NULL) ! 221: dst = *gp; ! 222: break; ! 223: ! 224: default: ! 225: dst = *gp; ! 226: break; ! 227: } ! 228: (void) strcpy (bp, dst); ! 229: dst = buffer; ! 230: ! 231: if (sglobbed) { ! 232: if (query) ! 233: switch (ask ("get %s %s", *gp, dst)) { ! 234: case NOTOK: ! 235: continue; ! 236: ! 237: case OK: ! 238: default: ! 239: break; ! 240: ! 241: case DONE: ! 242: goto out; ! 243: } ! 244: else ! 245: advise (NULLCP, "get %s %s", *gp, dst); ! 246: } ! 247: ! 248: if (check_get (dst) == NOTOK) ! 249: break; ! 250: (void) getvf (*gp, dst, faduid, vf, ubffnx); ! 251: ! 252: if (ftamfd == NOTOK) ! 253: break; ! 254: } ! 255: ! 256: out: ; ! 257: blkfree (src); ! 258: if (freedst) ! 259: free (freedst); ! 260: ! 261: return OK; ! 262: #endif ! 263: } ! 264: ! 265: /* */ ! 266: ! 267: #ifndef BRIDGE ! 268: static int check_get (dst) ! 269: char *dst; ! 270: { ! 271: int result; ! 272: register char *cp; ! 273: ! 274: if ((result = access (dst, W_OK)) == NOTOK && errno == ENOENT) ! 275: if (cp = rindex (dst, '/')) { ! 276: *cp = NULL; ! 277: result = access (*dst ? dst : "/", W_OK); ! 278: *cp = '/'; ! 279: } ! 280: else ! 281: result = access (".", W_OK); ! 282: if (result == OK) ! 283: return result; ! 284: ! 285: advise (dst, "unable to write"); ! 286: ! 287: return result; ! 288: } ! 289: #endif ! 290: ! 291: /* */ ! 292: ! 293: int getvf (src, dst, faduid, vf, wfnx) ! 294: char *src, ! 295: *dst; ! 296: register struct FADUidentity *faduid; ! 297: register struct vfsmap *vf; ! 298: IFP wfnx; ! 299: { ! 300: int fd, ! 301: result; ! 302: #ifdef BRIDGE ! 303: int ftp_result; ! 304: #endif ! 305: PE param; ! 306: struct FTAMgroup ftgs; ! 307: register struct FTAMgroup *ftg = &ftgs; ! 308: struct FTAMindication ftis; ! 309: register struct FTAMindication *fti = &ftis; ! 310: register struct FTAMabort *fta = &fti -> fti_abort; ! 311: ! 312: if (vf == &vfs[VFS_DEF]) { ! 313: if (!(vf = findvf (src))) { ! 314: vf = &vfs[VFS_UBF]; ! 315: advise (NULLCP, ! 316: "unable to determine document type associated with %s", src); ! 317: /* most likely reason: the file isn't there... */ ! 318: ! 319: if (vf -> vf_oid == NULLOID || !(vf -> vf_flags & VF_OK)) ! 320: return NOTOK; ! 321: advise (NULLCP, "proposing %s transfer", vf -> vf_text); ! 322: } ! 323: else ! 324: if (vf == &vfs[VFS_FDF]) { ! 325: advise (NULLCP, "%s is a %s", src, vf -> vf_text); ! 326: return NOTOK; ! 327: } ! 328: } ! 329: else ! 330: if (vf -> vf_oid == NULLOID || !(vf -> vf_flags & VF_OK)) { ! 331: advise (NULLCP, "no support for %ss", vf -> vf_text); ! 332: return NOTOK; ! 333: } ! 334: ! 335: bzero ((char *) ftg, sizeof *ftg); ! 336: ftg -> ftg_flags |= FTG_BEGIN | FTG_END; ! 337: ftg -> ftg_threshold = 0; ! 338: ! 339: ftg -> ftg_flags |= FTG_SELECT; ! 340: { ! 341: register struct FTAMselect *ftse = &ftg -> ftg_select; ! 342: register struct FTAMattributes *fa = &ftse -> ftse_attrs; ! 343: ! 344: fa -> fa_present = FA_FILENAME; ! 345: fa -> fa_nfile = 0; ! 346: fa -> fa_files[fa -> fa_nfile++] = src; ! 347: ! 348: ftse -> ftse_access = FA_PERM_READ; ! 349: FCINIT (&ftse -> ftse_conctl); ! 350: } ! 351: ftg -> ftg_threshold++; ! 352: ! 353: param = NULLPE; ! 354: ! 355: ftg -> ftg_flags |= FTG_OPEN; ! 356: { ! 357: register struct FTAMopen *ftop = &ftg -> ftg_open; ! 358: ! 359: ftop -> ftop_mode = FA_PERM_READ; ! 360: ftop -> ftop_contents = vf -> vf_oid; ! 361: if (vf -> vf_parameter) { ! 362: if (enc_f (vf -> vf_number, &_ZDOCS_mod, ¶m, 1, 0, NULLCP, ! 363: vf -> vf_parameter) == NOTOK) { ! 364: advise (NULLCP, "unable to build document type parameter: %s", ! 365: PY_pepy); ! 366: return NOTOK; ! 367: } ! 368: ftop -> ftop_parameter = param; ! 369: } ! 370: FCINIT (&ftop -> ftop_conctl); ! 371: ftop -> ftop_conctl.fc_readlock = FLOCK_SHARED; ! 372: } ! 373: ftg -> ftg_threshold++; ! 374: ! 375: result = FBulkBeginRequest (ftamfd, ftg, fti); ! 376: ! 377: if (param) ! 378: pe_free (param); ! 379: ! 380: if (result == NOTOK) { ! 381: ftam_advise (&fti -> fti_abort, "F-BULK-BEGIN.REQUEST"); ! 382: return NOTOK; ! 383: } ! 384: ! 385: ftg = &fti -> fti_group; ! 386: ! 387: if (ftg -> ftg_flags & FTG_SELECT) { ! 388: register struct FTAMselect *ftse = &ftg -> ftg_select; ! 389: ! 390: ftam_diag (ftse -> ftse_diags, ftse -> ftse_ndiag, 1, ! 391: ftse -> ftse_action); ! 392: if (ftse -> ftse_state != FSTATE_SUCCESS) ! 393: goto you_lose; ! 394: } ! 395: ! 396: if (ftg -> ftg_flags & FTG_OPEN) { ! 397: register struct FTAMopen *ftop = &ftg -> ftg_open; ! 398: ! 399: ftam_diag (ftop -> ftop_diags, ftop -> ftop_ndiag, 1, ! 400: ftop -> ftop_action); ! 401: if (ftop -> ftop_state != FSTATE_SUCCESS) ! 402: goto you_lose; ! 403: ! 404: for (myvf = vfs; myvf -> vf_entry; myvf++) ! 405: if (oid_cmp (myvf -> vf_oid, ftop -> ftop_contents) == 0) ! 406: break; ! 407: switch (myvf - vfs) { ! 408: case VFS_UBF: ! 409: case VFS_UTF: ! 410: effector = 1; ! 411: if (ftop -> ftop_parameter && myvf -> vf_number >= 0) { ! 412: caddr_t parm = NULL; ! 413: ! 414: if (dec_f (myvf -> vf_number, &_ZDOCS_mod, ! 415: ftop -> ftop_parameter, 1, NULLIP, NULLVP, ! 416: (char **) &parm) == NOTOK) ! 417: advise (NULLCP, ! 418: "unable to parse document type parameter: %s", ! 419: PY_pepy); ! 420: else ! 421: switch (myvf - vfs) { ! 422: case VFS_UTF: ! 423: { ! 424: PElementID id; ! 425: register struct type_DOCS_FTAM__1__Parameters *p1 = ! 426: (struct type_DOCS_FTAM__1__Parameters *) ! 427: parm; ! 428: ! 429: if (p1 -> optionals ! 430: & opt_DOCS_FTAM__1__Parameters_universal__class__number) ! 431: id = (PElementID) ! 432: p1 -> universal__class__number; ! 433: else ! 434: id = PE_DEFN_GFXS; ! 435: switch (id) { ! 436: case PE_DEFN_GFXS: ! 437: if (getenv ("HP-FTAM")) { ! 438: effector = 1; ! 439: break; ! 440: } /* else fall... */ ! 441: case PE_DEFN_PRTS: ! 442: case PE_DEFN_VISS: ! 443: effector = 0; ! 444: break; ! 445: ! 446: case PE_DEFN_T61S: ! 447: case PE_DEFN_VTXS: ! 448: case PE_DEFN_IA5S: ! 449: case PE_DEFN_GENS: ! 450: effector = 1; ! 451: break; ! 452: ! 453: default: ! 454: break; ! 455: } ! 456: } ! 457: break; ! 458: ! 459: case VFS_UBF: ! 460: default: ! 461: break; ! 462: } ! 463: if (parm) ! 464: fre_obj (parm, _ZDOCS_mod.md_dtab[myvf -> vf_number], ! 465: &_ZDOCS_mod); ! 466: } ! 467: if (debug) ! 468: advise (NULLCP, "effector=%d", effector); ! 469: /* and fall... */ ! 470: case VFS_FDF: ! 471: if (myvf != vf || watch) { ! 472: advise (NULLCP, "%s transfer", myvf -> vf_text); ! 473: vf = myvf; ! 474: } ! 475: break; ! 476: ! 477: default: ! 478: vf = &vfs[VFS_UBF]; ! 479: advise (NULLCP, "document type mismatch; assuming %s (%s)", ! 480: vf -> vf_text, vf -> vf_entry); ! 481: break; ! 482: } ! 483: } ! 484: myvf = vf; ! 485: ! 486: FTGFREE (ftg); ! 487: ! 488: if (FReadWriteRequest (ftamfd, FA_OPS_READ, faduid, myvf -> vf_context, ! 489: NOTOK, 0, fti) == NOTOK) { ! 490: ftam_advise (fta, "F-READWRITE.REQUEST"); ! 491: return NOTOK; ! 492: } ! 493: ! 494: if (dst) { ! 495: #ifdef BRIDGE ! 496: if ((fd = dataconn(dst)) == NOTOK) { ! 497: #else ! 498: if ((fd = open (dst, O_WRONLY | O_CREAT | O_TRUNC, 0666)) == NOTOK) { ! 499: #endif ! 500: struct FTAMdiagnostic diags[NFDIAG]; ! 501: register struct FTAMdiagnostic *dp = diags; ! 502: ! 503: advise (dst, "unable to write"); ! 504: #ifdef BRIDGE ! 505: ftp_result = DONE; ! 506: #endif ! 507: ! 508: dp -> ftd_type = DIAG_PERM; ! 509: dp -> ftd_identifier = FS_ACC_LCL; ! 510: dp -> ftd_observer = dp -> ftd_source = EREF_IFSU; ! 511: dp -> ftd_delay = DIAG_NODELAY; ! 512: (void) sprintf (dp -> ftd_data, "unable to write %s: %s", ! 513: dst, sys_errname (errno)); ! 514: dp -> ftd_cc = strlen (dp -> ftd_data); ! 515: dp++; ! 516: ! 517: if (FCancelRequest (ftamfd, FACTION_PERM, NULLPE, diags, ! 518: dp - diags, fti) == NOTOK) { ! 519: ftam_advise (fta, "F-CANCEL.REQUEST"); ! 520: if (fd != NOTOK) ! 521: (void) close (fd); ! 522: return NOTOK; ! 523: } ! 524: ! 525: if (fti -> fti_type == FTI_CANCEL) { ! 526: register struct FTAMcancel *ftcn = &fti -> fti_cancel; ! 527: ! 528: ftam_diag (ftcn -> ftcn_diags, ftcn -> ftcn_ndiag, 1, ! 529: ftcn -> ftcn_action); ! 530: FTCNFREE (ftcn); ! 531: } ! 532: ! 533: goto done_transfer; ! 534: } ! 535: } ! 536: else ! 537: fd = NOTOK; ! 538: ! 539: if (fd != NOTOK) ! 540: (*wfnx) (fd, (struct PSAPdata *) 0, OK); ! 541: ! 542: result = getloop (fd, dst, wfnx); ! 543: ! 544: if (fd != NOTOK) { ! 545: (*wfnx) (fd, (struct PSAPdata *) 0, DONE); ! 546: (void) close (fd); ! 547: } ! 548: ! 549: switch (result) { ! 550: case NOTOK: ! 551: return NOTOK; ! 552: ! 553: case OK: ! 554: default: ! 555: break; ! 556: ! 557: case DONE: ! 558: goto done_transfer; ! 559: } ! 560: ! 561: if (FTransEndRequest (ftamfd, NULLPE, fti) == NOTOK) { ! 562: ftam_advise (fta, "F-TRANSFER-END.REQUEST"); ! 563: return NOTOK; ! 564: } ! 565: ! 566: switch (fti -> fti_type) { ! 567: case FTI_TRANSEND: ! 568: { ! 569: register struct FTAMtransend *ftre = &fti -> fti_transend; ! 570: ! 571: ftam_diag (ftre -> ftre_diags, ftre -> ftre_ndiag, 1, ! 572: ftre -> ftre_action); ! 573: FTREFREE (ftre); ! 574: } ! 575: break; ! 576: ! 577: case FTI_CANCEL: ! 578: { ! 579: register struct FTAMcancel *ftcn = &fti -> fti_cancel; ! 580: ! 581: advise (NULLCP, "data transfer cancelled!"); ! 582: ftam_diag (ftcn -> ftcn_diags, ftcn -> ftcn_ndiag, 1, ! 583: ftcn -> ftcn_action); ! 584: FTCNFREE (ftcn); ! 585: ! 586: if (FCancelResponse (ftamfd, FACTION_SUCCESS, NULLPE, ! 587: (struct FTAMdiagnostic *) 0, 0, fti) ! 588: == NOTOK) { ! 589: ftam_advise (fta, "F-CANCEL.RESPONSE"); ! 590: return NOTOK; ! 591: } ! 592: } ! 593: break; ! 594: ! 595: default: ! 596: adios (NULLCP, "unexpected indication type=%d", fti -> fti_type); ! 597: } ! 598: #ifdef BRIDGE ! 599: ftp_result = OK; ! 600: #endif ! 601: ! 602: done_transfer: ; ! 603: ftg = &ftgs; ! 604: bzero ((char *) ftg, sizeof *ftg); ! 605: ftg -> ftg_flags |= FTG_BEGIN | FTG_END; ! 606: ftg -> ftg_threshold = 0; ! 607: ! 608: ftg -> ftg_flags |= FTG_CLOSE; ! 609: ftg -> ftg_threshold++; ! 610: ! 611: ftg -> ftg_flags |= FTG_DESELECT; ! 612: ftg -> ftg_threshold++; ! 613: ! 614: if (FBulkEndRequest (ftamfd, ftg, fti) == NOTOK) { ! 615: ftam_advise (fta, "F-BULK-END.REQUEST"); ! 616: return NOTOK; ! 617: } ! 618: ! 619: ftg = &fti -> fti_group; ! 620: ! 621: if (ftg -> ftg_flags & FTG_CLOSE) { ! 622: register struct FTAMclose *ftcl = &ftg -> ftg_close; ! 623: ! 624: ftam_diag (ftcl -> ftcl_diags, ftcl -> ftcl_ndiag, 1, ! 625: ftcl -> ftcl_action); ! 626: } ! 627: ! 628: if (ftg -> ftg_flags & FTG_DESELECT) { ! 629: register struct FTAMdeselect *ftde = &ftg -> ftg_deselect; ! 630: ! 631: ftam_diag (ftde -> ftde_diags, ftde -> ftde_ndiag, 1, ! 632: ftde -> ftde_action); ! 633: ftam_chrg (&ftde -> ftde_charges); ! 634: } ! 635: ! 636: FTGFREE (ftg); ! 637: #ifdef BRIDGE ! 638: return ftp_result; ! 639: #else ! 640: return OK; ! 641: #endif ! 642: ! 643: you_lose: ; ! 644: FTGFREE (ftg); ! 645: return NOTOK; ! 646: } ! 647: ! 648: /* */ ! 649: ! 650: static struct vfsmap *findvf (file) ! 651: char *file; ! 652: { ! 653: struct FTAMgroup ftgs; ! 654: register struct FTAMgroup *ftg = &ftgs; ! 655: struct FTAMindication ftis; ! 656: register struct FTAMindication *fti = &ftis; ! 657: struct vfsmap *vf; ! 658: ! 659: bzero ((char *) ftg, sizeof *ftg); ! 660: ftg -> ftg_flags |= FTG_BEGIN | FTG_END; ! 661: ftg -> ftg_threshold = 0; ! 662: ! 663: ftg -> ftg_flags |= FTG_SELECT; ! 664: { ! 665: register struct FTAMselect *ftse = &ftg -> ftg_select; ! 666: register struct FTAMattributes *fa = &ftse -> ftse_attrs; ! 667: ! 668: fa -> fa_present = FA_FILENAME; ! 669: fa -> fa_nfile = 0; ! 670: fa -> fa_files[fa -> fa_nfile++] = file; ! 671: ! 672: ftse -> ftse_access = FA_PERM_READATTR; ! 673: FCINIT (&ftse -> ftse_conctl); ! 674: } ! 675: ftg -> ftg_threshold++; ! 676: ! 677: ftg -> ftg_flags |= FTG_RDATTR; ! 678: { ! 679: register struct FTAMreadattr *ftra = &ftg -> ftg_readattr; ! 680: ! 681: ftra -> ftra_attrnames = FA_FILENAME | FA_CONTENTS; ! 682: } ! 683: ftg -> ftg_threshold++; ! 684: ! 685: ftg -> ftg_flags |= FTG_DESELECT; ! 686: ftg -> ftg_threshold++; ! 687: ! 688: if (FManageRequest (ftamfd, ftg, fti) == NOTOK) { ! 689: ftam_advise (&fti -> fti_abort, "F-MANAGE.REQUEST"); ! 690: return NULL; ! 691: } ! 692: ! 693: ftg = &fti -> fti_group; ! 694: ! 695: if (ftg -> ftg_flags & FTG_SELECT) { ! 696: register struct FTAMselect *ftse = &ftg -> ftg_select; ! 697: ! 698: if (debug) ! 699: ftam_diag (ftse -> ftse_diags, ftse -> ftse_ndiag, 1, ! 700: ftse -> ftse_action); ! 701: if (ftse -> ftse_state != FSTATE_SUCCESS) ! 702: goto you_lose; ! 703: } ! 704: ! 705: vf = NULL; ! 706: if (ftg -> ftg_flags & FTG_RDATTR) { ! 707: register struct FTAMreadattr *ftra = &ftg -> ftg_readattr; ! 708: register struct FTAMattributes *fa = &ftra -> ftra_attrs; ! 709: ! 710: if (debug) ! 711: ftam_diag (ftra -> ftra_diags, ftra -> ftra_ndiag, 1, ! 712: ftra -> ftra_action); ! 713: if (ftra -> ftra_action != FACTION_SUCCESS) ! 714: fa -> fa_present = 0; ! 715: ! 716: if (fa -> fa_present & FA_CONTENTS) { ! 717: for (vf = vfs; vf -> vf_entry; vf++) ! 718: if (vf -> vf_oid ! 719: && (vf -> vf_flags & VF_OK) ! 720: && oid_cmp (vf -> vf_oid, fa -> fa_contents) == 0) { ! 721: if (fa -> fa_parameter && vf -> vf_number >= 0) { ! 722: if (vf -> vf_parameter && (vf -> vf_flags & VF_PARM)) ! 723: fre_obj (vf -> vf_parameter, ! 724: _ZDOCS_mod.md_dtab[vf -> vf_number], ! 725: &_ZDOCS_mod); ! 726: vf -> vf_parameter = NULL, vf -> vf_flags &= ~VF_PARM; ! 727: if (dec_f (vf -> vf_number, &_ZDOCS_mod, ! 728: fa -> fa_parameter, 1, NULLIP, NULLVP, ! 729: &vf -> vf_parameter) == NOTOK) { ! 730: advise (NULLCP, ! 731: "unable to parse document type parameter: %s", ! 732: PY_pepy); ! 733: vf = NULL; ! 734: } ! 735: else ! 736: if (vf -> vf_check ! 737: && (*vf -> vf_check) (vf -> vf_parameter, ! 738: PY_pepy) == NOTOK) { ! 739: advise (NULLCP, "%s", PY_pepy); ! 740: vf = NULL; ! 741: } ! 742: } ! 743: break; ! 744: } ! 745: if (!vf -> vf_entry) { ! 746: advise (NULLCP, ! 747: "unknown document type %s associated with %s", ! 748: sprintoid (fa -> fa_contents), file); ! 749: vf = NULL; ! 750: } ! 751: } ! 752: } ! 753: ! 754: if (ftg -> ftg_flags & FTG_DESELECT) { ! 755: register struct FTAMdeselect *ftde = &ftg -> ftg_deselect; ! 756: ! 757: if (debug) { ! 758: ftam_diag (ftde -> ftde_diags, ftde -> ftde_ndiag, 1, ! 759: ftde -> ftde_action); ! 760: ftam_chrg (&ftde -> ftde_charges); ! 761: } ! 762: } ! 763: ! 764: FTGFREE (ftg); ! 765: return vf; ! 766: ! 767: you_lose: ; ! 768: FTGFREE (ftg); ! 769: return NULL; ! 770: } ! 771: ! 772: /* */ ! 773: ! 774: static int getloop (fd, dst, wfnx) ! 775: int fd; ! 776: char *dst; ! 777: IFP wfnx; ! 778: { ! 779: int reason, ! 780: result; ! 781: struct FTAMindication ftis; ! 782: register struct FTAMindication *fti = &ftis; ! 783: register struct FTAMabort *fta = &fti -> fti_abort; ! 784: ! 785: for (;;) { ! 786: if (!interrupted) { ! 787: int nfds; ! 788: fd_set rfds; ! 789: ! 790: nfds = 0; ! 791: FD_ZERO (&rfds); ! 792: /* interrupt causes EINTR */ ! 793: if (FSelectMask (ftamfd, &rfds, &nfds, fti) == OK) ! 794: (void) xselect (nfds, &rfds, NULLFD, NULLFD, NOTOK); ! 795: } ! 796: ! 797: if (interrupted) { ! 798: advise (NULLCP, "cancelling transfer"); ! 799: reason = FS_GEN_INITIATOR; ! 800: errno = EINTR; ! 801: goto do_cancel; ! 802: } ! 803: ! 804: switch (result = FWaitRequest (ftamfd, NOTOK, fti)) { ! 805: case NOTOK: ! 806: ftam_advise (&fti -> fti_abort, "F-WAIT.REQUEST"); ! 807: return NOTOK; ! 808: ! 809: case OK: ! 810: case DONE: ! 811: break; ! 812: ! 813: default: ! 814: adios (NULLCP, "unknown return from FWaitRequest=%d", ! 815: result); ! 816: } ! 817: ! 818: switch (fti -> fti_type) { ! 819: case FTI_DATA: ! 820: if ((*wfnx) (fd, &fti -> fti_data, OK) == NOTOK) { ! 821: struct FTAMdiagnostic diags[NFDIAG]; ! 822: register struct FTAMdiagnostic *dp; ! 823: ! 824: advise (dst, "error writing"); ! 825: reason = FS_ACC_WRITE; ! 826: ! 827: do_cancel: ; ! 828: dp = diags; ! 829: ! 830: dp -> ftd_type = DIAG_PERM; ! 831: dp -> ftd_identifier = reason; ! 832: dp -> ftd_observer = dp -> ftd_source = EREF_IFSU; ! 833: dp -> ftd_delay = DIAG_NODELAY; ! 834: (void) strcpy (dp -> ftd_data, sys_errname (errno)); ! 835: dp -> ftd_cc = strlen (dp -> ftd_data); ! 836: dp++; ! 837: ! 838: if (FCancelRequest (ftamfd, FACTION_PERM, NULLPE, diags, ! 839: dp - diags, fti) == NOTOK) { ! 840: ftam_advise (fta, "F-CANCEL.REQUEST"); ! 841: return NOTOK; ! 842: } ! 843: ! 844: if (fti -> fti_type == FTI_CANCEL) { ! 845: register struct FTAMcancel *ftcn = &fti -> fti_cancel; ! 846: ! 847: ftam_diag (ftcn -> ftcn_diags, ftcn -> ftcn_ndiag, 1, ! 848: ftcn -> ftcn_action); ! 849: FTCNFREE (ftcn); ! 850: } ! 851: ! 852: return DONE; ! 853: } ! 854: break; ! 855: ! 856: case FTI_DATAEND: ! 857: return OK; ! 858: ! 859: case FTI_CANCEL: ! 860: { ! 861: register struct FTAMcancel *ftcn = &fti -> fti_cancel; ! 862: ! 863: advise (NULLCP, "data transfer cancelled!"); ! 864: ftam_diag (ftcn -> ftcn_diags, ftcn -> ftcn_ndiag, 1, ! 865: ftcn -> ftcn_action); ! 866: FTCNFREE (ftcn); ! 867: ! 868: if (FCancelResponse (ftamfd, FACTION_SUCCESS, NULLPE, ! 869: (struct FTAMdiagnostic *) 0, 0, fti) ! 870: == NOTOK) { ! 871: ftam_advise (fta, "F-CANCEL.RESPONSE"); ! 872: return NOTOK; ! 873: } ! 874: } ! 875: return DONE; ! 876: ! 877: default: ! 878: adios (NULLCP, "unexpected indication type=%d", ! 879: fti -> fti_type); ! 880: } ! 881: } ! 882: } ! 883: ! 884: /* */ ! 885: ! 886: static int ubffnx (fd, px, status) ! 887: int fd; ! 888: register struct PSAPdata *px; ! 889: int status; ! 890: { ! 891: register int i, ! 892: n; ! 893: register PE pe, ! 894: *pep; ! 895: static int cc; ! 896: ! 897: if (px == NULL) { ! 898: switch (status) { ! 899: case OK: ! 900: default: ! 901: cc = 0; ! 902: if (verbose) ! 903: timer (cc, NULLCP); ! 904: if (hash) ! 905: marks = BUFSIZ - 1; ! 906: break; ! 907: ! 908: case DONE: ! 909: if (verbose) ! 910: timer (cc, "received"); ! 911: break; ! 912: } ! 913: ! 914: return OK; ! 915: } ! 916: ! 917: for (pep = px -> px_info, i = px -> px_ninfo - 1; i >= 0; pep++, i--) { ! 918: if ((pe = *pep) == NULLPE) ! 919: continue; ! 920: ! 921: switch (myvf - vfs) { ! 922: case VFS_UBF: ! 923: default: ! 924: if (debug) ! 925: WATCHP (DOCS_FTAM__3__Datatype1, pe, 1); ! 926: n = de2fd (fd, pe, 0, 0); ! 927: break; ! 928: ! 929: case VFS_UTF: ! 930: if (debug) ! 931: WATCHP (DOCS_FTAM__1__Datatype1, pe, 1); ! 932: n = de2fd (fd, pe, 1, effector); ! 933: break; ! 934: } ! 935: if (n == NOTOK) ! 936: break; ! 937: ! 938: if (verbose || hash) ! 939: cc += n; ! 940: if (hash) { ! 941: if (hash > 1) ! 942: printf ("%d\r", cc); ! 943: else ! 944: for (; marks < cc; marks += BUFSIZ) ! 945: (void) putchar ('#'); ! 946: (void) fflush (stdout); ! 947: } ! 948: } ! 949: ! 950: PXFREE (px); ! 951: ! 952: return n; ! 953: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.