Annotation of src/usr.bin/rcs/rcsclean.c, Revision 1.2
1.2 ! joris 1: /* $OpenBSD: rcsclean.c,v 1.1 2005/10/06 02:00:05 joris Exp $ */
1.1 joris 2: /*
3: * Copyright (c) 2005 Joris Vink <joris@openbsd.org>
4: * All rights reserved.
5: *
6: * Redistribution and use in source and binary forms, with or without
7: * modification, are permitted provided that the following conditions
8: * are met:
9: *
10: * 1. Redistributions of source code must retain the above copyright
11: * notice, this list of conditions and the following disclaimer.
12: * 2. The name of the author may not be used to endorse or promote products
13: * derived from this software without specific prior written permission.
14: *
15: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
16: * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
17: * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
18: * THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19: * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20: * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
21: * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
22: * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
23: * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
24: * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25: */
26:
27: #include <sys/param.h>
28: #include <sys/stat.h>
29:
30: #include <dirent.h>
31: #include <stdio.h>
32: #include <stdlib.h>
33: #include <string.h>
34: #include <unistd.h>
35:
36: #include "diff.h"
37: #include "log.h"
38: #include "rcs.h"
39: #include "rcsprog.h"
40:
41: extern char *__progname;
42: static int rcsclean_file(char *, RCSNUM *);
43:
44: int
45: rcsclean_main(int argc, char **argv)
46: {
47: int i, ch;
48: RCSNUM *rev;
49: DIR *dirp;
50: struct dirent *dp;
51:
52: rev = RCS_HEAD_REV;
53:
1.2 ! joris 54: while ((ch = getopt(argc, argv, "qr:V")) != -1) {
1.1 joris 55: switch (ch) {
56: case 'q':
57: verbose = 0;
58: break;
1.2 ! joris 59: case 'r':
! 60: if ((rev = rcsnum_parse(optarg)) == NULL) {
! 61: cvs_log(LP_ERR, "bad revision number");
! 62: exit(1);
! 63: }
! 64: break;
1.1 joris 65: case 'V':
66: printf("%s\n", rcs_version);
67: exit(0);
68: default:
69: break;
70: }
71: }
72:
73: argc -= optind;
74: argv += optind;
75:
76: if (argc == 0) {
77: if ((dirp = opendir(".")) == NULL) {
78: cvs_log(LP_ERRNO, "failed to open directory '.'");
79: (usage)();
80: exit(1);
81: }
82:
83: while ((dp = readdir(dirp)) != NULL) {
84: if (dp->d_type == DT_DIR)
85: continue;
86: rcsclean_file(dp->d_name, rev);
87: }
88:
89: closedir(dirp);
90: } else {
91: for (i = 0; i < argc; i++)
92: rcsclean_file(argv[i], rev);
93: }
94:
95: return (0);
96: }
97:
98: void
99: rcsclean_usage(void)
100: {
1.2 ! joris 101: fprintf(stderr, "usage %s [-qV] [-r rev] [file] ...\n", __progname);
1.1 joris 102: }
103:
104: static int
105: rcsclean_file(char *fname, RCSNUM *rev)
106: {
107: int match;
108: RCSFILE *file;
109: char fpath[MAXPATHLEN];
110: RCSNUM *frev;
111: BUF *b1, *b2;
112: char *s1, *s2, *c1, *c2;
113:
114: match = 1;
115: if (rcs_statfile(fname, fpath, sizeof(fpath)) < 0)
116: return (-1);
117:
118: if ((file = rcs_open(fpath, RCS_RDWR)) == NULL)
119: return (-1);
120:
121: if (rev == RCS_HEAD_REV)
122: frev = file->rf_head;
123: else
124: frev = rev;
125:
126: if ((b1 = rcs_getrev(file, frev)) == NULL) {
127: cvs_log(LP_ERR, "failed to get needed revision");
128: rcs_close(file);
129: return (-1);
130: }
131:
132: if ((b2 = cvs_buf_load(fname, BUF_AUTOEXT)) == NULL) {
133: cvs_log(LP_ERRNO, "failed to load '%s'", fname);
134: rcs_close(file);
135: return (-1);
136: }
137:
138: cvs_buf_putc(b1, '\0');
139: cvs_buf_putc(b2, '\0');
140:
141: c1 = cvs_buf_release(b1);
142: c2 = cvs_buf_release(b2);
143:
144: for (s1 = c1, s2 = c2; *s1 && *s2; *s1++, *s2++) {
145: if (*s1 != *s2) {
146: match = 0;
147: break;
148: }
149: }
150:
151: free(c1);
152: free(c2);
153:
154: if (match) {
155: if (verbose)
156: printf("rm -f %s\n", fname);
157: (void)unlink(fname);
158: }
159:
160: rcs_close(file);
161: return (0);
162: }