]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - usr.sbin/ctm/ctm/ctm_ed.c
MFV r337020:9443 panic when scrub a v10 pool
[FreeBSD/FreeBSD.git] / usr.sbin / ctm / ctm / ctm_ed.c
1 /*-
2  * SPDX-License-Identifier: Beerware
3  *
4  * ----------------------------------------------------------------------------
5  * "THE BEER-WARE LICENSE" (Revision 42):
6  * <phk@FreeBSD.org> wrote this file.  As long as you retain this notice you
7  * can do whatever you want with this stuff. If we meet some day, and you think
8  * this stuff is worth it, you can buy me a beer in return.   Poul-Henning Kamp
9  * ----------------------------------------------------------------------------
10  *
11  * $FreeBSD$
12  *
13  */
14
15 #include "ctm.h"
16
17 int
18 ctm_edit(u_char *script, int length, char *filein, char *fileout)
19 {
20     u_char *ep, cmd;
21     int ln, ln2, iln, ret=0, c;
22     FILE *fi=0,*fo=0;
23
24     fi = fopen(filein,"r");
25     if(!fi) {
26         warn("%s", filein);
27         return 8;
28     }
29
30     fo = fopen(fileout,"w");
31     if(!fo) {
32         warn("%s", fileout);
33         fclose(fi);
34         return 4;
35     }
36     iln = 1;
37     for(ep=script;ep < script+length;) {
38         cmd = *ep++;
39         if(cmd != 'a' && cmd != 'd') { ret = 1; goto bye; }
40         ln = 0;
41         while(isdigit(*ep)) {
42             ln *= 10;
43             ln += (*ep++ - '0');
44         }
45         if(*ep++ != ' ') { ret = 1; goto bye; }
46         ln2 = 0;
47         while(isdigit(*ep)) {
48             ln2 *= 10;
49             ln2 += (*ep++ - '0');
50         }
51         if(*ep++ != '\n') { ret = 1; goto bye; }
52
53
54         if(cmd == 'd') {
55             while(iln < ln) {
56                 c = getc(fi);
57                 if(c == EOF) { ret = 1; goto bye; }
58                 putc(c,fo);
59                 if(c == '\n')
60                     iln++;
61             }
62             while(ln2) {
63                 c = getc(fi);
64                 if(c == EOF) { ret = 1; goto bye; }
65                 if(c != '\n')
66                     continue;
67                 ln2--;
68                 iln++;
69             }
70             continue;
71         }
72         if(cmd == 'a') {
73             while(iln <= ln) {
74                 c = getc(fi);
75                 if(c == EOF) { ret = 1; goto bye; }
76                 putc(c,fo);
77                 if(c == '\n')
78                     iln++;
79             }
80             while(ln2) {
81                 c = *ep++;
82                 putc(c,fo);
83                 if(c != '\n')
84                     continue;
85                 ln2--;
86             }
87             continue;
88         }
89         ret = 1;
90         goto bye;
91     }
92     while(1) {
93         c = getc(fi);
94         if(c == EOF) break;
95         putc(c,fo);
96     }
97     ret = 0;
98 bye:
99     if(fi) {
100         if(fclose(fi) != 0) {
101             warn("%s", filein);
102             ret = 1;
103         }
104     }
105     if(fo) {
106         if(fflush(fo) != 0) {
107             warn("%s", fileout);
108             ret = 1;
109         }
110         if(fclose(fo) != 0) {
111             warn("%s", fileout);
112             ret = 1;
113         }
114     }
115     return ret;
116 }