1 66390331 2022-09-30 src #include <errno.h>
2 b79428b4 2022-07-13 src #include <stdarg.h>
3 c1ec7947 2022-10-20 src #include <stdint.h>
4 b79428b4 2022-07-13 src #include <stdio.h>
5 b79428b4 2022-07-13 src #include <stdlib.h>
6 b79428b4 2022-07-13 src #include <string.h>
7 b79428b4 2022-07-13 src #include <unistd.h>
9 1111d9d2 2022-10-06 src #define MAX_FILENAME 4096
11 becabb0c 2023-03-12 aa_src int aflag = 0;
12 becabb0c 2023-03-12 aa_src int iflag = 0;
13 becabb0c 2023-03-12 aa_src int lflag = 0;
14 becabb0c 2023-03-12 aa_src int nflag = 0;
15 becabb0c 2023-03-12 aa_src int oflag = 0;
16 becabb0c 2023-03-12 aa_src int vflag = 0;
17 1111d9d2 2022-10-06 src char new[MAX_FILENAME], *newe = new + MAX_FILENAME-1;
20 66390331 2022-09-30 src warn(const char *fmt, ...)
22 66390331 2022-09-30 src char *w = strerror(errno);
23 66390331 2022-09-30 src fputs("rene: ", stderr);
24 b79428b4 2022-07-13 src if (fmt != NULL) {
25 b79428b4 2022-07-13 src va_list argp;
26 b79428b4 2022-07-13 src va_start(argp, fmt);
27 b79428b4 2022-07-13 src vfprintf(stderr, fmt, argp);
28 b79428b4 2022-07-13 src va_end(argp);
30 66390331 2022-09-30 src fprintf(stderr, ": %s\n", w);
34 1e12e95d 2022-09-30 src err(int eval, const char *fmt, ...)
36 1e12e95d 2022-09-30 src char *w = strerror(errno);
37 1e12e95d 2022-09-30 src fputs("rene: ", stderr);
38 1e12e95d 2022-09-30 src if (fmt != NULL) {
39 1e12e95d 2022-09-30 src va_list argp;
40 1e12e95d 2022-09-30 src va_start(argp, fmt);
41 1e12e95d 2022-09-30 src vfprintf(stderr, fmt, argp);
42 1e12e95d 2022-09-30 src va_end(argp);
44 1e12e95d 2022-09-30 src fprintf(stderr, ": %s\n", w);
49 1111d9d2 2022-10-06 src errx(int eval, const char *fmt, ...)
51 1111d9d2 2022-10-06 src fputs("rene: ", stderr);
52 1111d9d2 2022-10-06 src if (fmt != NULL) {
53 1111d9d2 2022-10-06 src va_list argp;
54 1111d9d2 2022-10-06 src va_start(argp, fmt);
55 1111d9d2 2022-10-06 src vfprintf(stderr, fmt, argp);
56 1111d9d2 2022-10-06 src va_end(argp);
58 1111d9d2 2022-10-06 src fputc('\n', stderr);
63 1111d9d2 2022-10-06 src ren(char *from, char *to, char *f)
65 becabb0c 2023-03-12 aa_src int y = !oflag;
67 1111d9d2 2022-10-06 src char *p = strrchr(f, '/');
69 b79428b4 2022-07-13 src if (*++p == '\0')
73 1111d9d2 2022-10-06 src if (!(p = strstr(p, from)))
75 b79428b4 2022-07-13 src int fromlen = strlen(from);
76 becabb0c 2023-03-12 aa_src if (lflag)
77 1111d9d2 2022-10-06 src for(char *x; (x = strstr(p+fromlen, from)); p = x)
80 1111d9d2 2022-10-06 src char *fp = f;
81 1111d9d2 2022-10-06 src char *newp = new;
82 b79428b4 2022-07-13 src char *top = to;
84 1111d9d2 2022-10-06 src for (; fp != p; *newp++ = *fp++)
85 1111d9d2 2022-10-06 src if (newp == newe)
87 1111d9d2 2022-10-06 src errx(1, "%s: final file name is too long", f);
90 1111d9d2 2022-10-06 src for (top = to; *top != '\0'; *newp++ = *top++)
91 1111d9d2 2022-10-06 src if (newp == newe)
92 1111d9d2 2022-10-06 src goto toolong;
93 1111d9d2 2022-10-06 src fp += fromlen;
94 becabb0c 2023-03-12 aa_src if (!aflag || !(p = strstr(fp, from)))
95 1111d9d2 2022-10-06 src p = strchr(fp, '\0');
97 b79428b4 2022-07-13 src *newp = '\0';
99 becabb0c 2023-03-12 aa_src if (iflag && access(new, F_OK) == 0) {
100 1111d9d2 2022-10-06 src fprintf(stderr, "replace %s with %s? ", from, to);
101 1111d9d2 2022-10-06 src y = getchar() == 'y';
103 becabb0c 2023-03-12 aa_src if (y && !nflag && !(y += rename(f, new))) {
104 66390331 2022-09-30 src warn("rename");
107 becabb0c 2023-03-12 aa_src if (vflag && y)
108 b79428b4 2022-07-13 src printf("%s -> %s\n", f, new);
115 66390331 2022-09-30 src fputs("usage: rene [-ailnov] from to file ...\n", stderr);
116 66390331 2022-09-30 src exit(EXIT_FAILURE);
120 b79428b4 2022-07-13 src main(int argc, char *argv[])
122 1111d9d2 2022-10-06 src int c, ret = 0;
123 1e12e95d 2022-09-30 src #ifdef __OpenBSD__
124 1e12e95d 2022-09-30 src if (pledge("stdio cpath rpath", NULL) == -1)
125 1e12e95d 2022-09-30 src err(1, "pledge");
127 b79428b4 2022-07-13 src while ((c = getopt(argc, argv, "ailnov")) != -1) {
128 b79428b4 2022-07-13 src switch (c) {
130 becabb0c 2023-03-12 aa_src aflag = 1;
133 becabb0c 2023-03-12 aa_src iflag = 1;
136 becabb0c 2023-03-12 aa_src lflag = 1;
139 becabb0c 2023-03-12 aa_src nflag = 1;
142 becabb0c 2023-03-12 aa_src oflag = 1;
145 becabb0c 2023-03-12 aa_src vflag = 1;
151 b79428b4 2022-07-13 src argc -= optind;
152 b79428b4 2022-07-13 src argv += optind;
154 1111d9d2 2022-10-06 src if (argc < 3 || !argv[0] || !argv[1] || !argv[0][0])
156 b79428b4 2022-07-13 src for (int i = 2; i < argc; i++)
157 1111d9d2 2022-10-06 src if (!ren(argv[0], argv[1], argv[i]))