]> git.tuebingen.mpg.de Git - dss.git/commitdiff
Merge branch 't/rename_system_files'
authorAndre Noll <maan@systemlinux.org>
Sun, 16 Sep 2012 11:34:07 +0000 (13:34 +0200)
committerAndre Noll <maan@systemlinux.org>
Sun, 16 Sep 2012 11:34:07 +0000 (13:34 +0200)
Has been cooking for several weeks. The conflicts

daemon.c
exec.c
file.c
ipc.c
sig.c

are trivial and can be resolved easily.

daemon.c
df.c
dss.c
err.h
exec.c
file.c
ipc.c
log.h
sig.c
str.c
tv.c

index 2ea64ec29a001a5cd518f0320752e1d3636d8977..91a6ff26eebb9e6e070be6066d6a9e446c310c14 100644 (file)
--- a/daemon.c
+++ b/daemon.c
@@ -22,6 +22,7 @@
 #include "err.h"
 #include "log.h"
 #include "str.h"
+#include "daemon.h"
 
 /**
  * Do the usual stuff to become a daemon.
@@ -35,7 +36,7 @@ void daemon_init(void)
        pid_t pid;
        int null;
 
-       DSS_INFO_LOG("daemonizing\n");
+       DSS_INFO_LOG(("daemonizing\n"));
        pid = fork();
        if (pid < 0)
                goto err;
@@ -59,7 +60,7 @@ void daemon_init(void)
        close(null);
        return;
 err:
-       DSS_EMERG_LOG("fatal: %s\n", strerror(errno));
+       DSS_EMERG_LOG(("fatal: %s\n", strerror(errno)));
        exit(EXIT_FAILURE);
 }
 
@@ -77,8 +78,8 @@ FILE *open_log(const char *logfile_name)
        assert(logfile_name);
        logfile = fopen(logfile_name, "a");
        if (!logfile) {
-               DSS_EMERG_LOG("can not open %s: %s\n", logfile_name,
-                       strerror(errno));
+               DSS_EMERG_LOG(("can not open %s: %s\n", logfile_name,
+                       strerror(errno)));
                exit(EXIT_FAILURE);
        }
        setlinebuf(logfile);
@@ -96,7 +97,7 @@ void close_log(FILE* logfile)
 {
        if (!logfile)
                return;
-       DSS_INFO_LOG("closing logfile\n");
+       DSS_INFO_LOG(("closing logfile\n"));
        fclose(logfile);
 }
 
@@ -105,6 +106,6 @@ void close_log(FILE* logfile)
  */
 void log_welcome(int loglevel)
 {
-       DSS_INFO_LOG("***** welcome to dss ******\n");
-       DSS_DEBUG_LOG("using loglevel %d\n", loglevel);
+       DSS_INFO_LOG(("***** welcome to dss ******\n"));
+       DSS_DEBUG_LOG(("using loglevel %d\n", loglevel));
 }
diff --git a/df.c b/df.c
index 1356db26b75c8a734bab932146ae64e28de4386d..1c2531f9980f31bfb0731805ecd1bd7f5d88e326 100644 (file)
--- a/df.c
+++ b/df.c
@@ -42,7 +42,7 @@ int get_disk_space(const char *path, struct disk_space *result)
 
 void log_disk_space(struct disk_space *ds)
 {
-       DSS_INFO_LOG("free: %uM/%uM (%u%%), %u%% inodes unused\n",
+       DSS_INFO_LOG(("free: %uM/%uM (%u%%), %u%% inodes unused\n",
                ds->free_mb, ds->total_mb, ds->percent_free,
-               ds->percent_free_inodes);
+               ds->percent_free_inodes));
 }
diff --git a/dss.c b/dss.c
index d1a11e202ed488bd42126a52369aad3c5dbe3767..7620cfee1733d55ef99baaf956e11089db9b40d6 100644 (file)
--- a/dss.c
+++ b/dss.c
@@ -105,12 +105,12 @@ static void dump_dss_config(const char *msg)
        fprintf(log, "\n*** disk space ***\n\n");
        ret = get_disk_space(".", &ds);
        if (ret >= 0) {
-               DSS_INFO_LOG("disk space low: %s\n", disk_space_low(&ds)?
-                       "yes" : "no");
+               DSS_INFO_LOG(("disk space low: %s\n", disk_space_low(&ds)?
+                       "yes" : "no"));
                log_disk_space(&ds);
        } else
-               DSS_ERROR_LOG("can not get free disk space: %s\n",
-                       dss_strerror(-ret));
+               DSS_ERROR_LOG(("can not get free disk space: %s\n",
+                       dss_strerror(-ret)));
 
        /* we continue on errors from get_disk_space */
 
@@ -182,12 +182,25 @@ COMMANDS
 static int call_command_handler(void)
 {
        COMMANDS
-       DSS_EMERG_LOG("BUG: did not find command handler\n");
+       DSS_EMERG_LOG(("BUG: did not find command handler\n"));
        return -E_BUG;
 }
 #undef COMMAND
 #undef COMMANDS
 
+static int loglevel = -1;
+static const char *location_file = NULL;
+static int         location_line = -1;
+static const char *location_func = NULL;
+
+void dss_log_set_params(int ll, const char *file, int line, const char *func)
+{
+       loglevel = ll;
+       location_file = file;
+       location_line = line;
+       location_func = func;
+}
+
 /**
  * The log function of dss.
  *
@@ -196,7 +209,7 @@ static int call_command_handler(void)
  *
  * All DSS_XXX_LOG() macros use this function.
  */
