home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 239.lha / Unix2src.shar / server / scopy.c < prev    next >
C/C++ Source or Header  |  1989-05-02  |  3KB  |  169 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. #include "../lib/dnetlib.h"
  22.  
  23. char Buf[4096];
  24.  
  25. chandler()
  26. {
  27.     union wait stat;
  28.     struct rusage rus;
  29.     while (wait3(&stat, WNOHANG, &rus) > 0);
  30. }
  31.  
  32. main(ac,av)
  33. char *av[];
  34. {
  35.     long chann = DListen(PORT_FILECOPY);
  36.     int fd;
  37.     int n;
  38.     char buf[256];
  39.     extern int errno;
  40.  
  41.     elog(EDEBUG, "SCOPY START", 0);
  42.     if (av[1])
  43.         chdir(av[1]);
  44.     signal(SIGCHLD, chandler);
  45.     signal(SIGPIPE, SIG_IGN);
  46.     for (;;) {
  47.     fd = DAccept(chann);
  48.     if (fd < 0) {
  49.         if (errno == EINTR)
  50.         continue;
  51.         break;
  52.     }
  53.         elog(EDEBUG, "SCOPY CONNECT", 0);
  54.     if (fork() == NULL) {
  55.         putdir(fd, "."); 
  56.         _exit(1);
  57.     }
  58.     close(fd);
  59.     }
  60.     perror("SCOPY");
  61. }
  62.  
  63. putdir(chan, dirname)
  64. char *dirname;
  65. {
  66.     struct stat stat;
  67.     char olddir[256];
  68.     char co, nl, name[128];
  69.     long len;
  70.     int ret = -1;
  71.  
  72.     getwd(olddir);
  73.     if (lstat(dirname, &stat) >= 0 && !(stat.st_mode & S_IFDIR)) {
  74.     char rc = 'N';
  75.     gwrite(chan, &rc, 1);
  76.     elog(EWARN, "SCOPY: Unable to cd to dir '%s'", dirname);
  77.     return(1);
  78.     }
  79.     if (chdir(dirname) < 0) {
  80.     if (mkdir(dirname, 0777) < 0 || chdir(dirname) < 0) {
  81.         char rc = 'N';
  82.         elog(EWARN, "SCOPY: Unable to create directory '%s'", dirname);
  83.         gwrite(chan, &rc, 1);
  84.         return(1);
  85.     }
  86.     }
  87.     co = 'Y';
  88.     gwrite(chan, &co, 1);
  89.     while (ggread(chan, &co, 1) == 1) {
  90.     if (ggread(chan, &nl, 1) != 1 || ggread(chan, name, nl) != nl)
  91.         break;
  92.     if (ggread(chan, &len, 4) != 4)
  93.         break;
  94.     len = ntohl68(len);
  95.     switch(co) {
  96.     case 'C':
  97.         co = 'Y';
  98.             if (chdir(name) < 0) {
  99.         if (mkdir(name, 0777) < 0 || chdir(name) < 0)  {
  100.             co = 'N';
  101.                 elog(EWARN, "SCOPY: Unable to create directory '%s'", 
  102.             dirname);
  103.         }
  104.         }
  105.         gwrite(chan, &co, 1);
  106.         break;
  107.     case 'W':
  108.         if (putfile(chan, name, len) < 0) {
  109.         ret = -1;
  110.         elog(EWARN, "SCOPY: Failure on file %.*s", len, name);
  111.         goto fail;
  112.         }
  113.         break;
  114.     case 'X':
  115.         if (putdir(chan, name) < 0) {
  116.         ret = -1;
  117.         goto fail;
  118.         }
  119.         break;
  120.     case 'Y':
  121.         ret = 1;
  122.         co = 'Y';
  123.         gwrite(chan, &co, 1);
  124.         goto fail;
  125.     default:
  126.         co = 'N';
  127.         gwrite(chan, &co, 1);
  128.         break;
  129.     }
  130.     }
  131. fail:
  132.     chdir(olddir);
  133.     return(ret);
  134. }
  135.  
  136. putfile(chan, name, len)
  137. char *name;
  138. {
  139.     long fd = open(name, O_WRONLY|O_CREAT|O_TRUNC, 0666);
  140.     long n, r;
  141.     char rc;
  142.  
  143.     if (fd < 0) {
  144.     rc = 'N';
  145.     gwrite(chan, &rc, 1);
  146.     return(0);
  147.     }
  148.     rc = 'Y';
  149.     gwrite(chan, &rc, 1);
  150.     while (len) {
  151.     r = (len > sizeof(Buf)) ? sizeof(Buf) : len;
  152.     n = ggread(chan, Buf, r);
  153.     if (n != r)
  154.         break;
  155.         if (write(fd, Buf, n) != n)
  156.         break;
  157.     len -= n;
  158.     }
  159.     close(fd);
  160.     if (len) {
  161.     unlink(name);
  162.     return(-1);
  163.     }
  164.     rc = 'Y';
  165.     gwrite(chan, &rc, 1);
  166.     return(0);
  167. }
  168.  
  169.