]> git.ipfire.org Git - thirdparty/unbound.git/commitdiff
coredump feature.
authorWouter Wijngaards <wouter@nlnetlabs.nl>
Wed, 20 Jun 2007 07:47:56 +0000 (07:47 +0000)
committerWouter Wijngaards <wouter@nlnetlabs.nl>
Wed, 20 Jun 2007 07:47:56 +0000 (07:47 +0000)
git-svn-id: file:///svn/unbound/trunk@402 be551aaa-1e26-0410-a405-d3ace91eadb9

daemon/unbound.c
doc/Changelog
doc/unbound.8

index 8f94acf197bc772c8a511647dde52c562336fd5b..a5057f2ef9ff065bcb2cdcda8439782617fbf392 100644 (file)
@@ -55,6 +55,9 @@
 #include <pwd.h>
 #include <sys/resource.h>
 
+/** if we want to enable coredumps after daemonize */
+static int enable_coredumps = 0;
+
 /** print usage. */
 static void usage()
 {
@@ -63,6 +66,7 @@ static void usage()
        printf("-h      this help\n");
        printf("-c file config file to read, unbound.conf(5).\n");
        printf("-d      do not fork into the background.\n");
+       printf("-C      try to enable coredumps after fork into background.\n");
        printf("-v      verbose (multiple times increase verbosity)\n");
        printf("Version %s\n", PACKAGE_VERSION);
        printf("BSD licensed, see LICENSE in source package for details.\n");
@@ -92,6 +96,8 @@ checkrlimits(struct config_file* cfg)
                log_warn("getrlimit: %s", strerror(errno));
                return;
        }
+       if(rlim.rlim_cur == RLIM_INFINITY)
+               return;
        if((size_t)rlim.rlim_cur < total) {
                log_err("Not enough sockets available. Increase "
                        "ulimit(open files).");
@@ -103,6 +109,49 @@ checkrlimits(struct config_file* cfg)
        }
 }
 
+/** printout rlimit prettily */
+static void
+print_rlim_pretty(const char* str, struct rlimit* rlim)
+{
+       if(rlim->rlim_cur == RLIM_INFINITY && rlim->rlim_max == RLIM_INFINITY)
+               log_info("%s unlimited, max unlimited", str);
+       else if(rlim->rlim_max == RLIM_INFINITY)
+               log_info("%s %d, max unlimited", str, (int)rlim->rlim_cur);
+       else if(rlim->rlim_cur == RLIM_INFINITY)
+               log_info("%s unlimited, max %d", str, (int)rlim->rlim_max);
+       else    log_info("%s %d, max %d", str, (int)rlim->rlim_cur, 
+                       (int)rlim->rlim_max);
+}
+
+/** try to enable coredumps */
+static void
+do_coredump_enable()
+{
+       struct rlimit rlim;
+       if(getrlimit(RLIMIT_CORE, &rlim) < 0) {
+               log_warn("getrlimit(core): %s", strerror(errno));
+               return;
+       }
+       print_rlim_pretty("rlimit(core) is", &rlim);
+       if(rlim.rlim_cur == RLIM_INFINITY && rlim.rlim_max == RLIM_INFINITY) {
+               return;
+       }
+       if(rlim.rlim_cur > 10000) {
+               return;
+       }
+       rlim.rlim_cur = RLIM_INFINITY;
+       rlim.rlim_max = RLIM_INFINITY;
+       if(setrlimit(RLIMIT_CORE, &rlim) < 0) {
+               log_warn("setrlimit(core): %s", strerror(errno));
+               return;
+       }
+       if(getrlimit(RLIMIT_CORE, &rlim) < 0) {
+               log_warn("getrlimit(core, upd): %s", strerror(errno));
+               return;
+       }
+       print_rlim_pretty("updated rlimit(core) is", &rlim);
+}
+
 /** to changedir, logfile */
 static void
 apply_dir(struct daemon* daemon, struct config_file* cfg, int cmdline_verbose)
@@ -281,6 +330,8 @@ do_chroot(struct daemon* daemon, struct config_file* cfg, int debug_mode)
        log_init(cfg->logfile);
        if(!debug_mode && cfg->do_daemonize) {
                detach(cfg);
+               if(enable_coredumps)
+                       do_coredump_enable();
        }
        if(cfg->pidfile && cfg->pidfile[0]) {
                writepid(cfg->pidfile, getpid());
@@ -359,8 +410,11 @@ main(int argc, char* argv[])
 
        log_init(NULL);
        /* parse the options */
-       while( (c=getopt(argc, argv, "c:dhv")) != -1) {
+       while( (c=getopt(argc, argv, "Cc:dhv")) != -1) {
                switch(c) {
+               case 'C':
+                       enable_coredumps = 1;
+                       break;
                case 'c':
                        cfgfile = optarg;
                        break;
index cf12d6b4f63c7f18e59a629aa030c0d6cd816ae8..90a5e1bd384ad5dedbba6d9f3e2888e9719daeb4 100644 (file)
@@ -1,3 +1,7 @@
+20 June 2007: Wouter
+       - new -C option to enable coredumps after forking away.
+       - doc update.
+
 19 June 2007: Wouter
        - nicer layout in stats.c, review 0.3 change.
        - spelling improvement, review 0.3 change.
index aaa5c8367f6d94ceb4187ce698ba37dc3076793d..3f095e3475b5dea1ae7b44f9eb008f8a5b0ca90d 100644 (file)
@@ -1,38 +1,11 @@
-.ig
-unbound.8 -- unbound manual
-
-Copyright (c) 2007, NLnet Labs. All rights reserved.
-
-This software is open source.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions
-are met:
-
-Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-
-Redistributions in binary form must reproduce the above copyright notice,
-this list of conditions and the following disclaimer in the documentation
-and/or other materials provided with the distribution.
-
-Neither the name of the NLNET LABS nor the names of its contributors may
-be used to endorse or promote products derived from this software without
-specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
-TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE
-LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGE.
-
-..
+.\"
+.\" unbound.8 -- unbound manual
+.\"
+.\" Copyright (c) 2007, NLnet Labs. All rights reserved.
+.\"
+.\" See LICENSE for the license.
+.\"
+.\"
 .Dd @date@
 .Dt unbound 8
 .Sh NAME
@@ -43,6 +16,7 @@ unbound
 .Op Fl h
 .Op Fl d
 .Op Fl v
+.Op Fl C
 .Op Fl c Ar cfgfile
 
 .Sh DESCRIPTION
@@ -69,6 +43,11 @@ console.
 Increase verbosity. If given multiple times, more information is logged.
 This is in addition to the verbosity (if any) from the config file.
 
+.It Fl C
+Try to enable coredumps after forking into the background. If you do not
+have permission to alter the ulimits, then this will fail. Performs
+the equivalent of 'ulimit -c unlimited'. For debug purposes.
+
 .El
 .Sh SEE ALSO
 .Xr unbound.conf 5 .