-__printf_2_3 void dss_log(int ll, const char* fmt,...)
+__printf_1_2 void dss_log(const char* fmt,...)
 {
        va_list argp;
        FILE *outfd;
@@ -204,7 +217,7 @@ __printf_2_3 void dss_log(int ll, const char* fmt,...)
        time_t t1;
        char str[255] = "";
 
-       if (ll < conf.loglevel_arg)
+       if (loglevel < conf.loglevel_arg)
                return;
        outfd = logfile? logfile : stderr;
        time(&t1);
@@ -212,7 +225,12 @@ __printf_2_3 void dss_log(int ll, const char* fmt,...)
        strftime(str, sizeof(str), "%b %d %H:%M:%S", tm);
        fprintf(outfd, "%s ", str);
        if (conf.loglevel_arg <= INFO)
-               fprintf(outfd, "%i: ", ll);
+               fprintf(outfd, "%i: ", loglevel);
+#ifdef DSS_NO_FUNC_NAMES
+       fprintf(outfd, "%s:%d: ", location_file, location_line);
+#else
+       fprintf(outfd, "%s: ", location_func);
+#endif
        va_start(argp, fmt);
        vfprintf(outfd, fmt, argp);
        va_end(argp);
@@ -324,11 +342,11 @@ static int next_snapshot_is_due(void)
        if (!next_snapshot_time_is_valid())
                next_snapshot_time = compute_next_snapshot_time();
        if (next_snapshot_time <= now) {
-               DSS_DEBUG_LOG("next snapshot: now\n");
+               DSS_DEBUG_LOG(("next snapshot: now\n"));
                return 1;
        }
-       DSS_DEBUG_LOG("next snapshot due in %" PRId64 " seconds\n",
-               next_snapshot_time - now);
+       DSS_DEBUG_LOG(("next snapshot due in %" PRId64 " seconds\n",
+               next_snapshot_time - now));
        return 0;
 }
 
@@ -337,7 +355,7 @@ static void pre_create_hook(void)
        assert(snapshot_creation_status == HS_READY);
        /* make sure that the next snapshot time will be recomputed */
        invalidate_next_snapshot_time();
-       DSS_DEBUG_LOG("executing %s\n", conf.pre_create_hook_arg);
+       DSS_DEBUG_LOG(("executing %s\n", conf.pre_create_hook_arg));
        dss_exec_cmdline_pid(&create_pid, conf.pre_create_hook_arg);
        snapshot_creation_status = HS_PRE_RUNNING;
 }
@@ -348,7 +366,7 @@ static void pre_remove_hook(struct snapshot *s, const char *why)
 
        if (!s)
                return;
-       DSS_DEBUG_LOG("%s snapshot %s\n", why, s->name);
+       DSS_DEBUG_LOG(("%s snapshot %s\n", why, s->name));
        assert(snapshot_removal_status == HS_READY);
        assert(remove_pid == 0);
        assert(!snapshot_currently_being_removed);
@@ -359,7 +377,7 @@ static void pre_remove_hook(struct snapshot *s, const char *why)
 
        cmd = make_message("%s %s/%s", conf.pre_remove_hook_arg,
                conf.dest_dir_arg, s->name);
-       DSS_DEBUG_LOG("executing %s\n", cmd);
+       DSS_DEBUG_LOG(("executing %s\n", cmd));
        dss_exec_cmdline_pid(&remove_pid, cmd);
        free(cmd);
        snapshot_removal_status = HS_PRE_RUNNING;
@@ -380,7 +398,7 @@ static int exec_rm(void)
        assert(snapshot_removal_status == HS_PRE_SUCCESS);
        assert(remove_pid == 0);
 
-       DSS_NOTICE_LOG("removing %s (interval = %i)\n", s->name, s->interval);
+       DSS_NOTICE_LOG(("removing %s (interval = %i)\n", s->name, s->interval));
        ret = dss_rename(s->name, new_name);
        if (ret < 0)
                goto out;
@@ -401,7 +419,7 @@ static struct snapshot *find_orphaned_snapshot(struct snapshot_list *sl)
        struct snapshot *s;
        int i;
 
