home *** CD-ROM | disk | FTP | other *** search
/ Frozen Fish 1: Amiga / FrozenFish-Apr94.iso / bbs / alib / d1xx / d145 / dnet.lha / Dnet / amiga / client / putfiles.c < prev    next >
C/C++ Source or Header  |  1988-05-26  |  4KB  |  188 lines

  1.  
  2. /*
  3.  *  PUTFILES.C
  4.  *
  5.  *  DNET (c)Copyright 1988, Matthew Dillon, All Rights Reserved.
  6.  *
  7.  *  Download one or more files or directories to the remote host
  8.  */
  9.  
  10. #include <stdio.h>
  11. #include "/server/servers.h"
  12.  
  13. int Enable_Abort;
  14. char Buf[1024];
  15.  
  16. typedef struct FileInfoBlock FIB;
  17.  
  18. extern char *AllocMem();
  19.  
  20. main(ac,av)
  21. char *av[];
  22. {
  23.     long chan;
  24.     long n, len, orig;
  25.     long fh;
  26.     short i, j;
  27.     char fn;
  28.     char *host = NULL;
  29.  
  30.     if (ac == 1) {
  31.     puts("putfiles [-Nnet#] [-dremotedir] file/dir file/dir ....");
  32.     exit(1);
  33.     }
  34.     Enable_Abort = 0;
  35.     if (ac > 1 && strncmp(av[1], "-N", 2) == 0) {
  36.     host = av[1] + 2;
  37.     --ac;
  38.     ++av;
  39.     }
  40.     chan = DOpen(host, PORT_FILECOPY, -80, 126);
  41.     if (!chan) {
  42.     puts("Unable to connect");
  43.     exit(1);
  44.     }
  45.     DRead(chan, &fn, 1);
  46.     if (fn != 'Y') {
  47.     puts("Remote Server Software Error");
  48.     DClose(chan);
  49.     exit(1);
  50.     }
  51.     for (i = 1; i < ac; ++i) {
  52.     if (strncmp(av[i], "-d", 2) == 0) {
  53.         char *dir = av[i] + 2;
  54.         if (*dir == 0 && i+1 < ac) {
  55.         ++i;
  56.         dir = av[i];
  57.         }
  58.         if (writehdr(chan, 'C', dir, 0) != 'Y') {
  59.         printf("Unable to go to remote directory %s\n", dir);
  60.         break;
  61.         }
  62.     } else {
  63.         if (putname(chan, av[i]) < 0)
  64.         break;
  65.     }
  66.     }
  67.     printf("\nclosing... ");
  68.     fflush(stdout);
  69.     DClose(chan);
  70.     puts("done");
  71. }
  72.  
  73. putname(chan, file)
  74. char *file;
  75. {
  76.     long lock = Lock(file, SHARED_LOCK);
  77.     long dirl;
  78.     int ret = 1;
  79.     FIB *fib = (FIB *)AllocMem(sizeof(FIB), MEMF_PUBLIC);
  80.  
  81.     printf("%-20s ", file);
  82.     if (lock == NULL || !Examine(lock, fib)) {
  83.     FreeMem(fib, sizeof(FIB));
  84.     puts("NOT FOUND");
  85.     return(1);
  86.     }
  87.     if (fib->fib_DirEntryType > 0) {
  88.     char *dirname = (fib->fib_FileName[0]) ? fib->fib_FileName : "ram";
  89.     puts("DIR");
  90.     dirl = CurrentDir(lock);
  91.     if (writehdr(chan, 'X', dirname, 0) != 'Y') {
  92.         puts("Remote unable to make directory");
  93.         goto f1;
  94.     }
  95.     while (ExNext(lock, fib)) {
  96.         if (putname(chan, fib->fib_FileName) < 0) {
  97.         ret = -1;
  98.         break;
  99.         }
  100.     }
  101.     writehdr(chan, 'Y', "?", 0);
  102. f1:
  103.     UnLock(CurrentDir(dirl));
  104.     } else {
  105.     UnLock(lock);
  106.     ret = putfile(chan, file, fib->fib_FileName);
  107.     }
  108.     FreeMem(fib, sizeof(FIB));
  109.     return(ret);
  110. }
  111.  
  112. putfile(chan, file, stripedname)
  113. char *file;
  114. char *stripedname;
  115. {
  116.     long fh = Open(file, 1005);
  117.     long n, r, len;
  118.     long ttl = 0;
  119.     char co;
  120.  
  121.     fflush(stdout);
  122.     if (fh == NULL) {
  123.     puts("FILE NOT FOUND");
  124.     return(0);
  125.     }
  126.     Seek(fh, 0, 1);
  127.     len = ttl = Seek(fh, 0, -1);
  128.     if (writehdr(chan, 'W', stripedname, len) != 'Y') {
  129.     puts("REMOTE UNABLE TO ACCEPT FILE");
  130.     Close(fh);
  131.     return(0);
  132.     }
  133.     printf("%6ld/%-6ld", ttl - len, ttl);
  134.     while (len) {
  135.     fflush(stdout);
  136.     r = (len > sizeof(Buf)) ? sizeof(Buf) : len;
  137.     n = Read(fh, Buf, r);
  138.     if (n != r) {
  139.         puts("Local File error");
  140.         Close(fh);
  141.         return(-1);
  142.     }
  143.     if (DWrite(chan, Buf, n) != n) {
  144.         puts("Remote error");
  145.         Close(fh);
  146.         return(-1);
  147.     }
  148.     if (SetSignal(0,0) & SIGBREAKF_CTRL_C) {
  149.         puts("\nBreak");
  150.         Close(fh);
  151.         return(-1);
  152.     }
  153.     len -= n;
  154.     printf("\010\010\010\010\010\010\010\010\010\010\010\010\010");
  155.     printf("%6ld/%-6ld", ttl - len, ttl);
  156.     }
  157.     Close(fh);
  158.     if (len) {
  159.     puts("REMOTE ERROR");
  160.     return(-1);
  161.     }
  162.     printf("Queued, waiting...");
  163.     fflush(stdout);
  164.     DRead(chan, &co, 1);
  165.     if (co != 'Y') {
  166.     puts("Remote Server Software Error");
  167.     return(-1);
  168.     }
  169.     puts("  OK");
  170.     return(0);
  171. }
  172.  
  173. writehdr(chan, c, name, len)
  174. unsigned char c;
  175. char *name;
  176. long len;
  177. {
  178.     DWrite(chan, &c, 1);
  179.     c = strlen(name) + 1;
  180.     DWrite(chan, &c, 1);
  181.     DWrite(chan, name, c);
  182.     DWrite(chan, &len, 4);
  183.     if (DRead(chan, &c, 1) == 1)
  184.     return(c);
  185.     return(-1);
  186. }
  187.  
  188.