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