-       DSS_DEBUG_LOG("looking for orphaned snapshots\n");
+       DSS_DEBUG_LOG(("looking for orphaned snapshots\n"));
        FOR_EACH_SNAPSHOT(s, i, sl) {
                if (snapshot_is_being_created(s))
                        continue;
@@ -446,7 +464,7 @@ static struct snapshot *find_redundant_snapshot(struct snapshot_list *sl)
        struct snapshot *s;
        unsigned missing = 0;
 
-       DSS_DEBUG_LOG("looking for intervals containing too many snapshots\n");
+       DSS_DEBUG_LOG(("looking for intervals containing too many snapshots\n"));
        for (interval = conf.num_intervals_arg - 1; interval >= 0; interval--) {
                unsigned keep = desired_number_of_snapshots(interval, conf.num_intervals_arg);
                unsigned num = sl->interval_count[interval];
@@ -497,8 +515,8 @@ static struct snapshot *find_outdated_snapshot(struct snapshot_list *sl)
        int i;
        struct snapshot *s;
 
-       DSS_DEBUG_LOG("looking for snapshots belonging to intervals >= %d\n",
-               conf.num_intervals_arg);
+       DSS_DEBUG_LOG(("looking for snapshots belonging to intervals >= %d\n",
+               conf.num_intervals_arg));
        FOR_EACH_SNAPSHOT(s, i, sl) {
                if (snapshot_is_being_created(s))
                        continue;
@@ -511,7 +529,7 @@ static struct snapshot *find_outdated_snapshot(struct snapshot_list *sl)
        return NULL;
 }
 
-struct snapshot *find_oldest_removable_snapshot(struct snapshot_list *sl)
+static struct snapshot *find_oldest_removable_snapshot(struct snapshot_list *sl)
 {
        int i;
        struct snapshot *s;
@@ -520,7 +538,7 @@ struct snapshot *find_oldest_removable_snapshot(struct snapshot_list *sl)
                        continue;
                if (is_reference_snapshot(s))
                        continue;
-               DSS_INFO_LOG("oldest removable snapshot: %s\n", s->name);
+               DSS_INFO_LOG(("oldest removable snapshot: %s\n", s->name));
                return s;
        }
        return NULL;
@@ -539,8 +557,8 @@ static int rename_incomplete_snapshot(int64_t start)
        old_name = incomplete_name(start);
        ret = dss_rename(old_name, path_to_last_complete_snapshot);
        if (ret >= 0)
-               DSS_NOTICE_LOG("%s -> %s\n", old_name,
-                       path_to_last_complete_snapshot);
+               DSS_NOTICE_LOG(("%s -> %s\n", old_name,
+                       path_to_last_complete_snapshot));
        free(old_name);
        return ret;
 }
@@ -588,11 +606,11 @@ static int try_to_free_disk_space(void)
        victim = find_orphaned_snapshot(&sl);
        if (victim)
                goto remove;
-       DSS_WARNING_LOG("disk space low and nothing obvious to remove\n");
+       DSS_WARNING_LOG(("disk space low and nothing obvious to remove\n"));
        victim = find_oldest_removable_snapshot(&sl);
        if (victim)
                goto remove;
-       DSS_CRIT_LOG("uhuhu: disk space low and nothing to remove\n");
+       DSS_CRIT_LOG(("uhuhu: disk space low and nothing to remove\n"));
        ret = -ERRNO_TO_DSS_ERROR(ENOSPC);
        goto out;
 remove:
@@ -606,7 +624,7 @@ static void post_create_hook(void)
 {
        char *cmd = make_message("%s %s/%s", conf.post_create_hook_arg,
                conf.dest_dir_arg, path_to_last_complete_snapshot);
-       DSS_NOTICE_LOG("executing %s\n", cmd);
+       DSS_NOTICE_LOG(("executing %s\n", cmd));
        dss_exec_cmdline_pid(&create_pid, cmd);
        free(cmd);
        snapshot_creation_status = HS_POST_RUNNING;
@@ -621,7 +639,7 @@ static void post_remove_hook(void)
 
        cmd = make_message("%s %s/%s", conf.post_remove_hook_arg,
                conf.dest_dir_arg, s->name);
-       DSS_NOTICE_LOG("executing %s\n", cmd);
+       DSS_NOTICE_LOG(("executing %s\n", cmd));
        dss_exec_cmdline_pid(&remove_pid, cmd);
        free(cmd);
        snapshot_removal_status = HS_POST_RUNNING;
@@ -647,13 +665,13 @@ static void dss_kill(pid_t pid, int sig, const char *msg)
        else process_name = "??????";
 
        if (msg)
-               DSS_INFO_LOG("%s\n", msg);
-       DSS_DEBUG_LOG("sending signal %d (%s) to pid %d (%s process)\n",
-               sig, signame, (int)pid, process_name);
+               DSS_INFO_LOG(("%s\n", msg));
+       DSS_DEBUG_LOG(("sending signal %d (%s) to pid %d (%s process)\n",
+               sig, signame, (int)pid, process_name));
        if (kill(pid, sig) >= 0)
                return;
-       DSS_INFO_LOG("failed to send signal %d (%s) to pid %d (%s process)\n",
-               sig, signame, (int)pid, process_name);
+       DSS_INFO_LOG(("failed to send signal %d (%s) to pid %d (%s process)\n",
+               sig, signame, (int)pid, process_name));
 }
 
 static void stop_create_process(void)
@@ -678,20 +696,20 @@ static void restart_create_process(void)
 static void log_termination_msg(pid_t pid, int status)
 {
        if (WIFEXITED(status))
-               DSS_INFO_LOG("child %i exited. Exit status: %i\n", (int)pid,
-                       WEXITSTATUS(status));
+               DSS_INFO_LOG(("child %i exited. Exit status: %i\n", (int)pid,
+                       WEXITSTATUS(status)));
        else if (WIFSIGNALED(status))
-               DSS_NOTICE_LOG("child %i was killed by signal %i\n", (int)pid,
-                       WTERMSIG(status));
+               DSS_NOTICE_LOG(("child %i was killed by signal %i\n", (int)pid,
+                       WTERMSIG(status)));
        else
-               DSS_WARNING_LOG("child %i terminated abormally\n", (int)pid);
+               DSS_WARNING_LOG(("child %i terminated abormally\n", (int)pid));
 }
 
 static int wait_for_process(pid_t pid, int *status)
 {
        int ret;
 
-       DSS_DEBUG_LOG("Waiting for process %d to terminate\n", (int)pid);
+       DSS_DEBUG_LOG(("Waiting for process %d to terminate\n", (int)pid));
        for (;;) {
                fd_set rfds;
 
@@ -716,7 +734,7 @@ static int wait_for_process(pid_t pid, int *status)
                dss_kill(pid, SIGTERM, "killing child process");
        }
        if (ret < 0)
-               DSS_ERROR_LOG("failed to wait for process %d\n", (int)pid);
+               DSS_ERROR_LOG(("failed to wait for process %d\n", (int)pid));
        else
                log_termination_msg(pid, *status);
        return ret;
@@ -803,7 +821,7 @@ static int handle_rsync_exit(int status)
        int es, ret;
 
        if (!WIFEXITED(status)) {
-               DSS_ERROR_LOG("rsync process %d died involuntary\n", (int)create_pid);
+               DSS_ERROR_LOG(("rsync process %d died involuntary\n", (int)create_pid));
                ret = -E_INVOLUNTARY_EXIT;
                snapshot_creation_status = HS_READY;
                goto out;
@@ -815,15 +833,15 @@ static int handle_rsync_exit(int status)
         * 13: Errors with program diagnostics
         */
        if (es == 12 || es == 13) {
-               DSS_WARNING_LOG("rsync process %d returned %d -- restarting\n",
-                       (int)create_pid, es);
+               DSS_WARNING_LOG(("rsync process %d returned %d -- restarting\n",
+                       (int)create_pid, es));
                snapshot_creation_status = HS_NEEDS_RESTART;
                next_snapshot_time = get_current_time() + 60;
                ret = 1;
                goto out;
        }
        if (es != 0 && es != 23 && es != 24) {
-               DSS_ERROR_LOG("rsync process %d returned %d\n", (int)create_pid, es);
+               DSS_ERROR_LOG(("rsync process %d returned %d\n", (int)create_pid, es));
                ret = -E_BAD_EXIT_CODE;
                snapshot_creation_status = HS_READY;
                goto out;
@@ -852,9 +870,9 @@ static int handle_pre_create_hook_exit(int status)
        es = WEXITSTATUS(status);
        if (es) {
                if (!warn_count--) {
-                       DSS_NOTICE_LOG("pre_create_hook %s returned %d\n",
-                               conf.pre_create_hook_arg, es);
-                       DSS_NOTICE_LOG("deferring snapshot creation...\n");
+                       DSS_NOTICE_LOG(("pre_create_hook %s returned %d\n",
+                               conf.pre_create_hook_arg, es));
+                       DSS_NOTICE_LOG(("deferring snapshot creation...\n"));
                        warn_count = 60; /* warn only once per hour */
                }
                next_snapshot_time = get_current_time() + 60;
@@ -890,8 +908,8 @@ static int handle_sigchld(void)
                        ret = 1;
                        break;
                default:
-                       DSS_EMERG_LOG("BUG: create can't die in status %d\n",
-                               snapshot_creation_status);
+                       DSS_EMERG_LOG(("BUG: create can't die in status %d\n",
+                               snapshot_creation_status));
                        return -E_BUG;
                }
                create_pid = 0;
@@ -903,22 +921,22 @@ static int handle_sigchld(void)
                        return ret;
                return ret;
        }
-       DSS_EMERG_LOG("BUG: unknown process %d died\n", (int)pid);
+       DSS_EMERG_LOG(("BUG: unknown process %d died\n", (int)pid));
        return -E_BUG;
 }
 
 static int check_config(void)
 {
        if (conf.unit_interval_arg <= 0) {
-               DSS_ERROR_LOG("bad unit interval: %i\n", conf.unit_interval_arg);
+               DSS_ERROR_LOG(("bad unit interval: %i\n", conf.unit_interval_arg));
                return -E_INVALID_NUMBER;
        }
-       DSS_DEBUG_LOG("unit interval: %i day(s)\n", conf.unit_interval_arg);
+       DSS_DEBUG_LOG(("unit interval: %i day(s)\n", conf.unit_interval_arg));
        if (conf.num_intervals_arg <= 0) {
-               DSS_ERROR_LOG("bad number of intervals  %i\n", conf.num_intervals_arg);
+               DSS_ERROR_LOG(("bad number of intervals  %i\n", conf.num_intervals_arg));
                return -E_INVALID_NUMBER;
        }
-       DSS_DEBUG_LOG("number of intervals: %i\n", conf.num_intervals_arg);
+       DSS_DEBUG_LOG(("number of intervals: %i\n", conf.num_intervals_arg));
        return 1;
 }
 
@@ -943,7 +961,7 @@ static int parse_config_file(int override)
        config_file_exists = !stat(config_file, &statbuf);
        if (!config_file_exists && conf.config_file_given) {
                ret = -ERRNO_TO_DSS_ERROR(errno);
-               DSS_ERROR_LOG("failed to stat config file %s\n", config_file);
+               DSS_ERROR_LOG(("failed to stat config file %s\n", config_file));
                goto out;
        }
        if (config_file_exists) {
@@ -983,18 +1001,18 @@ static int parse_config_file(int override)
                logfile = open_log(conf.logfile_arg);
                log_welcome(conf.loglevel_arg);
        }
-       DSS_DEBUG_LOG("loglevel: %d\n", conf.loglevel_arg);
+       DSS_DEBUG_LOG(("loglevel: %d\n", conf.loglevel_arg));
        ret = config_file_exists;
 out:
        free(config_file);
        if (ret < 0)
-               DSS_EMERG_LOG("%s\n", dss_strerror(-ret));
+               DSS_EMERG_LOG(("%s\n", dss_strerror(-ret)));
        return ret;
 }
 
 static int change_to_dest_dir(void)
 {
-       DSS_INFO_LOG("changing cwd to %s\n", conf.dest_dir_arg);
+       DSS_INFO_LOG(("changing cwd to %s\n", conf.dest_dir_arg));
        return dss_chdir(conf.dest_dir_arg);
 }
 
@@ -1002,7 +1020,7 @@ static int handle_sighup(void)
 {
        int ret;
 
-       DSS_NOTICE_LOG("SIGHUP, re-reading config\n");
+       DSS_NOTICE_LOG(("SIGHUP, re-reading config\n"));
        dump_dss_config("old");
        ret = parse_config_file(1);
        if (ret < 0)
@@ -1036,7 +1054,7 @@ static int handle_signal(void)
        }
 out:
        if (ret < 0)
-               DSS_ERROR_LOG("%s\n", dss_strerror(-ret));
+               DSS_ERROR_LOG(("%s\n", dss_strerror(-ret)));
        return ret;
 }
 
