Fixed the argv munging to work properly regardless of whether the
[rsync/rsync.git] / batch.c
1 /* -*- c-file-style: "linux" -*-
2
3    Weiss 1/1999
4    Batch utilities for rsync.
5
6 */
7
8 #include "rsync.h"
9 #include <time.h>
10
11 extern char *batch_name;
12
13 void write_batch_argvs_file(int argc, char *argv[])
14 {
15         int fd, i;
16         char filename[MAXPATHLEN];
17
18         stringjoin(filename, sizeof filename,
19                    batch_name, ".sh", NULL);
20         fd = do_open(filename, O_WRONLY | O_CREAT | O_TRUNC,
21                      S_IRUSR | S_IWUSR | S_IEXEC);
22         if (fd < 0) {
23                 rsyserr(FERROR, errno, "Batch file %s open error", filename);
24                 exit_cleanup(1);
25         }
26
27         /* Write argvs info to BATCH.rsync_argvs file */
28         for (i = 0; i < argc; i++) {
29                 if (i == argc - 2) /* Skip source directory on cmdline */
30                         continue;
31                 if (strncmp(argv[i], "--files-from", 12) == 0) {
32                         if (strchr(argv[i], '=') == NULL)
33                                 i++;
34                         continue;
35                 }
36                 if (i != 0)
37                         write(fd, " ", 1);
38                 if (strncmp(argv[i], "--write-batch", 13) == 0) {
39                         write(fd, "--read", 6);
40                         write(fd, argv[i] + 7, strlen(argv[i] + 7));
41                 } else if (i == argc - 1) {
42                         char *p = find_colon(argv[i]);
43                         if (p) {
44                                 if (*++p == ':')
45                                         p++;
46                         } else
47                                 p = argv[i];
48                         write(fd, "${1:-", 5);
49                         write(fd, p, strlen(p));
50                         write(fd, "}", 1);
51                 } else
52                         write(fd, argv[i], strlen(argv[i]));
53         }
54         if (write(fd, "\n", 1) != 1 || close(fd) < 0) {
55                 rsyserr(FERROR, errno, "Batch file %s write error", filename);
56                 exit_cleanup(1);
57         }
58 }
59
60 void show_flist(int index, struct file_struct **fptr)
61 {
62         /*  for debugging    show_flist(flist->count, flist->files * */
63
64         int i;
65         for (i = 0; i < index; i++) {
66                 rprintf(FINFO, "flist->flags=%#x\n", fptr[i]->flags);
67                 rprintf(FINFO, "flist->modtime=%#lx\n",
68                         (long unsigned) fptr[i]->modtime);
69                 rprintf(FINFO, "flist->length=%.0f\n",
70                         (double) fptr[i]->length);
71                 rprintf(FINFO, "flist->mode=%#o\n", (int) fptr[i]->mode);
72                 rprintf(FINFO, "flist->basename=%s\n", fptr[i]->basename);
73                 if (fptr[i]->dirname)
74                         rprintf(FINFO, "flist->dirname=%s\n",
75                                 fptr[i]->dirname);
76                 if (fptr[i]->basedir)
77                         rprintf(FINFO, "flist->basedir=%s\n",
78                                 fptr[i]->basedir);
79         }
80 }
81
82 void show_argvs(int argc, char *argv[])
83 {
84         /*  for debugging  * */
85
86         int i;
87         rprintf(FINFO, "BATCH.C:show_argvs,argc=%d\n", argc);
88         for (i = 0; i < argc; i++) {
89                 /*    if (argv[i])   */
90                 rprintf(FINFO, "i=%d,argv[i]=%s\n", i, argv[i]);
91
92         }
93 }