source: build-files/freebsd-update/src/unstamp.c @ 635dc54

9.2-releasereleng/10.0releng/10.0.1releng/10.0.2releng/10.0.3
Last change on this file since 635dc54 was 635dc54, checked in by Kris Moore <kris@…>, 14 months ago

Add our freebsd-update code to GIT

This will become a dumping ground for mods we may make to the freebsd-update
build process, as well as the specific patches we have going into a release

  • Property mode set to 100644
File size: 4.5 KB
Line 
1/*-
2 * Copyright 2006 Colin Percival
3 * All rights reserved
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted providing that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 *    notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 *    notice, this list of conditions and the following disclaimer in the
12 *    documentation and/or other materials provided with the distribution.
13 *
14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
15 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
16 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
18 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
22 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
23 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
24 * POSSIBILITY OF SUCH DAMAGE.
25 */
26
27#include <sys/cdefs.h>
28__FBSDID("$FreeBSD: user/cperciva/freebsd-update-build/src/unstamp.c 247826 2013-03-05 00:52:14Z cperciva $");
29
30#include <err.h>
31#include <inttypes.h>
32#include <limits.h>
33#include <stdio.h>
34#include <stdlib.h>
35
36static void usage(void);
37static void unstamp_text(FILE * F0, FILE * F1);
38static void unstamp_binary(FILE * F0, FILE * F1);
39
40static void
41usage(void)
42{
43        fprintf(stderr, "usage: unstamp [-t] infile outfile < locations\n");
44        exit(1);
45        /* NOTREACHED */
46}
47
48/*
49 * Read a sequence of increasing <line> values from stdin and
50 * delete those lines from F0, writing the result to F1.
51 */
52static void
53unstamp_text(FILE * F0, FILE * F1)
54{
55        int ch;                         /* Character read from F0 */
56        int linenum = 0;                /* Current line number */
57        char * line;                    /* Line of text from stdin */
58        size_t linelen;                 /* Length of line from stdin */
59        int nextdelete;                 /* Next line to delete */
60
61        do {
62                /* Read a line from stdin */
63                if ((line = fgetln(stdin, &linelen)) == NULL) {
64                        if (feof(stdin))
65                                nextdelete = INT_MAX;
66                        else
67                                err(1, "fgetln");
68                } else {
69                        /* Convert to integer */
70                        nextdelete = strtol(line, NULL, 0);
71                }
72
73                /* Sanity check */
74                if (nextdelete < linenum)
75                        errx(1, "Stamp positions went backwards!");
76
77                /* Read lines */
78                do {
79                        /* Handle one line */
80                        do {
81                                /* Read a character */
82                                ch = getc(F0);
83
84                                /* Handle EOF / error */
85                                if (ch == EOF) {
86                                        if (feof(F0))
87                                                return;
88                                        else
89                                                err(1, "fgetc");
90                                }
91
92                                /* Write it, if we're not deleting the line */
93                                if (linenum != nextdelete)
94                                        putc(ch, F1);
95                        } while (ch != '\n');
96
97                        linenum++;
98                } while (linenum <= nextdelete);
99        } while (1);
100}
101
102/*
103 * Read a sequence of <start>|<len> pairs from stdin, where the <start>
104 * values are all >= than the previous <start>+<len> values, and copy
105 * bytes from F0 to F1, replacing the indicated bytes with zeros.
106 */
107static void
108findstamps_binary(FILE * F0, FILE * F1)
109{
110        int ch;
111        int pos = 0, spos = 0, slen = 0;
112        char * line;
113        size_t linelen;
114
115        do {
116                /* Read a line from stdin */
117                if ((line = fgetln(stdin, &linelen)) == NULL) {
118                        if (feof(stdin)) {
119                                spos = INT_MAX;
120                                slen = 0;
121                        } else
122                                err(1, "fgetln");
123                } else {
124                        /* Convert to integer */
125                        spos = strtol(line, &line, 0);
126                        line++;
127                        slen = strtol(line, NULL, 0);
128                }
129
130                /* Sanity check */
131                if (spos < pos)
132                        errx(1, "Stamp positions went backwards!");
133
134                /* Copy bytes */
135                do {
136                        /* Read a byte */
137                        ch = getc(F0);
138
139                        /* Handle EOF / error */
140                        if (ch == EOF) {
141                                if (feof(F0))
142                                        return;
143                                else
144                                        err(1, "fgetc");
145                        }
146
147                        /* Write the byte */
148                        if (pos < spos)
149                                putc(ch, F1);
150                        else
151                                putc(0, F1);
152
153                        pos++;
154                } while (pos < spos + slen);
155        } while (1);
156}
157
158int
159main(int argc, char *argv[])
160{
161        FILE * F0, * F1;
162        int tflag = 0;
163
164        /* Are we examining text files? */
165        if (argc < 2)
166                usage();
167        if (strcmp(argv[1], "-t") == 0) {
168                tflag = 1;
169                argc--;
170                argv++;
171        }
172
173        /* Open the files */
174        if (argc != 3)
175                usage();
176        if ((F0 = fopen(argv[1], "r")) == NULL)
177                err(1, "fopen(%s)", argv[1]);
178        if ((F1 = fopen(argv[2], "w")) == NULL)
179                err(1, "fopen(%s)", argv[2]);
180
181        /* Remove stamps */
182        if (tflag)
183                unstamp_text(F0, F1);
184        else
185                findstamps_binary(F0, F1);
186
187        /* Close the files */
188        if (fclose(F0))
189                err(1, "fclose(%s)", argv[1]);
190        if (fclose(F1))
191                err(1, "fclose(%s)", argv[2]);
192
193        return 0;
194}
Note: See TracBrowser for help on using the repository browser.