Add IPv6 support.
[srvx.git] / src / main.c
index 997c4786d0786c268f8a4cb73c96ce2a1031263f..2517516f6bb677f0d62caf31ad8c1465651ce6a2 100644 (file)
@@ -117,6 +117,20 @@ static const struct message_entry msgtab[] = {
     { "MSG_DB_WRITE_ERROR", "Error while writing database %s." },
     { "MSG_DB_WROTE_DB", "Wrote database %s (in "FMT_TIME_T".%06lu seconds)." },
     { "MSG_DB_WROTE_ALL", "Wrote all databases (in "FMT_TIME_T".%06lu seconds)." },
+    { "MSG_AND", "and" },
+    { "MSG_0_SECONDS", "0 seconds" },
+    { "MSG_YEAR", "year" },
+    { "MSG_YEARS", "years" },
+    { "MSG_WEEK", "week" },
+    { "MSG_WEEKS", "weeks" },
+    { "MSG_DAY", "day" },
+    { "MSG_DAYS", "days" },
+    { "MSG_HOUR", "hour" },
+    { "MSG_HOURS", "hours" },
+    { "MSG_MINUTE", "minute" },
+    { "MSG_MINUTES", "minutes" },
+    { "MSG_SECOND", "second" },
+    { "MSG_SECONDS", "seconds" },
     { NULL, NULL }
 };
 
@@ -127,10 +141,9 @@ uplink_insert(const char *key, void *data, UNUSED_ARG(void *extra))
 {
     struct uplinkNode *uplink = malloc(sizeof(struct uplinkNode));
     struct record_data *rd = data;
+    struct addrinfo hints, *ai;
     int enabled = 1;
     char *str;
-    struct sockaddr_in *sin;
-    unsigned long addr;
 
     if(!uplink)
     {
@@ -160,15 +173,17 @@ uplink_insert(const char *key, void *data, UNUSED_ARG(void *extra))
     uplink->tries = 0;
 
     str = database_get_data(rd->d.object, "bind_address", RECDB_QSTRING);
-    uplink->bind_addr_len = sizeof(*sin);
-    if (str && getipbyname(str, &addr)) 
+    memset(&hints, 0, sizeof(hints));
+    hints.ai_flags = AI_PASSIVE;
+    hints.ai_socktype = SOCK_STREAM;
+    if (!getaddrinfo(str, NULL, &hints, &ai))
     {
-       sin = calloc(1, uplink->bind_addr_len);
-       sin->sin_family = AF_INET;
-       sin->sin_addr.s_addr = addr;
-       uplink->bind_addr = sin;
-    } 
-    else 
+        uplink->bind_addr_len = ai->ai_addrlen;
+       uplink->bind_addr = calloc(1, ai->ai_addrlen);
+        memcpy(uplink->bind_addr, ai->ai_addr, ai->ai_addrlen);
+        freeaddrinfo(ai);
+    }
+    else
     {
        uplink->bind_addr = NULL;
        uplink->bind_addr_len = 0;
@@ -551,12 +566,13 @@ conf_globals(void)
 static int
 set_item_rlimit(const char *name, void *data, void *extra)
 {
-    int rsrc, found;
+    long rsrc;
+    int found;
     struct record_data *rd = data;
     struct rlimit rlim;
     const char *str;
 
-    rsrc = (int)dict_find(extra, name, &found);
+    rsrc = (long)dict_find(extra, name, &found);
     if (!found) {
         log_module(MAIN_LOG, LOG_ERROR, "Invalid rlimit \"%s\" in rlimits section.", name);
         return 0;
@@ -641,7 +657,7 @@ void usage(char *self) {
 void version() {
     printf("    --------------------------------------------------\n"
            "    - "PACKAGE_STRING" ("CODENAME"), Built: " __DATE__ ", " __TIME__".\n"
-           "    - Copyright (C) 2000 - 2003, srvx Development Team\n"
+           "    - Copyright (C) 2000 - 2005, srvx Development Team\n"
            "    --------------------------------------------------\n");
 }
 
@@ -677,6 +693,12 @@ int main(int argc, char *argv[])
     FILE *file_out;
     struct sigaction sv;
 
+#if WITH_MALLOC_BOEHM_GC
+    GC_find_leak = 1;
+    GC_set_warn_proc(gc_warn_proc);
+    GC_enable_incremental();
+#endif
+
     daemon = 1;
     debug = 0;
     tools_init();
@@ -750,14 +772,6 @@ int main(int argc, char *argv[])
 
     version();
 
-#ifdef __CYGWIN__
-    if(daemon)
-    {
-       fprintf(stderr, "Daemon mode not supported under Cygwin.\n");
-       daemon = 0;
-    }
-#endif
-
     if (replay_file) {
         /* We read a line here to "prime" the replay file parser, but
          * mostly to get the right value of "now" for when we do the
@@ -810,10 +824,6 @@ int main(int argc, char *argv[])
     MAIN_LOG = log_register_type("srvx", "file:main.log");
     if (debug)
         log_debug();
-#if WITH_MALLOC_BOEHM_GC
-    GC_set_warn_proc(gc_warn_proc);
-    GC_enable_incremental();
-#endif
     timeq_init();
     init_structs();
     init_parse();