home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 498a.lha / SC_v6.7 / crypt.c < prev    next >
C/C++ Source or Header  |  1991-04-08  |  4KB  |  176 lines

  1. /*
  2.  * Encryption utilites
  3.  * Bradley Williams    
  4.  * {allegra,ihnp4,uiucdcs,ctvax}!convex!williams
  5.  * $Revision: 6.8 $
  6.  */
  7.  
  8. #include <stdio.h>
  9. #include <curses.h>
  10.  
  11. #if defined(BSD42) || defined(BSD43)
  12. #include <sys/file.h>
  13. #else
  14. #include <fcntl.h>
  15. #endif
  16.  
  17. #include "sc.h"
  18.  
  19. char        *strcpy();
  20.  
  21. #ifdef SYSV3
  22. void exit();
  23. #endif
  24.  
  25. int         Crypt = 0;
  26.  
  27. creadfile (save, eraseflg)
  28. char *save;
  29. int  eraseflg;
  30. {
  31.     register FILE *f;
  32.     int pipefd[2];
  33.     int fildes;
  34.     int pid;
  35.  
  36.     if (eraseflg && strcmp(save, curfile) && modcheck(" first")) return;
  37.  
  38.     if ((fildes = open(findhome(save), O_RDONLY, 0)) < 0)
  39.     {
  40.     error ("Can't read file \"%s\"", save);
  41.     return;
  42.     }
  43.  
  44.     if (eraseflg) erasedb ();
  45.  
  46.     if (pipe(pipefd) < 0) {
  47.     error("Can't make pipe to child");
  48.     return;
  49.     }
  50.  
  51.     deraw();
  52.     if ((pid=fork()) == 0)              /* if child  */
  53.     {
  54.     (void) close (0);          /* close stdin */
  55.     (void) close (1);          /* close stdout */
  56.     (void) close (pipefd[0]);      /* close pipe input */
  57.     (void) dup (fildes);          /* standard in from file */
  58.     (void) dup (pipefd[1]);          /* connect to pipe */
  59.     (void) fprintf (stderr, " ");
  60.     (void) execl ("/bin/sh", "sh", "-c", "crypt", (char *)0);
  61.     exit (-127);
  62.     }
  63.     else                  /* else parent */
  64.     {
  65.     (void) close (fildes);
  66.     (void) close (pipefd[1]);      /* close pipe output */
  67.     if ((f = fdopen (pipefd[0], "r")) == (FILE *)0)
  68.     {
  69.         (void) kill (pid, -9);
  70.         error ("Can't fdopen file \"%s\"", save);
  71.         (void) close (pipefd[0]);
  72.         return;
  73.     }
  74.     }
  75.  
  76.     loading++;
  77.     while (fgets(line,sizeof line,f)) {
  78.     linelim = 0;
  79.     if (line[0] != '#') (void) yyparse ();
  80.     }
  81.     --loading;
  82.     (void) fclose (f);
  83.     (void) close (pipefd[0]);
  84.     while (pid != wait(&fildes)) /**/;
  85.     goraw();
  86.     linelim = -1;
  87.     modflg++;
  88.     if (eraseflg) {
  89.     (void) strcpy (curfile, save);
  90.     modflg = 0;
  91.     }
  92.     EvalAll();
  93. }
  94.  
  95. cwritefile (fname, r0, c0, rn, cn)
  96. char *fname;
  97. int r0, c0, rn, cn;
  98. {
  99.     register FILE *f;
  100.     int pipefd[2];
  101.     int fildes;
  102.     int pid;
  103.     char save[PATHLEN];
  104.     char *fn;
  105.     char *busave;
  106.  
  107.     if (*fname == '\0') fname = &curfile[0];
  108.  
  109.     fn = fname;
  110.     while (*fn && (*fn == ' '))  /* Skip leading blanks */
  111.     fn++;
  112.  
  113.     if ( *fn == '|' ) {
  114.     error ("Can't have encrypted pipe");
  115.     return(-1);
  116.     }
  117.  
  118.     (void) strcpy(save,fname);
  119.  
  120.     busave = findhome(save);
  121. #ifdef DOBACKUPS
  122.     if (!backup_file(busave) &&
  123.     (yn_ask("Could not create backup copy, Save anyhow?: (y,n)") != 1))
  124.         return(0);
  125. #endif
  126.     if ((fildes = open (busave, O_TRUNC|O_WRONLY|O_CREAT, 0600)) < 0)
  127.     {
  128.     error ("Can't create file \"%s\"", save);
  129.     return(-1);
  130.     }
  131.  
  132.     if (pipe (pipefd) < 0) {
  133.     error ("Can't make pipe to child\n");
  134.     return(-1);
  135.     }
  136.  
  137.     deraw();
  138.     if ((pid=fork()) == 0)              /* if child  */
  139.     {
  140.     (void) close (0);              /* close stdin */
  141.     (void) close (1);              /* close stdout */
  142.     (void) close (pipefd[1]);          /* close pipe output */
  143.     (void) dup (pipefd[0]);              /* connect to pipe input */
  144.     (void) dup (fildes);              /* standard out to file */
  145.     (void) fprintf (stderr, " ");
  146.     (void) execl ("/bin/sh", "sh", "-c", "crypt", 0);
  147.     exit (-127);
  148.     }
  149.     else                  /* else parent */
  150.     {
  151.     (void) close (fildes);
  152.     (void) close (pipefd[0]);          /* close pipe input */
  153.     f = fdopen (pipefd[1], "w");
  154.     if (f == 0)
  155.     {
  156.         (void) kill (pid, -9);
  157.         error ("Can't fdopen file \"%s\"", save);
  158.         (void) close (pipefd[1]);
  159.         return(-1);
  160.     }
  161.     }
  162.  
  163.     write_fd(f, r0, c0, rn, cn);
  164.  
  165.     (void) fclose (f);
  166.     (void) close (pipefd[1]);
  167.     while (pid != wait(&fildes)) /**/;
  168.     (void) strcpy(curfile,save);
  169.  
  170.     modflg = 0;
  171.     error ("File \"%s\" written", curfile);
  172.     goraw();
  173.     return(0);
  174. }
  175.  
  176.