2 * Some usage & version related functions.
4 * Copyright (C) 2002-2022 Wayne Davison
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 3 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License along
17 * with this program; if not, visit the http://fsf.org website.
22 #include "latest-year.h"
23 #include "git-version.h"
24 #include "default-cvsignore.h"
27 extern struct name_num_obj valid_checksums, valid_compressions, valid_auth_checksums;
29 static char *istring(const char *fmt, int val)
32 if (asprintf(&str, fmt, val) < 0)
33 out_of_memory("istring");
37 static void print_info_flags(enum logcode f)
40 BOOL as_json = f == FNONE ? 1 : 0; /* We use 1 == first attribute, 2 == need closing array */
41 char line_buf[75], *quot = as_json ? "\"" : "";
43 char *info_flags[] = {
47 istring("%d-bit files", (int)(sizeof (OFF_T) * 8)),
48 istring("%d-bit inums", (int)(sizeof dumstat->st_ino * 8)), /* Don't check ino_t! */
49 istring("%d-bit timestamps", (int)(sizeof (time_t) * 8)),
50 istring("%d-bit long ints", (int)(sizeof (int64) * 8)),
52 #ifndef HAVE_SOCKETPAIR
62 #ifndef CAN_SET_SYMLINK_TIMES
67 #ifndef SUPPORT_HARD_LINKS
72 #ifndef CAN_HARDLINK_SPECIAL
77 #ifndef CAN_HARDLINK_SYMLINK
87 #ifndef SUPPORT_ATIMES
94 #ifndef HAVE_FTRUNCATE
99 #ifndef HAVE_FTRUNCATE
109 #ifndef SUPPORT_XATTRS
114 #ifdef RSYNC_USE_SECLUDED_ARGS
126 #ifndef SUPPORT_PREALLOCATION
136 #ifndef SUPPORT_CRTIMES
143 #ifndef USE_ROLL_SIMD
166 for (line_len = 0, j = 0; ; j++) {
167 char *str = info_flags[j], *next_nfo = str ? info_flags[j+1] : NULL;
168 int str_len = str && *str != '*' ? strlen(str) + (as_json ? 2 : 0) : 1000;
169 int need_comma = next_nfo && *next_nfo != '*' ? 1 : 0;
170 if (line_len && line_len + 1 + str_len + need_comma >= (int)sizeof line_buf) {
172 printf(" %s\n", line_buf);
174 rprintf(f, " %s\n", line_buf);
185 printf(",\n \"%c%s\": [\n", toLower(str+1), str+2);
187 rprintf(f, "%s:\n", str+1);
190 line_len += snprintf(line_buf+line_len, sizeof line_buf - line_len,
191 " %s%s%s%s", quot, str, quot, need_comma ? "," : "");
197 static void output_nno_list(enum logcode f, const char *name, struct name_num_obj *nno)
199 char namebuf[64], tmpbuf[256];
200 char *tok, *next_tok, *comma = ",";
203 /* Using '(' ensures that we get a trailing "none" but also includes aliases. */
204 get_default_nno_list(nno, tmpbuf, sizeof tmpbuf - 1, '(');
206 rprintf(f, "%s:\n", name);
207 rprintf(f, " %s\n", tmpbuf);
211 strlcpy(namebuf, name, sizeof namebuf);
212 for (cp = namebuf; *cp; cp++) {
215 else if (isUpper(cp))
219 printf(",\n \"%s\": [\n ", namebuf);
221 for (tok = strtok(tmpbuf, " "); tok; tok = next_tok) {
222 next_tok = strtok(NULL, " ");
223 if (*tok != '(') /* Ignore the alises in the JSON output */
224 printf(" \"%s\"%s", tok, comma + (next_tok ? 0 : 1));
230 /* A request of f == FNONE wants json on stdout. */
231 void print_rsync_version(enum logcode f)
233 char copyright[] = "(C) 1996-" LATEST_YEAR " by Andrew Tridgell, Wayne Davison, and others.";
234 char url[] = "https://rsync.samba.org/";
237 #define json_line(name, value) \
239 printf("%c\n \"%s\": \"%s\"", first_line ? '{' : ',', name, value); \
245 json_line("program", RSYNC_NAME);
246 json_line("version", rsync_version());
247 snprintf(verbuf, sizeof verbuf, "%d.%d", PROTOCOL_VERSION, SUBPROTOCOL_VERSION);
248 json_line("protocol", verbuf);
249 json_line("copyright", copyright);
250 json_line("url", url);
252 #if SUBPROTOCOL_VERSION != 0
253 char *subprotocol = istring(".PR%d", SUBPROTOCOL_VERSION);
255 char *subprotocol = "";
257 rprintf(f, "%s version %s protocol version %d%s\n",
258 RSYNC_NAME, rsync_version(), PROTOCOL_VERSION, subprotocol);
259 rprintf(f, "Copyright %s\n", copyright);
260 rprintf(f, "Web site: %s\n", url);
265 init_checksum_choices();
267 output_nno_list(f, "Checksum list", &valid_checksums);
268 output_nno_list(f, "Compress list", &valid_compressions);
269 output_nno_list(f, "Daemon auth list", &valid_auth_checksums);
272 json_line("license", "GPL3");
273 json_line("caveat", "rsync comes with ABSOLUTELY NO WARRANTY");
278 #ifdef MAINTAINER_MODE
279 rprintf(f, "Panic Action: \"%s\"\n", get_panic_action());
283 rprintf(f, "WARNING: no 64-bit integers on this platform!\n");
285 if (sizeof (int64) != SIZEOF_INT64) {
287 "WARNING: size mismatch in SIZEOF_INT64 define (%d != %d)\n",
288 (int) SIZEOF_INT64, (int) sizeof (int64));
292 rprintf(f,"rsync comes with ABSOLUTELY NO WARRANTY. This is free software, and you\n");
293 rprintf(f,"are welcome to redistribute it under certain conditions. See the GNU\n");
294 rprintf(f,"General Public Licence for details.\n");
297 void usage(enum logcode F)
299 print_rsync_version(F);
302 rprintf(F,"rsync is a file transfer program capable of efficient remote update\n");
303 rprintf(F,"via a fast differencing algorithm.\n");
306 rprintf(F,"Usage: rsync [OPTION]... SRC [SRC]... DEST\n");
307 rprintf(F," or rsync [OPTION]... SRC [SRC]... [USER@]HOST:DEST\n");
308 rprintf(F," or rsync [OPTION]... SRC [SRC]... [USER@]HOST::DEST\n");
309 rprintf(F," or rsync [OPTION]... SRC [SRC]... rsync://[USER@]HOST[:PORT]/DEST\n");
310 rprintf(F," or rsync [OPTION]... [USER@]HOST:SRC [DEST]\n");
311 rprintf(F," or rsync [OPTION]... [USER@]HOST::SRC [DEST]\n");
312 rprintf(F," or rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]\n");
313 rprintf(F,"The ':' usages connect via remote shell, while '::' & 'rsync://' usages connect\n");
314 rprintf(F,"to an rsync daemon, and require SRC or DEST to start with a module name.\n");
316 rprintf(F,"Options\n");
317 #include "help-rsync.h"
319 rprintf(F,"Use \"rsync --daemon --help\" to see the daemon-mode command-line options.\n");
320 rprintf(F,"Please see the rsync(1) and rsyncd.conf(5) manpages for full documentation.\n");
321 rprintf(F,"See https://rsync.samba.org/ for updates, bug reports, and answers\n");
324 void daemon_usage(enum logcode F)
326 print_rsync_version(F);
329 rprintf(F,"Usage: rsync --daemon [OPTION]...\n");
330 #include "help-rsyncd.h"
332 rprintf(F,"If you were not trying to invoke rsync as a daemon, avoid using any of the\n");
333 rprintf(F,"daemon-specific rsync options. See also the rsyncd.conf(5) manpage.\n");
336 const char *rsync_version(void)
344 return *ver == 'v' ? ver+1 : ver;
347 const char *default_cvsignore(void)
349 return DEFAULT_CVSIGNORE;