@@ -1099,11 +1117,11 @@ static int rename_resume_snap(int64_t creation_time)
        s = find_orphaned_snapshot(&sl);
 out:
        if (s) {
-               DSS_INFO_LOG("reusing %s snapshot %s\n", why, s->name);
+               DSS_INFO_LOG(("reusing %s snapshot %s\n", why, s->name));
                ret = dss_rename(s->name, new_name);
        }
        if (ret >= 0)
-               DSS_NOTICE_LOG("creating new snapshot %s\n", new_name);
+               DSS_NOTICE_LOG(("creating new snapshot %s\n", new_name));
        free(new_name);
        free_snapshot_list(&sl);
        return ret;
@@ -1127,11 +1145,11 @@ static void create_rsync_argv(char ***argv, int64_t *num)
        for (j = 0; j < conf.rsync_option_given; j++)
                (*argv)[i++] = dss_strdup(conf.rsync_option_arg[j]);
        if (name_of_reference_snapshot) {
-               DSS_INFO_LOG("using %s as reference\n", name_of_reference_snapshot);
+               DSS_INFO_LOG(("using %s as reference\n", name_of_reference_snapshot));
                (*argv)[i++] = make_message("--link-dest=../%s",
                        name_of_reference_snapshot);
        } else
-               DSS_INFO_LOG("no suitable reference snapshot found\n");
+               DSS_INFO_LOG(("no suitable reference snapshot found\n"));
        logname = dss_logname();
        if (use_rsync_locally(logname))
                (*argv)[i++] = dss_strdup(conf.source_dir_arg);
