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

  1.  
  2. /*
  3.  *    SCOPY.C
  4.  *
  5.  *    DNET (c)Copyright 1988, Matthew Dillon, All Rights Reserved
  6.  *
  7.  *    Remote file copy server (putfiles is the client program)
  8.  */
  9.  
  10. #include <sys/types.h>
  11. #include <sys/stat.h>
  12. #include <sys/wait.h>
  13. #include <sys/time.h>
  14. #include <sys/file.h>
  15. #include <sys/resource.h>
  16. #include <stdio.h>
  17. #include <errno.h>
  18. #include <signal.h>
  19.  
  20. #include "servers.h"
  21.  
  22. char Buf[4096];
  23.  
  24. chandler()
  25. {
  26.     union wait stat;
  27.     struct rusage rus;
  28.     while (wait3(&stat, WNOHANG, &rus) > 0);
  29. }
  30.  
  31. main(ac,av)
  32. char *av[];
  33. {
  34.     long chann = DListen(PORT_FILECOPY);
  35.     int fd;
  36.     int n;
  37.     char buf[256];
  38.     extern int errno;
  39.  
  40.     if (av[1])
  41.         chdir(av[1]);
  42.     signal(SIGCHLD, chandler);
  43.     signal(SIGPIPE, SIG_IGN);
  44.     for (;;) {
  45.     fd = DAccept(chann);
  46.     if (fd < 0) {
  47.         if (errno == EINTR)
  48.         continue;
  49.         break;
  50.     }
  51.     if (fork() == NULL) {
  52.         putdir(fd, "."); 
  53.         _exit(1);
  54.     }
  55.     close(fd);
  56.     }
  57.     perror("SCOPY");
  58. }
  59.  
  60. putdir(chan, dirname)
  61. char *dirname;
  62. {
  63.     struct stat stat;
  64.     char olddir[256];
  65.     char co, nl, name[128];
  66.     long len;
  67.     int ret = -1;
  68.  
  69.     getwd(olddir);
  70.     if (lstat(dirname, &stat) > 0 && !(stat.st_mode & S_IFDIR)) {
  71.     char rc = 'N';
  72.     gwrite(chan, &rc, 1);
  73.     return(1);
  74.     }
  75.     if (chdir(dirname) < 0) {
  76.     if (mkdir(dirname, 0777) < 0 || chdir(dirname) < 0) {
  77.         char rc = 'N';
  78.         gwrite(chan, &rc, 1);
  79.         return(1);
  80.     }
  81.     }
  82.     co = 'Y';
  83.     gwrite(chan, &co, 1);
  84.     while (ggread(chan, &co, 1) == 1) {
  85.     if (ggread(chan, &nl, 1) != 1 || ggread(chan, name, nl) != nl)
  86.         break;
  87.     if (ggread(chan, &len, 4) != 4)
  88.         break;
  89.     len = ntohl68(len);
  90.     switch(co) {
  91.     case 'C':
  92.         co = 'Y';
  93.             if (chdir(name) < 0) {
  94.         if (mkdir(name, 0777) < 0 || chdir(name) < 0) 
  95.             co = 'N';
  96.         }
  97.         gwrite(chan, &co, 1);
  98.         break;
  99.     case 'W':
  100.         if (putfile(chan, name, len) < 0) {
  101.         ret = -1;
  102.         goto fail;
  103.         }
  104.         break;
  105.     case 'X':
  106.         if (putdir(chan, name) < 0) {
  107.         ret = -1;
  108.         goto fail;
  109.         }
  110.         break;
  111.     case 'Y':
  112.         ret = 1;
  113.         co = 'Y';
  114.         gwrite(chan, &co, 1);
  115.         goto fail;
  116.     default:
  117.         co = 'N';
  118.         gwrite(chan, &co, 1);
  119.         break;
  120.     }
  121.     }
  122. fail:
  123.     chdir(olddir);
  124.     return(ret);
  125. }
  126.  
  127. putfile(chan, name, len)
  128. char *name;
  129. {
  130.     long fd = open(name, O_WRONLY|O_CREAT|O_TRUNC, 0666);
  131.     long n, r;
  132.     char rc;
  133.  
  134.     if (fd < 0) {
  135.     rc = 'N';
  136.     gwrite(chan, &rc, 1);
  137.     return(0);
  138.     }
  139.     rc = 'Y';
  140.     gwrite(chan, &rc, 1);
  141.     while (len) {
  142.     r = (len > sizeof(Buf)) ? sizeof(Buf) : len;
  143.     n = ggread(chan, Buf, r);
  144.     if (n != r)
  145.         break;
  146.         if (write(fd, Buf, n) != n)
  147.         break;
  148.     len -= n;
  149.     }
  150.     close(fd);
  151.     if (len) {
  152.     unlink(name);
  153.     return(-1);
  154.     }
  155.     rc = 'Y';
  156.     gwrite(chan, &rc, 1);
  157.     return(0);
  158. }
  159.  
  160.