+ case 'G':
+ if (!gid_ndx || file->flags & FLAG_SKIP_GROUP)
+ n = "DEFAULT";
+ else {
+ strlcat(fmt, "u", sizeof fmt);
+ snprintf(buf2, sizeof buf2, fmt,
+ F_GROUP(file));
+ n = buf2;
+ }
+ break;
+ case 'p':
+ strlcat(fmt, "ld", sizeof fmt);
+ snprintf(buf2, sizeof buf2, fmt,
+ (long)getpid());
+ n = buf2;
+ break;
+ case 'M':
+ n = c = timestring(file->modtime);
+ while ((c = strchr(c, ' ')) != NULL)
+ *c = '-';
+ break;
+ case 'B':
+ c = buf2 + MAXPATHLEN - PERMSTRING_SIZE - 1;
+ permstring(c, file->mode);
+ n = c + 1; /* skip the type char */
+ break;
+ case 'o':
+ n = op;
+ break;
+ case 'f':
+ if (fname) {
+ c = f_name_buf();
+ strlcpy(c, fname, MAXPATHLEN);
+ } else
+ c = f_name(file, NULL);
+ if (am_sender && F_PATHNAME(file)) {
+ pathjoin(buf2, sizeof buf2,
+ F_PATHNAME(file), c);
+ clean_fname(buf2, 0);
+ if (fmt[1]) {
+ strlcpy(c, buf2, MAXPATHLEN);
+ n = c;
+ } else
+ n = buf2;
+ } else if (am_daemon && *c != '/') {
+ pathjoin(buf2, sizeof buf2,
+ curr_dir + module_dirlen, c);
+ clean_fname(buf2, 0);
+ if (fmt[1]) {
+ strlcpy(c, buf2, MAXPATHLEN);
+ n = c;
+ } else
+ n = buf2;
+ } else {
+ clean_fname(c, 0);
+ n = c;
+ }
+ if (*n == '/')
+ n++;
+ break;
+ case 'n':
+ if (fname) {
+ c = f_name_buf();
+ strlcpy(c, fname, MAXPATHLEN);
+ } else
+ c = f_name(file, NULL);
+ if (S_ISDIR(file->mode))
+ strlcat(c, "/", MAXPATHLEN);
+ n = c;
+ break;
+ case 'L':
+ if (hlink && *hlink) {
+ n = hlink;
+ strlcpy(buf2, " => ", sizeof buf2);
+ } else if (S_ISLNK(file->mode) && !fname) {
+ n = F_SYMLINK(file);
+ strlcpy(buf2, " -> ", sizeof buf2);
+ } else {
+ n = "";
+ if (!fmt[1])
+ break;
+ strlcpy(buf2, " ", sizeof buf2);
+ }
+ strlcat(fmt, "s", sizeof fmt);
+ snprintf(buf2 + 4, sizeof buf2 - 4, fmt, n);
+ n = buf2;
+ break;
+ case 'm':
+ n = lp_name(module_id);
+ break;
+ case 't':
+ n = timestring(time(NULL));
+ break;
+ case 'P':
+ n = full_module_path;
+ break;
+ case 'u':
+ n = auth_user;
+ break;
+ case 'b':
+ if (am_sender) {
+ b = stats.total_written -
+ initial_stats->total_written;
+ } else {
+ b = stats.total_read -
+ initial_stats->total_read;
+ }
+ strlcat(fmt, "s", sizeof fmt);
+ snprintf(buf2, sizeof buf2, fmt, comma_num(b));
+ n = buf2;
+ break;
+ case 'c':
+ if (!am_sender) {
+ b = stats.total_written -
+ initial_stats->total_written;
+ } else {
+ b = stats.total_read -
+ initial_stats->total_read;
+ }
+ strlcat(fmt, "s", sizeof fmt);
+ snprintf(buf2, sizeof buf2, fmt, comma_num(b));
+ n = buf2;
+ break;
+ case 'C':
+ if (protocol_version >= 30
+ && (iflags & ITEM_TRANSFER
+ || (always_checksum && S_ISREG(file->mode)))) {
+ int i, x1, x2;
+ const char *sum = iflags & ITEM_TRANSFER
+ ? sender_file_sum : F_SUM(file);
+ c = buf2 + checksum_len*2;
+ *c = '\0';
+ for (i = checksum_len; --i >= 0; ) {
+ x1 = CVAL(sum, i);
+ x2 = x1 >> 4;
+ x1 &= 0xF;
+ *--c = x1 <= 9 ? x1 + '0' : x1 + 'a' - 10;
+ *--c = x2 <= 9 ? x2 + '0' : x2 + 'a' - 10;
+ }
+ } else {
+ memset(buf2, ' ', checksum_len*2);
+ buf2[checksum_len*2] = '\0';
+ }
+ n = buf2;
+ break;
+ case 'i':
+ if (iflags & ITEM_DELETED) {
+ n = "*deleting ";
+ break;
+ }
+ n = c = buf2 + MAXPATHLEN - 32;
+ c[0] = iflags & ITEM_LOCAL_CHANGE
+ ? iflags & ITEM_XNAME_FOLLOWS ? 'h' : 'c'
+ : !(iflags & ITEM_TRANSFER) ? '.'
+ : !local_server && *op == 's' ? '<' : '>';
+ if (S_ISLNK(file->mode)) {
+ c[1] = 'L';
+ c[3] = '.';
+ c[4] = !(iflags & ITEM_REPORT_TIME) ? '.'
+ : !preserve_times || !receiver_symlink_times
+ || (iflags & ITEM_REPORT_TIMEFAIL) ? 'T' : 't';
+ } else {
+ c[1] = S_ISDIR(file->mode) ? 'd'
+ : IS_SPECIAL(file->mode) ? 'S'
+ : IS_DEVICE(file->mode) ? 'D' : 'f';
+ c[3] = !(iflags & ITEM_REPORT_SIZE) ? '.' : 's';
+ c[4] = !(iflags & ITEM_REPORT_TIME) ? '.'
+ : !preserve_times ? 'T' : 't';
+ }
+ c[2] = !(iflags & ITEM_REPORT_CHANGE) ? '.' : 'c';
+ c[5] = !(iflags & ITEM_REPORT_PERMS) ? '.' : 'p';
+ c[6] = !(iflags & ITEM_REPORT_OWNER) ? '.' : 'o';
+ c[7] = !(iflags & ITEM_REPORT_GROUP) ? '.' : 'g';
+ c[8] = !(iflags & ITEM_REPORT_ATIME) ? '.' : 'u';
+ c[9] = !(iflags & ITEM_REPORT_ACL) ? '.' : 'a';
+ c[10] = !(iflags & ITEM_REPORT_XATTR) ? '.' : 'x';
+ c[11] = '\0';
+
+ if (iflags & (ITEM_IS_NEW|ITEM_MISSING_DATA)) {
+ char ch = iflags & ITEM_IS_NEW ? '+' : '?';
+ int i;
+ for (i = 2; c[i]; i++)
+ c[i] = ch;
+ } else if (c[0] == '.' || c[0] == 'h' || c[0] == 'c') {
+ int i;
+ for (i = 2; c[i]; i++) {
+ if (c[i] != '.')
+ break;
+ }
+ if (!c[i]) {
+ for (i = 2; c[i]; i++)
+ c[i] = ' ';
+ }
+ }
+ break;