@@ -1144,7 +1162,7 @@ static void create_rsync_argv(char ***argv, int64_t *num)
        (*argv)[i++] = incomplete_name(*num);
        (*argv)[i++] = NULL;
        for (j = 0; j < i; j++)
-               DSS_DEBUG_LOG("argv[%d] = %s\n", j, (*argv)[j]);
+               DSS_DEBUG_LOG(("argv[%d] = %s\n", j, (*argv)[j]));
 }
 
 static void free_rsync_argv(char **argv)
@@ -1262,7 +1280,7 @@ static void exit_hook(int exit_code)
        argv[1] = dss_strerror(-exit_code);
        argv[2] = NULL;
 
-       DSS_NOTICE_LOG("executing %s %s\n", argv[0], argv[1]);
+       DSS_NOTICE_LOG(("executing %s %s\n", argv[0], argv[1]));
        dss_exec(&pid, conf.exit_hook_arg, argv);
 }
 
@@ -1273,7 +1291,7 @@ static void lock_dss_or_die(void)
 
        free(config_file);
        if (ret < 0) {
-               DSS_EMERG_LOG("failed to lock: %s\n", dss_strerror(-ret));
+               DSS_EMERG_LOG(("failed to lock: %s\n", dss_strerror(-ret)));
                exit(EXIT_FAILURE);
        }
 }
@@ -1284,7 +1302,7 @@ static int com_run(void)
 
        lock_dss_or_die();
        if (conf.dry_run_given) {
-               DSS_ERROR_LOG("dry_run not supported by this command\n");
+               DSS_ERROR_LOG(("dry_run not supported by this command\n"));
                return -E_SYNTAX;
        }
        ret = install_sighandler(SIGHUP);
@@ -1425,7 +1443,7 @@ static int setup_signal_handling(void)
 {
        int ret;
 
-       DSS_INFO_LOG("setting up signal handlers\n");
+       DSS_INFO_LOG(("setting up signal handlers\n"));
        signal_pipe = signal_init(); /* always successful */
        ret = install_sighandler(SIGINT);
        if (ret < 0)
@@ -1482,6 +1500,6 @@ int main(int argc, char **argv)
        ret = call_command_handler();
 out:
        if (ret < 0)
-               DSS_EMERG_LOG("%s\n", dss_strerror(-ret));
+               DSS_EMERG_LOG(("%s\n", dss_strerror(-ret)));
        exit(ret >= 0? EXIT_SUCCESS : EXIT_FAILURE);
 }
diff --git a/err.h b/err.h
index 14cc032fae65f621ade9c419d682f0252b7ad0ac..551ff54674681a332072bb535e31821e0a4d5671 100644 (file)
--- a/err.h
+++ b/err.h
@@ -6,7 +6,8 @@
 extern char *dss_errlist[];
 extern char *dss_error_txt;
 
-__printf_2_3 void dss_log(int ll, const char* fmt,...);
+void dss_log_set_params(int ll, const char *file, int line, const char *func);
+__printf_1_2 void dss_log(const char* fmt,...);
 
 /**
  * This bit indicates whether a number is considered a system error number
diff --git a/exec.c b/exec.c
index 36602df7588a49fa0dc92157bc95dd33c1dd9c00..2a40bc0dbb17b831aaa1d15376c1119af44910cb 100644 (file)
--- a/exec.c
+++ b/exec.c
@@ -17,6 +17,7 @@
 #include "log.h"
 #include "err.h"
 #include "str.h"
+#include "exec.h"
 
 /**
  * Spawn a new process using execvp().
@@ -32,7 +33,7 @@
 void dss_exec(pid_t *pid, const char *file, char *const *const args)
 {
        if ((*pid = fork()) < 0) {
-               DSS_EMERG_LOG("fork error: %s\n", strerror(errno));
+               DSS_EMERG_LOG(("fork error: %s\n", strerror(errno)));
                exit(EXIT_FAILURE);
        }
        if (*pid) /* parent */
