-/* $Cambridge: exim/src/src/buildconfig.c,v 1.12 2006/02/07 11:19:00 ph10 Exp $ */
-
/*************************************************
* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) University of Cambridge 1995 - 2006 */
+/* Copyright (c) University of Cambridge 1995 - 2009 */
/* See the file NOTICE for conditions of use and distribution. */
#include <grp.h>
typedef struct {
- char *name;
+ const char *name;
int *flag;
} have_item;
typedef struct {
- char *name;
+ const char *name;
char *data;
} save_item;
-static char *db_opts[] = { "", "USE_DB", "USE_GDBM", "USE_TDB" };
+static const char *db_opts[] = { "", "USE_DB", "USE_GDBM", "USE_TDB" };
static int have_ipv6 = 0;
static int have_iconv = 0;
{
off_t test_off_t = 0;
time_t test_time_t = 0;
+#if ! (__STDC_VERSION__ >= 199901L)
+size_t test_size_t = 0;
+unsigned long test_ulong_t = 0L;
+#endif
+long test_long_t = 0;
FILE *base;
FILE *new;
int last_initial = 'A';
This assumption is known to be OK for the common operating systems. */
fprintf(new, "#ifndef OFF_T_FMT\n");
-if (sizeof(test_off_t) > 4)
+if (sizeof(test_off_t) > sizeof(test_long_t))
{
fprintf(new, "#define OFF_T_FMT \"%%lld\"\n");
fprintf(new, "#define LONGLONG_T long long int\n");
off_t. */
fprintf(new, "#ifndef TIME_T_FMT\n");
-if (sizeof(test_time_t) > 4)
+if (sizeof(test_time_t) > sizeof(test_long_t))
{
fprintf(new, "#define TIME_T_FMT \"%%lld\"\n");
fprintf(new, "#undef LONGLONG_T\n");
}
fprintf(new, "#endif\n\n");
+/* And for sizeof() results, size_t, which should with C99 be just %zu, deal
+with C99 not being ubiquitous yet. Unfortunately. */
+
+#if __STDC_VERSION__ >= 199901L
+fprintf(new, "#define SIZE_T_FMT \"%%zu\"\n");
+#else
+if (sizeof(test_size_t) > sizeof (test_ulong_t))
+ fprintf(new, "#define SIZE_T_FMT \"%%llu\"\n");
+else
+ fprintf(new, "#define SIZE_T_FMT \"%%lu\"\n");
+#endif
+
/* Now search the makefile for certain settings */
base = fopen("Makefile", "rb");
uid_t uid = 0;
gid_t gid = 0;
int gid_set = 0;
+ int uid_not_set = 0;
char *username = NULL;
char *groupname = NULL;
char *s;
while (isspace(*user)) user++;
username = user;
gid_set = 1;
+ uid_not_set = 1;
}
else
return 1;
}
+ /* security sanity checks
+ if ref: is being used, we can never be sure, but we can take reasonable
+ steps to filter out the most obvious ones. */
+
+ if ((!uid_not_set && uid == 0) ||
+ ((username != NULL) && (
+ (strcmp(username, "root") == 0) ||
+ (strcmp(username, "toor") == 0) )))
+ {
+ printf("\n*** Exim's internal user must not be root.\n\n");
+ return 1;
+ }
+
/* Output user and group names or uid/gid. When names are set, uid/gid
are set to zero but will be replaced at runtime. */
int isgroup = name[10] == 'G';
uid_t uid = 0;
gid_t gid = 0;
- char *s;
- char *username = NULL;
- char *user = getenv(name);
+ const char *s;
+ const char *username = NULL;
+ const char *user = getenv(name);
if (user == NULL) user = "";
while (isspace((unsigned char)(*user))) user++;
while (isspace(*user)) user++;
username = user;
}
-
- else if (isgroup)
+else if (isgroup)
{
struct group *gr = getgrnam(user);
if (gr == NULL)
{
char *wcs = getenv("WITH_CONTENT_SCAN");
char *wod = getenv("WITH_OLD_DEMIME");
- if (wcs != NULL || wod != NULL)
+ char *dcc = getenv("EXPERIMENTAL_DCC");
+ if (wcs != NULL || wod != NULL || dcc != NULL)
fprintf(new, "#define WITH_CONTENT_SCAN yes\n");
else fprintf(new, "/* WITH_CONTENT_SCAN not set */\n");
continue;
fprintf(new, "\"%s\"\n", value);
}
- /* Timezone values and HEADERS_CHARSET get quoted */
+ /* Timezone values HEADERS_CHARSET, TCP_WRAPPERS_DAEMON_NAME and
+ WHITELIST_D_MACROS get quoted */
else if (strcmp(name, "TIMEZONE_DEFAULT") == 0||
- strcmp(name, "HEADERS_CHARSET") == 0)
+ strcmp(name, "TCP_WRAPPERS_DAEMON_NAME") == 0||
+ strcmp(name, "HEADERS_CHARSET") == 0||
+ strcmp(name, "WHITELIST_D_MACROS") == 0)
fprintf(new, "\"%s\"\n", value);
/* For others, quote any paths and don't quote anything else */