*fmt = '%';
/* We expand % codes one by one in place in buf. We don't
- * copy in the terminating nul of the inserted strings, but
- * rather keep going until we reach the nul of the format. */
+ * copy in the terminating null of the inserted strings, but
+ * rather keep going until we reach the null of the format. */
total = strlcpy(buf, format, sizeof buf);
- for (p = buf; (p = strchr(p, '%')) != NULL && p[1]; ) {
+ for (p = buf; (p = strchr(p, '%')) != NULL; ) {
s = p++;
n = fmt + 1;
if (*p == '-')
*n++ = *p++;
- while (isdigit(*(uchar*)p) && n - fmt < 16)
+ while (isdigit(*(uchar*)p) && n - fmt < (int)(sizeof fmt) - 8)
*n++ = *p++;
+ if (!*p)
+ break;
*n = '\0';
n = NULL;
n = buf2;
break;
case 'p':
- strlcat(fmt, "d", sizeof fmt);
+ strlcat(fmt, "ld", sizeof fmt);
snprintf(buf2, sizeof buf2, fmt,
- (int)getpid());
+ (long)getpid());
n = buf2;
break;
case 'o': n = op; break;
file->dir.root, n);
/* The buffer from safe_fname() has more
* room than MAXPATHLEN, so this is safe. */
- strcpy(n, buf2);
+ if (fmt[1])
+ strcpy(n, buf2);
+ else
+ n = buf2;
}
clean_fname(n, 0);
if (*n == '/')
break;
case 'L':
if (hlink && *hlink) {
- snprintf(buf2, sizeof buf2, " => %s",
- safe_fname(hlink));
- n = buf2;
+ n = safe_fname(hlink);
+ strcpy(buf2, " => ");
} else if (S_ISLNK(file->mode) && file->u.link) {
- snprintf(buf2, sizeof buf2, " -> %s",
- safe_fname(file->u.link));
- n = buf2;
- } else
+ n = safe_fname(file->u.link);
+ strcpy(buf2, " -> ");
+ } else {
n = "";
+ if (!fmt[1])
+ break;
+ strcpy(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;
n = "*deleting";
break;
}
- n = buf2;
+ n = buf2 + MAXPATHLEN - 32;
n[0] = iflags & ITEM_LOCAL_CHANGE
? iflags & ITEM_XNAME_FOLLOWS ? 'h' : 'c'
: !(iflags & ITEM_TRANSFER) ? '.'
break;
}
- /* Subtract the length of the escape from the string's size. */
- total -= p - s;
-
/* "n" is the string to be inserted in place of this % code. */
if (!n)
continue;
}
len = strlen(n);
+ /* Subtract the length of the escape from the string's size. */
+ total -= p - s;
+
if (len + total >= sizeof buf) {
rprintf(FERROR,
"buffer overflow expanding %%%c -- exiting\n",
rprintf(code, "%s\n", buf);
}
+int log_format_has(const char *format, char esc)
+{
+ const char *p;
+
+ if (!format)
+ return 0;
+
+ for (p = format; (p = strchr(p, '%')) != NULL; ) {
+ if (*++p == '-')
+ p++;
+ while (isdigit(*(uchar*)p))
+ p++;
+ if (!*p)
+ break;
+ if (*p == esc)
+ return 1;
+ }
+ return 0;
+}
+
/* log the transfer of a file */
void log_item(struct file_struct *file, struct stats *initial_stats,
int iflags, char *hlink)