@@ -41,7 +42,7 @@ void dss_exec(pid_t *pid, const char *file, char *const *const args)
        signal(SIGTERM, SIG_DFL);
        signal(SIGCHLD, SIG_DFL);
        execvp(file, args);
-       DSS_EMERG_LOG("execvp error: %s\n", strerror(errno));
+       DSS_EMERG_LOG(("execvp error: %s\n", strerror(errno)));
        _exit(EXIT_FAILURE);
 }
 
diff --git a/file.c b/file.c
index ea671b1cebbf697931ba1928c63827a2e97410a3..648421816439acf9a0acd12e002f1da7f780a31e 100644 (file)
--- a/file.c
+++ b/file.c
@@ -4,6 +4,7 @@
  * Licensed under the GPL v2. For licencing details see COPYING.
  */
 
+#include <stdio.h>
 #include <unistd.h>
 #include <assert.h>
 #include <string.h>
 #include <sys/stat.h>
 #include <fcntl.h>
 
-
 #include "gcc-compat.h"
 #include "err.h"
 #include "str.h"
+#include "file.h"
 
 /**
  * Call a function for each subdirectory of the current working directory.
diff --git a/ipc.c b/ipc.c
index 9889674d2493efc0250ea699aa33454a6d61cc59..65ef20049d26748ef54b6fd60068e7492b159beb 100644 (file)
--- a/ipc.c
+++ b/ipc.c
@@ -19,6 +19,7 @@
 #include "log.h"
 #include "gcc-compat.h"
 #include "err.h"
+#include "ipc.h"
 
 #if (defined(__GNUC__) && defined(__i386__))
 #define get16bits(d) (*((const uint16_t *) (d)))
@@ -236,11 +237,11 @@ static inline int get_key_or_die(char *config_file)
        if (stat(config_file, &statbuf) == 0) {
                ret = dss_realpath(config_file, &rpath);
                if (ret < 0) {
-                       DSS_EMERG_LOG("could not resolve path %s: %s\n", config_file,
-                               dss_strerror(-ret));
+                       DSS_EMERG_LOG(("could not resolve path %s: %s\n", config_file,
+                               dss_strerror(-ret)));
                        exit(EXIT_FAILURE);
                }
-               DSS_DEBUG_LOG("resolved path: %s\n", rpath);
+               DSS_DEBUG_LOG(("resolved path: %s\n", rpath));
        } else
                /*
                 * This happens if the user did not specify a config file, and
@@ -260,7 +261,7 @@ static int mutex_get(int key, int flags)
 {
        int ret;
 
-       DSS_DEBUG_LOG("getting semaphore 0x%x\n", key);
+       DSS_DEBUG_LOG(("getting semaphore 0x%x\n", key));
        ret = semget(key, 2, flags);
        if (ret < 0)
                return -ERRNO_TO_DSS_ERROR(errno);
@@ -271,7 +272,7 @@ static int do_semop(int id, struct sembuf *sops, int num)
 {
        int ret;
 
-       DSS_DEBUG_LOG("calling semop\n");
+       DSS_DEBUG_LOG(("calling semop\n"));
        do {
                ret = semop(id, sops, num);
                if (ret >= 0)
@@ -282,31 +283,27 @@ static int do_semop(int id, struct sembuf *sops, int num)
 
 static int mutex_lock(int id)
 {
+       struct sembuf sops[4];
        int ret;
 
-       DSS_DEBUG_LOG("locking\n");
-       struct sembuf sops[4] = {
-               {
-                       .sem_num = 0,
-                       .sem_op = 0,
-                       .sem_flg = SEM_UNDO | IPC_NOWAIT
-               },
-               {
-                       .sem_num = 0,
-                       .sem_op = 1,
-                       .sem_flg = SEM_UNDO | IPC_NOWAIT
-               },
-               {
-                       .sem_num = 1,
-                       .sem_op = 0,
-                       .sem_flg = SEM_UNDO | IPC_NOWAIT
-               },
-               {
-                       .sem_num = 1,
-                       .sem_op = 1,
-                       .sem_flg = SEM_UNDO | IPC_NOWAIT
-               }
-       };
+       DSS_DEBUG_LOG(("locking\n"));
+
+       sops[0].sem_num = 0;
+       sops[0].sem_op = 0;
+       sops[0].sem_flg = SEM_UNDO | IPC_NOWAIT;
+
+       sops[1].sem_num = 0;
+       sops[1].sem_op = 1;
+       sops[1].sem_flg = SEM_UNDO | IPC_NOWAIT;
+
+       sops[2].sem_num = 1;
+       sops[2].sem_op = 0;
+       sops[2].sem_flg = SEM_UNDO | IPC_NOWAIT;
+
+       sops[3].sem_num = 1;
+       sops[3].sem_op = 1;
+       sops[3].sem_flg = SEM_UNDO | IPC_NOWAIT;
+
        ret = do_semop(id, sops, 4);
        if (ret < 0)
                return -ERRNO_TO_DSS_ERROR(errno);
@@ -315,21 +312,19 @@ static int mutex_lock(int id)
 
 static int mutex_try_lock(int id)
 {
+       struct sembuf sops[2];
        int ret;
 
-       DSS_DEBUG_LOG("trying to lock\n");
-       struct sembuf sops[2] = {
-               {
-                       .sem_num = 0,
-                       .sem_op = 0,
-                       .sem_flg = SEM_UNDO | IPC_NOWAIT
-               },
-               {
-                       .sem_num = 0,
-                       .sem_op = 1,
-                       .sem_flg = SEM_UNDO | IPC_NOWAIT
-               }
-       };
+       DSS_DEBUG_LOG(("trying to lock\n"));
+
+       sops[0].sem_num = 0;
+       sops[0].sem_op = 0;
+       sops[0].sem_flg = SEM_UNDO | IPC_NOWAIT;
+
+       sops[1].sem_num = 0;
+       sops[1].sem_op = 1;
+       sops[1].sem_flg = SEM_UNDO | IPC_NOWAIT;
+
        ret = do_semop(id, sops, 2);
        if (ret < 0)
                return -ERRNO_TO_DSS_ERROR(errno);
diff --git a/log.h b/log.h
index 5d38c7bfaa74bcda2aad3c0fd8058b936c1a7e47..ba422104d4ad7b61bc3debb101c3f4bb50ff60e4 100644 (file)
--- a/log.h
+++ b/log.h
 /** Log messages with lower priority than that will not be compiled in. */
 #define COMPILE_TIME_LOGLEVEL 0
 
