#include "print.h"
+#include "diag-control.h"
+
#include "fptype.h"
#ifndef PATH_MAX
error("Couldn't find user '%.32s'", username);
#ifdef HAVE_LIBCAP_NG
/* We don't need CAP_SETUID, CAP_SETGID and CAP_SYS_CHROOT any more. */
-DIAG_OFF_CLANG(assign-enum)
+DIAG_OFF_ASSIGN_ENUM
capng_updatev(
CAPNG_DROP,
CAPNG_EFFECTIVE | CAPNG_PERMITTED,
CAP_SETGID,
CAP_SYS_CHROOT,
-1);
-DIAG_ON_CLANG(assign-enum)
+DIAG_ON_ASSIGN_ENUM
capng_apply(CAPNG_SELECT_BOTH);
#endif /* HAVE_LIBCAP_NG */
int yflag_dlt = -1;
const char *yflag_dlt_name = NULL;
int print = 0;
+ long Cflagmult;
netdissect_options Ndo;
netdissect_options *ndo = &Ndo;
#else
Cflag = strtol(optarg, &endp, 10);
#endif
- if (endp == optarg || *endp != '\0' || errno != 0
- || Cflag <= 0)
+ if (endp == optarg || errno != 0 || Cflag <= 0)
error("invalid file size %s", optarg);
+
+ if (*endp == '\0') {
+ /*
+ * There's nothing after the file size,
+ * so the size is in units of 1 MB
+ * (1,000,000 bytes).
+ */
+ Cflagmult = 1000000;
+ } else {
+ /*
+ * There's something after the file
+ * size.
+ *
+ * If it's a single letter, then:
+ *
+ * if the letter is k or K, the size
+ * is in units of 1 KiB (1024 bytes);
+ *
+ * if the letter is m or M, the size
+ * is in units of 1 MiB (1,048,576 bytes);
+ *
+ * if the letter is g or G, the size
+ * is in units of 1 GiB (1,073,741,824 bytes).
+ *
+ * Otherwise, it's an error.
+ */
+ switch (*endp) {
+
+ case 'k':
+ case 'K':
+ Cflagmult = 1024;
+ break;
+
+ case 'm':
+ case 'M':
+ Cflagmult = 1024*1024;
+ break;
+
+ case 'g':
+ case 'G':
+ Cflagmult = 1024*1024*1024;
+ break;
+
+ default:
+ error("invalid file size %s", optarg);
+ }
+
+ /*
+ * OK, there was a letter that we treat
+ * as a units indication; was there
+ * anything after it?
+ */
+ endp++;
+ if (*endp != '\0') {
+ /* Yes - error */
+ error("invalid file size %s", optarg);
+ }
+ }
+
/*
- * Will multiplying it by 1000000 overflow?
+ * Will multiplying it by multiplier overflow?
*/
#ifdef HAVE_PCAP_DUMP_FTELL64
- if (Cflag > INT64_T_CONSTANT(0x7fffffffffffffff) / 1000000)
+ if (Cflag > INT64_T_CONSTANT(0x7fffffffffffffff) / Cflagmult)
#else
- if (Cflag > LONG_MAX / 1000000)
+ if (Cflag > LONG_MAX / Cflagmult)
#endif
error("file size %s is too large", optarg);
- Cflag *= 1000000;
+ Cflag *= Cflagmult;
break;
case 'd':
/* Initialize capng */
capng_clear(CAPNG_SELECT_BOTH);
if (username) {
-DIAG_OFF_CLANG(assign-enum)
+DIAG_OFF_ASSIGN_ENUM
capng_updatev(
CAPNG_ADD,
CAPNG_PERMITTED | CAPNG_EFFECTIVE,
CAP_SETUID,
CAP_SETGID,
-1);
-DIAG_ON_CLANG(assign-enum)
+DIAG_ON_ASSIGN_ENUM
}
if (chroot_dir) {
-DIAG_OFF_CLANG(assign-enum)
+DIAG_OFF_ASSIGN_ENUM
capng_update(
CAPNG_ADD,
CAPNG_PERMITTED | CAPNG_EFFECTIVE,
CAP_SYS_CHROOT
);
-DIAG_ON_CLANG(assign-enum)
+DIAG_ON_ASSIGN_ENUM
}
if (WFileName) {
-DIAG_OFF_CLANG(assign-enum)
+DIAG_OFF_ASSIGN_ENUM
capng_update(
CAPNG_ADD,
CAPNG_PERMITTED | CAPNG_EFFECTIVE,
CAP_DAC_OVERRIDE
);
-DIAG_ON_CLANG(assign-enum)
+DIAG_ON_ASSIGN_ENUM
}
capng_apply(CAPNG_SELECT_BOTH);
#endif /* HAVE_LIBCAP_NG */
}
#endif /* _WIN32 */
-USES_APPLE_DEPRECATED_API
+DIAG_OFF_DEPRECATION
static void
print_version(FILE *f)
{
# endif
#endif /* __SANITIZE_ADDRESS__ or __has_feature */
}
-USES_APPLE_RST
+DIAG_ON_DEPRECATION
static void
print_usage(FILE *f)