| 1 | /* edit.c - */ |
| 2 | |
| 3 | #ifndef lint |
| 4 | static char *rcsid = "$Header: /f/osi/quipu/dish/RCS/edit.c,v 7.2 91/02/22 09:40:31 mrose Interim $"; |
| 5 | #endif |
| 6 | |
| 7 | /* |
| 8 | * $Header: /f/osi/quipu/dish/RCS/edit.c,v 7.2 91/02/22 09:40:31 mrose Interim $ |
| 9 | * |
| 10 | * |
| 11 | * $Log: edit.c,v $ |
| 12 | * Revision 7.2 91/02/22 09:40:31 mrose |
| 13 | * Interim 6.8 |
| 14 | * |
| 15 | * Revision 7.1 90/07/09 14:47:08 mrose |
| 16 | * sync |
| 17 | * |
| 18 | * Revision 7.0 89/11/23 22:20:04 mrose |
| 19 | * Release 6.0 |
| 20 | * |
| 21 | */ |
| 22 | |
| 23 | /* |
| 24 | * NOTICE |
| 25 | * |
| 26 | * Acquisition, use, and distribution of this module and related |
| 27 | * materials are subject to the restrictions of a license agreement. |
| 28 | * Consult the Preface in the User's Manual for the full terms of |
| 29 | * this agreement. |
| 30 | * |
| 31 | */ |
| 32 | |
| 33 | |
| 34 | #include "manifest.h" |
| 35 | #include "quipu/util.h" |
| 36 | #include "psap.h" |
| 37 | #include "tailor.h" |
| 38 | #ifdef BSD42 |
| 39 | #include <sys/file.h> |
| 40 | #endif |
| 41 | #ifdef SYS5 |
| 42 | #include <fcntl.h> |
| 43 | #endif |
| 44 | #include <sys/stat.h> |
| 45 | |
| 46 | extern char fname[]; |
| 47 | |
| 48 | #define OPT (!frompipe || rps -> ps_byteno == 0 ? opt : rps) |
| 49 | #define RPS (!frompipe || opt -> ps_byteno == 0 ? rps : opt) |
| 50 | extern char frompipe; |
| 51 | extern PS opt, rps; |
| 52 | |
| 53 | editentry (argc, argv) |
| 54 | int argc; |
| 55 | char **argv; |
| 56 | { |
| 57 | char str[LINESIZE]; |
| 58 | char prog[LINESIZE]; |
| 59 | int res; |
| 60 | extern char inbuf[]; |
| 61 | extern int fd; |
| 62 | extern char remote_prob; |
| 63 | extern char dad_flag; |
| 64 | |
| 65 | if (argc != 1) { |
| 66 | Usage (argv[0]); |
| 67 | return (NOTOK); |
| 68 | } |
| 69 | |
| 70 | (void) sprintf (str, "%s %s", |
| 71 | _isodefile (isodebinpath, "editentry"), fname); |
| 72 | |
| 73 | if (!frompipe) |
| 74 | return (system (str) ? NOTOK : OK); |
| 75 | |
| 76 | if (!dad_flag) { |
| 77 | (void) sprintf (prog, "e%s\n", str); |
| 78 | |
| 79 | send_pipe_aux (prog); |
| 80 | |
| 81 | if ((res = read_pipe_aux (prog,sizeof prog)) < 1) { |
| 82 | (void) fprintf (stderr, "read failure\n"); |
| 83 | remote_prob = TRUE; |
| 84 | return (NOTOK); |
| 85 | } else { |
| 86 | if ((res == 1) && (*prog == 'e')) { |
| 87 | remote_prob = FALSE; |
| 88 | return (NOTOK); /* remote error - abandon ! */ |
| 89 | } |
| 90 | if (*fname != '/') { |
| 91 | char tempbuf[LINESIZE]; |
| 92 | |
| 93 | /* relative path... prefix cwd */ |
| 94 | *(prog + res) = 0; |
| 95 | (void) sprintf (tempbuf, "%s/%s", prog, fname); |
| 96 | (void) strcpy (fname, tempbuf); |
| 97 | } |
| 98 | } |
| 99 | } else { |
| 100 | #ifndef SOCKETS |
| 101 | ps_printf (OPT, |
| 102 | "operation not allowed when using directory assistance server!\n"); |
| 103 | return NOTOK; |
| 104 | #else |
| 105 | int cc, i, j; |
| 106 | char *cp, *dp; |
| 107 | FILE *fp; |
| 108 | struct stat st; |
| 109 | extern int errno; |
| 110 | |
| 111 | if ((fp = fopen (fname, "r+")) == NULL) { |
| 112 | ps_printf (OPT, "unable to open %s for rw: %s\n", |
| 113 | fname, sys_errname (errno)); |
| 114 | return NOTOK; |
| 115 | } |
| 116 | if (fstat (fileno (fp), &st) == NOTOK |
| 117 | || (st.st_mode & S_IFMT) != S_IFREG |
| 118 | || (cc = st.st_size) == 0) { |
| 119 | ps_printf (OPT, "%s: not a regular file\n", fname); |
| 120 | out: ; |
| 121 | (void) fclose (fp); |
| 122 | return NOTOK; |
| 123 | } |
| 124 | |
| 125 | (void) sprintf (prog, "e%d\n", cc); |
| 126 | send_pipe_aux (prog); |
| 127 | |
| 128 | if ((res = read_pipe_aux (prog, sizeof prog)) < 1) { |
| 129 | (void) fprintf (stderr, "read failure\n"); |
| 130 | remote_prob = TRUE; |
| 131 | goto out; |
| 132 | } |
| 133 | else |
| 134 | if ((res == 1) && (*prog == 'e')) { |
| 135 | remote_prob = FALSE; |
| 136 | goto out; |
| 137 | } |
| 138 | |
| 139 | if ((cp = malloc ((unsigned) (cc))) == NULL) { |
| 140 | ps_printf (OPT, "out of memory\n"); |
| 141 | goto out; |
| 142 | } |
| 143 | for (dp = cp, j = cc; j > 0; dp += i, j -= i) |
| 144 | switch (i = fread (dp, sizeof *dp, j, fp)) { |
| 145 | case NOTOK: |
| 146 | ps_printf (OPT, "error reading %s: %s\n", |
| 147 | fname, sys_errname (errno)); |
| 148 | goto out2; |
| 149 | |
| 150 | case OK: |
| 151 | ps_printf (OPT, "premature eof reading %s\n", |
| 152 | fname); |
| 153 | out2: ; |
| 154 | free (cp); |
| 155 | goto out; |
| 156 | |
| 157 | default: |
| 158 | break; |
| 159 | } |
| 160 | |
| 161 | send_pipe_aux2 (cp, cc); |
| 162 | free (cp), cp = NULL; |
| 163 | |
| 164 | if ((res = read_pipe_aux2 (&cp, &cc)) < 1) { |
| 165 | (void) ps_printf (OPT, "read failure\n"); |
| 166 | remote_prob = TRUE; |
| 167 | goto out; |
| 168 | } |
| 169 | if (res == 1) { |
| 170 | if (*cp != 'e') |
| 171 | (void) ps_printf (OPT, "remote protocol error: %s\n", |
| 172 | cp); |
| 173 | goto out; |
| 174 | } |
| 175 | |
| 176 | (void) fclose (fp); |
| 177 | if ((fp = fopen (fname, "w")) == NULL) { |
| 178 | ps_printf (OPT, "unable to re-open %s for writing: %s\n", |
| 179 | fname, sys_errname (errno)); |
| 180 | free (cp); |
| 181 | return NOTOK; |
| 182 | } |
| 183 | |
| 184 | if (fwrite (cp, sizeof *cp, cc, fp) == 0) { |
| 185 | ps_printf (OPT, "error writing %s: %s\n", |
| 186 | fname, sys_errname (errno)); |
| 187 | goto out2; |
| 188 | } |
| 189 | |
| 190 | free (cp); |
| 191 | (void) fclose (fp); |
| 192 | #endif |
| 193 | } |
| 194 | |
| 195 | return (OK); |
| 196 | } |
| 197 | |
| 198 | |
| 199 | get_password (str,buffer) |
| 200 | char * str; |
| 201 | char * buffer; |
| 202 | { |
| 203 | |
| 204 | char prog[LINESIZE]; |
| 205 | int res; |
| 206 | extern char inbuf[]; |
| 207 | extern int fd; |
| 208 | extern char remote_prob; |
| 209 | char * getpassword (); |
| 210 | |
| 211 | if (frompipe) { |
| 212 | (void) sprintf (prog, "p%s\n", str); |
| 213 | |
| 214 | send_pipe_aux (prog); |
| 215 | |
| 216 | if ((res = read_pipe_aux (prog,sizeof prog)) < 1) { |
| 217 | (void) fprintf (stderr, "read failure\n"); |
| 218 | remote_prob = TRUE; |
| 219 | return; |
| 220 | } else { |
| 221 | *(prog+res) = 0; |
| 222 | (void) strcpy (buffer, prog + 1); |
| 223 | } |
| 224 | } else { |
| 225 | (void) sprintf (buffer,"Enter password for \"%s\": ",str); |
| 226 | (void) strcpy (buffer,getpassword (buffer)); |
| 227 | } |
| 228 | } |
| 229 | |
| 230 | yesno (str) |
| 231 | char * str; |
| 232 | { |
| 233 | char prog[LINESIZE]; |
| 234 | extern char inbuf[]; |
| 235 | extern int fd; |
| 236 | extern char remote_prob; |
| 237 | char * getpassword (); |
| 238 | |
| 239 | if (frompipe) { |
| 240 | (void) sprintf (prog, "y%s\n", str); |
| 241 | |
| 242 | send_pipe_aux (prog); |
| 243 | |
| 244 | if (read_pipe_aux (prog,sizeof prog) < 1) { |
| 245 | (void) fprintf (stderr, "read failure\n"); |
| 246 | remote_prob = TRUE; |
| 247 | return FALSE; |
| 248 | } |
| 249 | } else { |
| 250 | ps_printf (OPT,"%s",str); |
| 251 | (void) fgets (prog, sizeof prog, stdin); |
| 252 | } |
| 253 | |
| 254 | switch (prog[0]) { |
| 255 | case 'y': |
| 256 | return OK; |
| 257 | |
| 258 | case 'n': |
| 259 | default: |
| 260 | return NOTOK; |
| 261 | |
| 262 | case 'N': |
| 263 | return DONE; |
| 264 | } |
| 265 | } |