+/** Not all compilers support __func__ or an equivalent. */
+#if (!defined(__STDC_VERSION__) || __STDC_VERSION__ < 199901L) && !defined(__GNUC__)
+# if defined(_MSC_VER) && _MSC_VER >= 1300
+#  define __func__ __FUNCTION__
+# else
+#  define DSS_NO_FUNC_NAMES
+#  define __func__ "<unknown>"
+# endif
+#endif
+
 /** \cond */
 #if DEBUG > COMPILE_TIME_LOGLEVEL
-#define DSS_DEBUG_LOG(f,...) dss_log(DEBUG, "%s: " f, __FUNCTION__, ## __VA_ARGS__)
+#define DSS_DEBUG_LOG(args) \
+       do { \
+               dss_log_set_params(DEBUG, __FILE__, __LINE__, __func__); \
+               dss_log args ; \
+       } while (0)
 #else
-#define DSS_DEBUG_LOG(...) do {;} while (0)
+#define DSS_DEBUG_LOG(args) do {;} while (0)
 #endif
 
 #if INFO > COMPILE_TIME_LOGLEVEL
-#define DSS_INFO_LOG(f,...) dss_log(INFO, "%s: " f, __FUNCTION__, ## __VA_ARGS__)
+#define DSS_INFO_LOG(args) \
+       do { \
+               dss_log_set_params(INFO, __FILE__, __LINE__, __func__); \
+               dss_log args ; \
+       } while (0)
 #else
-#define DSS_INFO_LOG(...) do {;} while (0)
+#define DSS_INFO_LOG(args) do {;} while (0)
 #endif
 
 #if NOTICE > COMPILE_TIME_LOGLEVEL
-#define DSS_NOTICE_LOG(f,...) dss_log(NOTICE, "%s: " f, __FUNCTION__, ## __VA_ARGS__)
+#define DSS_NOTICE_LOG(args) \
+       do { \
+               dss_log_set_params(NOTICE, __FILE__, __LINE__, __func__); \
+               dss_log args ; \
+       } while (0)
 #else
-#define DSS_NOTICE_LOG(...) do {;} while (0)
+#define DSS_NOTICE_LOG(args) do {;} while (0)
 #endif
 
 #if WARNING > COMPILE_TIME_LOGLEVEL
-#define DSS_WARNING_LOG(f,...) dss_log(WARNING, "%s: " f, __FUNCTION__, ##  __VA_ARGS__)
+#define DSS_WARNING_LOG(args) \
+       do { \
+               dss_log_set_params(WARNING, __FILE__, __LINE__, __func__); \
+               dss_log args ; \
+       } while (0)
 #else
-#define DSS_WARNING_LOG(...) do {;} while (0)
+#define DSS_WARNING_LOG(args) do {;} while (0)
 #endif
 
 #if ERROR > COMPILE_TIME_LOGLEVEL
-#define DSS_ERROR_LOG(f,...) dss_log(ERROR, "%s: " f, __FUNCTION__, ## __VA_ARGS__)
+#define DSS_ERROR_LOG(args) \
+       do { \
+               dss_log_set_params(ERROR, __FILE__, __LINE__, __func__); \
+               dss_log args ; \
+       } while (0)
 #else
-#define DSS_ERROR_LOG(...) do {;} while (0)
+#define DSS_ERROR_LOG(args) do {;} while (0)
 #endif
 
 #if CRIT > COMPILE_TIME_LOGLEVEL
-#define DSS_CRIT_LOG(f,...) dss_log(CRIT, "%s: " f, __FUNCTION__, ## __VA_ARGS__)
+#define DSS_CRIT_LOG(args) \
+       do { \
+               dss_log_set_params(CRIT, __FILE__, __LINE__, __func__); \
+               dss_log args ; \
+       } while (0)
 #else
-#define DSS_CRIT_LOG(...) do {;} while (0)
+#define DSS_CRIT_LOG(args) do {;} while (0)
 #endif
 
 #if EMERG > COMPILE_TIME_LOGLEVEL
