home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume14 / 3bconnect / file.c < prev    next >
C/C++ Source or Header  |  1988-05-08  |  2KB  |  92 lines

  1. /*
  2.  * file.c: server end of the "rcp" function.
  3.  * Send or get files. Relies on the transport interface to detect errors,
  4.  * only checks sequence numbers to identify lost packets.
  5.  * If a packet is lost, then the transfer is abandoned and restarted - this
  6.  * is not expected to happen often.
  7.  */
  8. #include <sys/types.h>
  9. #include <sys/stat.h>
  10.  
  11. #include "ni.h"
  12.  
  13. #include "ftp.h"
  14.  
  15. extern char *sys_errlist[];
  16. extern int errno;
  17.  
  18. char *lastpart();
  19.  
  20. fileserver(r)
  21. register struct request *r;
  22. {
  23.     register int f, n;
  24.     int mode, newfile;
  25.     long kb;
  26.     struct stat statb;
  27.     char fname[128], local[128], remote[128];
  28. /*
  29.  * re-configure the ethernet port to handle sufficient buffers
  30.  */
  31.     close(ethernet);
  32.     configure(server, WINDOW, getpid());
  33.     send(r, 0, ACCEPT, client);
  34.     signal(SIGTERM, SIG_DFL);        /* TERMINATE packet kills */
  35.     while(1) {
  36.         recv(r);            /* get request */
  37.         switch(r->r_type) {
  38.         case TERMINATE:
  39.             exit(1);
  40.             break;
  41.         case SENDFILE:
  42.             strncpy(fname, r->r_data, r->r_size);
  43.             fname[r->r_size] = 0;
  44.             if((f = open(fname, 0)) == -1) {
  45.                 n = sprintf(r->r_data, "%s: %s", fname,
  46.                     sys_errlist[errno]);
  47.                 send(r, n, REJECT, client);
  48.             }
  49.             else {
  50.                 stat(fname, &statb);
  51.                 n = sprintf(r->r_data, "%d", statb.st_mode & 0777);
  52.                 send(r, n, ACCEPT, client);
  53.                 ftpout(f, client);
  54.                 close(f);
  55.             }
  56.             break;
  57.         case PUTFILE:
  58.             n = sscanf(r->r_data,  "%d %s %s", 
  59.                     &mode,  remote, local);
  60.             if(n != 3) {
  61.                 n = sprintf(r->r_data, "Illegal request parameters");
  62.                 send(r, n, REJECT, client);
  63.                 break;
  64.             }
  65.             strcpy(fname, local);
  66.             if(stat(local, &statb) != -1) {
  67.                 if((statb.st_mode & S_IFMT) == S_IFDIR)
  68.                     sprintf(fname, "%s/%s", local, 
  69.                         lastpart(remote));
  70.                 newfile = 0;
  71.             }
  72.             else newfile = 1;
  73.             if((f = creat(fname, 0666)) == -1) {
  74.                 n = sprintf(r->r_data, "%s: %s", fname,
  75.                     sys_errlist[errno]);
  76.                 send(r, n, REJECT, client);
  77.             }
  78.             else {
  79.                 if(newfile) chmod(fname, mode);
  80.                 send(r, 0, ACCEPT, client);
  81.                 if(!ftpin(f, client, &kb)) unlink(fname);
  82.                 close(f);
  83.             }
  84.             break;
  85.         default:
  86.             n = sprintf(r->r_data, "Illegal request function %d", 
  87.                     r->r_type);
  88.             send(r, n, REJECT, client);
  89.         }
  90.     }
  91. }
  92.