new libsa version
[unix-history] / usr / src / contrib / sc / crypt.c
CommitLineData
940fe9cb
KB
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
19char *strcpy();
20
21#ifdef SYSV3
22void exit();
23#endif
24
25int Crypt = 0;
26
27creadfile (save, eraseflg)
28char *save;
29int 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
95cwritefile (fname, r0, c0, rn, cn)
96char *fname;
97int 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