-#define DSS_EMERG_LOG(f,...) dss_log(EMERG, "%s: " f, __FUNCTION__, ## __VA_ARGS__)
+#define DSS_EMERG_LOG(args) \
+       do { \
+               dss_log_set_params(EMERG, __FILE__, __LINE__, __func__); \
+               dss_log args ; \
+       } while (0)
 #else
-#define DSS_EMERG_LOG(...)
+#define DSS_EMERG_LOG(args)
 #endif
diff --git a/sig.c b/sig.c
index 9694684045145105001e7410b06558ee73bbfd39..2f6f7ddb30ac13e531d9847134a0c9606ed315e0 100644 (file)
--- a/sig.c
+++ b/sig.c
@@ -23,6 +23,7 @@
 #include "log.h"
 #include "str.h"
 #include "file.h"
+#include "sig.h"
 
 static int signal_pipe[2];
 
@@ -59,7 +60,7 @@ int signal_init(void)
                goto err_out;
        return signal_pipe[0];
 err_out:
-       DSS_EMERG_LOG("%s\n", dss_strerror(-ret));
+       DSS_EMERG_LOG(("%s\n", dss_strerror(-ret)));
        exit(EXIT_FAILURE);
 }
 
@@ -94,13 +95,13 @@ int reap_child(pid_t *pid, int *status)
        if (*pid < 0)
                return -ERRNO_TO_DSS_ERROR(errno);
        if (WIFEXITED(*status))
-               DSS_DEBUG_LOG("child %i exited. Exit status: %i\n", (int)*pid,
-                       WEXITSTATUS(*status));
+               DSS_DEBUG_LOG(("child %i exited. Exit status: %i\n", (int)*pid,
+                       WEXITSTATUS(*status)));
        else if (WIFSIGNALED(*status))
-               DSS_DEBUG_LOG("child %i was killed by signal %i\n", (int)*pid,
-                       WTERMSIG(*status));
+               DSS_DEBUG_LOG(("child %i was killed by signal %i\n", (int)*pid,
+                       WTERMSIG(*status)));
        else
-               DSS_WARNING_LOG("child %i terminated abormally\n", (int)*pid);
+               DSS_WARNING_LOG(("child %i terminated abormally\n", (int)*pid));
        return 1;
 }
 
@@ -116,7 +117,7 @@ int reap_child(pid_t *pid, int *status)
  */
 int install_sighandler(int sig)
 {
-       DSS_DEBUG_LOG("catching signal %d\n", sig);
+       DSS_DEBUG_LOG(("catching signal %d\n", sig));
        if (signal(sig, &generic_signal_handler) != SIG_ERR)
                return 1;
        return -E_SIGNAL_SIG_ERR;
@@ -138,14 +139,14 @@ int next_signal(void)
 
        r = read(signal_pipe[0], &s, sizeof(s));
        if (r == sizeof(s)) {
-               DSS_DEBUG_LOG("next signal: %d\n", s);
+               DSS_DEBUG_LOG(("next signal: %d\n", s));
                return s;
        }
        err = errno;
        assert(r < 0);
        if (err == EAGAIN)
                return 0;
-       DSS_ERROR_LOG("failed to read from signal pipe\n");
+       DSS_ERROR_LOG(("failed to read from signal pipe\n"));
        return -ERRNO_TO_DSS_ERROR(err);
 }
 
diff --git a/str.c b/str.c
index e2b7f303ae4d717850a561bc9d4338495b0f6d3f..4bca765e9427ebf67b293b22a5dd7a8bf8e920cb 100644 (file)
--- a/str.c
+++ b/str.c
@@ -72,8 +72,8 @@ __must_check __malloc void *dss_realloc(void *p, size_t size)
         */
        assert(size);
        if (!(p = realloc(p, size))) {
-               DSS_EMERG_LOG("realloc failed (size = %zu), aborting\n",
-                       size);
+               DSS_EMERG_LOG(("realloc failed (size = %zu), aborting\n",
+                       size));
                exit(EXIT_FAILURE);
        }
        return p;
@@ -98,8 +98,8 @@ __must_check __malloc void *dss_malloc(size_t size)
        p = malloc(size);
 
        if (!p) {
-               DSS_EMERG_LOG("malloc failed (size = %zu),  aborting\n",
-                       size);
+               DSS_EMERG_LOG(("malloc failed (size = %zu),  aborting\n",
+                       size));
                exit(EXIT_FAILURE);
        }
        return p;
@@ -145,7 +145,7 @@ __must_check __malloc char *dss_strdup(const char *s)
 
        if ((ret = strdup(s? s: "")))
                return ret;
-       DSS_EMERG_LOG("strdup failed, aborting\n");
+       DSS_EMERG_LOG(("strdup failed, aborting\n"));
        exit(EXIT_FAILURE);
 }
 
diff --git a/tv.c b/tv.c
index b0acc79c30a58ca0843bbe5c8956dd038d8bcdc5..ec2cdc2f470ab02a5416293a790988aa938d4528 100644 (file)
--- a/tv.c
+++ b/tv.c
@@ -14,6 +14,7 @@
 #include "err.h"
 #include "str.h"
 #include "log.h"
+#include "time.h"
 
 /**
  * Convert struct timeval to milliseconds.
@@ -139,6 +140,6 @@ int64_t get_current_time(void)
 {
        time_t now;
        time(&now);
-       DSS_DEBUG_LOG("now: %jd\n", (intmax_t)now);
+       DSS_DEBUG_LOG(("now: %jd\n", (intmax_t)now));
        return (int64_t)now;
 }