diff --git a/CHANGELOG b/CHANGELOG index ca171a4..a7ac9fb 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -35,6 +35,7 @@ - fix typo in autofs(5) man page. - fix map entry expansion when undefined macro is present. - remove unused export validation code. +- add dynamic logging (adapted from v4 patch from Jeff Moyer). 18/06/2007 autofs-5.0.2 ----------------------- diff --git a/daemon/automount.c b/daemon/automount.c index 70a3b9d..9ec6923 100644 --- a/daemon/automount.c +++ b/daemon/automount.c @@ -173,7 +173,7 @@ int rmdir_path(struct autofs_point *ap, const char *path, dev_t dev) */ memset(&st, 0, sizeof(st)); if (lstat(buf, &st) != 0) { - crit(ap->logopt, "lstat of %s failed.", buf); + crit(ap->logopt, "lstat of %s failed", buf); return -1; } @@ -234,14 +234,15 @@ int rmdir_path(struct autofs_point *ap, const char *path, dev_t dev) /* Like ftw, except fn gets called twice: before a directory is entered, and after. If the before call returns 0, the directory isn't entered. */ -static int walk_tree(const char *base, int (*fn) (const char *file, +static int walk_tree(const char *base, int (*fn) (unsigned logopt, + const char *file, const struct stat * st, - int, void *), int incl, void *arg) + int, void *), int incl, unsigned logopt, void *arg) { char buf[PATH_MAX + 1]; struct stat st; - if (lstat(base, &st) != -1 && (fn) (base, &st, 0, arg)) { + if (lstat(base, &st) != -1 && (fn) (logopt, base, &st, 0, arg)) { if (S_ISDIR(st.st_mode)) { struct dirent **de; int n; @@ -269,18 +270,18 @@ static int walk_tree(const char *base, int (*fn) (const char *file, return -1; } - walk_tree(buf, fn, 1, arg); + walk_tree(buf, fn, 1, logopt, arg); free(de[n]); } free(de); } if (incl) - (fn) (base, &st, 1, arg); + (fn) (logopt, base, &st, 1, arg); } return 0; } -static int rm_unwanted_fn(const char *file, const struct stat *st, int when, void *arg) +static int rm_unwanted_fn(unsigned logopt, const char *file, const struct stat *st, int when, void *arg) { dev_t dev = *(dev_t *) arg; char buf[MAX_ERR_BUF]; @@ -293,41 +294,38 @@ static int rm_unwanted_fn(const char *file, const struct stat *st, int when, voi } if (lstat(file, &newst)) { - crit(LOGOPT_ANY, - "unable to stat file, possible race condition"); + crit(logopt, "unable to stat file, possible race condition"); return 0; } if (newst.st_dev != dev) { - crit(LOGOPT_ANY, - "file %s has the wrong device, possible race condition", + crit(logopt, "file %s has the wrong device, possible race condition", file); return 0; } if (S_ISDIR(newst.st_mode)) { - debug(LOGOPT_ANY, "removing directory %s", file); + debug(logopt, "removing directory %s", file); if (rmdir(file)) { char *estr = strerror_r(errno, buf, MAX_ERR_BUF); - warn(LOGOPT_ANY, + warn(logopt, "unable to remove directory %s: %s", file, estr); return 0; } } else if (S_ISREG(newst.st_mode)) { - crit(LOGOPT_ANY, - "attempting to remove files from a mounted " + crit(logopt, "attempting to remove files from a mounted " "directory. file %s", file); return 0; } else if (S_ISLNK(newst.st_mode)) { - debug(LOGOPT_ANY, "removing symlink %s", file); + debug(logopt, "removing symlink %s", file); unlink(file); } return 1; } -void rm_unwanted(const char *path, int incl, dev_t dev) +void rm_unwanted(unsigned logopt, const char *path, int incl, dev_t dev) { - walk_tree(path, rm_unwanted_fn, incl, &dev); + walk_tree(path, rm_unwanted_fn, incl, logopt, &dev); } struct counter_args { @@ -335,7 +333,7 @@ struct counter_args { dev_t dev; }; -static int counter_fn(const char *file, const struct stat *st, int when, void *arg) +static int counter_fn(unsigned logopt, const char *file, const struct stat *st, int when, void *arg) { struct counter_args *counter = (struct counter_args *) arg; @@ -349,14 +347,14 @@ static int counter_fn(const char *file, const struct stat *st, int when, void *a } /* Count mounted filesystems and symlinks */ -int count_mounts(const char *path, dev_t dev) +int count_mounts(unsigned logopt, const char *path, dev_t dev) { struct counter_args counter; counter.count = 0; counter.dev = dev; - if (walk_tree(path, counter_fn, 0, &counter) == -1) + if (walk_tree(path, counter_fn, 0, logopt, &counter) == -1) return -1; return counter.count; @@ -368,9 +366,9 @@ static void check_rm_dirs(struct autofs_point *ap, const char *path, int incl) (ap->state == ST_SHUTDOWN_PENDING || ap->state == ST_SHUTDOWN_FORCE || ap->state == ST_SHUTDOWN)) - rm_unwanted(path, incl, ap->dev); + rm_unwanted(ap->logopt, path, incl, ap->dev); else if (ap->ghost && (ap->type == LKP_INDIRECT)) - rm_unwanted(path, 0, ap->dev); + rm_unwanted(ap->logopt, path, 0, ap->dev); } /* Try to purge cache entries kept around due to existing mounts */ @@ -466,7 +464,7 @@ static int umount_subtree_mounts(struct autofs_point *ap, const char *path, unsi cache_multi_lock(me->parent); if (umount_multi_triggers(ap, root, me, base)) { warn(ap->logopt, - "could not umount some offsets under %s", path); + "some offset mounts still present under %s", path); left++; } cache_multi_unlock(me->parent); @@ -483,7 +481,7 @@ static int umount_subtree_mounts(struct autofs_point *ap, const char *path, unsi * it already to ensure it's ok to remove any offset triggers. */ if (!is_mm_root && is_mounted(_PATH_MOUNTED, path, MNTS_REAL)) { - msg("unmounting dir = %s", path); + info(ap->logopt, "unmounting dir = %s", path); if (umount_ent(ap, path)) { warn(ap->logopt, "could not umount dir %s", path); left++; @@ -576,35 +574,35 @@ int umount_autofs(struct autofs_point *ap, int force) return ret; } -int send_ready(int ioctlfd, unsigned int wait_queue_token) +int send_ready(unsigned logopt, int ioctlfd, unsigned int wait_queue_token) { char buf[MAX_ERR_BUF]; if (wait_queue_token == 0) return 0; - debug(LOGOPT_NONE, "token = %d", wait_queue_token); + debug(logopt, "token = %d", wait_queue_token); if (ioctl(ioctlfd, AUTOFS_IOC_READY, wait_queue_token) < 0) { char *estr = strerror_r(errno, buf, MAX_ERR_BUF); - error(LOGOPT_ANY, "AUTOFS_IOC_READY: error %s", estr); + logerr("AUTOFS_IOC_READY: error %s", estr); return 1; } return 0; } -int send_fail(int ioctlfd, unsigned int wait_queue_token) +int send_fail(unsigned logopt, int ioctlfd, unsigned int wait_queue_token) { char buf[MAX_ERR_BUF]; if (wait_queue_token == 0) return 0; - debug(LOGOPT_NONE, "token = %d", wait_queue_token); + debug(logopt, "token = %d", wait_queue_token); if (ioctl(ioctlfd, AUTOFS_IOC_FAIL, wait_queue_token) < 0) { char *estr = strerror_r(errno, buf, MAX_ERR_BUF); - error(LOGOPT_ANY, "AUTOFS_IOC_FAIL: error %s", estr); + logerr("AUTOFS_IOC_FAIL: error %s", estr); return 1; } return 0; @@ -649,23 +647,245 @@ static int fullread(int fd, void *ptr, size_t len) return len; } +static char *automount_path_to_fifo(unsigned logopt, const char *path) +{ + char *fifo_name, *p; + int name_len = strlen(path) + strlen(AUTOFS_LOGPRI_FIFO) + 1; + int ret; + + fifo_name = malloc(name_len); + if (!fifo_name) + return NULL; + ret = snprintf(fifo_name, name_len, "%s%s", + AUTOFS_LOGPRI_FIFO, path); + if (ret >= name_len) { + info(logopt, + "fifo path for \"%s\" truncated to \"%s\". This may " + "lead to --set-log-priority commands being sent to the " + "wrong automount daemon.", path, fifo_name); + } + + /* + * An automount path can be made up of subdirectories. So, to + * create the fifo name, we will just replace instances of '/' with + * '-'. + */ + p = fifo_name + strlen(AUTOFS_LOGPRI_FIFO); + while (*p != '\0') { + if (*p == '/') + *p = '-'; + p++; + } + + debug(logopt, "fifo name %s",fifo_name); + + return fifo_name; +} + +static int create_logpri_fifo(struct autofs_point *ap) +{ + int ret = -1; + int fd; + char *fifo_name; + + fifo_name = automount_path_to_fifo(ap->logopt, ap->path); + if (!fifo_name) { + crit(ap->logopt, "Failed to allocate memory!"); + goto out_free; /* free(NULL) is okay */ + } + + ret = unlink(fifo_name); + if (ret != 0 && errno != ENOENT) { + crit(ap->logopt, + "Failed to unlink FIFO. Is the automount daemon " + "already running?"); + goto out_free; + } + + ret = mkfifo(fifo_name, S_IRUSR|S_IWUSR); + if (ret != 0) { + crit(ap->logopt, + "mkfifo for %s returned %d", fifo_name, errno); + goto out_free; + } + + fd = open(fifo_name, O_RDWR|O_NONBLOCK); + if (fd < 0) { + crit(ap->logopt, + "Failed to open %s, errno %d", fifo_name, errno); + goto out_free; + } + + ap->logpri_fifo = fd; + +out_free: + free(fifo_name); + return ret; +} + +static int destroy_logpri_fifo(struct autofs_point *ap) +{ + int ret = -1; + int fd = ap->logpri_fifo; + char *fifo_name; + + fifo_name = automount_path_to_fifo(ap->logopt, ap->path); + if (!fifo_name) { + crit(ap->logopt, "Failed to allocate memory!"); + goto out_free; /* free(NULL) is okay */ + } + + ap->logpri_fifo = -1; + + ret = close(fd); + if (ret != 0) { + warn(ap->logopt, + "close for fifo %s returned %d", fifo_name, errno); + } + + ret = unlink(fifo_name); + if (ret != 0) { + warn(ap->logopt, + "Failed to unlink FIFO. Was the fifo created OK?"); + } + +out_free: + free(fifo_name); + return ret; +} + +static void handle_fifo_message(struct autofs_point *ap, int fd) +{ + int ret; + char buffer[PIPE_BUF]; + char *end; + long pri; + + memset(buffer, 0, sizeof(buffer)); + ret = read(fd, &buffer, sizeof(buffer)); + if (ret < 0) { + warn(ap->logopt, "read on fifo returned error %d", errno); + return; + } + + if (ret != 2) { + debug(ap->logopt, "expected 2 bytes, received %d.", ret); + return; + } + + errno = 0; + pri = strtol(buffer, &end, 10); + if ((pri == LONG_MIN || pri == LONG_MAX) && errno == ERANGE) { + debug(ap->logopt, "strtol reported an %s. Failed to set " + "log priority.", pri == LONG_MIN ? "underflow" : "overflow"); + return; + } + if ((pri == 0 && errno == EINVAL) || end == buffer) { + debug(ap->logopt, "priority is expected to be an integer " + "in the range 0-7 inclusive."); + return; + } + + if (pri > LOG_DEBUG || pri < LOG_EMERG) { + debug(ap->logopt, "invalid log priority (%ld) received " + "on fifo", pri); + return; + } + + /* + * OK, the message passed all of the sanity checks. The + * automounter actually only supports three log priorities. + * Everything is logged at log level debug, deamon messages + * and everything except debug messages are logged with the + * verbose setting and only error and critical messages are + * logged when debugging isn't enabled. + */ + if (pri >= LOG_WARNING) { + if (pri == LOG_DEBUG) { + set_log_debug_ap(ap); + info(ap->logopt, "Debug logging set for %s", ap->path); + } else { + set_log_verbose_ap(ap); + info(ap->logopt, "Verbose logging set for %s", ap->path); + } + } else { + if (ap->logopt & LOGOPT_ANY) + info(ap->logopt, "Basic logging set for %s", ap->path); + set_log_norm_ap(ap); + } +} + +static int set_log_priority(const char *path, int priority) +{ + int fd; + char *fifo_name; + char buf[2]; + + if (priority > LOG_DEBUG || priority < LOG_EMERG) { + fprintf(stderr, "Log priority %d is invalid.\n", priority); + fprintf(stderr, "Please spcify a number in the range 0-7.\n"); + return -1; + } + + /* + * This is an ascii based protocol, so we want the string + * representation of the integer log priority. + */ + snprintf(buf, sizeof(buf), "%d", priority); + + fifo_name = automount_path_to_fifo(LOGOPT_NONE, path); + if (!fifo_name) { + fprintf(stderr, "%s: Failed to allocate memory!\n", + __FUNCTION__); + return -1; + } + + /* + * Specify O_NONBLOCK so that the open will fail if there is no + * daemon reading from the other side of the FIFO. + */ + fd = open(fifo_name, O_WRONLY|O_NONBLOCK); + if (fd < 0) { + fprintf(stderr, "%s: open of %s failed with %d\n", + __FUNCTION__, fifo_name, errno); + free(fifo_name); + return -1; + } + + if (write(fd, buf, sizeof(buf)) != sizeof(buf)) { + fprintf(stderr, "Failed to change logging priority. "); + fprintf(stderr, "write to fifo failed with errno %d.\n", + errno); + close(fd); + free(fifo_name); + return -1; + } + close(fd); + free(fifo_name); + fprintf(stdout, "Successfully set log priority for %s.\n", path); + + return 0; +} + static int get_pkt(struct autofs_point *ap, union autofs_packet_union *pkt) { - struct pollfd fds[2]; + struct pollfd fds[3]; char buf[MAX_ERR_BUF]; fds[0].fd = ap->pipefd; fds[0].events = POLLIN; fds[1].fd = ap->state_pipe[0]; fds[1].events = POLLIN; + fds[2].fd = ap->logpri_fifo; + fds[2].events = POLLIN; for (;;) { - if (poll(fds, 2, -1) == -1) { + if (poll(fds, 3, -1) == -1) { char *estr; if (errno == EINTR) continue; estr = strerror_r(errno, buf, MAX_ERR_BUF); - error(ap->logopt, "poll failed: %s", estr); + logerr("poll failed: %s", estr); return -1; } @@ -709,6 +929,11 @@ static int get_pkt(struct autofs_point *ap, union autofs_packet_union *pkt) if (fds[0].revents & POLLIN) return fullread(ap->pipefd, pkt, kpkt_len); + + if (fds[2].revents & POLLIN) { + debug(ap->logopt, "message pending on control fifo."); + handle_fifo_message(ap, fds[2].fd); + } } } @@ -730,21 +955,93 @@ int do_expire(struct autofs_point *ap, const char *name, int namelen) return 1; } - msg("expiring path %s", buf); + info(ap->logopt, "expiring path %s", buf); ret = umount_multi(ap, buf, 1); if (ret == 0) - msg("expired %s", buf); + info(ap->logopt, "expired %s", buf); else warn(ap->logopt, "couldn't complete expire of %s", buf); return ret; } +static int autofs_init_ap(struct autofs_point *ap) +{ + int pipefd[2], cl_flags; + + if ((ap->state != ST_INIT)) { + /* This can happen if an autofs process is already running*/ + error(ap->logopt, "bad state %d", ap->state); + return -1; + } + + ap->pipefd = ap->kpipefd = ap->ioctlfd = -1; + + /* Pipe for kernel communications */ + if (pipe(pipefd) < 0) { + crit(ap->logopt, + "failed to create commumication pipe for autofs path %s", + ap->path); + free(ap->path); + return -1; + } + + ap->pipefd = pipefd[0]; + ap->kpipefd = pipefd[1]; + + if ((cl_flags = fcntl(ap->pipefd, F_GETFD, 0)) != -1) { + cl_flags |= FD_CLOEXEC; + fcntl(ap->pipefd, F_SETFD, cl_flags); + } + + if ((cl_flags = fcntl(ap->kpipefd, F_GETFD, 0)) != -1) { + cl_flags |= FD_CLOEXEC; + fcntl(ap->kpipefd, F_SETFD, cl_flags); + } + + /* Pipe state changes from signal handler to main loop */ + if (pipe(ap->state_pipe) < 0) { + crit(ap->logopt, + "failed create state pipe for autofs path %s", ap->path); + close(ap->pipefd); + close(ap->kpipefd); /* Close kernel pipe end */ + free(ap->path); + return -1; + } + + if ((cl_flags = fcntl(ap->state_pipe[0], F_GETFD, 0)) != -1) { + cl_flags |= FD_CLOEXEC; + fcntl(ap->state_pipe[0], F_SETFD, cl_flags); + } + + if ((cl_flags = fcntl(ap->state_pipe[1], F_GETFD, 0)) != -1) { + cl_flags |= FD_CLOEXEC; + fcntl(ap->state_pipe[1], F_SETFD, cl_flags); + } + + if (create_logpri_fifo(ap) < 0) { + crit(ap->logopt, + "failed to create FIFO for path %s\n", ap->path); + destroy_logpri_fifo(ap); + close(ap->pipefd); + close(ap->kpipefd); + free(ap->path); + close(ap->state_pipe[0]); + close(ap->state_pipe[1]); + return -1; + } + + return 0; +} + static int mount_autofs(struct autofs_point *ap) { int status = 0; + if (autofs_init_ap(ap) != 0) + return -1; + if (ap->type == LKP_DIRECT) status = mount_autofs_direct(ap); else @@ -841,9 +1138,8 @@ static void become_daemon(unsigned foreground) fclose(pidfp); } else { char *estr = strerror_r(errno, buf, MAX_ERR_BUF); - warn(LOGOPT_ANY, - "failed to write pid file %s: %s", - pid_file, estr); + logerr("failed to write pid file %s: %s", + pid_file, estr); pid_file = NULL; } } @@ -889,12 +1185,12 @@ static void *do_notify_state(void *arg) master = mrc.master; - debug(master->default_logging, "signal %d", sig); + debug(master->logopt, "signal %d", sig); mrc.signaled = 1; status = pthread_cond_signal(&mrc.cond); if (status) { - error(master->default_logging, + error(master->logopt, "failed to signal state notify condition"); status = pthread_mutex_unlock(&mrc.mutex); if (status) @@ -923,7 +1219,7 @@ static pthread_t do_signals(struct master *master, int sig) status = pthread_create(&thid, &thread_attr, do_notify_state, &r_sig); if (status) { - error(master->default_logging, + error(master->logopt, "mount state notify thread create failed"); status = pthread_mutex_unlock(&mrc.mutex); if (status) @@ -951,6 +1247,7 @@ static pthread_t do_signals(struct master *master, int sig) static void *do_read_master(void *arg) { struct master *master; + unsigned int logopt; time_t age; int readall = 1; int status; @@ -961,11 +1258,12 @@ static void *do_read_master(void *arg) master = mrc.master; age = mrc.age; + logopt = master->logopt; mrc.signaled = 1; status = pthread_cond_signal(&mrc.cond); if (status) { - error(master->default_logging, + error(logopt, "failed to signal master read map condition"); master->reading = 0; status = pthread_mutex_unlock(&mrc.mutex); @@ -989,6 +1287,7 @@ static void *do_read_master(void *arg) static int do_hup_signal(struct master *master, time_t age) { + unsigned int logopt = master->logopt; pthread_t thid; int status; @@ -1007,7 +1306,7 @@ static int do_hup_signal(struct master *master, time_t age) status = pthread_create(&thid, &thread_attr, do_read_master, NULL); if (status) { - error(master->default_logging, + error(logopt, "master read map thread create failed"); master->reading = 0; status = pthread_mutex_unlock(&mrc.mutex); @@ -1062,8 +1361,7 @@ static void *statemachine(void *arg) break; default: - error(master_list->default_logging, - "got unexpected signal %d!", sig); + logerr("got unexpected signal %d!", sig); continue; } } @@ -1134,10 +1432,11 @@ static void handle_mounts_cleanup(void *arg) struct autofs_point *ap; char path[PATH_MAX + 1]; char buf[MAX_ERR_BUF]; - unsigned int clean = 0, submount; + unsigned int clean = 0, submount, logopt; ap = (struct autofs_point *) arg; + logopt = ap->logopt; submount = ap->submount; strcpy(path, ap->path); @@ -1152,6 +1451,7 @@ static void handle_mounts_cleanup(void *arg) umount_autofs(ap, 1); + destroy_logpri_fifo(ap); master_signal_submount(ap, MASTER_SUBMNT_JOIN); master_remove_mapent(ap->entry); master_free_mapent_sources(ap->entry, 1); @@ -1162,12 +1462,12 @@ static void handle_mounts_cleanup(void *arg) if (clean) { if (rmdir(path) == -1) { char *estr = strerror_r(errno, buf, MAX_ERR_BUF); - warn(LOGOPT_NONE, "failed to remove dir %s: %s", + warn(logopt, "failed to remove dir %s: %s", path, estr); } } - msg("shut down path %s", path); + info(logopt, "shut down path %s", path); /* If we are the last tell the state machine to shutdown */ if (!submount && master_list_empty(master_list)) @@ -1190,7 +1490,7 @@ void *handle_mounts(void *arg) status = pthread_mutex_lock(&suc.mutex); if (status) { - crit(ap->logopt, "failed to lock startup condition mutex!"); + logerr("failed to lock startup condition mutex!"); fatal(status); } @@ -1204,7 +1504,7 @@ void *handle_mounts(void *arg) } if (ap->ghost && ap->type != LKP_DIRECT) - msg("ghosting enabled"); + info(ap->logopt, "ghosting enabled"); suc.status = 0; pthread_cleanup_pop(1); @@ -1356,6 +1656,8 @@ static void usage(void) " use ramdom replicated server selection\n" " -O --global-options\n" " specify global mount options\n" + " -l --set-log-priority priority path [path,...]\n" + " set daemon log verbosity\n" " -V --version print version, build config and exit\n" , program); } @@ -1437,9 +1739,45 @@ static void show_build_info(void) return; } +typedef struct _code { + char *c_name; + int c_val; +} CODE; + +CODE prioritynames[] = { + { "alert", LOG_ALERT }, + { "crit", LOG_CRIT }, + { "debug", LOG_DEBUG }, + { "emerg", LOG_EMERG }, + { "err", LOG_ERR }, + { "error", LOG_ERR }, /* DEPRECATED */ + { "info", LOG_INFO }, + { "notice", LOG_NOTICE }, + { "panic", LOG_EMERG }, /* DEPRECATED */ + { "warn", LOG_WARNING }, /* DEPRECATED */ + { "warning", LOG_WARNING }, + { NULL, -1 }, +}; + +static int convert_log_priority(char *priority_name) +{ + CODE *priority_mapping; + + for (priority_mapping = prioritynames; + priority_mapping->c_name != NULL; + priority_mapping++) { + + if (!strcasecmp(priority_name, priority_mapping->c_name)) + return priority_mapping->c_val; + } + + return -1; +} + int main(int argc, char *argv[]) { int res, opt, status; + int logpri = -1; unsigned ghost, logging; unsigned foreground, have_global_options; time_t timeout; @@ -1457,6 +1795,7 @@ int main(int argc, char *argv[]) {"random-multimount-selection", 0, 0, 'r'}, {"global-options", 1, 0, 'O'}, {"version", 0, 0, 'V'}, + {"set-log-priority", 1, 0, 'l'}, {0, 0, 0, 0} }; @@ -1477,7 +1816,7 @@ int main(int argc, char *argv[]) foreground = 0; opterr = 0; - while ((opt = getopt_long(argc, argv, "+hp:t:vdD:fVrO:", long_options, NULL)) != EOF) { + while ((opt = getopt_long(argc, argv, "+hp:t:vdD:fVrO:l:", long_options, NULL)) != EOF) { switch (opt) { case 'h': usage(); @@ -1525,6 +1864,23 @@ int main(int argc, char *argv[]) program); break; + case 'l': + if (isalpha(*optarg)) { + logpri = convert_log_priority(optarg); + if (logpri < 0) { + fprintf(stderr, "Invalid log priority:" + " %s\n", optarg); + exit(1); + } + } else if (isdigit(*optarg)) { + logpri = getnumopt(optarg, opt); + } else { + fprintf(stderr, "non-alphanumeric character " + "found in log priority. Aborting.\n"); + exit(1); + } + break; + case '?': case ':': printf("%s: Ambiguous or unknown options\n", program); @@ -1548,6 +1904,26 @@ int main(int argc, char *argv[]) argv += optind; argc -= optind; + if (logpri >= 0) { + int exit_code = 0; + int i; + + /* + * The remaining argv elements are the paths for which + * log priorities must be changed. + */ + for (i = 0; i < argc; i++) { + if (set_log_priority(argv[i], logpri) < 0) + exit_code = 1; + } + if (argc < 1) { + fprintf(stderr, + "--set-log-priority requires a path.\n"); + exit_code = 1; + } + exit(exit_code); + } + if (is_automount_running() > 0) { fprintf(stderr, "%s: program is already running.\n", program); @@ -1572,7 +1948,7 @@ int main(int argc, char *argv[]) rlim.rlim_max = MAX_OPEN_FILES; res = setrlimit(RLIMIT_NOFILE, &rlim); if (res) - warn(LOGOPT_NONE, + warn(logging, "can't increase open file limit - continuing"); #if ENABLE_CORES @@ -1580,7 +1956,7 @@ int main(int argc, char *argv[]) rlim.rlim_max = RLIM_INFINITY; res = setrlimit(RLIMIT_CORE, &rlim); if (res) - warn(LOGOPT_NONE, + warn(logging, "can't increase core file limit - continuing"); #endif @@ -1592,15 +1968,14 @@ int main(int argc, char *argv[]) master_list = master_new(argv[0], timeout, ghost); if (!master_list) { - crit(LOGOPT_ANY, "%s: can't create master map %s", + logerr("%s: can't create master map %s", program, argv[0]); close(start_pipefd[1]); exit(1); } if (pthread_attr_init(&thread_attr)) { - crit(LOGOPT_ANY, - "%s: failed to init thread attribute struct!", + logerr("%s: failed to init thread attribute struct!", program); close(start_pipefd[1]); exit(1); @@ -1608,8 +1983,7 @@ int main(int argc, char *argv[]) if (pthread_attr_setdetachstate( &thread_attr, PTHREAD_CREATE_DETACHED)) { - crit(LOGOPT_ANY, - "%s: failed to set detached thread attribute!", + logerr("%s: failed to set detached thread attribute!", program); close(start_pipefd[1]); exit(1); @@ -1618,38 +1992,37 @@ int main(int argc, char *argv[]) #ifdef _POSIX_THREAD_ATTR_STACKSIZE if (pthread_attr_setstacksize( &thread_attr, PTHREAD_STACK_MIN*64)) { - crit(LOGOPT_ANY, - "%s: failed to set stack size thread attribute!", - program); + logerr("%s: failed to set stack size thread attribute!", + program); close(start_pipefd[1]); exit(1); } #endif - msg("Starting automounter version %s, master map %s", + info(logging, "Starting automounter version %s, master map %s", version, master_list->name); - msg("using kernel protocol version %d.%02d", + info(logging, "using kernel protocol version %d.%02d", get_kver_major(), get_kver_minor()); status = pthread_key_create(&key_thread_stdenv_vars, key_thread_stdenv_vars_destroy); if (status) { - crit(LOGOPT_ANY, - "failed to create thread data key for std env vars!"); + logerr("%s: failed to create thread data key for std env vars!", + program); master_kill(master_list); close(start_pipefd[1]); exit(1); } if (!alarm_start_handler()) { - crit(LOGOPT_ANY, "failed to create alarm handler thread!"); + logerr("%s: failed to create alarm handler thread!", program); master_kill(master_list); close(start_pipefd[1]); exit(1); } if (!st_start_handler()) { - crit(LOGOPT_ANY, "failed to create FSM handler thread!"); + logerr("%s: failed to create FSM handler thread!", program); master_kill(master_list); close(start_pipefd[1]); exit(1); @@ -1685,5 +2058,7 @@ int main(int argc, char *argv[]) if (dh) dlclose(dh); #endif + info(logging, "autofs stopped"); + exit(0); } diff --git a/daemon/direct.c b/daemon/direct.c index 9a39a6f..4ab4204 100644 --- a/daemon/direct.c +++ b/daemon/direct.c @@ -86,61 +86,6 @@ static void mnts_cleanup(void *arg) return; } -static int autofs_init_direct(struct autofs_point *ap) -{ - int pipefd[2], cl_flags; - - if ((ap->state != ST_INIT)) { - /* This can happen if an autofs process is already running*/ - error(ap->logopt, "bad state %d", ap->state); - return -1; - } - - ap->pipefd = ap->kpipefd = ap->ioctlfd = -1; - - /* Pipe for kernel communications */ - if (pipe(pipefd) < 0) { - crit(ap->logopt, - "failed to create commumication pipe for autofs path %s", - ap->path); - return -1; - } - - ap->pipefd = pipefd[0]; - ap->kpipefd = pipefd[1]; - - if ((cl_flags = fcntl(ap->pipefd, F_GETFD, 0)) != -1) { - cl_flags |= FD_CLOEXEC; - fcntl(ap->pipefd, F_SETFD, cl_flags); - } - - if ((cl_flags = fcntl(ap->kpipefd, F_GETFD, 0)) != -1) { - cl_flags |= FD_CLOEXEC; - fcntl(ap->kpipefd, F_SETFD, cl_flags); - } - - /* Pipe state changes from signal handler to main loop */ - if (pipe(ap->state_pipe) < 0) { - crit(ap->logopt, "failed create state pipe for autofs path %s", - ap->path); - close(ap->pipefd); - close(ap->kpipefd); - return -1; - } - - if ((cl_flags = fcntl(ap->state_pipe[0], F_GETFD, 0)) != -1) { - cl_flags |= FD_CLOEXEC; - fcntl(ap->state_pipe[0], F_SETFD, cl_flags); - } - - if ((cl_flags = fcntl(ap->state_pipe[1], F_GETFD, 0)) != -1) { - cl_flags |= FD_CLOEXEC; - fcntl(ap->state_pipe[1], F_SETFD, cl_flags); - } - - return 0; -} - int do_umount_autofs_direct(struct autofs_point *ap, struct mnt_list *mnts, struct mapent *me) { char buf[MAX_ERR_BUF]; @@ -241,10 +186,10 @@ int do_umount_autofs_direct(struct autofs_point *ap, struct mnt_list *mnts, stru force_umount: if (rv != 0) { - msg("forcing umount of direct mount %s", me->key); + info(ap->logopt, "forcing umount of direct mount %s", me->key); rv = umount2(me->key, MNT_DETACH); } else - msg("umounted direct mount %s", me->key); + info(ap->logopt, "umounted direct mount %s", me->key); if (!rv && me->dir_created) { if (rmdir(me->key) == -1) { @@ -326,7 +271,7 @@ static int unlink_mount_tree(struct autofs_point *ap, struct list_head *list) continue; if (strcmp(mnt->fs_type, "autofs")) - rv = spawn_umount(log_debug, "-l", mnt->path, NULL); + rv = spawn_umount(ap->logopt, "-l", mnt->path, NULL); else rv = umount2(mnt->path, MNT_DETACH); if (rv == -1) { @@ -475,13 +420,15 @@ int do_mount_autofs_direct(struct autofs_point *ap, struct mnt_list *mnts, struc ioctl(ioctlfd, AUTOFS_IOC_SETTIMEOUT, &timeout); if (ap->exp_timeout) - msg("mounted direct mount on %s " + info(ap->logopt, + "mounted direct mount on %s " "with timeout %u, freq %u seconds", me->key, (unsigned int) ap->exp_timeout, (unsigned int) ap->exp_runfreq); else - msg("mounted direct mount on %s with timeouts disabled", - me->key); + info(ap->logopt, + "mounted direct mount on %s with timeouts disabled", + me->key); ret = fstat(ioctlfd, &st); if (ret == -1) { @@ -522,9 +469,6 @@ int mount_autofs_direct(struct autofs_point *ap) return -1; } - if (autofs_init_direct(ap)) - return -1; - /* TODO: check map type */ if (lookup_nss_read_map(ap, NULL, now)) lookup_prune_cache(ap, now); @@ -607,7 +551,7 @@ int umount_autofs_offset(struct autofs_point *ap, struct mapent *me) /* offset isn't mounted, return success and try to recover */ if (!is_mounted(_PROC_MOUNTS, me->key, MNTS_AUTOFS)) { debug(ap->logopt, - "offset %s unexpectedly not mounted", + "offset %s not mounted", me->key); return 0; } @@ -627,7 +571,7 @@ int umount_autofs_offset(struct autofs_point *ap, struct mapent *me) rv = ioctl(ioctlfd, AUTOFS_IOC_ASKUMOUNT, &status); if (rv) { char *estr = strerror_r(errno, buf, MAX_ERR_BUF); - error(ap->logopt, "ioctl failed: %s", estr); + logerr("ioctl failed: %s", estr); return 1; } else if (!status) { if (ap->state != ST_SHUTDOWN_FORCE) { @@ -692,10 +636,10 @@ int umount_autofs_offset(struct autofs_point *ap, struct mapent *me) force_umount: if (rv != 0) { - msg("forcing umount of offset mount %s", me->key); + info(ap->logopt, "forcing umount of offset mount %s", me->key); rv = umount2(me->key, MNT_DETACH); } else - msg("umounted offset mount %s", me->key); + info(ap->logopt, "umounted offset mount %s", me->key); if (!rv && me->dir_created) { if (rmdir(me->key) == -1) { @@ -868,7 +812,7 @@ static int expire_direct(int ioctlfd, const char *path, unsigned int when, unsig return 0; } - retries = (count_mounts(path, st.st_dev) + 1) * EXPIRE_RETRIES; + retries = (count_mounts(logopt, path, st.st_dev) + 1) * EXPIRE_RETRIES; while (retries--) { struct timespec tm = {0, 100000000}; @@ -1018,7 +962,7 @@ void *expire_proc_direct(void *arg) if (me->ioctlfd != -1 && fstat(ioctlfd, &st) != -1 && - !count_mounts(next->path, st.st_dev)) { + !count_mounts(ap->logopt, next->path, st.st_dev)) { close(ioctlfd); me->ioctlfd = -1; } @@ -1049,6 +993,9 @@ void *expire_proc_direct(void *arg) } pthread_cleanup_pop(1); + if (left) + info(ap->logopt, "%d remaining in %s", left, ap->path); + ec.status = left; pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cur_state); @@ -1072,7 +1019,7 @@ static void pending_cond_destroy(void *arg) static void expire_send_fail(void *arg) { struct pending_args *mt = arg; - send_fail(mt->ioctlfd, mt->wait_queue_token); + send_fail(mt->ap->logopt, mt->ioctlfd, mt->wait_queue_token); } static void free_pending_args(void *arg) @@ -1124,14 +1071,14 @@ static void *do_expire_direct(void *arg) status = do_expire(ap, mt->name, len); pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &state); if (status) - send_fail(mt->ioctlfd, mt->wait_queue_token); + send_fail(ap->logopt, mt->ioctlfd, mt->wait_queue_token); else { struct mapent *me; cache_readlock(mt->mc); me = cache_lookup_distinct(mt->mc, mt->name); me->ioctlfd = -1; cache_unlock(mt->mc); - send_ready(mt->ioctlfd, mt->wait_queue_token); + send_ready(ap->logopt, mt->ioctlfd, mt->wait_queue_token); close(mt->ioctlfd); } pthread_setcancelstate(state, NULL); @@ -1194,7 +1141,7 @@ int handle_packet_expire_direct(struct autofs_point *ap, autofs_packet_expire_di if (!mt) { char *estr = strerror_r(errno, buf, MAX_ERR_BUF); error(ap->logopt, "malloc: %s", estr); - send_fail(me->ioctlfd, pkt->wait_queue_token); + send_fail(ap->logopt, me->ioctlfd, pkt->wait_queue_token); cache_unlock(mc); pthread_setcancelstate(state, NULL); return 1; @@ -1223,7 +1170,7 @@ int handle_packet_expire_direct(struct autofs_point *ap, autofs_packet_expire_di status = pthread_create(&thid, &thread_attr, do_expire_direct, mt); if (status) { error(ap->logopt, "expire thread create failed"); - send_fail(mt->ioctlfd, pkt->wait_queue_token); + send_fail(ap->logopt, mt->ioctlfd, pkt->wait_queue_token); cache_unlock(mc); expire_mutex_unlock(NULL); pending_cond_destroy(mt); @@ -1252,7 +1199,7 @@ int handle_packet_expire_direct(struct autofs_point *ap, autofs_packet_expire_di static void mount_send_fail(void *arg) { struct pending_args *mt = arg; - send_fail(mt->ioctlfd, mt->wait_queue_token); + send_fail(mt->ap->logopt, mt->ioctlfd, mt->wait_queue_token); close(mt->ioctlfd); } @@ -1319,7 +1266,7 @@ static void *do_mount_direct(void *arg) pthread_setcancelstate(state, NULL); - msg("attempting to mount entry %s", mt->name); + info(ap->logopt, "attempting to mount entry %s", mt->name); /* * Setup thread specific data values for macro @@ -1445,16 +1392,16 @@ cont: cache_unlock(mt->mc); if (set_fd) { me->ioctlfd = mt->ioctlfd; - send_ready(mt->ioctlfd, mt->wait_queue_token); + send_ready(ap->logopt, mt->ioctlfd, mt->wait_queue_token); } else { - send_ready(mt->ioctlfd, mt->wait_queue_token); + send_ready(ap->logopt, mt->ioctlfd, mt->wait_queue_token); close(mt->ioctlfd); } - msg("mounted %s", mt->name); + info(ap->logopt, "mounted %s", mt->name); } else { - send_fail(mt->ioctlfd, mt->wait_queue_token); + send_fail(mt->ap->logopt, mt->ioctlfd, mt->wait_queue_token); close(mt->ioctlfd); - msg("failed to mount %s", mt->name); + info(ap->logopt, "failed to mount %s", mt->name); } pthread_setcancelstate(state, NULL); @@ -1505,7 +1452,7 @@ int handle_packet_missing_direct(struct autofs_point *ap, autofs_packet_missing_ * Shouldn't happen as the kernel is telling us * someone has walked on our mount point. */ - crit(ap->logopt, "can't find map entry for (%lu,%lu)", + logerr("can't find map entry for (%lu,%lu)", (unsigned long) pkt->dev, (unsigned long) pkt->ino); pthread_setcancelstate(state, NULL); return 1; @@ -1538,7 +1485,7 @@ int handle_packet_missing_direct(struct autofs_point *ap, autofs_packet_missing_ if (ap->state == ST_SHUTDOWN_PENDING || ap->state == ST_SHUTDOWN_FORCE || ap->state == ST_SHUTDOWN) { - send_fail(ioctlfd, pkt->wait_queue_token); + send_fail(ap->logopt, ioctlfd, pkt->wait_queue_token); close(ioctlfd); cache_unlock(mc); pthread_setcancelstate(state, NULL); @@ -1549,7 +1496,7 @@ int handle_packet_missing_direct(struct autofs_point *ap, autofs_packet_missing_ if (!mt) { char *estr = strerror_r(errno, buf, MAX_ERR_BUF); error(ap->logopt, "malloc: %s", estr); - send_fail(ioctlfd, pkt->wait_queue_token); + send_fail(ap->logopt, ioctlfd, pkt->wait_queue_token); close(ioctlfd); cache_unlock(mc); pthread_setcancelstate(state, NULL); @@ -1578,7 +1525,7 @@ int handle_packet_missing_direct(struct autofs_point *ap, autofs_packet_missing_ status = pthread_create(&thid, &thread_attr, do_mount_direct, mt); if (status) { error(ap->logopt, "missing mount thread create failed"); - send_fail(ioctlfd, pkt->wait_queue_token); + send_fail(ap->logopt, ioctlfd, pkt->wait_queue_token); close(ioctlfd); cache_unlock(mc); mount_mutex_unlock(NULL); diff --git a/daemon/indirect.c b/daemon/indirect.c index 02e7045..5c422c8 100644 --- a/daemon/indirect.c +++ b/daemon/indirect.c @@ -43,63 +43,6 @@ extern pthread_attr_t thread_attr; static pthread_mutex_t ma_mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t ea_mutex = PTHREAD_MUTEX_INITIALIZER; -static int autofs_init_indirect(struct autofs_point *ap) -{ - int pipefd[2], cl_flags; - - if ((ap->state != ST_INIT)) { - /* This can happen if an autofs process is already running*/ - error(ap->logopt, "bad state %d", ap->state); - return -1; - } - - ap->pipefd = ap->kpipefd = ap->ioctlfd = -1; - - /* Pipe for kernel communications */ - if (pipe(pipefd) < 0) { - crit(ap->logopt, - "failed to create commumication pipe for autofs path %s", - ap->path); - free(ap->path); - return -1; - } - - ap->pipefd = pipefd[0]; - ap->kpipefd = pipefd[1]; - - if ((cl_flags = fcntl(ap->pipefd, F_GETFD, 0)) != -1) { - cl_flags |= FD_CLOEXEC; - fcntl(ap->pipefd, F_SETFD, cl_flags); - } - - if ((cl_flags = fcntl(ap->kpipefd, F_GETFD, 0)) != -1) { - cl_flags |= FD_CLOEXEC; - fcntl(ap->kpipefd, F_SETFD, cl_flags); - } - - /* Pipe state changes from signal handler to main loop */ - if (pipe(ap->state_pipe) < 0) { - crit(ap->logopt, - "failed create state pipe for autofs path %s", ap->path); - close(ap->pipefd); - close(ap->kpipefd); /* Close kernel pipe end */ - free(ap->path); - return -1; - } - - if ((cl_flags = fcntl(ap->state_pipe[0], F_GETFD, 0)) != -1) { - cl_flags |= FD_CLOEXEC; - fcntl(ap->state_pipe[0], F_SETFD, cl_flags); - } - - if ((cl_flags = fcntl(ap->state_pipe[1], F_GETFD, 0)) != -1) { - cl_flags |= FD_CLOEXEC; - fcntl(ap->state_pipe[1], F_SETFD, cl_flags); - } - - return 0; -} - static int unlink_mount_tree(struct autofs_point *ap, struct mnt_list *mnts) { struct mnt_list *this; @@ -118,7 +61,7 @@ static int unlink_mount_tree(struct autofs_point *ap, struct mnt_list *mnts) } if (strcmp(this->fs_type, "autofs")) - rv = spawn_umount(log_debug, "-l", this->path, NULL); + rv = spawn_umount(ap->logopt, "-l", this->path, NULL); else rv = umount2(this->path, MNT_DETACH); if (rv == -1) { @@ -222,12 +165,14 @@ static int do_mount_autofs_indirect(struct autofs_point *ap) ioctl(ap->ioctlfd, AUTOFS_IOC_SETTIMEOUT, &timeout); if (ap->exp_timeout) - msg("mounted indirect mount on %s " + info(ap->logopt, + "mounted indirect mount on %s " "with timeout %u, freq %u seconds", ap->path, - (unsigned int) ap->exp_timeout, - (unsigned int) ap->exp_runfreq); + (unsigned int) ap->exp_timeout, + (unsigned int) ap->exp_runfreq); else - msg("mounted indirect mount on %s with timeouts disabled", + info(ap->logopt, + "mounted indirect mount on %s with timeouts disabled", ap->path); fstat(ap->ioctlfd, &st); @@ -257,9 +202,6 @@ int mount_autofs_indirect(struct autofs_point *ap) int status; int map; - if (autofs_init_indirect(ap)) - return -1; - /* TODO: read map, determine map type is OK */ if (lookup_nss_read_map(ap, NULL, now)) lookup_prune_cache(ap, now); @@ -309,7 +251,7 @@ int umount_autofs_indirect(struct autofs_point *ap) rv = ioctl(ap->ioctlfd, AUTOFS_IOC_ASKUMOUNT, &ret); if (rv == -1) { char *estr = strerror_r(errno, buf, MAX_ERR_BUF); - error(ap->logopt, "ioctl failed: %s", estr); + logerr("ioctl failed: %s", estr); return 1; } else if (!ret) { error(ap->logopt, "ask umount returned busy %s", ap->path); @@ -370,9 +312,9 @@ force_umount: "forcing umount of indirect mount %s", ap->path); rv = umount2(ap->path, MNT_DETACH); } else { - msg("umounted indirect mount %s", ap->path); + info(ap->logopt, "umounted indirect mount %s", ap->path); if (ap->submount) - rm_unwanted(ap->path, 1, ap->dev); + rm_unwanted(ap->logopt, ap->path, 1, ap->dev); } return rv; @@ -390,7 +332,7 @@ static int expire_indirect(struct autofs_point *ap, int ioctlfd, const char *pat return 0; } - retries = (count_mounts(path, st.st_dev) + 1) * EXPIRE_RETRIES; + retries = (count_mounts(ap->logopt, path, st.st_dev) + 1) * EXPIRE_RETRIES; while (retries--) { struct timespec tm = {0, 100000000}; @@ -559,13 +501,7 @@ void *expire_proc_indirect(void *arg) * words) the umounts are done by the time we reach here */ if (count) - debug(ap->logopt, "%d remaining in %s", count, ap->path); - - /* If we are trying to shutdown make sure we can umount */ - if (!ioctl(ap->ioctlfd, AUTOFS_IOC_ASKUMOUNT, &ret)) { - if (!ret) - msg("mount still busy %s", ap->path); - } + info(ap->logopt, "%d remaining in %s", count, ap->path); ec.status = left; @@ -590,7 +526,7 @@ static void pending_cond_destroy(void *arg) static void expire_send_fail(void *arg) { struct pending_args *mt = arg; - send_fail(mt->ap->ioctlfd, mt->wait_queue_token); + send_fail(mt->ap->logopt, mt->ap->ioctlfd, mt->wait_queue_token); } static void free_pending_args(void *arg) @@ -634,9 +570,9 @@ static void *do_expire_indirect(void *arg) status = do_expire(mt->ap, mt->name, mt->len); pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &state); if (status) - send_fail(ap->ioctlfd, mt->wait_queue_token); + send_fail(ap->logopt, ap->ioctlfd, mt->wait_queue_token); else - send_ready(ap->ioctlfd, mt->wait_queue_token); + send_ready(ap->logopt, ap->ioctlfd, mt->wait_queue_token); pthread_setcancelstate(state, NULL); pthread_cleanup_pop(0); @@ -661,8 +597,8 @@ int handle_packet_expire_indirect(struct autofs_point *ap, autofs_packet_expire_ mt = malloc(sizeof(struct pending_args)); if (!mt) { char *estr = strerror_r(errno, buf, MAX_ERR_BUF); - error(ap->logopt, "malloc: %s", estr); - send_fail(ap->ioctlfd, pkt->wait_queue_token); + logerr("malloc: %s", estr); + send_fail(ap->logopt, ap->ioctlfd, pkt->wait_queue_token); pthread_setcancelstate(state, NULL); return 1; } @@ -684,7 +620,7 @@ int handle_packet_expire_indirect(struct autofs_point *ap, autofs_packet_expire_ status = pthread_create(&thid, &thread_attr, do_expire_indirect, mt); if (status) { error(ap->logopt, "expire thread create failed"); - send_fail(ap->ioctlfd, pkt->wait_queue_token); + send_fail(ap->logopt, ap->ioctlfd, pkt->wait_queue_token); expire_mutex_unlock(NULL); pending_cond_destroy(mt); free_pending_args(mt); @@ -710,7 +646,7 @@ int handle_packet_expire_indirect(struct autofs_point *ap, autofs_packet_expire_ static void mount_send_fail(void *arg) { struct pending_args *mt = arg; - send_fail(mt->ap->ioctlfd, mt->wait_queue_token); + send_fail(mt->ap->logopt, mt->ap->ioctlfd, mt->wait_queue_token); } static void mount_mutex_unlock(void *arg) @@ -775,7 +711,7 @@ static void *do_mount_indirect(void *arg) pthread_setcancelstate(state, NULL); - msg("attempting to mount entry %s", buf); + info(ap->logopt, "attempting to mount entry %s", buf); /* * Setup thread specific data values for macro @@ -887,11 +823,11 @@ cont: status = lookup_nss_mount(ap, NULL, mt->name, mt->len); pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &state); if (status) { - send_ready(ap->ioctlfd, mt->wait_queue_token); - msg("mounted %s", buf); + send_ready(ap->logopt, ap->ioctlfd, mt->wait_queue_token); + info(ap->logopt, "mounted %s", buf); } else { - send_fail(ap->ioctlfd, mt->wait_queue_token); - msg("failed to mount %s", buf); + send_fail(ap->logopt, ap->ioctlfd, mt->wait_queue_token); + info(ap->logopt, "failed to mount %s", buf); } pthread_setcancelstate(state, NULL); @@ -918,7 +854,7 @@ int handle_packet_missing_indirect(struct autofs_point *ap, autofs_packet_missin if (ap->state == ST_SHUTDOWN_PENDING || ap->state == ST_SHUTDOWN_FORCE || ap->state == ST_SHUTDOWN) { - send_fail(ap->ioctlfd, pkt->wait_queue_token); + send_fail(ap->logopt, ap->ioctlfd, pkt->wait_queue_token); pthread_setcancelstate(state, NULL); return 0; } @@ -926,8 +862,8 @@ int handle_packet_missing_indirect(struct autofs_point *ap, autofs_packet_missin mt = malloc(sizeof(struct pending_args)); if (!mt) { char *estr = strerror_r(errno, buf, MAX_ERR_BUF); - error(ap->logopt, "malloc: %s", estr); - send_fail(ap->ioctlfd, pkt->wait_queue_token); + logerr("malloc: %s", estr); + send_fail(ap->logopt, ap->ioctlfd, pkt->wait_queue_token); pthread_setcancelstate(state, NULL); return 1; } @@ -953,7 +889,7 @@ int handle_packet_missing_indirect(struct autofs_point *ap, autofs_packet_missin status = pthread_create(&thid, &thread_attr, do_mount_indirect, mt); if (status) { error(ap->logopt, "expire thread create failed"); - send_fail(ap->ioctlfd, pkt->wait_queue_token); + send_fail(ap->logopt, ap->ioctlfd, pkt->wait_queue_token); mount_mutex_unlock(NULL); pending_cond_destroy(mt); free_pending_args(mt); diff --git a/daemon/lookup.c b/daemon/lookup.c index 4f2b318..fd99cf2 100644 --- a/daemon/lookup.c +++ b/daemon/lookup.c @@ -103,6 +103,7 @@ static int do_read_master(struct master *master, char *type, time_t age) static int read_master_map(struct master *master, char *type, time_t age) { + unsigned int logopt = master->logopt; char *path, *save_name; int result; @@ -117,7 +118,7 @@ static int read_master_map(struct master *master, char *type, time_t age) */ if (strchr(master->name, '/')) { - error(LOGOPT_ANY, "relative path invalid in files map name"); + error(logopt, "relative path invalid in files map name"); return NSS_STATUS_NOTFOUND; } @@ -142,6 +143,7 @@ static int read_master_map(struct master *master, char *type, time_t age) int lookup_nss_read_master(struct master *master, time_t age) { + unsigned int logopt = master->logopt; struct list_head nsslist; struct list_head *head, *p; int result = NSS_STATUS_UNKNOWN; @@ -149,12 +151,10 @@ int lookup_nss_read_master(struct master *master, time_t age) /* If it starts with a '/' it has to be a file or LDAP map */ if (*master->name == '/') { if (*(master->name + 1) == '/') { - debug(LOGOPT_NONE, - "reading master ldap %s", master->name); + debug(logopt, "reading master ldap %s", master->name); result = do_read_master(master, "ldap", age); } else { - debug(LOGOPT_NONE, - "reading master file %s", master->name); + debug(logopt, "reading master file %s", master->name); result = do_read_master(master, "file", age); } @@ -184,13 +184,11 @@ int lookup_nss_read_master(struct master *master, time_t age) */ if (strncmp(name, "ldap", 4)) { master->name = tmp + 1; - debug(LOGOPT_NONE, - "reading master %s %s", + debug(logopt, "reading master %s %s", source, master->name); } else { master->name = name; - debug(LOGOPT_NONE, - "reading master %s %s", + debug(logopt, "reading master %s %s", source, tmp + 1); } @@ -208,7 +206,7 @@ int lookup_nss_read_master(struct master *master, time_t age) if (result) { if (!list_empty(&nsslist)) free_sources(&nsslist); - error(LOGOPT_ANY, "can't to read name service switch config."); + error(logopt, "can't to read name service switch config."); return 0; } @@ -220,13 +218,12 @@ int lookup_nss_read_master(struct master *master, time_t age) this = list_entry(p, struct nss_source, list); - debug(LOGOPT_NONE, + debug(logopt, "reading master %s %s", this->source, master->name); result = read_master_map(master, this->source, age); if (result == NSS_STATUS_UNKNOWN) { - debug(LOGOPT_NONE, - "no map - continuing to next source"); + debug(logopt, "no map - continuing to next source"); continue; } @@ -1008,9 +1005,10 @@ int lookup_prune_cache(struct autofs_point *ap, time_t age) if (this->ioctlfd == -1) status = cache_delete(mc, key); if (status != CHE_FAIL) { - if (ap->type == LKP_INDIRECT) - rmdir_path(ap, path, ap->dev); - else + if (ap->type == LKP_INDIRECT) { + if (ap->ghost) + rmdir_path(ap, path, ap->dev); + } else rmdir_path(ap, path, this->dev); } } diff --git a/daemon/module.c b/daemon/module.c index e83c929..36eca00 100644 --- a/daemon/module.c +++ b/daemon/module.c @@ -33,7 +33,7 @@ int load_autofs4_module(void) */ fp = fopen("/proc/filesystems", "r"); if (!fp) { - error(LOGOPT_ANY, "cannot open /proc/filesystems\n"); + logerr("cannot open /proc/filesystems\n"); return 0; } @@ -45,7 +45,7 @@ int load_autofs4_module(void) } fclose(fp); - ret = spawnl(log_debug, PATH_MODPROBE, PATH_MODPROBE, + ret = spawnl(LOGOPT_NONE, PATH_MODPROBE, PATH_MODPROBE, "-q", FS_MODULE_NAME, NULL); if (ret) return 0; @@ -72,7 +72,7 @@ struct lookup_mod *open_lookup(const char *name, const char *err_prefix, if (!mod) { if (err_prefix) { char *estr = strerror_r(errno, buf, MAX_ERR_BUF); - crit(LOGOPT_ANY, "%s%s", err_prefix, estr); + logerr("%s%s", err_prefix, estr); } return NULL; } @@ -83,7 +83,7 @@ struct lookup_mod *open_lookup(const char *name, const char *err_prefix, free(mod); if (err_prefix) { char *estr = strerror_r(errno, buf, MAX_ERR_BUF); - crit(LOGOPT_ANY, "%s%s", err_prefix, estr); + logerr("%s%s", err_prefix, estr); } return NULL; } @@ -91,7 +91,7 @@ struct lookup_mod *open_lookup(const char *name, const char *err_prefix, if (!(dh = dlopen(fnbuf, RTLD_NOW))) { if (err_prefix) - crit(LOGOPT_ANY, "%scannot open lookup module %s (%s)", + logerr("%scannot open lookup module %s (%s)", err_prefix, name, dlerror()); free(mod); return NULL; @@ -100,8 +100,7 @@ struct lookup_mod *open_lookup(const char *name, const char *err_prefix, if (!(ver = (int *) dlsym(dh, "lookup_version")) || *ver != AUTOFS_LOOKUP_VERSION) { if (err_prefix) - crit(LOGOPT_ANY, - "%slookup module %s version mismatch", + logerr("%slookup module %s version mismatch", err_prefix, name); dlclose(dh); free(mod); @@ -114,7 +113,7 @@ struct lookup_mod *open_lookup(const char *name, const char *err_prefix, !(mod->lookup_mount = (lookup_mount_t) dlsym(dh, "lookup_mount")) || !(mod->lookup_done = (lookup_done_t) dlsym(dh, "lookup_done"))) { if (err_prefix) - crit(LOGOPT_ANY, "%slookup module %s corrupt", err_prefix, name); + logerr("%slookup module %s corrupt", err_prefix, name); dlclose(dh); free(mod); return NULL; @@ -156,7 +155,7 @@ struct parse_mod *open_parse(const char *name, const char *err_prefix, if (!mod) { if (err_prefix) { char *estr = strerror_r(errno, buf, MAX_ERR_BUF); - crit(LOGOPT_ANY, "%s%s", err_prefix, estr); + logerr("%s%s", err_prefix, estr); } return NULL; } @@ -167,7 +166,7 @@ struct parse_mod *open_parse(const char *name, const char *err_prefix, free(mod); if (err_prefix) { char *estr = strerror_r(errno, buf, MAX_ERR_BUF); - crit(LOGOPT_ANY, "%s%s", err_prefix, estr); + logerr("%s%s", err_prefix, estr); } return NULL; } @@ -175,8 +174,7 @@ struct parse_mod *open_parse(const char *name, const char *err_prefix, if (!(dh = dlopen(fnbuf, RTLD_NOW))) { if (err_prefix) - crit(LOGOPT_ANY, - "%scannot open parse module %s (%s)", + logerr("%scannot open parse module %s (%s)", err_prefix, name, dlerror()); free(mod); return NULL; @@ -185,8 +183,7 @@ struct parse_mod *open_parse(const char *name, const char *err_prefix, if (!(ver = (int *) dlsym(dh, "parse_version")) || *ver != AUTOFS_PARSE_VERSION) { if (err_prefix) - crit(LOGOPT_ANY, - "%sparse module %s version mismatch", + logerr("%sparse module %s version mismatch", err_prefix, name); dlclose(dh); free(mod); @@ -197,8 +194,7 @@ struct parse_mod *open_parse(const char *name, const char *err_prefix, !(mod->parse_mount = (parse_mount_t) dlsym(dh, "parse_mount")) || !(mod->parse_done = (parse_done_t) dlsym(dh, "parse_done"))) { if (err_prefix) - crit(LOGOPT_ANY, - "%sparse module %s corrupt", + logerr("%sparse module %s corrupt", err_prefix, name); dlclose(dh); free(mod); @@ -240,7 +236,7 @@ struct mount_mod *open_mount(const char *name, const char *err_prefix) if (!mod) { if (err_prefix) { char *estr = strerror_r(errno, buf, MAX_ERR_BUF); - crit(LOGOPT_ANY, "%s%s", err_prefix, estr); + logerr("%s%s", err_prefix, estr); } return NULL; } @@ -251,7 +247,7 @@ struct mount_mod *open_mount(const char *name, const char *err_prefix) free(mod); if (err_prefix) { char *estr = strerror_r(errno, buf, MAX_ERR_BUF); - crit(LOGOPT_ANY, "%s%s", err_prefix, estr); + logerr("%s%s", err_prefix, estr); } return NULL; } @@ -259,8 +255,7 @@ struct mount_mod *open_mount(const char *name, const char *err_prefix) if (!(dh = dlopen(fnbuf, RTLD_NOW))) { if (err_prefix) - crit(LOGOPT_ANY, - "%scannot open mount module %s (%s)", + logerr("%scannot open mount module %s (%s)", err_prefix, name, dlerror()); free(mod); return NULL; @@ -269,8 +264,7 @@ struct mount_mod *open_mount(const char *name, const char *err_prefix) if (!(ver = (int *) dlsym(dh, "mount_version")) || *ver != AUTOFS_MOUNT_VERSION) { if (err_prefix) - crit(LOGOPT_ANY, - "%smount module %s version mismatch", + logerr("%smount module %s version mismatch", err_prefix, name); dlclose(dh); free(mod); @@ -281,8 +275,7 @@ struct mount_mod *open_mount(const char *name, const char *err_prefix) !(mod->mount_mount = (mount_mount_t) dlsym(dh, "mount_mount")) || !(mod->mount_done = (mount_done_t) dlsym(dh, "mount_done"))) { if (err_prefix) - crit(LOGOPT_ANY, - "%smount module %s corrupt", + logerr("%smount module %s corrupt", err_prefix, name); dlclose(dh); free(mod); diff --git a/daemon/spawn.c b/daemon/spawn.c index 271d37e..3d5ea56 100644 --- a/daemon/spawn.c +++ b/daemon/spawn.c @@ -88,7 +88,7 @@ void reset_signals(void) #define ERRBUFSIZ 2047 /* Max length of error string excl \0 */ -static int do_spawn(logger *log, unsigned int options, const char *prog, const char *const *argv) +static int do_spawn(unsigned logopt, unsigned int options, const char *prog, const char *const *argv) { pid_t f; int ret, status, pipefd[2]; @@ -195,7 +195,7 @@ static int do_spawn(logger *log, unsigned int options, const char *prog, const c while (errp && (p = memchr(sp, '\n', errp))) { *p++ = '\0'; if (sp[0]) /* Don't output empty lines */ - log(LOGOPT_ANY, ">> %s", sp); + warn(logopt, ">> %s", sp); errp -= (p - sp); sp = p; } @@ -206,7 +206,7 @@ static int do_spawn(logger *log, unsigned int options, const char *prog, const c if (errp >= ERRBUFSIZ) { /* Line too long, split */ errbuf[errp] = '\0'; - log(LOGOPT_ANY, ">> %s", errbuf); + warn(logopt, ">> %s", errbuf); errp = 0; } } @@ -217,7 +217,7 @@ static int do_spawn(logger *log, unsigned int options, const char *prog, const c if (errp > 0) { /* End of file without \n */ errbuf[errp] = '\0'; - log(LOGOPT_ANY, ">> %s", errbuf); + warn(logopt, ">> %s", errbuf); } if (waitpid(f, &ret, 0) != f) @@ -235,12 +235,12 @@ static int do_spawn(logger *log, unsigned int options, const char *prog, const c } } -int spawnv(logger *log, const char *prog, const char *const *argv) +int spawnv(unsigned logopt, const char *prog, const char *const *argv) { - return do_spawn(log, SPAWN_OPT_NONE, prog, argv); + return do_spawn(logopt, SPAWN_OPT_NONE, prog, argv); } -int spawnl(logger *log, const char *prog, ...) +int spawnl(unsigned logopt, const char *prog, ...) { va_list arg; int argc; @@ -258,10 +258,10 @@ int spawnl(logger *log, const char *prog, ...) while ((*p++ = va_arg(arg, char *))); va_end(arg); - return do_spawn(log, SPAWN_OPT_NONE, prog, (const char **) argv); + return do_spawn(logopt, SPAWN_OPT_NONE, prog, (const char **) argv); } -int spawn_mount(logger *log, ...) +int spawn_mount(unsigned logopt, ...) { va_list arg; int argc; @@ -279,7 +279,7 @@ int spawn_mount(logger *log, ...) options = SPAWN_OPT_NONE; #endif - va_start(arg, log); + va_start(arg, logopt); for (argc = 1; va_arg(arg, char *); argc++); va_end(arg); @@ -288,13 +288,13 @@ int spawn_mount(logger *log, ...) argv[0] = arg0; - va_start(arg, log); + va_start(arg, logopt); p = argv + 1; while ((*p++ = va_arg(arg, char *))); va_end(arg); while (retries--) { - ret = do_spawn(log, options, prog, (const char **) argv); + ret = do_spawn(logopt, options, prog, (const char **) argv); if (ret & MTAB_NOTUPDATED) continue; break; @@ -311,7 +311,7 @@ int spawn_mount(logger *log, ...) * NOTE: If mount locking is enabled this type of recursive mount cannot * work. */ -int spawn_bind_mount(logger *log, ...) +int spawn_bind_mount(unsigned logopt, ...) { va_list arg; int argc; @@ -330,7 +330,7 @@ int spawn_bind_mount(logger *log, ...) options = SPAWN_OPT_ACCESS; #endif - va_start(arg, log); + va_start(arg, logopt); for (argc = 1; va_arg(arg, char *); argc++); va_end(arg); @@ -340,13 +340,13 @@ int spawn_bind_mount(logger *log, ...) argv[0] = arg0; argv[1] = bind; - va_start(arg, log); + va_start(arg, logopt); p = argv + 2; while ((*p++ = va_arg(arg, char *))); va_end(arg); while (retries--) { - ret = do_spawn(log, options, prog, (const char **) argv); + ret = do_spawn(logopt, options, prog, (const char **) argv); if (ret & MTAB_NOTUPDATED) continue; break; @@ -355,7 +355,7 @@ int spawn_bind_mount(logger *log, ...) return ret; } -int spawn_umount(logger *log, ...) +int spawn_umount(unsigned logopt, ...) { va_list arg; int argc; @@ -372,7 +372,7 @@ int spawn_umount(logger *log, ...) options = SPAWN_OPT_NONE; #endif - va_start(arg, log); + va_start(arg, logopt); for (argc = 1; va_arg(arg, char *); argc++); va_end(arg); @@ -381,13 +381,13 @@ int spawn_umount(logger *log, ...) argv[0] = arg0; - va_start(arg, log); + va_start(arg, logopt); p = argv + 1; while ((*p++ = va_arg(arg, char *))); va_end(arg); while (retries--) { - ret = do_spawn(log, options, prog, (const char **) argv); + ret = do_spawn(logopt, options, prog, (const char **) argv); if (ret & MTAB_NOTUPDATED) continue; break; diff --git a/daemon/state.c b/daemon/state.c index 39f4497..a2da762 100644 --- a/daemon/state.c +++ b/daemon/state.c @@ -58,22 +58,20 @@ void dump_state_queue(void) struct list_head *head = &state_queue; struct list_head *p, *q; - debug(LOGOPT_ANY, "dumping queue"); + logmsg("dumping queue"); list_for_each(p, head) { struct state_queue *entry; entry = list_entry(p, struct state_queue, list); - debug(LOGOPT_ANY, - "queue list head path %s state %d busy %d", + logmsg("queue list head path %s state %d busy %d", entry->ap->path, entry->state, entry->busy); list_for_each(q, &entry->pending) { struct state_queue *this; this = list_entry(q, struct state_queue, pending); - debug(LOGOPT_ANY, - "queue list entry path %s state %d busy %d", + logmsg("queue list entry path %s state %d busy %d", this->ap->path, this->state, this->busy); } } @@ -85,7 +83,7 @@ void nextstate(int statefd, enum states next) if (write(statefd, &next, sizeof(next)) != sizeof(next)) { char *estr = strerror_r(errno, buf, MAX_ERR_BUF); - error(LOGOPT_ANY, "write failed %s", estr); + logerr("write failed %s", estr); } } diff --git a/include/automount.h b/include/automount.h index d55ba5c..37a3c0a 100644 --- a/include/automount.h +++ b/include/automount.h @@ -131,6 +131,7 @@ struct mapent_cache { unsigned int size; pthread_mutex_t ino_index_mutex; struct list_head *ino_index; + struct autofs_point *ap; struct map_source *map; struct mapent **hash; }; @@ -164,7 +165,7 @@ void cache_readlock(struct mapent_cache *mc); void cache_writelock(struct mapent_cache *mc); int cache_try_writelock(struct mapent_cache *mc); void cache_unlock(struct mapent_cache *mc); -struct mapent_cache *cache_init(struct map_source *map); +struct mapent_cache *cache_init(struct autofs_point *ap, struct map_source *map); struct mapent_cache *cache_init_null_cache(struct master *master); int cache_set_ino_index(struct mapent_cache *mc, const char *key, dev_t dev, ino_t ino); /* void cache_set_ino(struct mapent *me, dev_t dev, ino_t ino); */ @@ -200,11 +201,11 @@ int free_argv(int argc, const char **argv); inline void dump_core(void); int aquire_lock(void); void release_lock(void); -int spawnl(logger *log, const char *prog, ...); -int spawnv(logger *log, const char *prog, const char *const *argv); -int spawn_mount(logger *log, ...); -int spawn_bind_mount(logger *log, ...); -int spawn_umount(logger *log, ...); +int spawnl(unsigned logopt, const char *prog, ...); +int spawnv(unsigned logopt, const char *prog, const char *const *argv); +int spawn_mount(unsigned logopt, ...); +int spawn_bind_mount(unsigned logopt, ...); +int spawn_umount(unsigned logopt, ...); void reset_signals(void); int do_mount(struct autofs_point *ap, const char *root, const char *name, int name_len, const char *what, const char *fstype, @@ -222,6 +223,8 @@ int rmdir_path(struct autofs_point *ap, const char *path, dev_t dev); #define MAPENT_MAX_LEN 4095 #define PARSE_MAX_BUF KEY_MAX_LEN + MAPENT_MAX_LEN + 2 +#define AUTOFS_LOGPRI_FIFO "/tmp/autofs.fifo" + int lookup_nss_read_master(struct master *master, time_t age); int lookup_nss_read_map(struct autofs_point *ap, struct map_source *source, time_t age); int lookup_enumerate(struct autofs_point *ap, @@ -435,6 +438,7 @@ struct autofs_point { int pipefd; /* File descriptor for pipe */ int kpipefd; /* Kernel end descriptor for pipe */ int ioctlfd; /* File descriptor for ioctls */ + int logpri_fifo; /* FIFO used for changing log levels */ dev_t dev; /* "Device" number assigned by kernel */ struct master_mapent *entry; /* Master map entry for this mount */ unsigned int type; /* Type of map direct or indirect */ @@ -464,8 +468,8 @@ struct autofs_point { void *handle_mounts(void *arg); int umount_multi(struct autofs_point *ap, const char *path, int incl); -int send_ready(int ioctlfd, unsigned int wait_queue_token); -int send_fail(int ioctlfd, unsigned int wait_queue_token); +int send_ready(unsigned logopt, int ioctlfd, unsigned int wait_queue_token); +int send_fail(unsigned logopt, int ioctlfd, unsigned int wait_queue_token); int do_expire(struct autofs_point *ap, const char *name, int namelen); void *expire_proc_indirect(void *); void *expire_proc_direct(void *); @@ -483,8 +487,8 @@ int handle_packet_expire_indirect(struct autofs_point *ap, autofs_packet_expire_ int handle_packet_expire_direct(struct autofs_point *ap, autofs_packet_expire_direct_t *pkt); int handle_packet_missing_indirect(struct autofs_point *ap, autofs_packet_missing_indirect_t *pkt); int handle_packet_missing_direct(struct autofs_point *ap, autofs_packet_missing_direct_t *pkt); -void rm_unwanted(const char *path, int incl, dev_t dev); -int count_mounts(const char *path, dev_t dev); +void rm_unwanted(unsigned logopt, const char *path, int incl, dev_t dev); +int count_mounts(unsigned logopt, const char *path, dev_t dev); #define state_mutex_lock(ap) \ do { \ diff --git a/include/log.h b/include/log.h index 3276cca..6a4a942 100644 --- a/include/log.h +++ b/include/log.h @@ -20,6 +20,7 @@ /* Define logging functions */ #define LOGOPT_NONE 0x0000 +#define LOGOPT_ERROR 0x0000 #define LOGOPT_DEBUG 0x0001 #define LOGOPT_VERBOSE 0x0002 #define LOGOPT_ANY (LOGOPT_DEBUG | LOGOPT_VERBOSE) @@ -29,34 +30,33 @@ struct autofs_point; extern void set_log_norm(void); extern void set_log_verbose(void); extern void set_log_debug(void); -extern void set_mnt_logging(struct autofs_point *); +extern void set_log_norm_ap(struct autofs_point *ap); +extern void set_log_verbose_ap(struct autofs_point *ap); +extern void set_log_debug_ap(struct autofs_point *ap); +extern void set_mnt_logging(unsigned global_logopt); extern void log_to_syslog(void); extern void log_to_stderr(void); -typedef void logger(unsigned int logopt, const char* msg, ...); - -extern void (*log_info)(unsigned int, const char* msg, ...); -extern void (*log_notice)(unsigned int, const char* msg, ...); -extern void (*log_warn)(unsigned int, const char* msg, ...); -extern void (*log_error)(unsigned int, const char* msg, ...); -extern void (*log_crit)(unsigned int, const char* msg, ...); -extern void (*log_debug)(unsigned int, const char* msg, ...); - -#define msg(msg, args...) \ - do { log_info(LOGOPT_NONE, msg, ##args); } while (0) +extern void log_info(unsigned int, const char* msg, ...); +extern void log_notice(unsigned int, const char* msg, ...); +extern void log_warn(unsigned int, const char* msg, ...); +extern void log_error(unsigned, const char* msg, ...); +extern void log_crit(unsigned, const char* msg, ...); +extern void log_debug(unsigned int, const char* msg, ...); +extern void logmsg(const char* msg, ...); #define debug(opt, msg, args...) \ do { log_debug(opt, "%s: " msg, __FUNCTION__, ##args); } while (0) -#define info(opt, msg, args...) \ - do { log_info(opt, "%s: " msg, __FUNCTION__, ##args); } while (0) +#define info(opt, msg, args...) \ + do { log_info(opt, msg, ##args); } while (0) #define notice(opt, msg, args...) \ - do { log_notice(opt, "%s: " msg, __FUNCTION__, ##args); } while (0) + do { log_notice(opt, msg, ##args); } while (0) -#define warn(opt, msg, args...) \ - do { log_warn(opt, "%s: " msg, __FUNCTION__, ##args); } while (0) +#define warn(opt, msg, args...) \ + do { log_warn(opt, msg, ##args); } while (0) #define error(opt, msg, args...) \ do { log_error(opt, "%s: " msg, __FUNCTION__, ##args); } while (0) @@ -64,17 +64,18 @@ extern void (*log_debug)(unsigned int, const char* msg, ...); #define crit(opt, msg, args...) \ do { log_crit(opt, "%s: " msg, __FUNCTION__, ##args); } while (0) +#define logerr(msg, args...) \ + do { logmsg("%s:%d: " msg, __FUNCTION__, __LINE__, ##args); } while (0) + #define fatal(status) \ do { \ if (status == EDEADLK) { \ - log_crit(LOGOPT_ANY, \ - "%s: deadlock detected " \ + logmsg("deadlock detected " \ "at line %d in %s, dumping core.", \ - __FUNCTION__, __LINE__, __FILE__); \ + __LINE__, __FILE__); \ dump_core(); \ } \ - log_crit(LOGOPT_ANY, \ - "unexpected pthreads error: %d at %d " \ + logmsg("unexpected pthreads error: %d at %d " \ "in %s", status, __LINE__, __FILE__); \ abort(); \ } while(0) @@ -83,7 +84,7 @@ extern void (*log_debug)(unsigned int, const char* msg, ...); #define assert(x) \ do { \ if (!(x)) { \ - log_crit(LOGOPT_ANY, __FILE__ \ + logmsg(__FILE__ \ ":%d: assertion failed: " #x, __LINE__); \ } \ } while(0) diff --git a/include/lookup_ldap.h b/include/lookup_ldap.h index ca8d658..5b5c475 100644 --- a/include/lookup_ldap.h +++ b/include/lookup_ldap.h @@ -94,13 +94,13 @@ struct lookup_context { #define LDAP_AUTH_AUTODETECT 0x0004 /* lookup_ldap.c */ -LDAP *init_ldap_connection(const char *uri, struct lookup_context *ctxt); -int unbind_ldap_connection(LDAP *ldap, struct lookup_context *ctxt); +LDAP *init_ldap_connection(unsigned logopt, const char *uri, struct lookup_context *ctxt); +int unbind_ldap_connection(unsigned logopt, LDAP *ldap, struct lookup_context *ctxt); int authtype_requires_creds(const char *authtype); /* cyrus-sasl.c */ -int autofs_sasl_init(LDAP *ldap, struct lookup_context *ctxt); -int autofs_sasl_bind(LDAP *ldap, struct lookup_context *ctxt); +int autofs_sasl_init(unsigned logopt, LDAP *ldap, struct lookup_context *ctxt); +int autofs_sasl_bind(unsigned logopt, LDAP *ldap, struct lookup_context *ctxt); void autofs_sasl_unbind(struct lookup_context *ctxt); void autofs_sasl_done(struct lookup_context *ctxt); #endif diff --git a/include/master.h b/include/master.h index 8470bb1..5f10d1f 100644 --- a/include/master.h +++ b/include/master.h @@ -62,6 +62,7 @@ struct master { unsigned int default_ghost; unsigned int default_logging; unsigned int default_timeout; + unsigned int logopt; struct mapent_cache *nc; struct list_head mounts; }; @@ -106,6 +107,7 @@ int master_notify_submount(struct autofs_point *, const char *path, enum states) void master_signal_submount(struct autofs_point *, unsigned int); void master_notify_state_change(struct master *, int); int master_mount_mounts(struct master *, time_t, int); +extern inline unsigned int master_get_logopt(void); int master_list_empty(struct master *); int master_kill(struct master *); diff --git a/include/replicated.h b/include/replicated.h index 3afe9f7..672f853 100644 --- a/include/replicated.h +++ b/include/replicated.h @@ -62,8 +62,8 @@ struct host { void seed_random(void); void free_host_list(struct host **); -int parse_location(struct host **, const char *); -int prune_host_list(struct host **, unsigned int, const char *, unsigned int); +int parse_location(unsigned, struct host **, const char *); +int prune_host_list(unsigned, struct host **, unsigned int, const char *, unsigned int); void dump_host_list(struct host *); #endif diff --git a/lib/alarm.c b/lib/alarm.c index 90bf7aa..6a70ed1 100755 --- a/lib/alarm.c +++ b/lib/alarm.c @@ -51,7 +51,7 @@ void dump_alarms(void) struct alarm *this; this = list_entry(p, struct alarm, list); - msg("alarm time = %d", this->time); + logmsg("alarm time = %d", this->time); } pthread_mutex_unlock(&mutex); } diff --git a/lib/args.c b/lib/args.c index fbfb004..9616598 100644 --- a/lib/args.c +++ b/lib/args.c @@ -37,7 +37,7 @@ char **add_argv(int argc, char **argv, char *str) if (argv[i]) { vector[i] = strdup(argv[i]); if (!vector[i]) { - error(LOGOPT_ANY, "failed to strdup arg"); + logerr("failed to strdup arg"); break; } } else @@ -81,7 +81,7 @@ char **append_argv(int argc1, char **argv1, int argc2, char **argv2) if (argv2[j]) { vector[i] = strdup(argv2[j]); if (!vector[i]) { - error(LOGOPT_ANY, "failed to strdup arg"); + logerr("failed to strdup arg"); break; } } else @@ -116,7 +116,7 @@ const char **copy_argv(int argc, const char **argv) if (argv[i]) { vector[i] = strdup(argv[i]); if (!vector[i]) { - error(LOGOPT_ANY, "failed to strdup arg"); + logerr("failed to strdup arg"); break; } } else diff --git a/lib/cache.c b/lib/cache.c index 06bb461..55586a3 100644 --- a/lib/cache.c +++ b/lib/cache.c @@ -34,7 +34,7 @@ void cache_dump_multi(struct list_head *list) list_for_each(p, list) { me = list_entry(p, struct mapent, multi_list); - msg("key=%s", me->key); + logmsg("key=%s", me->key); } } @@ -48,7 +48,7 @@ void cache_dump_cache(struct mapent_cache *mc) if (me == NULL) continue; while (me) { - msg("me->key=%s me->multi=%p dev=%ld ino=%ld", + logmsg("me->key=%s me->multi=%p dev=%ld ino=%ld", me->key, me->multi, me->dev, me->ino); me = me->next; } @@ -61,7 +61,7 @@ void cache_readlock(struct mapent_cache *mc) status = pthread_rwlock_rdlock(&mc->rwlock); if (status) { - error(LOGOPT_ANY, "mapent cache rwlock lock failed"); + logmsg("mapent cache rwlock lock failed"); fatal(status); } return; @@ -73,7 +73,7 @@ void cache_writelock(struct mapent_cache *mc) status = pthread_rwlock_wrlock(&mc->rwlock); if (status) { - error(LOGOPT_ANY, "mapent cache rwlock lock failed"); + logmsg("mapent cache rwlock lock failed"); fatal(status); } return; @@ -85,7 +85,7 @@ int cache_try_writelock(struct mapent_cache *mc) status = pthread_rwlock_trywrlock(&mc->rwlock); if (status) { - debug(LOGOPT_ANY, "mapent cache rwlock busy"); + logmsg("mapent cache rwlock busy"); return 0; } return 1; @@ -97,7 +97,7 @@ void cache_unlock(struct mapent_cache *mc) status = pthread_rwlock_unlock(&mc->rwlock); if (status) { - error(LOGOPT_ANY, "mapent cache rwlock unlock failed"); + logmsg("mapent cache rwlock unlock failed"); fatal(status); } return; @@ -120,7 +120,7 @@ void cache_multi_lock(struct mapent *me) status = pthread_mutex_lock(&me->multi_mutex); if (status) { - error(LOGOPT_ANY, "mapent cache multi mutex lock failed"); + logmsg("mapent cache multi mutex lock failed"); fatal(status); } return; @@ -135,7 +135,7 @@ void cache_multi_unlock(struct mapent *me) status = pthread_mutex_unlock(&me->multi_mutex); if (status) { - error(LOGOPT_ANY, "mapent cache multi mutex unlock failed"); + logmsg("mapent cache multi mutex unlock failed"); fatal(status); } return; @@ -164,7 +164,7 @@ static inline void ino_index_unlock(struct mapent_cache *mc) return; } -struct mapent_cache *cache_init(struct map_source *map) +struct mapent_cache *cache_init(struct autofs_point *ap, struct map_source *map) { struct mapent_cache *mc; unsigned int i; @@ -207,6 +207,7 @@ struct mapent_cache *cache_init(struct map_source *map) INIT_LIST_HEAD(&mc->ino_index[i]); } + mc->ap = ap; mc->map = map; cache_unlock(mc); @@ -257,6 +258,9 @@ struct mapent_cache *cache_init_null_cache(struct master *master) INIT_LIST_HEAD(&mc->ino_index[i]); } + mc->ap = NULL; + mc->map = NULL; + cache_unlock(mc); return mc; @@ -608,6 +612,7 @@ static void cache_add_ordered_offset(struct mapent *me, struct list_head *head) /* cache must be write locked by caller */ int cache_add_offset(struct mapent_cache *mc, const char *mkey, const char *key, const char *mapent, time_t age) { + unsigned logopt = mc->ap ? mc->ap->logopt : master_get_logopt(); struct mapent *me, *owner; int ret = CHE_OK; @@ -621,7 +626,7 @@ int cache_add_offset(struct mapent_cache *mc, const char *mkey, const char *key, ret = cache_add(mc, owner->source, key, mapent, age); if (ret == CHE_FAIL) { - warn(LOGOPT_ANY, "failed to add key %s to cache", key); + warn(logopt, "failed to add key %s to cache", key); return CHE_FAIL; } @@ -689,6 +694,7 @@ int cache_set_parents(struct mapent *mm) /* cache must be write locked by caller */ int cache_update(struct mapent_cache *mc, struct map_source *ms, const char *key, const char *mapent, time_t age) { + unsigned logopt = mc->ap ? mc->ap->logopt : master_get_logopt(); struct mapent *me = NULL; char *pent; int ret = CHE_OK; @@ -697,7 +703,7 @@ int cache_update(struct mapent_cache *mc, struct map_source *ms, const char *key if (!me || (*me->key == '*' && *key != '*')) { ret = cache_add(mc, ms, key, mapent, age); if (!ret) { - debug(LOGOPT_NONE, "failed for %s", key); + debug(logopt, "failed for %s", key); return CHE_FAIL; } ret = CHE_UPDATED; @@ -796,6 +802,7 @@ done: /* cache must be write locked by caller */ int cache_delete_offset_list(struct mapent_cache *mc, const char *key) { + unsigned logopt = mc->ap ? mc->ap->logopt : master_get_logopt(); struct mapent *me; struct mapent *this; struct list_head *head, *next; @@ -816,7 +823,7 @@ int cache_delete_offset_list(struct mapent_cache *mc, const char *key) this = list_entry(next, struct mapent, multi_list); next = next->next; if (this->ioctlfd != -1) { - error(LOGOPT_ANY, + error(logopt, "active offset mount key %s", this->key); return CHE_FAIL; } @@ -829,10 +836,10 @@ int cache_delete_offset_list(struct mapent_cache *mc, const char *key) next = next->next; list_del_init(&this->multi_list); this->multi = NULL; - debug(LOGOPT_NONE, "deleting offset key %s", this->key); + debug(logopt, "deleting offset key %s", this->key); status = cache_delete(mc, this->key); if (status == CHE_FAIL) { - warn(LOGOPT_ANY, + warn(logopt, "failed to delete offset %s", this->key); this->multi = me; /* TODO: add list back in */ diff --git a/lib/defaults.c b/lib/defaults.c index 2cccf20..94885e8 100644 --- a/lib/defaults.c +++ b/lib/defaults.c @@ -105,17 +105,22 @@ static int get_env_yesno(const char *name) * We've changed the key names so we need to check for the * config key and it's old name for backward conpatibility. */ -static int check_set_config_value(const char *res, const char *name, const char *value) +static int check_set_config_value(const char *res, const char *name, const char *value, unsigned to_syslog) { char *old_name; int ret; if (!strcasecmp(res, name)) { ret = setenv(name, value, 0); - if (ret) - fprintf(stderr, - "can't set config value for %s, " - "error %d", name, ret); + if (ret) { + if (!to_syslog) + fprintf(stderr, + "can't set config value for %s, " + "error %d\n", name, ret); + else + logmsg("can't set config value for %s, " + "error %d", name, ret); + } return 1; } @@ -125,10 +130,15 @@ static int check_set_config_value(const char *res, const char *name, const char if (!strcasecmp(res, old_name)) { ret = setenv(name, value, 0); - if (ret) - fprintf(stderr, - "can't set config value for %s, " - "error %d", name, ret); + if (ret) { + if (!to_syslog) + fprintf(stderr, + "can't set config value for %s, " + "error %d\n", name, ret); + else + logmsg("can't set config value for %s, " + "error %d\n", name, ret); + } return 1; } return 0; @@ -296,19 +306,19 @@ unsigned int defaults_read_config(unsigned int to_syslog) if (!parse_line(res, &key, &value)) continue; - if (check_set_config_value(key, ENV_NAME_MASTER_MAP, value) || - check_set_config_value(key, ENV_NAME_TIMEOUT, value) || - check_set_config_value(key, ENV_NAME_BROWSE_MODE, value) || - check_set_config_value(key, ENV_NAME_LOGGING, value) || - check_set_config_value(key, ENV_LDAP_TIMEOUT, value) || - check_set_config_value(key, ENV_LDAP_NETWORK_TIMEOUT, value) || - check_set_config_value(key, ENV_NAME_MAP_OBJ_CLASS, value) || - check_set_config_value(key, ENV_NAME_ENTRY_OBJ_CLASS, value) || - check_set_config_value(key, ENV_NAME_MAP_ATTR, value) || - check_set_config_value(key, ENV_NAME_ENTRY_ATTR, value) || - check_set_config_value(key, ENV_NAME_VALUE_ATTR, value) || - check_set_config_value(key, ENV_APPEND_OPTIONS, value) || - check_set_config_value(key, ENV_AUTH_CONF_FILE, value)) + if (check_set_config_value(key, ENV_NAME_MASTER_MAP, value, to_syslog) || + check_set_config_value(key, ENV_NAME_TIMEOUT, value, to_syslog) || + check_set_config_value(key, ENV_NAME_BROWSE_MODE, value, to_syslog) || + check_set_config_value(key, ENV_NAME_LOGGING, value, to_syslog) || + check_set_config_value(key, ENV_LDAP_TIMEOUT, value, to_syslog) || + check_set_config_value(key, ENV_LDAP_NETWORK_TIMEOUT, value, to_syslog) || + check_set_config_value(key, ENV_NAME_MAP_OBJ_CLASS, value, to_syslog) || + check_set_config_value(key, ENV_NAME_ENTRY_OBJ_CLASS, value, to_syslog) || + check_set_config_value(key, ENV_NAME_MAP_ATTR, value, to_syslog) || + check_set_config_value(key, ENV_NAME_ENTRY_ATTR, value, to_syslog) || + check_set_config_value(key, ENV_NAME_VALUE_ATTR, value, to_syslog) || + check_set_config_value(key, ENV_APPEND_OPTIONS, value, to_syslog) || + check_set_config_value(key, ENV_AUTH_CONF_FILE, value, to_syslog)) ; } @@ -318,8 +328,7 @@ unsigned int defaults_read_config(unsigned int to_syslog) "fgets returned error %d while reading %s\n", ferror(f), DEFAULTS_CONFIG_FILE); } else { - error(LOGOPT_ANY, - "fgets returned error %d while reading %s", + logmsg("fgets returned error %d while reading %s", ferror(f), DEFAULTS_CONFIG_FILE); } fclose(f); diff --git a/lib/log.c b/lib/log.c index b747e12..65e8ad2 100644 --- a/lib/log.c +++ b/lib/log.c @@ -27,11 +27,6 @@ #include "automount.h" -/* -struct syslog_data syslog_context = AUTOFS_SYSLOG_CONTEXT; -struct syslog_data *slc = &syslog_context; -*/ - static unsigned int syslog_open = 0; static unsigned int logging_to_syslog = 0; @@ -39,32 +34,44 @@ static unsigned int logging_to_syslog = 0; static unsigned int do_verbose = 0; /* Verbose feedback option */ static unsigned int do_debug = 0; /* Full debug output */ -static void null(unsigned int logopt, const char *msg, ...) { } - -void (*log_info)(unsigned int logopt, const char* msg, ...) = null; -void (*log_notice)(unsigned int logopt, const char* msg, ...) = null; -void (*log_warn)(unsigned int logopt, const char* msg, ...) = null; -void (*log_error)(unsigned int logopt, const char* msg, ...) = null; -void (*log_crit)(unsigned int logopt, const char* msg, ...) = null; -void (*log_debug)(unsigned int logopt, const char* msg, ...) = null; - void set_log_norm(void) { do_verbose = 0; do_debug = 0; + return; } void set_log_verbose(void) { do_verbose = 1; + return; } void set_log_debug(void) { do_debug = 1; + return; +} + +void set_log_norm_ap(struct autofs_point *ap) +{ + ap->logopt = LOGOPT_ERROR; + return; +} + +void set_log_verbose_ap(struct autofs_point *ap) +{ + ap->logopt = LOGOPT_VERBOSE; + return; +} + +void set_log_debug_ap(struct autofs_point *ap) +{ + ap->logopt = LOGOPT_DEBUG; + return; } -static void syslog_info(unsigned int logopt, const char *msg, ...) +void log_info(unsigned int logopt, const char *msg, ...) { unsigned int opt_log = logopt & (LOGOPT_DEBUG | LOGOPT_VERBOSE); va_list ap; @@ -73,11 +80,18 @@ static void syslog_info(unsigned int logopt, const char *msg, ...) return; va_start(ap, msg); - vsyslog(LOG_INFO, msg, ap); + if (logging_to_syslog) + vsyslog(LOG_INFO, msg, ap); + else { + vfprintf(stderr, msg, ap); + fputc('\n', stderr); + } va_end(ap); + + return; } -static void syslog_notice(unsigned int logopt, const char *msg, ...) +void log_notice(unsigned int logopt, const char *msg, ...) { unsigned int opt_log = logopt & (LOGOPT_DEBUG | LOGOPT_VERBOSE); va_list ap; @@ -86,11 +100,18 @@ static void syslog_notice(unsigned int logopt, const char *msg, ...) return; va_start(ap, msg); - vsyslog(LOG_NOTICE, msg, ap); + if (logging_to_syslog) + vsyslog(LOG_NOTICE, msg, ap); + else { + vfprintf(stderr, msg, ap); + fputc('\n', stderr); + } va_end(ap); + + return; } -static void syslog_warn(unsigned int logopt, const char *msg, ...) +void log_warn(unsigned int logopt, const char *msg, ...) { unsigned int opt_log = logopt & (LOGOPT_DEBUG | LOGOPT_VERBOSE); va_list ap; @@ -99,70 +120,79 @@ static void syslog_warn(unsigned int logopt, const char *msg, ...) return; va_start(ap, msg); - vsyslog(LOG_WARNING, msg, ap); + if (logging_to_syslog) + vsyslog(LOG_WARNING, msg, ap); + else { + vfprintf(stderr, msg, ap); + fputc('\n', stderr); + } va_end(ap); + + return; } -static void syslog_err(unsigned int logopt, const char *msg, ...) +void log_error(unsigned logopt, const char *msg, ...) { va_list ap; + va_start(ap, msg); - vsyslog(LOG_ERR, msg, ap); + if (logging_to_syslog) + vsyslog(LOG_ERR, msg, ap); + else { + vfprintf(stderr, msg, ap); + fputc('\n', stderr); + } va_end(ap); + return; } -static void syslog_crit(unsigned int logopt, const char *msg, ...) +void log_crit(unsigned logopt, const char *msg, ...) { va_list ap; + va_start(ap, msg); - vsyslog(LOG_CRIT, msg, ap); + if (logging_to_syslog) + vsyslog(LOG_CRIT, msg, ap); + else { + vfprintf(stderr, msg, ap); + fputc('\n', stderr); + } va_end(ap); + return; } -static void syslog_debug(unsigned int logopt, const char *msg, ...) +void log_debug(unsigned int logopt, const char *msg, ...) { + unsigned int opt_log = logopt & LOGOPT_DEBUG; va_list ap; - if (!do_debug && !(logopt & LOGOPT_DEBUG)) + if (!do_debug && !opt_log) return; va_start(ap, msg); - vsyslog(LOG_DEBUG, msg, ap); + if (logging_to_syslog) + vsyslog(LOG_WARNING, msg, ap); + else { + vfprintf(stderr, msg, ap); + fputc('\n', stderr); + } va_end(ap); + + return; } -static void to_stderr(unsigned int logopt, const char *msg, ...) +void logmsg(const char *msg, ...) { va_list ap; va_start(ap, msg); - vfprintf(stderr, msg, ap); - fputc('\n',stderr); - va_end(ap); -} - -void set_mnt_logging(struct autofs_point *ap) -{ - unsigned int opt_verbose = ap->logopt & LOGOPT_VERBOSE; - unsigned int opt_debug = ap->logopt & LOGOPT_DEBUG; - - if (opt_debug) { - if (logging_to_syslog) - log_debug = syslog_debug; - else - log_debug = to_stderr; - } - - if (opt_verbose || opt_debug) { - if (logging_to_syslog) { - log_info = syslog_info; - log_notice = syslog_notice; - log_warn = syslog_warn; - } else { - log_info = to_stderr; - log_notice = to_stderr; - log_warn = to_stderr; - } + if (logging_to_syslog) + vsyslog(LOG_CRIT, msg, ap); + else { + vfprintf(stderr, msg, ap); + fputc('\n', stderr); } + va_end(ap); + return; } void log_to_syslog(void) @@ -175,31 +205,13 @@ void log_to_syslog(void) openlog("automount", LOG_PID, LOG_DAEMON); } - if (do_debug) - log_debug = syslog_debug; - else - log_debug = null; - - if (do_verbose || do_debug) { - log_info = syslog_info; - log_notice = syslog_notice; - log_warn = syslog_warn; - } else { - log_info = null; - log_notice = null; - log_warn = null; - } - - log_error = syslog_err; - log_crit = syslog_crit; - logging_to_syslog = 1; /* Redirect all our file descriptors to /dev/null */ nullfd = open("/dev/null", O_RDWR); if (nullfd < 0) { char *estr = strerror_r(errno, buf, MAX_ERR_BUF); - syslog_crit(LOGOPT_ANY, "cannot open /dev/null: %s", estr); + fprintf(stderr, "cannot open /dev/null: %s", estr); exit(1); } @@ -207,13 +219,15 @@ void log_to_syslog(void) dup2(nullfd, STDOUT_FILENO) < 0 || dup2(nullfd, STDERR_FILENO) < 0) { char *estr = strerror_r(errno, buf, MAX_ERR_BUF); - syslog_crit(LOGOPT_ANY, - "redirecting file descriptors failed: %s", estr); + fprintf(stderr, + "redirecting file descriptors failed: %s", estr); exit(1); } if (nullfd > 2) close(nullfd); + + return; } void log_to_stderr(void) @@ -223,23 +237,7 @@ void log_to_stderr(void) closelog(); } - if (do_debug) - log_debug = to_stderr; - else - log_debug = null; - - if (do_verbose || do_debug) { - log_info = to_stderr; - log_notice = to_stderr; - log_warn = to_stderr; - } else { - log_info = null; - log_notice = null; - log_warn = null; - } - - log_error = to_stderr; - log_crit = to_stderr; - logging_to_syslog = 0; + + return; } diff --git a/lib/macros.c b/lib/macros.c index 936ae06..fa6db8e 100644 --- a/lib/macros.c +++ b/lib/macros.c @@ -50,8 +50,7 @@ void dump_table(struct substvar *table) fatal(status); while (lv) { - debug(LOGOPT_NONE, - "lv->def %s lv->val %s lv->next %p", + logmsg("lv->def %s lv->val %s lv->next %p", lv->def, lv->val, lv->next); lv = lv->next; } diff --git a/lib/master.c b/lib/master.c index abc3bc2..2e24ad0 100644 --- a/lib/master.c +++ b/lib/master.c @@ -524,8 +524,7 @@ void master_source_writelock(struct master_mapent *entry) status = pthread_rwlock_wrlock(&entry->source_lock); if (status) { - error(LOGOPT_ANY, - "master_mapent source write lock failed"); + logmsg("master_mapent source write lock failed"); fatal(status); } return; @@ -537,8 +536,7 @@ void master_source_readlock(struct master_mapent *entry) status = pthread_rwlock_rdlock(&entry->source_lock); if (status) { - error(LOGOPT_ANY, - "master_mapent source read lock failed"); + logmsg("master_mapent source read lock failed"); fatal(status); } return; @@ -550,8 +548,7 @@ void master_source_unlock(struct master_mapent *entry) status = pthread_rwlock_unlock(&entry->source_lock); if (status) { - error(LOGOPT_ANY, - "master_mapent source unlock failed"); + logmsg("master_mapent source unlock failed"); fatal(status); } return; @@ -572,7 +569,7 @@ void master_source_current_wait(struct master_mapent *entry) status = pthread_mutex_lock(&entry->current_mutex); if (status) { - error(LOGOPT_ANY, "entry current source lock failed"); + logmsg("entry current source lock failed"); fatal(status); } @@ -580,8 +577,7 @@ void master_source_current_wait(struct master_mapent *entry) status = pthread_cond_wait( &entry->current_cond, &entry->current_mutex); if (status) { - error(LOGOPT_ANY, - "entry current source condition wait failed"); + logmsg("entry current source condition wait failed"); fatal(status); } } @@ -595,14 +591,13 @@ void master_source_current_signal(struct master_mapent *entry) status = pthread_cond_signal(&entry->current_cond); if (status) { - error(LOGOPT_ANY, - "entry current source condition signal failed"); + logmsg("entry current source condition signal failed"); fatal(status); } status = pthread_mutex_unlock(&entry->current_mutex); if (status) { - error(LOGOPT_ANY, "entry current source unlock failed"); + logmsg("entry current source unlock failed"); fatal(status); } @@ -770,6 +765,7 @@ struct master *master_new(const char *name, unsigned int timeout, unsigned int g master->default_ghost = ghost; master->default_timeout = timeout; master->default_logging = defaults_get_logging(); + master->logopt = master->default_logging; INIT_LIST_HEAD(&master->mounts); @@ -778,11 +774,12 @@ struct master *master_new(const char *name, unsigned int timeout, unsigned int g int master_read_master(struct master *master, time_t age, int readall) { + unsigned int logopt = master->logopt; struct mapent_cache *nc; nc = cache_init_null_cache(master); if (!nc) { - error(LOGOPT_ANY, + error(logopt, "failed to init null map cache for %s", master->name); return 0; } @@ -791,7 +788,7 @@ int master_read_master(struct master *master, time_t age, int readall) master_init_scan(); if (!lookup_nss_read_master(master, age)) { - error(LOGOPT_ANY, + error(logopt, "can't read master map %s", master->name); return 0; } @@ -802,7 +799,7 @@ int master_read_master(struct master *master, time_t age, int readall) if (list_empty(&master->mounts)) { master_mutex_unlock(); - warn(LOGOPT_ANY, "no mounts in table"); + warn(logopt, "no mounts in table"); return 1; } @@ -934,6 +931,7 @@ void master_notify_state_change(struct master *master, int sig) struct autofs_point *ap; struct list_head *p; int state_pipe, cur_state; + unsigned int logopt; pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cur_state); master_mutex_lock(); @@ -944,6 +942,7 @@ void master_notify_state_change(struct master *master, int sig) entry = list_entry(p, struct master_mapent, list); ap = entry->ap; + logopt = ap->logopt; state_mutex_lock(ap); @@ -978,7 +977,7 @@ void master_notify_state_change(struct master *master, int sig) } next: if (next != ST_INVAL) - debug(ap->logopt, + debug(logopt, "sig %d switching %s from %d to %d", sig, ap->path, ap->state, next); @@ -1230,6 +1229,11 @@ int master_list_empty(struct master *master) return res; } +inline unsigned int master_get_logopt(void) +{ + return master_list ? master_list->logopt : LOGOPT_NONE; +} + int master_kill(struct master *master) { if (!list_empty(&master->mounts)) @@ -1251,6 +1255,6 @@ void dump_master(struct master *master) head = &master->mounts; list_for_each(p, head) { struct master_mapent *this = list_entry(p, struct master_mapent, list); - debug(LOGOPT_ANY, "path %s", this->path); + logmsg("path %s", this->path); } } diff --git a/lib/master_parse.y b/lib/master_parse.y index 70b48be..a767f9e 100644 --- a/lib/master_parse.y +++ b/lib/master_parse.y @@ -585,13 +585,13 @@ static char *master_strdup(char *str) static int master_error(const char *s) { - error(LOGOPT_ANY, "%s while parsing map.", s); + logmsg("%s while parsing map.", s); return 0; } static int master_notify(const char *s) { - warn(LOGOPT_ANY, "syntax error in map near [ %s ]", s); + logmsg("syntax error in map near [ %s ]", s); return(0); } @@ -704,6 +704,7 @@ int master_parse_entry(const char *buffer, unsigned int default_timeout, unsigne struct master_mapent *entry, *new; struct map_source *source; unsigned int logopt = logging; + unsigned int m_logopt = master->logopt; int ret; local_init_vars(); @@ -758,8 +759,8 @@ int master_parse_entry(const char *buffer, unsigned int default_timeout, unsigne } else { if (entry->age && entry->age == age) { if (strcmp(path, "/-")) { - warn(LOGOPT_VERBOSE, - "ignoring duplicate indirect mount %s", + info(m_logopt, + "ignoring duplicate indirect mount %s", path); local_free_vars(); return 0; @@ -770,13 +771,12 @@ int master_parse_entry(const char *buffer, unsigned int default_timeout, unsigne if (!entry->ap) { ret = master_add_autofs_point(entry, timeout, logopt, ghost, 0); if (!ret) { - error(LOGOPT_ANY, "failed to add autofs_point"); + error(m_logopt, "failed to add autofs_point"); if (new) master_free_mapent(new); local_free_vars(); return 0; } - set_mnt_logging(entry->ap); } else { struct autofs_point *ap = entry->ap; time_t tout = timeout; @@ -786,14 +786,11 @@ int master_parse_entry(const char *buffer, unsigned int default_timeout, unsigne * use the ghost, log and timeout of the first */ if (entry->age < age) { - ap->ghost = ghost; - ap->logopt = logopt; ap->exp_timeout = timeout; ap->exp_runfreq = (ap->exp_timeout + CHECK_RATIO - 1) / CHECK_RATIO; if (ap->ioctlfd != -1 && ap->type == LKP_INDIRECT) ioctl(ap->ioctlfd, AUTOFS_IOC_SETTIMEOUT, &tout); } - set_mnt_logging(ap); } entry->ap->random_selection = random_selection; @@ -809,7 +806,7 @@ int master_parse_entry(const char *buffer, unsigned int default_timeout, unsigne source = master_add_map_source(entry, type, format, age, local_argc, (const char **) local_argv); if (!source) { - error(LOGOPT_ANY, "failed to add source"); + error(m_logopt, "failed to add source"); if (new) master_free_mapent(new); local_free_vars(); @@ -817,9 +814,9 @@ int master_parse_entry(const char *buffer, unsigned int default_timeout, unsigne } if (!source->mc) { - source->mc = cache_init(source); + source->mc = cache_init(entry->ap, source); if (!source->mc) { - error(LOGOPT_ANY, "failed to init source cache"); + error(m_logopt, "failed to init source cache"); if (new) master_free_mapent(new); local_free_vars(); diff --git a/lib/master_tok.l b/lib/master_tok.l index 2735223..00cd223 100644 --- a/lib/master_tok.l +++ b/lib/master_tok.l @@ -368,7 +368,7 @@ int master_wrap(void) static void master_echo(void) { - debug(LOGOPT_NONE, "%s", master_text); + logmsg("%s", master_text); return; } diff --git a/lib/mounts.c b/lib/mounts.c index 0e428e8..425a65a 100644 --- a/lib/mounts.c +++ b/lib/mounts.c @@ -126,7 +126,7 @@ char *make_options_string(char *path, int pipefd, char *extra) options = malloc(MAX_OPTIONS_LEN + 1); if (!options) { - crit(LOGOPT_ANY, "can't malloc options string"); + logerr("can't malloc options string"); return NULL; } @@ -141,13 +141,12 @@ char *make_options_string(char *path, int pipefd, char *extra) AUTOFS_MAX_PROTO_VERSION); if (len >= MAX_OPTIONS_LEN) { - crit(LOGOPT_ANY, "buffer to small for options - truncated"); + logerr("buffer to small for options - truncated"); len = MAX_OPTIONS_LEN - 1; } if (len < 0) { - crit(LOGOPT_ANY, - "failed to malloc autofs mount options for %s", path); + logerr("failed to malloc autofs mount options for %s", path); free(options); return NULL; } @@ -163,7 +162,7 @@ char *make_mnt_name_string(char *path) mnt_name = malloc(MAX_MNT_NAME_LEN + 1); if (!mnt_name) { - crit(LOGOPT_ANY, "can't malloc mnt_name string"); + logerr("can't malloc mnt_name string"); return NULL; } @@ -171,13 +170,12 @@ char *make_mnt_name_string(char *path) mnt_name_template, (unsigned) getpid()); if (len >= MAX_MNT_NAME_LEN) { - crit(LOGOPT_ANY, "buffer to small for mnt_name - truncated"); + logerr("buffer to small for mnt_name - truncated"); len = MAX_MNT_NAME_LEN - 1; } if (len < 0) { - crit(LOGOPT_ANY, - "failed setting up mnt_name for autofs path %s", path); + logerr("failed setting up mnt_name for autofs path %s", path); free(mnt_name); return NULL; } @@ -207,7 +205,7 @@ struct mnt_list *get_mnt_list(const char *table, const char *path, int include) tab = setmntent(table, "r"); if (!tab) { char *estr = strerror_r(errno, buf, PATH_MAX - 1); - error(LOGOPT_ANY, "setmntent: %s", estr); + logerr("setmntent: %s", estr); return NULL; } @@ -398,7 +396,7 @@ int is_mounted(const char *table, const char *path, unsigned int type) tab = setmntent(table, "r"); if (!tab) { char *estr = strerror_r(errno, buf, PATH_MAX - 1); - error(LOGOPT_ANY, "setmntent: %s", estr); + logerr("setmntent: %s", estr); return 0; } @@ -443,7 +441,7 @@ int has_fstab_option(const char *opt) tab = setmntent(_PATH_MNTTAB, "r"); if (!tab) { char *estr = strerror_r(errno, buf, PATH_MAX - 1); - error(LOGOPT_ANY, "setmntent: %s", estr); + logerr("setmntent: %s", estr); return 0; } @@ -471,7 +469,7 @@ char *find_mnt_ino(const char *table, dev_t dev, ino_t ino) tab = setmntent(table, "r"); if (!tab) { char *estr = strerror_r(errno, buf, (size_t) PATH_MAX - 1); - error(LOGOPT_ANY, "setmntent: %s", estr); + logerr("setmntent: %s", estr); return 0; } @@ -667,7 +665,7 @@ struct mnt_list *tree_make_mnt_tree(const char *table, const char *path) tab = setmntent(table, "r"); if (!tab) { char *estr = strerror_r(errno, buf, PATH_MAX - 1); - error(LOGOPT_ANY, "setmntent: %s", estr); + logerr("setmntent: %s", estr); return NULL; } diff --git a/lib/nss_parse.y b/lib/nss_parse.y index e559696..90b7d25 100644 --- a/lib/nss_parse.y +++ b/lib/nss_parse.y @@ -127,13 +127,13 @@ status_exp: STATUS EQUAL ACTION static int nss_ignore(const char *s) { - msg("ignored invalid nsswitch config near [ %s ]", s); + logmsg("ignored invalid nsswitch config near [ %s ]", s); return(0); } static int nss_error(const char *s) { - msg("syntax error in nsswitch config near [ %s ]\n", s); + logmsg("syntax error in nsswitch config near [ %s ]\n", s); return(0); } @@ -167,7 +167,7 @@ int nsswitch_parse(struct list_head *list) nsswitch = fopen(NSSWITCH_FILE, "r"); if (!nsswitch) { - error(LOGOPT_ANY, "couldn't open %s\n", NSSWITCH_FILE); + logerr("couldn't open %s\n", NSSWITCH_FILE); return 1; } diff --git a/lib/nss_tok.l b/lib/nss_tok.l index f96b47f..c435b63 100644 --- a/lib/nss_tok.l +++ b/lib/nss_tok.l @@ -135,6 +135,6 @@ int nss_wrap(void) static void nss_echo(void) { - msg("%s", nss_text); + logmsg("%s", nss_text); return; } diff --git a/lib/parse_subs.c b/lib/parse_subs.c index 3627f44..5422fef 100644 --- a/lib/parse_subs.c +++ b/lib/parse_subs.c @@ -337,9 +337,9 @@ int umount_ent(struct autofs_point *ap, const char *path) * and EBADSLT relates to CD changer not responding. */ if (!status && (S_ISDIR(st.st_mode) && st.st_dev != ap->dev)) { - rv = spawn_umount(log_debug, path, NULL); + rv = spawn_umount(ap->logopt, path, NULL); } else if (is_smbfs && (sav_errno == EIO || sav_errno == EBADSLT)) { - rv = spawn_umount(log_debug, path, NULL); + rv = spawn_umount(ap->logopt, path, NULL); } /* We are doing a forced shutcwdown down so unlink busy mounts */ @@ -356,8 +356,8 @@ int umount_ent(struct autofs_point *ap, const char *path) } if (ap->state == ST_SHUTDOWN_FORCE) { - msg("forcing umount of %s", path); - rv = spawn_umount(log_debug, "-l", path, NULL); + info(ap->logopt, "forcing umount of %s", path); + rv = spawn_umount(ap->logopt, "-l", path, NULL); } /* @@ -503,7 +503,7 @@ int umount_multi_triggers(struct autofs_point *ap, char *root, struct mapent *me * the offset triggers back. */ if (is_mounted(_PATH_MOUNTED, root, MNTS_REAL)) { - msg("unmounting dir = %s", root); + info(ap->logopt, "unmounting dir = %s", root); if (umount_ent(ap, root)) { if (!mount_multi_triggers(ap, root, me, "/")) warn(ap->logopt, diff --git a/lib/rpc_subs.c b/lib/rpc_subs.c index d79a94f..5797639 100644 --- a/lib/rpc_subs.c +++ b/lib/rpc_subs.c @@ -96,7 +96,7 @@ static CLIENT *create_udp_client(struct conn_info *info) if (ret || !result) { int err = ghn_errno == -1 ? errno : ghn_errno; char *estr = strerror_r(err, buf, HOST_ENT_BUF_SIZE); - error(LOGOPT_ANY, "hostname lookup failed: %s", estr); + logerr("hostname lookup failed: %s", estr); goto out_close; } memcpy(&raddr.sin_addr.s_addr, php->h_addr, php->h_length); @@ -305,7 +305,7 @@ static CLIENT *create_tcp_client(struct conn_info *info) if (ret || !result) { int err = ghn_errno == -1 ? errno : ghn_errno; char *estr = strerror_r(err, buf, HOST_ENT_BUF_SIZE); - error(LOGOPT_ANY, "hostname lookup failed: %s", estr); + logerr("hostname lookup failed: %s", estr); goto out_close; } memcpy(&addr.sin_addr.s_addr, php->h_addr, php->h_length); diff --git a/man/automount.8 b/man/automount.8 index e203a3e..5cd63c7 100644 --- a/man/automount.8 +++ b/man/automount.8 @@ -62,6 +62,22 @@ setting. .TP .I "\-V, \-\-version" Display the version number, then exit. +.TP +.I "\-l, \-\-set-log-priority priority path [path,...]" +Set the daemon log priority to the specified value. Valid values include +the numbers 0-7, or the strings emerg, alert, crit, err, warning, notice, +info, or debug. Log level debug will log everything, log levels info, warn +(or warning), or notice with enable the daemon verbose logging. Any other +level will set basic logging. Note that enabling debug or verbose +logging in the autofs global configuration will override dynamic log level +changes. For example, if verbose logging is set in the configuration then +attempting to set logging to basic logging, by using alert, crit, err +or emerg won't stop the verbose logging. However, setting logging to debug +will lead to everything (debug logging) being logged witch can then also +be disabled, returning the daemon to verbose logging. +.P +The \fIpath\fP argument corresponds to the automounted +path name as specified in the master map. .SH ARGUMENTS \fBautomount\fP takes one optional argument, the name of the master map to use. diff --git a/modules/cyrus-sasl.c b/modules/cyrus-sasl.c index 68e5dd7..18733f3 100644 --- a/modules/cyrus-sasl.c +++ b/modules/cyrus-sasl.c @@ -96,18 +96,18 @@ sasl_log_func(void *context, int level, const char *message) switch (level) { case SASL_LOG_ERR: case SASL_LOG_FAIL: - error(LOGOPT_ANY, "%s", message); + logerr("%s", message); break; case SASL_LOG_WARN: - warn(LOGOPT_ANY, "%s", message); + logmsg("%s", message); break; case SASL_LOG_NOTE: - info(LOGOPT_ANY, "%s", message); + logmsg("%s", message); break; case SASL_LOG_DEBUG: case SASL_LOG_TRACE: case SASL_LOG_PASS: - debug(LOGOPT_NONE, "%s", message); + debug(LOGOPT_DEBUG, "%s", message); break; default: break; @@ -129,7 +129,7 @@ getuser_func(void *context, int id, const char **result, unsigned *len) *len = strlen(sasl_auth_id); break; default: - error(LOGOPT_ANY, "unknown id in request: %d", id); + error(LOGOPT_VERBOSE, "unknown id in request: %d", id); return SASL_FAIL; } @@ -166,7 +166,7 @@ getpass_func(sasl_conn_t *conn, void *context, int id, sasl_secret_t **psecret) * the returned data. */ char ** -get_server_SASL_mechanisms(LDAP *ld) +get_server_SASL_mechanisms(unsigned logopt, LDAP *ld) { int ret; const char *saslattrlist[] = {"supportedSASLmechanisms", NULL}; @@ -178,7 +178,7 @@ get_server_SASL_mechanisms(LDAP *ld) NULL, NULL, NULL, LDAP_NO_LIMIT, &results); if (ret != LDAP_SUCCESS) { - error(LOGOPT_ANY, "%s", ldap_err2string(ret)); + error(logopt, "%s", ldap_err2string(ret)); return NULL; } @@ -186,7 +186,7 @@ get_server_SASL_mechanisms(LDAP *ld) if (entry == NULL) { /* No root DSE. (!) */ ldap_msgfree(results); - debug(LOGOPT_NONE, + debug(logopt, "a lookup of \"supportedSASLmechanisms\" returned " "no results."); return NULL; @@ -196,7 +196,7 @@ get_server_SASL_mechanisms(LDAP *ld) ldap_msgfree(results); if (mechanisms == NULL) { /* Well, that was a waste of time. */ - msg("No SASL authentication mechanisms are supported" + info(logopt, "No SASL authentication mechanisms are supported" " by the LDAP server."); return NULL; } @@ -208,7 +208,7 @@ get_server_SASL_mechanisms(LDAP *ld) * Returns 0 upon successful connect, -1 on failure. */ int -do_sasl_bind(LDAP *ld, sasl_conn_t *conn, const char **clientout, +do_sasl_bind(unsigned logopt, LDAP *ld, sasl_conn_t *conn, const char **clientout, unsigned int *clientoutlen, const char *auth_mech, int sasl_result) { int ret, msgid, bind_result; @@ -226,7 +226,7 @@ do_sasl_bind(LDAP *ld, sasl_conn_t *conn, const char **clientout, &client_cred : NULL, NULL, NULL, &msgid); if (ret != LDAP_SUCCESS) { - crit(LOGOPT_ANY, + crit(logopt, "Error sending sasl_bind request to " "the server: %s", ldap_err2string(ret)); return -1; @@ -236,7 +236,7 @@ do_sasl_bind(LDAP *ld, sasl_conn_t *conn, const char **clientout, results = NULL; ret = ldap_result(ld, msgid, LDAP_MSG_ALL, NULL, &results); if (ret != LDAP_RES_BIND) { - crit(LOGOPT_ANY, + crit(logopt, "Error while waiting for response to " "sasl_bind request: %s", ldap_err2string(ret)); return -1; @@ -264,7 +264,7 @@ do_sasl_bind(LDAP *ld, sasl_conn_t *conn, const char **clientout, ret = ldap_get_option(ld, LDAP_OPT_RESULT_CODE, &bind_result); if (ret != LDAP_SUCCESS) { - crit(LOGOPT_ANY, + crit(logopt, "Error retrieving response to sasl_bind " "request: %s", ldap_err2string(ret)); ret = -1; @@ -277,7 +277,7 @@ do_sasl_bind(LDAP *ld, sasl_conn_t *conn, const char **clientout, bind_result = ret; break; default: - warn(LOGOPT_ANY, + warn(logopt, "Error parsing response to sasl_bind " "request: %s.", ldap_err2string(ret)); break; @@ -299,7 +299,7 @@ do_sasl_bind(LDAP *ld, sasl_conn_t *conn, const char **clientout, expected_data = sasl_result == SASL_CONTINUE; if (have_data && !expected_data) { - warn(LOGOPT_ANY, + warn(logopt, "The LDAP server sent data in response to our " "bind request, but indicated that the bind was " "complete. LDAP SASL bind with mechansim %s " @@ -308,7 +308,7 @@ do_sasl_bind(LDAP *ld, sasl_conn_t *conn, const char **clientout, break; } if (expected_data && !have_data) { - warn(LOGOPT_ANY, + warn(logopt, "The LDAP server indicated that the LDAP SASL " "bind was incomplete, but did not provide the " "required data to proceed. LDAP SASL bind with " @@ -340,7 +340,7 @@ do_sasl_bind(LDAP *ld, sasl_conn_t *conn, const char **clientout, */ if ((*clientoutlen > 0) && (bind_result != LDAP_SASL_BIND_IN_PROGRESS)) { - warn(LOGOPT_ANY, + warn(logopt, "We have data for the server, " "but it thinks we are done!"); /* XXX should print out debug data here */ @@ -372,7 +372,7 @@ do_sasl_bind(LDAP *ld, sasl_conn_t *conn, const char **clientout, * Upon failure, -1 is returned. */ int -sasl_do_kinit(struct lookup_context *ctxt) +sasl_do_kinit(unsigned logopt, struct lookup_context *ctxt) { krb5_error_code ret; krb5_principal tgs_princ, krb5_client_princ = ctxt->krb5_client_princ; @@ -384,33 +384,33 @@ sasl_do_kinit(struct lookup_context *ctxt) return 0; ctxt->kinit_done = 1; - debug(LOGOPT_NONE, + debug(logopt, "initializing kerberos ticket: client principal %s ", ctxt->client_princ ? "" : "autofsclient"); ret = krb5_init_context(&ctxt->krb5ctxt); if (ret) { - error(LOGOPT_ANY, "krb5_init_context failed with %d", ret); + error(logopt, "krb5_init_context failed with %d", ret); return -1; } ret = krb5_cc_resolve(ctxt->krb5ctxt, krb5ccval, &ctxt->krb5_ccache); if (ret) { - error(LOGOPT_ANY, "krb5_cc_resolve failed with error %d", + error(logopt, "krb5_cc_resolve failed with error %d", ret); krb5_free_context(ctxt->krb5ctxt); return -1; } if (ctxt->client_princ) { - debug(LOGOPT_NONE, + debug(logopt, "calling krb5_parse_name on client principal %s", ctxt->client_princ); ret = krb5_parse_name(ctxt->krb5ctxt, ctxt->client_princ, &krb5_client_princ); if (ret) { - error(LOGOPT_ANY, + error(logopt, "krb5_parse_name failed for " "specified client principal %s", ctxt->client_princ); @@ -419,14 +419,14 @@ sasl_do_kinit(struct lookup_context *ctxt) } else { char *tmp_name = NULL; - debug(LOGOPT_NONE, + debug(logopt, "calling krb5_sname_to_principal using defaults"); ret = krb5_sname_to_principal(ctxt->krb5ctxt, NULL, "autofsclient", KRB5_NT_SRV_HST, &krb5_client_princ); if (ret) { - error(LOGOPT_ANY, + error(logopt, "krb5_sname_to_principal failed for " "%s with error %d", ctxt->client_princ ? "" : "autofsclient", ret); @@ -437,13 +437,13 @@ sasl_do_kinit(struct lookup_context *ctxt) ret = krb5_unparse_name(ctxt->krb5ctxt, krb5_client_princ, &tmp_name); if (ret) { - debug(LOGOPT_NONE, + debug(logopt, "krb5_unparse_name failed with error %d", ret); goto out_cleanup_cc; } - debug(LOGOPT_NONE, + debug(logopt, "principal used for authentication: \"%s\"", tmp_name); krb5_free_unparsed_name(ctxt->krb5ctxt, tmp_name); @@ -458,19 +458,19 @@ sasl_do_kinit(struct lookup_context *ctxt) krb5_princ_realm(ctxt->krb5ctxt, krb5_client_princ)->data, 0); if (ret) { - error(LOGOPT_ANY, + error(logopt, "krb5_build_principal failed with error %d", ret); goto out_cleanup_cc; } ret = krb5_unparse_name(ctxt->krb5ctxt, tgs_princ, &tgs_name); if (ret) { - error(LOGOPT_ANY, "krb5_unparse_name failed with error %d", + error(logopt, "krb5_unparse_name failed with error %d", ret); goto out_cleanup_cc; } - debug(LOGOPT_NONE, "Using tgs name %s", tgs_name); + debug(logopt, "Using tgs name %s", tgs_name); memset(&my_creds, 0, sizeof(my_creds)); ret = krb5_get_init_creds_keytab(ctxt->krb5ctxt, &my_creds, @@ -479,7 +479,7 @@ sasl_do_kinit(struct lookup_context *ctxt) 0 /* relative start time */, tgs_name, NULL); if (ret) { - error(LOGOPT_ANY, + error(logopt, "krb5_get_init_creds_keytab failed with error %d", ret); goto out_cleanup_unparse; @@ -500,7 +500,7 @@ sasl_do_kinit(struct lookup_context *ctxt) fatal(status); if (ret) { - error(LOGOPT_ANY, + error(logopt, "krb5_cc_initialize failed with error %d", ret); goto out_cleanup_unparse; } @@ -508,7 +508,7 @@ sasl_do_kinit(struct lookup_context *ctxt) /* and store credentials for that principal */ ret = krb5_cc_store_cred(ctxt->krb5ctxt, ctxt->krb5_ccache, &my_creds); if (ret) { - error(LOGOPT_ANY, + error(logopt, "krb5_cc_store_cred failed with error %d", ret); goto out_cleanup_unparse; } @@ -516,12 +516,12 @@ sasl_do_kinit(struct lookup_context *ctxt) /* finally, set the environment variable to point to our * credentials cache */ if (setenv(krb5ccenv, krb5ccval, 1) != 0) { - error(LOGOPT_ANY, "setenv failed with %d", errno); + error(logopt, "setenv failed with %d", errno); goto out_cleanup_unparse; } ctxt->kinit_successful = 1; - debug(LOGOPT_NONE, "Kerberos authentication was successful!"); + debug(logopt, "Kerberos authentication was successful!"); krb5_free_unparsed_name(ctxt->krb5ctxt, tgs_name); @@ -540,7 +540,7 @@ out_cleanup_cc: else ret = krb5_cc_destroy(ctxt->krb5ctxt, ctxt->krb5_ccache); if (ret) - warn(LOGOPT_ANY, + warn(logopt, "krb5_cc_destroy failed with non-fatal error %d", ret); status = pthread_mutex_unlock(&krb5cc_mutex); @@ -559,7 +559,7 @@ out_cleanup_cc: * Returns a valid sasl_conn_t pointer upon success, NULL on failure. */ sasl_conn_t * -sasl_bind_mech(LDAP *ldap, struct lookup_context *ctxt, const char *mech) +sasl_bind_mech(unsigned logopt, LDAP *ldap, struct lookup_context *ctxt, const char *mech) { sasl_conn_t *conn; char *tmp, *host = NULL; @@ -569,15 +569,15 @@ sasl_bind_mech(LDAP *ldap, struct lookup_context *ctxt, const char *mech) int result; if (!strncmp(mech, "GSSAPI", 6)) { - if (sasl_do_kinit(ctxt) != 0) + if (sasl_do_kinit(logopt, ctxt) != 0) return NULL; } - debug(LOGOPT_NONE, "Attempting sasl bind with mechanism %s", mech); + debug(logopt, "Attempting sasl bind with mechanism %s", mech); result = ldap_get_option(ldap, LDAP_OPT_HOST_NAME, &host); if (result != LDAP_SUCCESS || !host) { - debug(LOGOPT_NONE, "failed to get hostname for connection"); + debug(logopt, "failed to get hostname for connection"); return NULL; } @@ -587,7 +587,7 @@ sasl_bind_mech(LDAP *ldap, struct lookup_context *ctxt, const char *mech) /* Create a new authentication context for the service. */ result = sasl_client_new("ldap", host, NULL, NULL, NULL, 0, &conn); if (result != SASL_OK) { - error(LOGOPT_ANY, "sasl_client_new failed with error %d", + error(logopt, "sasl_client_new failed with error %d", result); ldap_memfree(host); return NULL; @@ -599,23 +599,23 @@ sasl_bind_mech(LDAP *ldap, struct lookup_context *ctxt, const char *mech) /* OK and CONTINUE are the only non-fatal return codes here. */ if ((result != SASL_OK) && (result != SASL_CONTINUE)) { - error(LOGOPT_ANY, "sasl_client start failed with error: %s", + error(logopt, "sasl_client start failed with error: %s", sasl_errdetail(conn)); ldap_memfree(host); sasl_dispose(&conn); return NULL; } - result = do_sasl_bind(ldap, conn, + result = do_sasl_bind(logopt, ldap, conn, &clientout, &clientoutlen, chosen_mech, result); if (result == 0) { ldap_memfree(host); - debug(LOGOPT_NONE, "sasl bind with mechanism %s succeeded", + debug(logopt, "sasl bind with mechanism %s succeeded", chosen_mech); return conn; } - info(LOGOPT_ANY, "sasl bind with mechanism %s failed", mech); + info(logopt, "sasl bind with mechanism %s failed", mech); /* sasl bind failed */ ldap_memfree(host); @@ -629,14 +629,14 @@ sasl_bind_mech(LDAP *ldap, struct lookup_context *ctxt, const char *mech) * -1 on error or if no mechanism is supported by both client and server. */ sasl_conn_t * -sasl_choose_mech(LDAP *ldap, struct lookup_context *ctxt) +sasl_choose_mech(unsigned logopt, LDAP *ldap, struct lookup_context *ctxt) { sasl_conn_t *conn; int authenticated; int i; char **mechanisms; - mechanisms = get_server_SASL_mechanisms(ldap); + mechanisms = get_server_SASL_mechanisms(logopt, ldap); if (!mechanisms) return NULL; @@ -652,12 +652,11 @@ sasl_choose_mech(LDAP *ldap, struct lookup_context *ctxt) if (authtype_requires_creds(mechanisms[i])) continue; - conn = sasl_bind_mech(ldap, ctxt, mechanisms[i]); + conn = sasl_bind_mech(logopt, ldap, ctxt, mechanisms[i]); if (conn) { ctxt->sasl_mech = strdup(mechanisms[i]); if (!ctxt->sasl_mech) { - crit(LOGOPT_ANY, - "Successfully authenticated with " + crit(logopt, "Successfully authenticated with " "mechanism %s, but failed to allocate " "memory to hold the mechanism type.", mechanisms[i]); @@ -668,11 +667,11 @@ sasl_choose_mech(LDAP *ldap, struct lookup_context *ctxt) authenticated = 1; break; } - debug(LOGOPT_NONE, "Failed to authenticate with mech %s", + debug(logopt, "Failed to authenticate with mech %s", mechanisms[i]); } - debug(LOGOPT_NONE, "authenticated: %d, sasl_mech: %s", + debug(logopt, "authenticated: %d, sasl_mech: %s", authenticated, ctxt->sasl_mech); ldap_value_free(mechanisms); @@ -680,14 +679,14 @@ sasl_choose_mech(LDAP *ldap, struct lookup_context *ctxt) } int -autofs_sasl_bind(LDAP *ldap, struct lookup_context *ctxt) +autofs_sasl_bind(unsigned logopt, LDAP *ldap, struct lookup_context *ctxt) { sasl_conn_t *conn; if (!ctxt->sasl_mech) return -1; - conn = sasl_bind_mech(ldap, ctxt, ctxt->sasl_mech); + conn = sasl_bind_mech(logopt, ldap, ctxt, ctxt->sasl_mech); if (!conn) return -1; @@ -717,13 +716,13 @@ autofs_sasl_unbind(struct lookup_context *ctxt) * -1 - Failure */ int -autofs_sasl_init(LDAP *ldap, struct lookup_context *ctxt) +autofs_sasl_init(unsigned logopt, LDAP *ldap, struct lookup_context *ctxt) { sasl_conn_t *conn; /* Start up Cyrus SASL--only needs to be done once. */ if (sasl_client_init(callbacks) != SASL_OK) { - error(LOGOPT_ANY, "sasl_client_init failed"); + error(logopt, "sasl_client_init failed"); return -1; } @@ -736,9 +735,9 @@ autofs_sasl_init(LDAP *ldap, struct lookup_context *ctxt) * select one. */ if (ctxt->sasl_mech) - conn = sasl_bind_mech(ldap, ctxt, ctxt->sasl_mech); + conn = sasl_bind_mech(logopt, ldap, ctxt, ctxt->sasl_mech); else - conn = sasl_choose_mech(ldap, ctxt); + conn = sasl_choose_mech(logopt, ldap, ctxt); if (conn) { sasl_dispose(&conn); @@ -772,8 +771,7 @@ autofs_sasl_done(struct lookup_context *ctxt) else ret = krb5_cc_destroy(ctxt->krb5ctxt, ctxt->krb5_ccache); if (ret) - warn(LOGOPT_ANY, - "krb5_cc_destroy failed with non-fatal error %d", + logmsg("krb5_cc_destroy failed with non-fatal error %d", ret); status = pthread_mutex_unlock(&krb5cc_mutex); @@ -782,8 +780,7 @@ autofs_sasl_done(struct lookup_context *ctxt) krb5_free_context(ctxt->krb5ctxt); if (unsetenv(krb5ccenv) != 0) - warn(LOGOPT_ANY, - "unsetenv failed with error %d", errno); + logerr("unsetenv failed with error %d", errno); ctxt->krb5ctxt = NULL; ctxt->krb5_ccache = NULL; diff --git a/modules/lookup_file.c b/modules/lookup_file.c index 31ee0fb..921b32b 100644 --- a/modules/lookup_file.c +++ b/modules/lookup_file.c @@ -63,13 +63,13 @@ int lookup_init(const char *mapfmt, int argc, const char *const *argv, void **co ctxt = malloc(sizeof(struct lookup_context)); if (!ctxt) { char *estr = strerror_r(errno, buf, MAX_ERR_BUF); - crit(LOGOPT_ANY, MODPREFIX "malloc: %s", estr); + logerr(MODPREFIX "malloc: %s", estr); return 1; } if (argc < 1) { free(ctxt); - crit(LOGOPT_ANY, MODPREFIX "No map name"); + logerr(MODPREFIX "No map name"); return 1; } @@ -77,21 +77,21 @@ int lookup_init(const char *mapfmt, int argc, const char *const *argv, void **co if (ctxt->mapname[0] != '/') { free(ctxt); - msg(MODPREFIX "file map %s is not an absolute pathname", - argv[0]); + logmsg(MODPREFIX + "file map %s is not an absolute pathname", argv[0]); return 1; } if (access(ctxt->mapname, R_OK)) { free(ctxt); - msg(MODPREFIX "file map %s missing or not readable", - argv[0]); + warn(LOGOPT_NONE, MODPREFIX + "file map %s missing or not readable", argv[0]); return 1; } if (stat(ctxt->mapname, &st)) { free(ctxt); - crit(LOGOPT_ANY, MODPREFIX "file map %s, could not stat", + logmsg(MODPREFIX "file map %s, could not stat", argv[0]); return 1; } @@ -104,7 +104,7 @@ int lookup_init(const char *mapfmt, int argc, const char *const *argv, void **co ctxt->parse = open_parse(mapfmt, MODPREFIX, argc - 1, argv + 1); if (!ctxt->parse) { free(ctxt); - crit(LOGOPT_ANY, MODPREFIX "failed to open parse context"); + logmsg(MODPREFIX "failed to open parse context"); return 1; } *context = ctxt; @@ -112,7 +112,7 @@ int lookup_init(const char *mapfmt, int argc, const char *const *argv, void **co return 0; } -static int read_one(FILE *f, char *key, unsigned int *k_len, char *mapent, unsigned int *m_len) +static int read_one(unsigned logopt, FILE *f, char *key, unsigned int *k_len, char *mapent, unsigned int *m_len) { char *kptr, *p; int mapent_len, key_len; @@ -193,7 +193,7 @@ static int read_one(FILE *f, char *key, unsigned int *k_len, char *mapent, unsig if (gotten == got_plus) goto got_it; else if (escape == esc_all) { - warn(LOGOPT_ANY, MODPREFIX + warn(logopt, MODPREFIX "unmatched \" in map key %s", key); goto next; } else if (escape != esc_val) @@ -208,7 +208,7 @@ static int read_one(FILE *f, char *key, unsigned int *k_len, char *mapent, unsig if (key_len == KEY_MAX_LEN) { state = st_badent; gotten = got_nothing; - warn(LOGOPT_ANY, + warn(logopt, MODPREFIX "map key \"%s...\" " "is too long. The maximum key " "length is %d", key, @@ -245,7 +245,7 @@ static int read_one(FILE *f, char *key, unsigned int *k_len, char *mapent, unsig state = st_begin; if (gotten == got_real || gotten == getting) goto got_it; - warn(LOGOPT_ANY, MODPREFIX + warn(logopt, MODPREFIX "bad map entry \"%s...\" for key " "\"%s\"", mapent, key); goto next; @@ -286,7 +286,7 @@ static int read_one(FILE *f, char *key, unsigned int *k_len, char *mapent, unsig if (ch == '\n') { if (escape == esc_all) { state = st_begin; - warn(LOGOPT_ANY, MODPREFIX + warn(logopt, MODPREFIX "unmatched \" in %s for key %s", mapent, key); goto next; @@ -310,7 +310,7 @@ static int read_one(FILE *f, char *key, unsigned int *k_len, char *mapent, unsig goto got_it; ungetc(nch, f); } else { - warn(LOGOPT_ANY, + warn(logopt, MODPREFIX "map entry \"%s...\" for key " "\"%s\" is too long. The maximum entry" " size is %d", mapent, key, @@ -388,6 +388,7 @@ int lookup_read_master(struct master *master, time_t age, void *context) struct lookup_context *ctxt = (struct lookup_context *) context; unsigned int timeout = master->default_timeout; unsigned int logging = master->default_logging; + unsigned int logopt = master->logopt; char *buffer; int blen; char *path; @@ -402,29 +403,28 @@ int lookup_read_master(struct master *master, time_t age, void *context) return NSS_STATUS_UNAVAIL; if (master->depth > MAX_INCLUDE_DEPTH) { - error(LOGOPT_ANY, - MODPREFIX + error(logopt, MODPREFIX "maximum include depth exceeded %s", master->name); return NSS_STATUS_UNAVAIL; } path = alloca(KEY_MAX_LEN + 1); if (!path) { - error(LOGOPT_ANY, + error(logopt, MODPREFIX "could not malloc storage for path"); return NSS_STATUS_UNAVAIL; } ent = alloca(MAPENT_MAX_LEN + 1); if (!ent) { - error(LOGOPT_ANY, + error(logopt, MODPREFIX "could not malloc storage for mapent"); return NSS_STATUS_UNAVAIL; } f = fopen(ctxt->mapname, "r"); if (!f) { - error(LOGOPT_ANY, + error(logopt, MODPREFIX "could not open master map file %s", ctxt->mapname); return NSS_STATUS_UNAVAIL; @@ -438,19 +438,19 @@ int lookup_read_master(struct master *master, time_t age, void *context) } while(1) { - entry = read_one(f, path, &path_len, ent, &ent_len); + entry = read_one(logopt, f, path, &path_len, ent, &ent_len); if (!entry) { if (feof(f)) break; if (ferror(f)) { - warn(LOGOPT_ANY, MODPREFIX + warn(logopt, MODPREFIX "error reading map %s", ctxt->mapname); break; } continue; } - debug(LOGOPT_NONE, MODPREFIX "read entry %s", path); + debug(logopt, MODPREFIX "read entry %s", path); /* * If key starts with '+' it has to be an @@ -470,7 +470,7 @@ int lookup_read_master(struct master *master, time_t age, void *context) master->depth++; status = lookup_nss_read_master(master, age); if (!status) - warn(LOGOPT_ANY, + warn(logopt, MODPREFIX "failed to read included master map %s", master->name); @@ -482,7 +482,7 @@ int lookup_read_master(struct master *master, time_t age, void *context) blen = path_len + 1 + ent_len + 1; buffer = malloc(blen); if (!buffer) { - error(LOGOPT_ANY, + error(logopt, MODPREFIX "could not malloc parse buffer"); return NSS_STATUS_UNAVAIL; } @@ -503,7 +503,7 @@ int lookup_read_master(struct master *master, time_t age, void *context) } if (fstat(fd, &st)) { - crit(LOGOPT_ANY, MODPREFIX "file map %s, could not stat", + crit(logopt, MODPREFIX "file map %s, could not stat", ctxt->mapname); return NSS_STATUS_UNAVAIL; } @@ -684,12 +684,12 @@ int lookup_read_map(struct autofs_point *ap, time_t age, void *context) } while(1) { - entry = read_one(f, key, &k_len, mapent, &m_len); + entry = read_one(ap->logopt, f, key, &k_len, mapent, &m_len); if (!entry) { if (feof(f)) break; if (ferror(f)) { - warn(LOGOPT_ANY, MODPREFIX + warn(ap->logopt, MODPREFIX "error reading map %s", ctxt->mapname); break; } @@ -791,7 +791,7 @@ static int lookup_one(struct autofs_point *ap, } while(1) { - entry = read_one(f, mkey, &k_len, mapent, &m_len); + entry = read_one(ap->logopt, f, mkey, &k_len, mapent, &m_len); if (entry) { /* * If key starts with '+' it has to be an @@ -860,7 +860,7 @@ static int lookup_one(struct autofs_point *ap, break; if (ferror(f)) { - warn(LOGOPT_ANY, MODPREFIX + warn(ap->logopt, MODPREFIX "error reading map %s", ctxt->mapname); break; } @@ -904,7 +904,7 @@ static int lookup_wild(struct autofs_point *ap, struct lookup_context *ctxt) } while(1) { - entry = read_one(f, mkey, &k_len, mapent, &m_len); + entry = read_one(ap->logopt, f, mkey, &k_len, mapent, &m_len); if (entry) { int eq; @@ -925,7 +925,7 @@ static int lookup_wild(struct autofs_point *ap, struct lookup_context *ctxt) break; if (ferror(f)) { - warn(LOGOPT_ANY, MODPREFIX + warn(ap->logopt, MODPREFIX "error reading map %s", ctxt->mapname); break; } diff --git a/modules/lookup_hesiod.c b/modules/lookup_hesiod.c index f30e9b2..649e24c 100644 --- a/modules/lookup_hesiod.c +++ b/modules/lookup_hesiod.c @@ -48,7 +48,7 @@ int lookup_init(const char *mapfmt, int argc, const char *const *argv, void **co ctxt = malloc(sizeof(struct lookup_context)); if (!ctxt) { char *estr = strerror_r(errno, buf, MAX_ERR_BUF); - crit(LOGOPT_ANY, MODPREFIX "malloc: %s", estr); + logerr(MODPREFIX "malloc: %s", estr); return 1; } @@ -58,7 +58,7 @@ int lookup_init(const char *mapfmt, int argc, const char *const *argv, void **co /* Initialize the hesiod context. */ if (hesiod_init(&(ctxt->hesiod_context)) != 0) { char *estr = strerror_r(errno, buf, MAX_ERR_BUF); - crit(LOGOPT_ANY, MODPREFIX "hesiod_init(): %s", estr); + logerr(MODPREFIX "hesiod_init(): %s", estr); free(ctxt); return 1; } @@ -70,7 +70,7 @@ int lookup_init(const char *mapfmt, int argc, const char *const *argv, void **co /* Open the parser, if we can. */ ctxt->parser = open_parse(mapfmt, MODPREFIX, argc - 1, argv + 1); if (!ctxt->parser) { - crit(LOGOPT_ANY, MODPREFIX "failed to open parse context"); + logerr(MODPREFIX "failed to open parse context"); free(ctxt); return 1; } diff --git a/modules/lookup_hosts.c b/modules/lookup_hosts.c index d711611..d746e42 100644 --- a/modules/lookup_hosts.c +++ b/modules/lookup_hosts.c @@ -57,7 +57,7 @@ int lookup_init(const char *mapfmt, int argc, const char *const *argv, void **co ctxt = malloc(sizeof(struct lookup_context)); if (!ctxt) { char *estr = strerror_r(errno, buf, MAX_ERR_BUF); - crit(LOGOPT_ANY, MODPREFIX "malloc: %s", estr); + logerr(MODPREFIX "malloc: %s", estr); return 1; } @@ -65,7 +65,7 @@ int lookup_init(const char *mapfmt, int argc, const char *const *argv, void **co ctxt->parse = open_parse(mapfmt, MODPREFIX, argc, argv); if (!ctxt->parse) { - crit(LOGOPT_ANY, MODPREFIX "failed to open parse context"); + logerr(MODPREFIX "failed to open parse context"); free(ctxt); return 1; } @@ -94,7 +94,7 @@ int lookup_read_map(struct autofs_point *ap, time_t age, void *context) status = pthread_mutex_lock(&hostent_mutex); if (status) { - error(LOGOPT_ANY, MODPREFIX "failed to lock hostent mutex"); + error(ap->logopt, MODPREFIX "failed to lock hostent mutex"); return NSS_STATUS_UNAVAIL; } @@ -110,7 +110,7 @@ int lookup_read_map(struct autofs_point *ap, time_t age, void *context) status = pthread_mutex_unlock(&hostent_mutex); if (status) - error(LOGOPT_ANY, MODPREFIX "failed to unlock hostent mutex"); + error(ap->logopt, MODPREFIX "failed to unlock hostent mutex"); source->age = age; @@ -157,10 +157,10 @@ int lookup_mount(struct autofs_point *ap, const char *name, int name_len, void * } if (*name == '/') - msg(MODPREFIX + info(ap->logopt, MODPREFIX "can't find path in hosts map %s", name); else - msg(MODPREFIX + info(ap->logopt, MODPREFIX "can't find path in hosts map %s/%s", ap->path, name); @@ -216,7 +216,7 @@ done: if (!mapent) { char *estr; estr = strerror_r(errno, buf, MAX_ERR_BUF); - crit(ap->logopt, MODPREFIX "malloc: %s", estr); + logerr(MODPREFIX "malloc: %s", estr); rpc_exports_free(exp); return NSS_STATUS_UNAVAIL; } @@ -230,7 +230,7 @@ done: if (!mapent) { char *estr; estr = strerror_r(errno, buf, MAX_ERR_BUF); - crit(ap->logopt, MODPREFIX "malloc: %s", estr); + logerr(MODPREFIX "malloc: %s", estr); rpc_exports_free(exp); return NSS_STATUS_UNAVAIL; } diff --git a/modules/lookup_ldap.c b/modules/lookup_ldap.c index c0f228b..00215af 100644 --- a/modules/lookup_ldap.c +++ b/modules/lookup_ldap.c @@ -49,9 +49,9 @@ static struct ldap_schema common_schema[] = { }; static unsigned int common_schema_count = sizeof(common_schema)/sizeof(struct ldap_schema); -static LDAP *auth_init(const char *, struct lookup_context *); +static LDAP *auth_init(unsigned logopt, const char *, struct lookup_context *); -int bind_ldap_anonymous(LDAP *ldap, struct lookup_context *ctxt) +int bind_ldap_anonymous(unsigned logopt, LDAP *ldap, struct lookup_context *ctxt) { int rv; @@ -62,15 +62,14 @@ int bind_ldap_anonymous(LDAP *ldap, struct lookup_context *ctxt) if (rv != LDAP_SUCCESS) { if (!ctxt->uri) { - crit(LOGOPT_ANY, - MODPREFIX "Unable to bind to the LDAP server: " + crit(logopt, MODPREFIX + "Unable to bind to the LDAP server: " "%s, error %s", ctxt->server ? "" : "(default)", ldap_err2string(rv)); } else { struct ldap_uri *uri; uri = list_entry(ctxt->uri->next, struct ldap_uri, list); - warn(LOGOPT_ANY, - MODPREFIX "Unable to bind to the LDAP server: " + info(logopt, MODPREFIX "Unable to bind to the LDAP server: " "%s, error %s", uri->uri, ldap_err2string(rv)); } return -1; @@ -79,12 +78,11 @@ int bind_ldap_anonymous(LDAP *ldap, struct lookup_context *ctxt) return 0; } -int unbind_ldap_connection(LDAP *ldap, struct lookup_context *ctxt) +int unbind_ldap_connection(unsigned logopt, LDAP *ldap, struct lookup_context *ctxt) { int rv; #ifdef WITH_SASL - debug(LOGOPT_NONE, "use_tls: %d", ctxt->use_tls); /* * The OpenSSL library can't handle having its message and error * string database loaded multiple times and segfaults if the @@ -102,13 +100,12 @@ int unbind_ldap_connection(LDAP *ldap, struct lookup_context *ctxt) rv = ldap_unbind_ext(ldap, NULL, NULL); if (rv != LDAP_SUCCESS) - error(LOGOPT_ANY, - "unbind failed: %s", ldap_err2string(rv)); + error(logopt, "unbind failed: %s", ldap_err2string(rv)); return rv; } -LDAP *init_ldap_connection(const char *uri, struct lookup_context *ctxt) +LDAP *init_ldap_connection(unsigned logopt, const char *uri, struct lookup_context *ctxt) { LDAP *ldap = NULL; struct timeval timeout = { ctxt->timeout, 0 }; @@ -120,9 +117,9 @@ LDAP *init_ldap_connection(const char *uri, struct lookup_context *ctxt) /* Initialize the LDAP context. */ rv = ldap_initialize(&ldap, uri); if (rv != LDAP_OPT_SUCCESS) { - crit(LOGOPT_ANY, - MODPREFIX "couldn't initialize LDAP connection to %s", - uri ? uri : "default server"); + info(logopt, MODPREFIX + "couldn't initialize LDAP connection to %s", + uri ? uri : "default"); return NULL; } @@ -133,7 +130,7 @@ LDAP *init_ldap_connection(const char *uri, struct lookup_context *ctxt) ldap_unbind_ext(ldap, NULL, NULL); rv = ldap_initialize(&ldap, uri); if (rv != LDAP_OPT_SUCCESS) { - crit(LOGOPT_ANY, MODPREFIX "couldn't initialize LDAP"); + crit(logopt, MODPREFIX "couldn't initialize LDAP"); return NULL; } ctxt->version = 2; @@ -144,7 +141,7 @@ LDAP *init_ldap_connection(const char *uri, struct lookup_context *ctxt) /* Set synchronous call timeout */ rv = ldap_set_option(ldap, LDAP_OPT_TIMEOUT, &timeout); if (rv != LDAP_OPT_SUCCESS) - info(LOGOPT_ANY, MODPREFIX + info(logopt, MODPREFIX "failed to set synchronous call timeout to %d", timeout.tv_sec); } @@ -152,16 +149,14 @@ LDAP *init_ldap_connection(const char *uri, struct lookup_context *ctxt) /* Sane network timeout */ rv = ldap_set_option(ldap, LDAP_OPT_NETWORK_TIMEOUT, &net_timeout); if (rv != LDAP_OPT_SUCCESS) - info(LOGOPT_ANY, - MODPREFIX "failed to set connection timeout to %d", + info(logopt, MODPREFIX "failed to set connection timeout to %d", net_timeout.tv_sec); #ifdef WITH_SASL if (ctxt->use_tls) { if (ctxt->version == 2) { if (ctxt->tls_required) { - error(LOGOPT_ANY, - MODPREFIX + error(logopt, MODPREFIX "TLS required but connection is version 2"); ldap_unbind_ext(ldap, NULL, NULL); return NULL; @@ -171,16 +166,15 @@ LDAP *init_ldap_connection(const char *uri, struct lookup_context *ctxt) rv = ldap_start_tls_s(ldap, NULL, NULL); if (rv != LDAP_SUCCESS) { - unbind_ldap_connection(ldap, ctxt); + unbind_ldap_connection(logopt, ldap, ctxt); if (ctxt->tls_required) { - error(LOGOPT_ANY, - MODPREFIX + error(logopt, MODPREFIX "TLS required but START_TLS failed: %s", ldap_err2string(rv)); return NULL; } ctxt->use_tls = LDAP_TLS_DONT_USE; - ldap = init_ldap_connection(uri, ctxt); + ldap = init_ldap_connection(logopt, uri, ctxt); if (ldap) ctxt->use_tls = LDAP_TLS_INIT; return ldap; @@ -192,7 +186,7 @@ LDAP *init_ldap_connection(const char *uri, struct lookup_context *ctxt) return ldap; } -static int get_query_dn(LDAP *ldap, struct lookup_context *ctxt, const char *class, const char *key) +static int get_query_dn(unsigned logopt, LDAP *ldap, struct lookup_context *ctxt, const char *class, const char *key) { char buf[PARSE_MAX_BUF]; char *query, *dn, *qdn; @@ -206,7 +200,7 @@ static int get_query_dn(LDAP *ldap, struct lookup_context *ctxt, const char *cla attrs[1] = NULL; if (!ctxt->mapname && !ctxt->base) { - error(LOGOPT_ANY, MODPREFIX "no master map to lookup"); + error(logopt, MODPREFIX "no master map to lookup"); return 0; } @@ -218,7 +212,7 @@ static int get_query_dn(LDAP *ldap, struct lookup_context *ctxt, const char *cla query = alloca(l); if (query == NULL) { char *estr = strerror_r(errno, buf, MAX_ERR_BUF); - crit(LOGOPT_ANY, MODPREFIX "alloca: %s", estr); + crit(logopt, MODPREFIX "alloca: %s", estr); return NSS_STATUS_UNAVAIL; } @@ -229,14 +223,14 @@ static int get_query_dn(LDAP *ldap, struct lookup_context *ctxt, const char *cla if (ctxt->mapname) { if (sprintf(query, "(&(objectclass=%s)(%s=%.*s))", class, key, (int) strlen(ctxt->mapname), ctxt->mapname) >= l) { - debug(LOGOPT_NONE, + debug(logopt, MODPREFIX "error forming query string"); return 0; } scope = LDAP_SCOPE_SUBTREE; } else { if (sprintf(query, "(objectclass=%s)", class) >= l) { - debug(LOGOPT_NONE, + debug(logopt, MODPREFIX "error forming query string"); return 0; } @@ -259,15 +253,14 @@ static int get_query_dn(LDAP *ldap, struct lookup_context *ctxt, const char *cla else { struct ldap_searchdn *this = ctxt->sdns; - debug(LOGOPT_NONE, MODPREFIX - "check search base list"); + debug(logopt, MODPREFIX "check search base list"); while (this) { rv = ldap_search_s(ldap, this->basedn, scope, query, attrs, 0, &result); if ((rv == LDAP_SUCCESS) && result) { - debug(LOGOPT_NONE, MODPREFIX + debug(logopt, MODPREFIX "found search base under %s", this->basedn); break; @@ -283,7 +276,7 @@ static int get_query_dn(LDAP *ldap, struct lookup_context *ctxt, const char *cla } if ((rv != LDAP_SUCCESS) || !result) { - error(LOGOPT_NONE, + error(logopt, MODPREFIX "query failed for %s: %s", query, ldap_err2string(rv)); return 0; @@ -292,9 +285,9 @@ static int get_query_dn(LDAP *ldap, struct lookup_context *ctxt, const char *cla e = ldap_first_entry(ldap, result); if (e) { dn = ldap_get_dn(ldap, e); - debug(LOGOPT_NONE, MODPREFIX "found query dn %s", dn); + debug(logopt, MODPREFIX "found query dn %s", dn); } else { - debug(LOGOPT_NONE, + debug(logopt, MODPREFIX "query succeeded, no matches for %s", query); ldap_msgfree(result); @@ -373,7 +366,7 @@ static struct ldap_schema *alloc_common_schema(struct ldap_schema *s) return schema; } -static int find_query_dn(LDAP *ldap, struct lookup_context *ctxt) +static int find_query_dn(unsigned logopt, LDAP *ldap, struct lookup_context *ctxt) { struct ldap_schema *schema; unsigned int i; @@ -384,11 +377,10 @@ static int find_query_dn(LDAP *ldap, struct lookup_context *ctxt) for (i = 0; i < common_schema_count; i++) { const char *class = common_schema[i].map_class; const char *key = common_schema[i].map_attr; - if (get_query_dn(ldap, ctxt, class, key)) { + if (get_query_dn(logopt, ldap, ctxt, class, key)) { schema = alloc_common_schema(&common_schema[i]); if (!schema) { - error(LOGOPT_ANY, - MODPREFIX "failed to allocate schema"); + error(logopt, MODPREFIX "failed to allocate schema"); return 0; } ctxt->schema = schema; @@ -399,28 +391,26 @@ static int find_query_dn(LDAP *ldap, struct lookup_context *ctxt) return 0; } -static int do_bind(LDAP *ldap, struct lookup_context *ctxt) +static int do_bind(unsigned logopt, LDAP *ldap, struct lookup_context *ctxt) { char *host = NULL, *nhost; int rv, need_base = 1; #ifdef WITH_SASL - debug(LOGOPT_NONE, "auth_required: %d, sasl_mech %s", + debug(logopt, MODPREFIX "auth_required: %d, sasl_mech %s", ctxt->auth_required, ctxt->sasl_mech); if (ctxt->sasl_mech || (ctxt->auth_required & (LDAP_AUTH_REQUIRED|LDAP_AUTH_AUTODETECT))) { - rv = autofs_sasl_bind(ldap, ctxt); - debug(LOGOPT_NONE, MODPREFIX - "autofs_sasl_bind returned %d", rv); + rv = autofs_sasl_bind(logopt, ldap, ctxt); + debug(logopt, MODPREFIX "autofs_sasl_bind returned %d", rv); } else { - rv = bind_ldap_anonymous(ldap, ctxt); - debug(LOGOPT_NONE, - MODPREFIX "ldap anonymous bind returned %d", rv); + rv = bind_ldap_anonymous(logopt, ldap, ctxt); + debug(logopt, MODPREFIX "ldap anonymous bind returned %d", rv); } #else - rv = bind_ldap_anonymous(ldap, ctxt); - debug(LOGOPT_NONE, MODPREFIX "ldap anonymous bind returned %d", rv); + rv = bind_ldap_anonymous(logopt, ldap, ctxt); + debug(logopt, MODPREFIX "ldap anonymous bind returned %d", rv); #endif if (rv != 0) @@ -428,13 +418,13 @@ static int do_bind(LDAP *ldap, struct lookup_context *ctxt) rv = ldap_get_option(ldap, LDAP_OPT_HOST_NAME, &host); if (rv != LDAP_SUCCESS || !host) { - debug(LOGOPT_ANY, "failed to get hostname for connection"); + debug(logopt, "failed to get hostname for connection"); return 0; } nhost = strdup(host); if (!nhost) { - debug(LOGOPT_ANY, "failed to alloc context for hostname"); + debug(logopt, "failed to alloc context for hostname"); return 0; } ldap_memfree(host); @@ -463,16 +453,16 @@ static int do_bind(LDAP *ldap, struct lookup_context *ctxt) * base dn for searches. */ if (!ctxt->schema) { - if (!find_query_dn(ldap, ctxt)) { - error(LOGOPT_ANY, - MODPREFIX "failed to find valid query dn"); + if (!find_query_dn(logopt, ldap, ctxt)) { + warn(logopt, + MODPREFIX "failed to find valid query dn"); return 0; } } else { const char *class = ctxt->schema->map_class; const char *key = ctxt->schema->map_attr; - if (!get_query_dn(ldap, ctxt, class, key)) { - error(LOGOPT_ANY, MODPREFIX "failed to get query dn"); + if (!get_query_dn(logopt, ldap, ctxt, class, key)) { + error(logopt, MODPREFIX "failed to get query dn"); return 0; } } @@ -480,23 +470,23 @@ static int do_bind(LDAP *ldap, struct lookup_context *ctxt) return 1; } -static LDAP *do_connect(const char *uri, struct lookup_context *ctxt) +static LDAP *do_connect(unsigned logopt, const char *uri, struct lookup_context *ctxt) { LDAP *ldap; - ldap = init_ldap_connection(uri, ctxt); + ldap = init_ldap_connection(logopt, uri, ctxt); if (!ldap) return NULL; - if (!do_bind(ldap, ctxt)) { - unbind_ldap_connection(ldap, ctxt); + if (!do_bind(logopt, ldap, ctxt)) { + unbind_ldap_connection(logopt, ldap, ctxt); return NULL; } return ldap; } -static LDAP *connect_to_server(const char *uri, struct lookup_context *ctxt) +static LDAP *connect_to_server(unsigned logopt, const char *uri, struct lookup_context *ctxt) { LDAP *ldap; @@ -506,19 +496,19 @@ static LDAP *connect_to_server(const char *uri, struct lookup_context *ctxt) * authentication. */ if (ctxt->auth_required & LDAP_AUTH_REQUIRED) { - ldap = auth_init(uri, ctxt); + ldap = auth_init(logopt, uri, ctxt); if (!ldap && ctxt->auth_required & LDAP_AUTH_AUTODETECT) - warn(LOGOPT_NONE, + info(logopt, "no authentication mechanisms auto detected."); if (!ldap) { - error(LOGOPT_ANY, MODPREFIX + error(logopt, MODPREFIX "cannot initialize authentication setup"); return NULL; } - if (!do_bind(ldap, ctxt)) { - unbind_ldap_connection(ldap, ctxt); - error(LOGOPT_ANY, MODPREFIX "cannot bind to server"); + if (!do_bind(logopt, ldap, ctxt)) { + unbind_ldap_connection(logopt, ldap, ctxt); + error(logopt, MODPREFIX "cannot bind to server"); return NULL; } @@ -526,16 +516,18 @@ static LDAP *connect_to_server(const char *uri, struct lookup_context *ctxt) } #endif - ldap = do_connect(uri, ctxt); + ldap = do_connect(logopt, uri, ctxt); if (!ldap) { - error(LOGOPT_ANY, MODPREFIX "cannot connect to server"); + warn(logopt, + MODPREFIX "couldn't connect to server %s", + uri ? uri : "default"); return NULL; } return ldap; } -static LDAP *find_server(struct lookup_context *ctxt) +static LDAP *find_server(unsigned logopt, struct lookup_context *ctxt) { LDAP *ldap = NULL; struct ldap_uri *this; @@ -547,10 +539,9 @@ static LDAP *find_server(struct lookup_context *ctxt) while(p != ctxt->uri) { this = list_entry(p, struct ldap_uri, list); p = p->next; - debug(LOGOPT_ANY, "check uri %s", this->uri); - ldap = connect_to_server(this->uri, ctxt); + ldap = connect_to_server(logopt, this->uri, ctxt); if (ldap) { - debug(LOGOPT_ANY, "connexted to uri %s", this->uri); + info(logopt, "connected to uri %s", this->uri); break; } list_del_init(&this->list); @@ -568,17 +559,17 @@ static LDAP *find_server(struct lookup_context *ctxt) return ldap; } -static LDAP *do_reconnect(struct lookup_context *ctxt) +static LDAP *do_reconnect(unsigned logopt, struct lookup_context *ctxt) { LDAP *ldap; if (ctxt->server || !ctxt->uri) { - ldap = do_connect(ctxt->server, ctxt); + ldap = do_connect(logopt, ctxt->server, ctxt); return ldap; } else { struct ldap_uri *this; this = list_entry(ctxt->uri->next, struct ldap_uri, list); - ldap = do_connect(this->uri, ctxt); + ldap = do_connect(logopt, this->uri, ctxt); if (ldap) return ldap; /* Failed to connect, put at end of list */ @@ -589,15 +580,15 @@ static LDAP *do_reconnect(struct lookup_context *ctxt) autofs_sasl_done(ctxt); /* Current server failed connect, try the rest */ - ldap = find_server(ctxt); + ldap = find_server(logopt, ctxt); if (!ldap) - error(LOGOPT_ANY, MODPREFIX "failed to find available server"); + error(logopt, MODPREFIX "failed to find available server"); return ldap; } #ifdef WITH_SASL -int get_property(xmlNodePtr node, const char *prop, char **value) +int get_property(unsigned logopt, xmlNodePtr node, const char *prop, char **value) { xmlChar *ret; xmlChar *property = (xmlChar *) prop; @@ -608,8 +599,7 @@ int get_property(xmlNodePtr node, const char *prop, char **value) } if (!(*value = strdup((char *) ret))) { - error(LOGOPT_ANY, - MODPREFIX "strdup failed with %d", errno); + logerr(MODPREFIX "strdup failed with %d", errno); xmlFree(ret); return -1; } @@ -645,7 +635,7 @@ int authtype_requires_creds(const char *authtype) * then no further action is necessary. If it is not, the caller is free * to then use another method to determine how to connect to the server. */ -int parse_ldap_config(struct lookup_context *ctxt) +int parse_ldap_config(unsigned logopt, struct lookup_context *ctxt) { int ret = 0, fallback = 0; unsigned int auth_required = LDAP_AUTH_NOTREQUIRED; @@ -662,7 +652,7 @@ int parse_ldap_config(struct lookup_context *ctxt) auth_conf = (char *) defaults_get_auth_conf_file(); if (!auth_conf) { - error(LOGOPT_ANY, + error(logopt, MODPREFIX "failed to get auth config file name."); return 0; } @@ -687,7 +677,7 @@ int parse_ldap_config(struct lookup_context *ctxt) ctxt->client_princ = NULL; return 0; } - error(LOGOPT_ANY, + error(logopt, MODPREFIX "stat(2) failed with error %s.", strerror(errno)); return 0; @@ -696,8 +686,7 @@ int parse_ldap_config(struct lookup_context *ctxt) if (!S_ISREG(st.st_mode) || st.st_uid != 0 || st.st_gid != 0 || (st.st_mode & 0x01ff) != 0600) { - error(LOGOPT_ANY, - MODPREFIX + error(logopt, MODPREFIX "Configuration file %s exists, but is not usable. " "Please make sure that it is owned by root, group " "is root, and the mode is 0600.", @@ -708,30 +697,29 @@ int parse_ldap_config(struct lookup_context *ctxt) xmlInitParser(); doc = xmlParseFile(auth_conf); if (!doc) { - warn(LOGOPT_ANY, - MODPREFIX "xmlParseFile failed for %s.", auth_conf); + error(logopt, MODPREFIX + "xmlParseFile failed for %s.", auth_conf); goto out; } root = xmlDocGetRootElement(doc); if (!root) { - debug(LOGOPT_ANY, - MODPREFIX "empty xml document (%s).", auth_conf); + debug(logopt, MODPREFIX + "empty xml document (%s).", auth_conf); fallback = 1; goto out; } if (xmlStrcmp(root->name, (const xmlChar *)"autofs_ldap_sasl_conf")) { - error(LOGOPT_ANY, - MODPREFIX + error(logopt, MODPREFIX "The root node of the XML document %s is not " "autofs_ldap_sasl_conf.", auth_conf); goto out; } - ret = get_property(root, "usetls", &usetls); + ret = get_property(logopt, root, "usetls", &usetls); if (ret != 0) { - error(LOGOPT_ANY, + error(logopt, MODPREFIX "Failed read the usetls property from " "the configuration file %s.", auth_conf); @@ -746,7 +734,7 @@ int parse_ldap_config(struct lookup_context *ctxt) else if (!strcasecmp(usetls, "no")) use_tls = LDAP_TLS_DONT_USE; else { - error(LOGOPT_ANY, + error(logopt, MODPREFIX "The usetls property must have value " "\"yes\" or \"no\"."); @@ -756,9 +744,9 @@ int parse_ldap_config(struct lookup_context *ctxt) free(usetls); } - ret = get_property(root, "tlsrequired", &tlsrequired); + ret = get_property(logopt, root, "tlsrequired", &tlsrequired); if (ret != 0) { - error(LOGOPT_ANY, + error(logopt, MODPREFIX "Failed read the tlsrequired property from " "the configuration file %s.", auth_conf); @@ -773,7 +761,7 @@ int parse_ldap_config(struct lookup_context *ctxt) else if (!strcasecmp(tlsrequired, "no")) tls_required = LDAP_TLS_DONT_USE; else { - error(LOGOPT_ANY, + error(logopt, MODPREFIX "The tlsrequired property must have value " "\"yes\" or \"no\"."); @@ -783,9 +771,9 @@ int parse_ldap_config(struct lookup_context *ctxt) free(tlsrequired); } - ret = get_property(root, "authrequired", &authrequired); + ret = get_property(logopt, root, "authrequired", &authrequired); if (ret != 0) { - error(LOGOPT_ANY, + error(logopt, MODPREFIX "Failed read the authrequired property from " "the configuration file %s.", auth_conf); @@ -802,7 +790,7 @@ int parse_ldap_config(struct lookup_context *ctxt) else if (!strcasecmp(authrequired, "autodetect")) auth_required = LDAP_AUTH_AUTODETECT; else { - error(LOGOPT_ANY, + error(logopt, MODPREFIX "The authrequired property must have value " "\"yes\", \"no\" or \"autodetect\"."); @@ -812,9 +800,9 @@ int parse_ldap_config(struct lookup_context *ctxt) free(authrequired); } - ret = get_property(root, "authtype", &authtype); + ret = get_property(logopt, root, "authtype", &authtype); if (ret != 0) { - error(LOGOPT_ANY, + error(logopt, MODPREFIX "Failed read the authtype property from the " "configuration file %s.", auth_conf); @@ -822,10 +810,10 @@ int parse_ldap_config(struct lookup_context *ctxt) } if (authtype && authtype_requires_creds(authtype)) { - ret = get_property(root, "user", &user); - ret |= get_property(root, "secret", &secret); + ret = get_property(logopt, root, "user", &user); + ret |= get_property(logopt, root, "secret", &secret); if (ret != 0 || (!user || !secret)) { - error(LOGOPT_ANY, + error(logopt, MODPREFIX "%s authentication type requires a username " "and a secret. Please fix your configuration " @@ -845,7 +833,7 @@ int parse_ldap_config(struct lookup_context *ctxt) * We allow the admin to specify the principal to use for the * client. The default is "autofsclient/hostname@REALM". */ - (void)get_property(root, "clientprinc", &client_princ); + (void)get_property(logopt, root, "clientprinc", &client_princ); ctxt->auth_conf = auth_conf; ctxt->use_tls = use_tls; @@ -856,15 +844,15 @@ int parse_ldap_config(struct lookup_context *ctxt) ctxt->secret = secret; ctxt->client_princ = client_princ; - debug(LOGOPT_NONE, + debug(logopt, MODPREFIX "ldap authentication configured with the following options:"); - debug(LOGOPT_NONE, + debug(logopt, MODPREFIX "use_tls: %u, " "tls_required: %u, " "auth_required: %u, " "sasl_mech: %s", use_tls, tls_required, auth_required, authtype); - debug(LOGOPT_NONE, + debug(logopt, MODPREFIX "user: %s, " "secret: %s, " "client principal: %s", @@ -889,7 +877,7 @@ out: * Returns ldap connection on success, with authtype, user and secret * filled in as appropriate. Returns NULL on failre. */ -static LDAP *auth_init(const char *uri, struct lookup_context *ctxt) +static LDAP *auth_init(unsigned logopt, const char *uri, struct lookup_context *ctxt) { int ret; LDAP *ldap; @@ -900,11 +888,11 @@ static LDAP *auth_init(const char *uri, struct lookup_context *ctxt) * if the permissions on the file were incorrect, or if the * specified authentication type is not valid. */ - ret = parse_ldap_config(ctxt); + ret = parse_ldap_config(logopt, ctxt); if (ret) return NULL; - ldap = init_ldap_connection(uri, ctxt); + ldap = init_ldap_connection(logopt, uri, ctxt); if (!ldap) return NULL; @@ -916,7 +904,7 @@ static LDAP *auth_init(const char *uri, struct lookup_context *ctxt) * to use. If kerberos is used, it will also take care to initialize * the credential cache and the client and service principals. */ - ret = autofs_sasl_init(ldap, ctxt); + ret = autofs_sasl_init(logopt, ldap, ctxt); if (ret) { ctxt->sasl_mech = NULL; return NULL; @@ -930,7 +918,7 @@ static LDAP *auth_init(const char *uri, struct lookup_context *ctxt) * Take an input string as specified in the master map, and break it * down into a server name and basedn. */ -static int parse_server_string(const char *url, struct lookup_context *ctxt) +static int parse_server_string(unsigned logopt, const char *url, struct lookup_context *ctxt) { char buf[MAX_ERR_BUF], *tmp = NULL, proto[9]; const char *ptr, *name; @@ -939,8 +927,7 @@ static int parse_server_string(const char *url, struct lookup_context *ctxt) memset(proto, 0, 9); ptr = url; - debug(LOGOPT_NONE, - MODPREFIX + debug(logopt, MODPREFIX "Attempting to parse LDAP information from string \"%s\".", ptr); ctxt->port = LDAP_PORT; @@ -974,7 +961,7 @@ static int parse_server_string(const char *url, struct lookup_context *ctxt) if (!tmp) { char *estr; estr = strerror_r(errno, buf, MAX_ERR_BUF); - crit(LOGOPT_ANY, MODPREFIX "malloc: %s", estr); + logerr(MODPREFIX "malloc: %s", estr); return 0; } ctxt->server = tmp; @@ -987,7 +974,7 @@ static int parse_server_string(const char *url, struct lookup_context *ctxt) memcpy(ctxt->server, s, l); ptr = q + 1; } else { - crit(LOGOPT_ANY, + crit(logopt, MODPREFIX "invalid LDAP map syntax %s", ptr); return 0; /* TODO: why did I put this here, the parser shouldn't let this by @@ -996,7 +983,7 @@ static int parse_server_string(const char *url, struct lookup_context *ctxt) if (!tmp) { char *estr; estr = strerror_r(errno, buf, MAX_ERR_BUF); - crit(LOGOPT_ANY, MODPREFIX "malloc: %s", estr); + crit(logopt, MODPREFIX "malloc: %s", estr); return 0; } ctxt->server = tmp; @@ -1014,7 +1001,7 @@ static int parse_server_string(const char *url, struct lookup_context *ctxt) q++; if (*q != ':') { - crit(LOGOPT_ANY, + crit(logopt, MODPREFIX "invalid LDAP map syntax %s", ptr); return 0; } @@ -1031,7 +1018,7 @@ static int parse_server_string(const char *url, struct lookup_context *ctxt) if (!tmp) { char *estr; estr = strerror_r(errno, buf, MAX_ERR_BUF); - crit(LOGOPT_ANY, MODPREFIX "malloc: %s", estr); + logerr(MODPREFIX "malloc: %s", estr); return 0; } ctxt->server = tmp; @@ -1072,7 +1059,7 @@ static int parse_server_string(const char *url, struct lookup_context *ctxt) else { char *estr; estr = strerror_r(errno, buf, MAX_ERR_BUF); - crit(LOGOPT_ANY, MODPREFIX "malloc: %s", estr); + logerr(MODPREFIX "malloc: %s", estr); if (ctxt->server) free(ctxt->server); return 0; @@ -1083,7 +1070,7 @@ static int parse_server_string(const char *url, struct lookup_context *ctxt) if (!base) { char *estr; estr = strerror_r(errno, buf, MAX_ERR_BUF); - crit(LOGOPT_ANY, MODPREFIX "malloc: %s", estr); + logerr(MODPREFIX "malloc: %s", estr); if (ctxt->server) free(ctxt->server); return 0; @@ -1097,7 +1084,7 @@ static int parse_server_string(const char *url, struct lookup_context *ctxt) if (!map) { char *estr; estr = strerror_r(errno, buf, MAX_ERR_BUF); - crit(LOGOPT_ANY, MODPREFIX "malloc: %s", estr); + logerr(MODPREFIX "malloc: %s", estr); if (ctxt->server) free(ctxt->server); return 0; @@ -1109,16 +1096,16 @@ static int parse_server_string(const char *url, struct lookup_context *ctxt) if (!ctxt->server && *proto) { if (!strncmp(proto, "ldaps", 5)) { - warn(LOGOPT_ANY, MODPREFIX + info(logopt, MODPREFIX "server must be given to force ldaps, connection " "will use LDAP client configured protocol"); } } done: if (ctxt->mapname) - debug(LOGOPT_NONE, MODPREFIX "mapname %s", ctxt->mapname); + debug(logopt, MODPREFIX "mapname %s", ctxt->mapname); else - debug(LOGOPT_NONE, MODPREFIX "server \"%s\", base dn \"%s\"", + debug(logopt, MODPREFIX "server \"%s\", base dn \"%s\"", ctxt->server ? ctxt->server : "(default)", ctxt->base); @@ -1175,8 +1162,6 @@ static void validate_uris(struct list_head *list) /* At least we get some basic validation */ if (!ldap_is_ldap_url(this->uri)) { - warn(LOGOPT_ANY, - "removed invalid uri from list, %s", this->uri); list_del(&this->list); free(this->uri); free(this); @@ -1202,7 +1187,7 @@ int lookup_init(const char *mapfmt, int argc, const char *const *argv, void **co ctxt = malloc(sizeof(struct lookup_context)); if (!ctxt) { char *estr = strerror_r(errno, buf, MAX_ERR_BUF); - crit(LOGOPT_ANY, MODPREFIX "malloc: %s", estr); + logerr(MODPREFIX "malloc: %s", estr); return 1; } memset(ctxt, 0, sizeof(struct lookup_context)); @@ -1215,7 +1200,7 @@ int lookup_init(const char *mapfmt, int argc, const char *const *argv, void **co * Parse out the server name and base dn, and fill them * into the proper places in the lookup context structure. */ - if (!parse_server_string(argv[0], ctxt)) { + if (!parse_server_string(LOGOPT_NONE, argv[0], ctxt)) { error(LOGOPT_ANY, MODPREFIX "cannot parse server string"); free_context(ctxt); return 1; @@ -1236,13 +1221,13 @@ int lookup_init(const char *mapfmt, int argc, const char *const *argv, void **co } if (ctxt->server || !ctxt->uri) { - ldap = connect_to_server(ctxt->server, ctxt); + ldap = connect_to_server(LOGOPT_NONE, ctxt->server, ctxt); if (!ldap) { free_context(ctxt); return 1; } } else { - ldap = find_server(ctxt); + ldap = find_server(LOGOPT_NONE, ctxt); if (!ldap) { free_context(ctxt); error(LOGOPT_ANY, MODPREFIX @@ -1250,13 +1235,13 @@ int lookup_init(const char *mapfmt, int argc, const char *const *argv, void **co return 1; } } - unbind_ldap_connection(ldap, ctxt); + unbind_ldap_connection(LOGOPT_ANY, ldap, ctxt); /* Open the parser, if we can. */ ctxt->parse = open_parse(mapfmt, MODPREFIX, argc - 1, argv + 1); if (!ctxt->parse) { free_context(ctxt); - crit(LOGOPT_ANY, MODPREFIX "failed to open parse context"); + logerr(MODPREFIX "failed to open parse context"); return 1; } *context = ctxt; @@ -1269,6 +1254,7 @@ int lookup_read_master(struct master *master, time_t age, void *context) struct lookup_context *ctxt = (struct lookup_context *) context; unsigned int timeout = master->default_timeout; unsigned int logging = master->default_logging; + unsigned int logopt = master->logopt; int rv, l, count, blen; char buf[PARSE_MAX_BUF]; char *query; @@ -1293,45 +1279,44 @@ int lookup_read_master(struct master *master, time_t age, void *context) query = alloca(l); if (query == NULL) { char *estr = strerror_r(errno, buf, MAX_ERR_BUF); - crit(LOGOPT_ANY, MODPREFIX "alloca: %s", estr); + logerr(MODPREFIX "alloca: %s", estr); return NSS_STATUS_UNAVAIL; } if (sprintf(query, "(objectclass=%s)", class) >= l) { - debug(LOGOPT_NONE, MODPREFIX "error forming query string"); + error(logopt, MODPREFIX "error forming query string"); return NSS_STATUS_UNAVAIL; } query[l] = '\0'; /* Initialize the LDAP context. */ - ldap = do_reconnect(ctxt); + ldap = do_reconnect(logopt, ctxt); if (!ldap) return NSS_STATUS_UNAVAIL; /* Look around. */ - debug(LOGOPT_NONE, + debug(logopt, MODPREFIX "searching for \"%s\" under \"%s\"", query, ctxt->qdn); rv = ldap_search_s(ldap, ctxt->qdn, scope, query, attrs, 0, &result); if ((rv != LDAP_SUCCESS) || !result) { - error(LOGOPT_NONE, - MODPREFIX "query failed for %s: %s", + error(logopt, MODPREFIX "query failed for %s: %s", query, ldap_err2string(rv)); - unbind_ldap_connection(ldap, ctxt); + unbind_ldap_connection(logging, ldap, ctxt); return NSS_STATUS_NOTFOUND; } e = ldap_first_entry(ldap, result); if (!e) { - debug(LOGOPT_NONE, + debug(logopt, MODPREFIX "query succeeded, no matches for %s", query); ldap_msgfree(result); - unbind_ldap_connection(ldap, ctxt); + unbind_ldap_connection(logging, ldap, ctxt); return NSS_STATUS_NOTFOUND; } else - debug(LOGOPT_NONE, MODPREFIX "examining entries"); + debug(logopt, MODPREFIX "examining entries"); while (e) { keyValue = ldap_get_values(ldap, e, entry); @@ -1346,7 +1331,7 @@ int lookup_read_master(struct master *master, time_t age, void *context) * each map entry */ if (ldap_count_values(keyValue) > 1) { - error(LOGOPT_ANY, + error(logopt, MODPREFIX "key %s has duplicate entries - ignoring", *keyValue); @@ -1358,7 +1343,7 @@ int lookup_read_master(struct master *master, time_t age, void *context) * inclusion is only valid in file maps. */ if (**keyValue == '+') { - warn(LOGOPT_ANY, + warn(logopt, MODPREFIX "ignoreing '+' map entry - not in file map"); goto next; @@ -1366,7 +1351,7 @@ int lookup_read_master(struct master *master, time_t age, void *context) values = ldap_get_values(ldap, e, info); if (!values || !*values) { - debug(LOGOPT_NONE, + debug(logopt, MODPREFIX "no %s defined for %s", info, query); goto next; } @@ -1376,7 +1361,7 @@ int lookup_read_master(struct master *master, time_t age, void *context) */ count = ldap_count_values(values); if (count > 1) { - error(LOGOPT_ANY, + error(logopt, MODPREFIX "one value per key allowed in master map"); ldap_value_free(values); @@ -1385,7 +1370,7 @@ int lookup_read_master(struct master *master, time_t age, void *context) blen = strlen(*keyValue) + 1 + strlen(*values) + 1; if (blen > PARSE_MAX_BUF) { - error(LOGOPT_ANY, MODPREFIX "map entry too long"); + error(logopt, MODPREFIX "map entry too long"); ldap_value_free(values); goto next; } @@ -1403,7 +1388,7 @@ next: /* Clean up. */ ldap_msgfree(result); - unbind_ldap_connection(ldap, ctxt); + unbind_ldap_connection(logopt, ldap, ctxt); return NSS_STATUS_SUCCESS; } @@ -1445,7 +1430,7 @@ static int read_one_map(struct autofs_point *ap, query = alloca(l); if (query == NULL) { char *estr = strerror_r(errno, buf, MAX_ERR_BUF); - crit(LOGOPT_ANY, MODPREFIX "malloc: %s", estr); + logerr(MODPREFIX "malloc: %s", estr); return NSS_STATUS_UNAVAIL; } @@ -1456,7 +1441,7 @@ static int read_one_map(struct autofs_point *ap, query[l] = '\0'; /* Initialize the LDAP context. */ - ldap = do_reconnect(ctxt); + ldap = do_reconnect(ap->logopt, ctxt); if (!ldap) return NSS_STATUS_UNAVAIL; @@ -1470,7 +1455,7 @@ static int read_one_map(struct autofs_point *ap, debug(ap->logopt, MODPREFIX "query failed for %s: %s", query, ldap_err2string(rv)); - unbind_ldap_connection(ldap, ctxt); + unbind_ldap_connection(ap->logopt, ldap, ctxt); *result_ldap = rv; return NSS_STATUS_NOTFOUND; } @@ -1480,7 +1465,7 @@ static int read_one_map(struct autofs_point *ap, debug(ap->logopt, MODPREFIX "query succeeded, no matches for %s", query); ldap_msgfree(result); - unbind_ldap_connection(ldap, ctxt); + unbind_ldap_connection(ap->logopt, ldap, ctxt); return NSS_STATUS_NOTFOUND; } else debug(ap->logopt, MODPREFIX "examining entries"); @@ -1612,8 +1597,7 @@ static int read_one_map(struct autofs_point *ap, if (!mapent) { char *estr; estr = strerror_r(errno, buf, MAX_ERR_BUF); - error(ap->logopt, - MODPREFIX "malloc: %s", estr); + logerr(MODPREFIX "malloc: %s", estr); ldap_value_free_len(bvValues); goto next; } @@ -1633,8 +1617,7 @@ static int read_one_map(struct autofs_point *ap, } else { char *estr; estr = strerror_r(errno, buf, MAX_ERR_BUF); - error(ap->logopt, - MODPREFIX "realloc: %s", estr); + logerr(MODPREFIX "realloc: %s", estr); } } } @@ -1669,7 +1652,7 @@ next: /* Clean up. */ ldap_msgfree(result); - unbind_ldap_connection(ldap, ctxt); + unbind_ldap_connection(ap->logopt, ldap, ctxt); source->age = age; @@ -1766,7 +1749,7 @@ static int lookup_one(struct autofs_point *ap, query[ql] = '\0'; /* Initialize the LDAP context. */ - ldap = do_reconnect(ctxt); + ldap = do_reconnect(ap->logopt, ctxt); if (!ldap) return CHE_FAIL; @@ -1777,7 +1760,7 @@ static int lookup_one(struct autofs_point *ap, if ((rv != LDAP_SUCCESS) || !result) { crit(ap->logopt, MODPREFIX "query failed for %s", query); - unbind_ldap_connection(ldap, ctxt); + unbind_ldap_connection(ap->logopt, ldap, ctxt); return CHE_FAIL; } @@ -1789,7 +1772,7 @@ static int lookup_one(struct autofs_point *ap, debug(ap->logopt, MODPREFIX "got answer, but no entry for %s", query); ldap_msgfree(result); - unbind_ldap_connection(ldap, ctxt); + unbind_ldap_connection(ap->logopt, ldap, ctxt); return CHE_MISSING; } @@ -1897,8 +1880,7 @@ static int lookup_one(struct autofs_point *ap, if (!mapent) { char *estr; estr = strerror_r(errno, buf, MAX_ERR_BUF); - error(ap->logopt, - MODPREFIX "malloc: %s", estr); + logerr(MODPREFIX "malloc: %s", estr); ldap_value_free_len(bvValues); goto next; } @@ -1918,8 +1900,7 @@ static int lookup_one(struct autofs_point *ap, } else { char *estr; estr = strerror_r(errno, buf, MAX_ERR_BUF); - error(ap->logopt, - MODPREFIX "realloc: %s", estr); + logerr(MODPREFIX "realloc: %s", estr); } } } @@ -1955,7 +1936,7 @@ next: } ldap_msgfree(result); - unbind_ldap_connection(ldap, ctxt); + unbind_ldap_connection(ap->logopt, ldap, ctxt); /* Failed to find wild entry, update cache if needed */ pthread_cleanup_push(cache_lock_cleanup, mc); diff --git a/modules/lookup_multi.c b/modules/lookup_multi.c index 8fa94ae..601d48e 100644 --- a/modules/lookup_multi.c +++ b/modules/lookup_multi.c @@ -73,7 +73,7 @@ static struct lookup_mod *nss_open_lookup(const char *format, int argc, const ch if (nsswitch_parse(&nsslist)) { if (!list_empty(&nsslist)) free_sources(&nsslist); - error(LOGOPT_ANY, "can't to read name service switch config."); + logerr("can't to read name service switch config."); return NULL; } @@ -92,7 +92,7 @@ static struct lookup_mod *nss_open_lookup(const char *format, int argc, const ch path = malloc(strlen(AUTOFS_MAP_DIR) + strlen(argv[0]) + 2); if (!path) { estr = strerror_r(errno, buf, MAX_ERR_BUF); - crit(LOGOPT_ANY, MODPREFIX "error: %s", estr); + logerr(MODPREFIX "error: %s", estr); free_sources(&nsslist); return NULL; } @@ -150,7 +150,7 @@ int lookup_init(const char *my_mapfmt, int argc, const char *const *argv, void * memset(ctxt, 0, sizeof(struct lookup_context)); if (argc < 1) { - crit(LOGOPT_ANY, MODPREFIX "No map list"); + logerr(MODPREFIX "No map list"); goto error_out; } @@ -176,8 +176,7 @@ int lookup_init(const char *my_mapfmt, int argc, const char *const *argv, void * if (!strcmp(ctxt->argl[an], "--")) { ctxt->argl[an] = NULL; if (!args) { - crit(LOGOPT_ANY, - MODPREFIX "error assigning map args"); + logerr(MODPREFIX "error assigning map args"); goto error_out; } ctxt->m[i].argv = copy_argv(ctxt->m[i].argc, (const char **) args); @@ -201,7 +200,7 @@ int lookup_init(const char *my_mapfmt, int argc, const char *const *argv, void * ctxt->m[i].mod = nss_open_lookup(my_mapfmt, ctxt->m[i].argc, ctxt->m[i].argv); if (!ctxt->m[i].mod) { - error(LOGOPT_ANY, MODPREFIX "error opening module"); + logerr(MODPREFIX "error opening module"); goto error_out; } } @@ -211,7 +210,7 @@ int lookup_init(const char *my_mapfmt, int argc, const char *const *argv, void * nomem: estr = strerror_r(errno, buf, MAX_ERR_BUF); - crit(LOGOPT_ANY, MODPREFIX "error: %s", estr); + logerr(MODPREFIX "error: %s", estr); error_out: if (ctxt) { for (i = 0; i < ctxt->n; i++) { diff --git a/modules/lookup_nisplus.c b/modules/lookup_nisplus.c index 83e99e0..ff8bd49 100644 --- a/modules/lookup_nisplus.c +++ b/modules/lookup_nisplus.c @@ -41,13 +41,13 @@ int lookup_init(const char *mapfmt, int argc, const char *const *argv, void **co ctxt = malloc(sizeof(struct lookup_context)); if (!ctxt) { char *estr = strerror_r(errno, buf, MAX_ERR_BUF); - crit(LOGOPT_ANY, MODPREFIX "%s", estr); + logerr(MODPREFIX "%s", estr); return 1; } if (argc < 1) { free(ctxt); - crit(LOGOPT_ANY, MODPREFIX "No map name"); + logmsg(MODPREFIX "No map name"); return 1; } ctxt->mapname = argv[0]; @@ -59,7 +59,7 @@ int lookup_init(const char *mapfmt, int argc, const char *const *argv, void **co ctxt->domainname = nis_local_directory(); if (!ctxt->domainname) { free(ctxt); - crit(LOGOPT_ANY, MODPREFIX "NIS+ domain not set"); + logmsg(MODPREFIX "NIS+ domain not set"); return 1; } @@ -69,7 +69,7 @@ int lookup_init(const char *mapfmt, int argc, const char *const *argv, void **co ctxt->parse = open_parse(mapfmt, MODPREFIX, argc - 1, argv + 1); if (!ctxt->parse) { free(ctxt); - crit(LOGOPT_ANY, MODPREFIX "failed to open parse context"); + logerr(MODPREFIX "failed to open parse context"); return 1; } *context = ctxt; @@ -81,7 +81,8 @@ int lookup_read_master(struct master *master, time_t age, void *context) { struct lookup_context *ctxt = (struct lookup_context *) context; unsigned int timeout = master->default_timeout; - unsigned int logging = master->default_logging; + unsigned int logging = master->default_logging; + unsigned int logopt = master->logopt; char *tablename; nis_result *result; nis_object *this; @@ -95,7 +96,7 @@ int lookup_read_master(struct master *master, time_t age, void *context) tablename = alloca(strlen(ctxt->mapname) + strlen(ctxt->domainname) + 20); if (!tablename) { char *estr = strerror_r(errno, buf, MAX_ERR_BUF); - crit(LOGOPT_ANY, MODPREFIX "alloca: %s", estr); + logerr(MODPREFIX "alloca: %s", estr); pthread_setcancelstate(cur_state, NULL); return NSS_STATUS_UNAVAIL; } @@ -105,8 +106,8 @@ int lookup_read_master(struct master *master, time_t age, void *context) result = nis_lookup(tablename, FOLLOW_PATH | FOLLOW_LINKS); if (result->status != NIS_SUCCESS && result->status != NIS_S_SUCCESS) { nis_freeresult(result); - crit(LOGOPT_ANY, - MODPREFIX "couldn't locat nis+ table %s", ctxt->mapname); + crit(logopt, + MODPREFIX "couldn't locate nis+ table %s", ctxt->mapname); pthread_setcancelstate(cur_state, NULL); return NSS_STATUS_NOTFOUND; } @@ -116,7 +117,7 @@ int lookup_read_master(struct master *master, time_t age, void *context) result = nis_list(tablename, FOLLOW_PATH | FOLLOW_LINKS, NULL, NULL); if (result->status != NIS_SUCCESS && result->status != NIS_S_SUCCESS) { nis_freeresult(result); - crit(LOGOPT_ANY, + crit(logopt, MODPREFIX "couldn't enumrate nis+ map %s", ctxt->mapname); pthread_setcancelstate(cur_state, NULL); return NSS_STATUS_UNAVAIL; @@ -139,8 +140,7 @@ int lookup_read_master(struct master *master, time_t age, void *context) buffer = malloc(ENTRY_LEN(this, 0) + 1 + ENTRY_LEN(this, 1) + 1); if (!buffer) { - error(LOGOPT_ANY, - MODPREFIX "could not malloc parse buffer"); + logerr(MODPREFIX "could not malloc parse buffer"); continue; } @@ -182,7 +182,7 @@ int lookup_read_map(struct autofs_point *ap, time_t age, void *context) tablename = alloca(strlen(ctxt->mapname) + strlen(ctxt->domainname) + 20); if (!tablename) { char *estr = strerror_r(errno, buf, MAX_ERR_BUF); - crit(LOGOPT_ANY, MODPREFIX "alloca: %s", estr); + logerr(MODPREFIX "alloca: %s", estr); pthread_setcancelstate(cur_state, NULL); return NSS_STATUS_UNAVAIL; } @@ -193,7 +193,7 @@ int lookup_read_map(struct autofs_point *ap, time_t age, void *context) if (result->status != NIS_SUCCESS && result->status != NIS_S_SUCCESS) { nis_freeresult(result); crit(ap->logopt, - MODPREFIX "couldn't locat nis+ table %s", ctxt->mapname); + MODPREFIX "couldn't locate nis+ table %s", ctxt->mapname); pthread_setcancelstate(cur_state, NULL); return NSS_STATUS_NOTFOUND; } @@ -274,7 +274,7 @@ static int lookup_one(struct autofs_point *ap, strlen(ctxt->mapname) + strlen(ctxt->domainname) + 20); if (!tablename) { char *estr = strerror_r(errno, buf, MAX_ERR_BUF); - crit(LOGOPT_ANY, MODPREFIX "alloca: %s", estr); + logerr(MODPREFIX "alloca: %s", estr); pthread_setcancelstate(cur_state, NULL); return -1; } @@ -327,7 +327,7 @@ static int lookup_wild(struct autofs_point *ap, struct lookup_context *ctxt) tablename = alloca(strlen(ctxt->mapname) + strlen(ctxt->domainname) + 20); if (!tablename) { char *estr = strerror_r(errno, buf, MAX_ERR_BUF); - crit(LOGOPT_ANY, MODPREFIX "alloca: %s", estr); + logerr(MODPREFIX "alloca: %s", estr); pthread_setcancelstate(cur_state, NULL); return -1; } diff --git a/modules/lookup_program.c b/modules/lookup_program.c index 2fd521a..e28168e 100644 --- a/modules/lookup_program.c +++ b/modules/lookup_program.c @@ -51,28 +51,26 @@ int lookup_init(const char *mapfmt, int argc, const char *const *argv, void **co ctxt = malloc(sizeof(struct lookup_context)); if (!ctxt) { char *estr = strerror_r(errno, buf, MAX_ERR_BUF); - crit(LOGOPT_ANY, MODPREFIX "malloc: %s", estr); + logerr(MODPREFIX "malloc: %s", estr); return 1; } if (argc < 1) { - crit(LOGOPT_ANY, MODPREFIX "No map name"); + logmsg(MODPREFIX "No map name"); free(ctxt); return 1; } ctxt->mapname = argv[0]; if (ctxt->mapname[0] != '/') { - crit(LOGOPT_ANY, - MODPREFIX "program map %s is not an absolute pathname", + logmsg(MODPREFIX "program map %s is not an absolute pathname", ctxt->mapname); free(ctxt); return 1; } if (access(ctxt->mapname, X_OK)) { - crit(LOGOPT_ANY, - MODPREFIX "program map %s missing or not executable", + logmsg(MODPREFIX "program map %s missing or not executable", ctxt->mapname); free(ctxt); return 1; @@ -83,7 +81,7 @@ int lookup_init(const char *mapfmt, int argc, const char *const *argv, void **co ctxt->parse = open_parse(mapfmt, MODPREFIX, argc - 1, argv + 1); if (!ctxt->parse) { - crit(LOGOPT_ANY, MODPREFIX "failed to open parse context"); + logmsg(MODPREFIX "failed to open parse context"); free(ctxt); return 1; } @@ -163,7 +161,7 @@ int lookup_mount(struct autofs_point *ap, const char *name, int name_len, void * mapent = (char *) malloc(MAPENT_MAX_LEN + 1); if (!mapent) { char *estr = strerror_r(errno, buf, MAX_ERR_BUF); - error(ap->logopt, MODPREFIX "malloc: %s", estr); + logerr(MODPREFIX "malloc: %s", estr); return NSS_STATUS_UNAVAIL; } @@ -176,7 +174,7 @@ int lookup_mount(struct autofs_point *ap, const char *name, int name_len, void * */ if (pipe(pipefd)) { char *estr = strerror_r(errno, buf, MAX_ERR_BUF); - error(ap->logopt, MODPREFIX "pipe: %s", estr); + logerr(MODPREFIX "pipe: %s", estr); goto out_free; } if (pipe(epipefd)) { @@ -188,7 +186,7 @@ int lookup_mount(struct autofs_point *ap, const char *name, int name_len, void * f = fork(); if (f < 0) { char *estr = strerror_r(errno, buf, MAX_ERR_BUF); - error(ap->logopt, MODPREFIX "fork: %s", estr); + logerr(MODPREFIX "fork: %s", estr); close(pipefd[0]); close(pipefd[1]); close(epipefd[0]); @@ -271,8 +269,7 @@ int lookup_mount(struct autofs_point *ap, const char *name, int name_len, void * ++alloci)); if (!tmp) { alloci--; - error(ap->logopt, - MODPREFIX "realloc: %s", + logerr(MODPREFIX "realloc: %s", strerror(errno)); break; } @@ -308,12 +305,12 @@ int lookup_mount(struct autofs_point *ap, const char *name, int name_len, void * } else if (ch == '\n') { *errp = '\0'; if (errbuf[0]) - error(ap->logopt, ">> %s", errbuf); + logmsg(">> %s", errbuf); errp = errbuf; } else { if (errp >= &errbuf[1023]) { *errp = '\0'; - error(ap->logopt, ">> %s", errbuf); + logmsg(">> %s", errbuf); errp = errbuf; } *(errp++) = ch; @@ -325,7 +322,7 @@ int lookup_mount(struct autofs_point *ap, const char *name, int name_len, void * *mapp = '\0'; if (errp > errbuf) { *errp = '\0'; - error(ap->logopt, ">> %s", errbuf); + logmsg(">> %s", errbuf); } close(pipefd[0]); @@ -333,12 +330,12 @@ int lookup_mount(struct autofs_point *ap, const char *name, int name_len, void * if (waitpid(f, &status, 0) != f) { char *estr = strerror_r(errno, buf, MAX_ERR_BUF); - error(ap->logopt, MODPREFIX "waitpid: %s", estr); + logerr(MODPREFIX "waitpid: %s", estr); goto out_free; } if (mapp == mapent || !WIFEXITED(status) || WEXITSTATUS(status) != 0) { - msg(MODPREFIX "lookup for %s failed", name); + info(ap->logopt, MODPREFIX "lookup for %s failed", name); goto out_free; } diff --git a/modules/lookup_userhome.c b/modules/lookup_userhome.c index efcab0b..680ddaf 100644 --- a/modules/lookup_userhome.c +++ b/modules/lookup_userhome.c @@ -73,7 +73,7 @@ int lookup_mount(struct autofs_point *ap, const char *name, int name_len, void * /* Create the appropriate symlink */ if (chdir(ap->path)) { char *estr = strerror_r(errno, buf, MAX_ERR_BUF); - error(ap->logopt, MODPREFIX "chdir failed: %s", estr); + logerr(MODPREFIX "chdir failed: %s", estr); return NSS_STATUS_UNAVAIL; } @@ -88,7 +88,7 @@ int lookup_mount(struct autofs_point *ap, const char *name, int name_len, void * if (symlink(pw->pw_dir, name) && errno != EEXIST) { char *estr = strerror_r(errno, buf, MAX_ERR_BUF); - error(ap->logopt, MODPREFIX "symlink failed: %s", estr); + logerr(MODPREFIX "symlink failed: %s", estr); return NSS_STATUS_UNAVAIL; } diff --git a/modules/lookup_yp.c b/modules/lookup_yp.c index da280cc..63fc8e3 100644 --- a/modules/lookup_yp.c +++ b/modules/lookup_yp.c @@ -45,12 +45,14 @@ struct lookup_context { struct callback_master_data { unsigned timeout; unsigned logging; + unsigned logopt; time_t age; }; struct callback_data { struct autofs_point *ap; struct map_source *source; + unsigned logopt; time_t age; }; @@ -111,20 +113,18 @@ int lookup_init(const char *mapfmt, int argc, const char *const *argv, void **co ctxt = malloc(sizeof(struct lookup_context)); if (!ctxt) { char *estr = strerror_r(errno, buf, MAX_ERR_BUF); - crit(LOGOPT_ANY, MODPREFIX "%s", estr); + logerr(MODPREFIX "%s", estr); return 1; } memset(ctxt, 0, sizeof(struct lookup_context)); if (argc < 1) { free(ctxt); - crit(LOGOPT_ANY, MODPREFIX "no map name"); + logerr(MODPREFIX "no map name"); return 1; } ctxt->mapname = argv[0]; - debug(LOGOPT_NONE, MODPREFIX "ctxt->mapname=%s", ctxt->mapname); - /* This should, but doesn't, take a const char ** */ err = yp_get_default_domain((char **) &ctxt->domainname); if (err) { @@ -133,8 +133,7 @@ int lookup_init(const char *mapfmt, int argc, const char *const *argv, void **co memcpy(name, ctxt->mapname, len); name[len] = '\0'; free(ctxt); - debug(LOGOPT_NONE, MODPREFIX "map %s: %s", name, - yperr_string(err)); + logerr(MODPREFIX "map %s: %s", name, yperr_string(err)); return 1; } @@ -146,7 +145,7 @@ int lookup_init(const char *mapfmt, int argc, const char *const *argv, void **co ctxt->parse = open_parse(mapfmt, MODPREFIX, argc - 1, argv + 1); if (!ctxt->parse) { free(ctxt); - crit(LOGOPT_ANY, MODPREFIX "failed to open parse context"); + logmsg(MODPREFIX "failed to open parse context"); return 1; } *context = ctxt; @@ -161,6 +160,7 @@ int yp_all_master_callback(int status, char *ypkey, int ypkeylen, (struct callback_master_data *) ypcb_data; unsigned int timeout = cbdata->timeout; unsigned int logging = cbdata->logging; + unsigned int logopt = cbdata->logopt; time_t age = cbdata->age; char *buffer; unsigned int len; @@ -182,7 +182,7 @@ int yp_all_master_callback(int status, char *ypkey, int ypkeylen, buffer = alloca(len); if (!buffer) { - error(LOGOPT_ANY, MODPREFIX "could not malloc parse buffer"); + error(logopt, MODPREFIX "could not malloc parse buffer"); return 0; } memset(buffer, 0, len); @@ -201,6 +201,8 @@ int lookup_read_master(struct master *master, time_t age, void *context) struct lookup_context *ctxt = (struct lookup_context *) context; struct ypall_callback ypcb; struct callback_master_data ypcb_data; + unsigned int logging = master->default_logging; + unsigned int logopt = master->logopt; char *mapname; int err; @@ -211,7 +213,8 @@ int lookup_read_master(struct master *master, time_t age, void *context) strcpy(mapname, ctxt->mapname); ypcb_data.timeout = master->default_timeout; - ypcb_data.logging = master->default_logging; + ypcb_data.logging = logging; + ypcb_data.logopt = logopt; ypcb_data.age = age; ypcb.foreach = yp_all_master_callback; @@ -232,7 +235,7 @@ int lookup_read_master(struct master *master, time_t age, void *context) if (err == YPERR_SUCCESS) return NSS_STATUS_SUCCESS; - warn(LOGOPT_ANY, + info(logopt, MODPREFIX "read of master map %s failed: %s", mapname, yperr_string(err)); @@ -249,6 +252,7 @@ int yp_all_callback(int status, char *ypkey, int ypkeylen, struct autofs_point *ap = cbdata->ap; struct map_source *source = cbdata->source; struct mapent_cache *mc = source->mc; + unsigned int logopt = cbdata->logopt; time_t age = cbdata->age; char *key, *mapent; int ret; @@ -264,8 +268,10 @@ int yp_all_callback(int status, char *ypkey, int ypkeylen, return 0; key = sanitize_path(ypkey, ypkeylen, ap->type, ap->logopt); - if (!key) + if (!key) { + error(logopt, MODPREFIX "invalid path %s", ypkey); return 0; + } mapent = alloca(vallen + 1); strncpy(mapent, val, vallen); @@ -288,6 +294,7 @@ int lookup_read_map(struct autofs_point *ap, time_t age, void *context) struct lookup_context *ctxt = (struct lookup_context *) context; struct ypall_callback ypcb; struct callback_data ypcb_data; + unsigned int logopt = ap->logopt; struct map_source *source; char *mapname; int err; @@ -298,6 +305,7 @@ int lookup_read_map(struct autofs_point *ap, time_t age, void *context) ypcb_data.ap = ap; ypcb_data.source = source; + ypcb_data.logopt = logopt; ypcb_data.age = age; ypcb.foreach = yp_all_callback; diff --git a/modules/mount_autofs.c b/modules/mount_autofs.c index c45b91b..356fb14 100644 --- a/modules/mount_autofs.c +++ b/modules/mount_autofs.c @@ -64,7 +64,7 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, fullpath = alloca(strlen(root) + name_len + 2); if (!fullpath) { char *estr = strerror_r(errno, buf, MAX_ERR_BUF); - error(ap->logopt, MODPREFIX "alloca: %s", estr); + logerr(MODPREFIX "alloca: %s", estr); return 1; } @@ -156,7 +156,6 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, } nap = entry->ap; nap->parent = ap; - set_mnt_logging(nap); argc = 1; @@ -208,7 +207,7 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, return 1; } - source->mc = cache_init(source); + source->mc = cache_init(entry->ap, source); if (!source->mc) { error(ap->logopt, MODPREFIX "failed to init source cache"); master_free_mapent(entry); diff --git a/modules/mount_bind.c b/modules/mount_bind.c index cb17ce4..04284f5 100644 --- a/modules/mount_bind.c +++ b/modules/mount_bind.c @@ -52,16 +52,14 @@ int mount_init(void **context) if (lstat(t1_dir, &st1) == -1) goto out; - err = spawn_mount(log_debug, "-n", "--bind", t1_dir, t2_dir, NULL); + err = spawn_mount(LOGOPT_NONE, "-n", "--bind", t1_dir, t2_dir, NULL); if (err == 0 && lstat(t2_dir, &st2) == 0 && st1.st_dev == st2.st_dev && st1.st_ino == st2.st_ino) { bind_works = 1; } - debug(LOGOPT_NONE, MODPREFIX "bind_works = %d", bind_works); - - spawn_umount(log_debug, "-n", t2_dir, NULL); + spawn_umount(LOGOPT_NONE, "-n", t2_dir, NULL); out: rmdir(t1_dir); @@ -91,7 +89,7 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int fullpath = alloca(rlen + name_len + 2); if (!fullpath) { char *estr = strerror_r(errno, buf, MAX_ERR_BUF); - error(ap->logopt, MODPREFIX "alloca: %s", estr); + logerr(MODPREFIX "alloca: %s", estr); return 1; } @@ -139,7 +137,7 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int "calling mount --bind " SLOPPY " -o %s %s %s", options, what, fullpath); - err = spawn_bind_mount(log_debug, + err = spawn_bind_mount(ap->logopt, SLOPPYOPT "-o", options, what, fullpath, NULL); if (err) { diff --git a/modules/mount_changer.c b/modules/mount_changer.c index 6e04c7c..08d9147 100644 --- a/modules/mount_changer.c +++ b/modules/mount_changer.c @@ -66,7 +66,7 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int fullpath = alloca(rlen + name_len + 2); if (!fullpath) { char *estr = strerror_r(errno, buf, MAX_ERR_BUF); - error(ap->logopt, MODPREFIX "alloca: %s", estr); + logerr(MODPREFIX "alloca: %s", estr); return 1; } @@ -80,7 +80,7 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int debug(ap->logopt, MODPREFIX "calling umount %s", what); - err = spawn_umount(log_debug, what, NULL); + err = spawn_umount(ap->logopt, what, NULL); if (err) { error(ap->logopt, MODPREFIX @@ -115,18 +115,18 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int MODPREFIX "calling mount -t %s " SLOPPY "-o %s %s %s", fstype, options, what, fullpath); - err = spawn_mount(log_debug, "-t", fstype, + err = spawn_mount(ap->logopt, "-t", fstype, SLOPPYOPT "-o", options, what, fullpath, NULL); } else { debug(ap->logopt, MODPREFIX "calling mount -t %s %s %s", fstype, what, fullpath); - err = spawn_mount(log_debug, "-t", fstype, what, fullpath, NULL); + err = spawn_mount(ap->logopt, "-t", fstype, what, fullpath, NULL); } if (err) { - msg(MODPREFIX "failed to mount %s (type %s) on %s", + info(ap->logopt, MODPREFIX "failed to mount %s (type %s) on %s", what, fstype, fullpath); if (ap->type != LKP_INDIRECT) @@ -137,7 +137,7 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int return 1; } else { - msg(MODPREFIX "mounted %s type %s on %s", + info(ap->logopt, MODPREFIX "mounted %s type %s on %s", what, fstype, fullpath); return 0; } @@ -161,7 +161,7 @@ int swapCD(const char *device, const char *slotName) /* open device */ fd = open(device, O_RDONLY | O_NONBLOCK); if (fd < 0) { - error(LOGOPT_ANY, MODPREFIX "Opening device %s failed : %s", + logerr(MODPREFIX "Opening device %s failed : %s", device, strerror(errno)); return 1; } @@ -174,7 +174,7 @@ int swapCD(const char *device, const char *slotName) /* Check CD player status */ total_slots_available = ioctl(fd, CDROM_CHANGER_NSLOTS); if (total_slots_available <= 1) { - error(LOGOPT_ANY, MODPREFIX + logerr(MODPREFIX "Device %s is not an ATAPI compliant CD changer.", device); return 1; @@ -183,14 +183,14 @@ int swapCD(const char *device, const char *slotName) /* load */ slot = ioctl(fd, CDROM_SELECT_DISC, slot); if (slot < 0) { - error(LOGOPT_ANY, MODPREFIX "CDROM_SELECT_DISC failed"); + logerr(MODPREFIX "CDROM_SELECT_DISC failed"); return 1; } /* close device */ status = close(fd); if (status != 0) { - error(LOGOPT_ANY, MODPREFIX "close failed for `%s': %s", + logerr(MODPREFIX "close failed for `%s': %s", device, strerror(errno)); return 1; } diff --git a/modules/mount_ext2.c b/modules/mount_ext2.c index 45f0615..8cf9937 100644 --- a/modules/mount_ext2.c +++ b/modules/mount_ext2.c @@ -58,7 +58,7 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int fullpath = alloca(rlen + name_len + 2); if (!fullpath) { char *estr = strerror_r(errno, buf, MAX_ERR_BUF); - error(ap->logopt, MODPREFIX "alloca: %s", estr); + logerr(MODPREFIX "alloca: %s", estr); return 1; } @@ -108,11 +108,11 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int if (ro) { debug(ap->logopt, MODPREFIX "calling %s -n %s", fsck_prog, what); - err = spawnl(log_debug, fsck_prog, fsck_prog, "-n", what, NULL); + err = spawnl(ap->logopt, fsck_prog, fsck_prog, "-n", what, NULL); } else { debug(ap->logopt, MODPREFIX "calling %s -p %s", fsck_prog, what); - err = spawnl(log_debug, fsck_prog, fsck_prog, "-p", what, NULL); + err = spawnl(ap->logopt, fsck_prog, fsck_prog, "-p", what, NULL); } /* @@ -132,17 +132,17 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int debug(ap->logopt, MODPREFIX "calling mount -t %s " SLOPPY "-o %s %s %s", fstype, options, what, fullpath); - err = spawn_mount(log_debug, "-t", fstype, + err = spawn_mount(ap->logopt, "-t", fstype, SLOPPYOPT "-o", options, what, fullpath, NULL); } else { debug(ap->logopt, MODPREFIX "calling mount -t %s %s %s", fstype, what, fullpath); - err = spawn_mount(log_debug, "-t", fstype, what, fullpath, NULL); + err = spawn_mount(ap->logopt, "-t", fstype, what, fullpath, NULL); } if (err) { - msg(MODPREFIX "failed to mount %s (type %s) on %s", + info(ap->logopt, MODPREFIX "failed to mount %s (type %s) on %s", what, fstype, fullpath); if (ap->type != LKP_INDIRECT) @@ -153,7 +153,7 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int return 1; } else { - debug(ap->logopt, + info(ap->logopt, MODPREFIX "mounted %s type %s on %s", what, fstype, fullpath); return 0; diff --git a/modules/mount_generic.c b/modules/mount_generic.c index 1f43baa..85b4391 100644 --- a/modules/mount_generic.c +++ b/modules/mount_generic.c @@ -57,7 +57,7 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int fullpath = alloca(rlen + name_len + 2); if (!fullpath) { char *estr = strerror_r(errno, buf, MAX_ERR_BUF); - error(ap->logopt, MODPREFIX "alloca: %s", estr); + logerr(MODPREFIX "alloca: %s", estr); return 1; } @@ -93,16 +93,16 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int MODPREFIX "calling mount -t %s " SLOPPY "-o %s %s %s", fstype, options, what, fullpath); - err = spawn_mount(log_debug, "-t", fstype, + err = spawn_mount(ap->logopt, "-t", fstype, SLOPPYOPT "-o", options, what, fullpath, NULL); } else { debug(ap->logopt, MODPREFIX "calling mount -t %s %s %s", fstype, what, fullpath); - err = spawn_mount(log_debug, "-t", fstype, what, fullpath, NULL); + err = spawn_mount(ap->logopt, "-t", fstype, what, fullpath, NULL); } if (err) { - msg(MODPREFIX "failed to mount %s (type %s) on %s", + info(ap->logopt, MODPREFIX "failed to mount %s (type %s) on %s", what, fstype, fullpath); if (ap->type != LKP_INDIRECT) @@ -113,7 +113,7 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int return 1; } else { - msg(MODPREFIX "mounted %s type %s on %s", + info(ap->logopt, MODPREFIX "mounted %s type %s on %s", what, fstype, fullpath); return 0; } diff --git a/modules/mount_nfs.c b/modules/mount_nfs.c index e4480c5..bad21fc 100644 --- a/modules/mount_nfs.c +++ b/modules/mount_nfs.c @@ -133,14 +133,14 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int else vers = NFS_VERS_MASK | NFS_PROTO_MASK; - if (!parse_location(&hosts, what)) { - warn(ap->logopt, MODPREFIX "no hosts available"); + if (!parse_location(ap->logopt, &hosts, what)) { + info(ap->logopt, MODPREFIX "no hosts available"); return 1; } - prune_host_list(&hosts, vers, nfsoptions, ap->random_selection); + prune_host_list(ap->logopt, &hosts, vers, nfsoptions, ap->random_selection); if (!hosts) { - warn(ap->logopt, MODPREFIX "no hosts available"); + info(ap->logopt, MODPREFIX "no hosts available"); return 1; } @@ -159,7 +159,7 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int fullpath = alloca(rlen + name_len + 2); if (!fullpath) { char *estr = strerror_r(errno, buf, MAX_ERR_BUF); - error(ap->logopt, MODPREFIX "alloca: %s", estr); + logerr(MODPREFIX "alloca: %s", estr); free_host_list(&hosts); return 1; } @@ -252,19 +252,19 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int MODPREFIX "calling mount -t %s " SLOPPY "-o %s %s %s", fstype, nfsoptions, loc, fullpath); - err = spawn_mount(log_debug, + err = spawn_mount(ap->logopt, "-t", fstype, SLOPPYOPT "-o", nfsoptions, loc, fullpath, NULL); } else { debug(ap->logopt, MODPREFIX "calling mount -t %s %s %s", fstype, loc, fullpath); - err = spawn_mount(log_debug, + err = spawn_mount(ap->logopt, "-t", fstype, loc, fullpath, NULL); } if (!err) { - msg(MODPREFIX "mounted %s on %s", loc, fullpath); + info(ap->logopt, MODPREFIX "mounted %s on %s", loc, fullpath); free(loc); free_host_list(&hosts); ap->ghost = save_ghost; @@ -280,7 +280,7 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int /* If we get here we've failed to complete the mount */ - msg(MODPREFIX "nfs: mount failure %s on %s", what, fullpath); + info(ap->logopt, MODPREFIX "nfs: mount failure %s on %s", what, fullpath); if (ap->type != LKP_INDIRECT) return 1; diff --git a/modules/parse_sun.c b/modules/parse_sun.c index 079bda6..186e567 100644 --- a/modules/parse_sun.c +++ b/modules/parse_sun.c @@ -277,7 +277,7 @@ int parse_init(int argc, const char *const *argv, void **context) if (!(ctxt = (struct parse_context *) malloc(sizeof(struct parse_context)))) { char *estr = strerror_r(errno, buf, MAX_ERR_BUF); - crit(LOGOPT_ANY, MODPREFIX "malloc: %s", estr); + logerr(MODPREFIX "malloc: %s", estr); *context = NULL; return 1; } @@ -302,7 +302,7 @@ int parse_init(int argc, const char *const *argv, void **context) if (!def) { char *estr = strerror_r(errno, buf, MAX_ERR_BUF); - error(LOGOPT_ANY, MODPREFIX "strdup: %s", estr); + logerr(MODPREFIX "strdup: %s", estr); break; } @@ -387,7 +387,7 @@ int parse_init(int argc, const char *const *argv, void **context) if (!noptstr) { char *estr = strerror_r(errno, buf, MAX_ERR_BUF); kill_context(ctxt); - crit(LOGOPT_ANY, MODPREFIX "%s", estr); + logerr(MODPREFIX "%s", estr); *context = NULL; return 1; } @@ -408,7 +408,7 @@ int parse_init(int argc, const char *const *argv, void **context) char *tmp = concat_options(gbl_options, ctxt->optstr); if (!tmp) { char *estr = strerror_r(errno, buf, MAX_ERR_BUF); - error(LOGOPT_ANY, MODPREFIX "concat_options: %s", estr); + logerr(MODPREFIX "concat_options: %s", estr); free(gbl_options); } else ctxt->optstr = tmp; @@ -472,7 +472,7 @@ static char *concat_options(char *left, char *right) if (ret == NULL) { char *estr = strerror_r(errno, buf, MAX_ERR_BUF); - error(LOGOPT_ANY, MODPREFIX "malloc: %s", estr); + logerr(MODPREFIX "malloc: %s", estr); return NULL; } @@ -637,8 +637,7 @@ static int check_is_multi(const char *mapent) int not_first_chunk = 0; if (!p) { - crit(LOGOPT_ANY, - MODPREFIX "unexpected NULL map entry pointer"); + logerr(MODPREFIX "unexpected NULL map entry pointer"); return 0; } @@ -1021,7 +1020,7 @@ int parse_mount(struct autofs_point *ap, const char *name, pmapent = alloca(mapent_len + 1); if (!pmapent) { char *estr = strerror_r(errno, buf, MAX_ERR_BUF); - error(ap->logopt, MODPREFIX "alloca: %s", estr); + logerr(MODPREFIX "alloca: %s", estr); ctxt->subst = removestdenv(ctxt->subst); macro_unlock(); pthread_setcancelstate(cur_state, NULL); @@ -1041,7 +1040,7 @@ int parse_mount(struct autofs_point *ap, const char *name, options = strdup(ctxt->optstr ? ctxt->optstr : ""); if (!options) { char *estr = strerror_r(errno, buf, MAX_ERR_BUF); - error(ap->logopt, MODPREFIX "strdup: %s", estr); + logerr(MODPREFIX "strdup: %s", estr); return 1; } optlen = strlen(options); @@ -1119,7 +1118,7 @@ int parse_mount(struct autofs_point *ap, const char *name, if (!m_root) { char *estr = strerror_r(errno, buf, MAX_ERR_BUF); free(options); - error(ap->logopt, MODPREFIX "alloca: %s", estr); + logerr(MODPREFIX "alloca: %s", estr); return 1; } strcpy(m_root, name); @@ -1129,7 +1128,7 @@ int parse_mount(struct autofs_point *ap, const char *name, if (!m_root) { char *estr = strerror_r(errno, buf, MAX_ERR_BUF); free(options); - error(ap->logopt, MODPREFIX "alloca: %s", estr); + logerr(MODPREFIX "alloca: %s", estr); return 1; } strcpy(m_root, ap->path); diff --git a/modules/replicated.c b/modules/replicated.c index e15587c..14b20a9 100644 --- a/modules/replicated.c +++ b/modules/replicated.c @@ -113,7 +113,7 @@ static unsigned int get_proximity(const char *host_addr, int addr_len) sock = socket(AF_INET, SOCK_DGRAM, 0); if (sock < 0) { char *estr = strerror_r(errno, buf, MAX_ERR_BUF); - error(LOGOPT_ANY, "socket creation failed: %s", estr); + logerr("socket creation failed: %s", estr); return PROXIMITY_ERROR; } @@ -127,7 +127,7 @@ static unsigned int get_proximity(const char *host_addr, int addr_len) ret = ioctl(sock, SIOCGIFCONF, &ifc); if (ret == -1) { char *estr = strerror_r(errno, buf, MAX_ERR_BUF); - error(LOGOPT_ANY, "ioctl: %s", estr); + logerr("ioctl: %s", estr); close(sock); return PROXIMITY_ERROR; } @@ -176,7 +176,7 @@ static unsigned int get_proximity(const char *host_addr, int addr_len) ret = ioctl(sock, SIOCGIFNETMASK, &nmptr); if (ret == -1) { char *estr = strerror_r(errno, buf, MAX_ERR_BUF); - error(LOGOPT_ANY, "ioctl: %s", estr); + logerr("ioctl: %s", estr); close(sock); return PROXIMITY_ERROR; } @@ -387,7 +387,7 @@ static unsigned short get_port_option(const char *options) return (unsigned short) port; } -static unsigned int get_nfs_info(struct host *host, +static unsigned int get_nfs_info(unsigned logopt, struct host *host, struct conn_info *pm_info, struct conn_info *rpc_info, const char *proto, unsigned int version, const char *options, unsigned int random_selection) @@ -533,7 +533,7 @@ done_ver: return supported; } -static int get_vers_and_cost(struct host *host, +static int get_vers_and_cost(unsigned logopt, struct host *host, unsigned int version, const char *options, unsigned int random_selection) { @@ -559,7 +559,7 @@ static int get_vers_and_cost(struct host *host, vers &= version; if (version & UDP_REQUESTED) { - supported = get_nfs_info(host, + supported = get_nfs_info(logopt, host, &pm_info, &rpc_info, "udp", vers, options, random_selection); if (supported) { @@ -569,7 +569,7 @@ static int get_vers_and_cost(struct host *host, } if (version & TCP_REQUESTED) { - supported = get_nfs_info(host, + supported = get_nfs_info(logopt, host, &pm_info, &rpc_info, "tcp", vers, options, random_selection); if (supported) { @@ -581,7 +581,7 @@ static int get_vers_and_cost(struct host *host, return ret; } -static int get_supported_ver_and_cost(struct host *host, +static int get_supported_ver_and_cost(unsigned logopt, struct host *host, unsigned int version, const char *options, unsigned int random_selection) { @@ -636,7 +636,7 @@ static int get_supported_ver_and_cost(struct host *host, vers = NFS4_VERSION; break; default: - crit(LOGOPT_ANY, "called with invalid version: 0x%x\n", version); + crit(logopt, "called with invalid version: 0x%x\n", version); return 0; } @@ -701,7 +701,7 @@ done: return 0; } -int prune_host_list(struct host **list, +int prune_host_list(unsigned logopt, struct host **list, unsigned int vers, const char *options, unsigned int random_selection) { @@ -742,7 +742,7 @@ int prune_host_list(struct host **list, break; if (this->name) { - status = get_vers_and_cost(this, vers, + status = get_vers_and_cost(logopt, this, vers, options, random_selection); if (!status) { if (this == first) { @@ -833,7 +833,7 @@ int prune_host_list(struct host **list, remove_host(list, this); add_host(&new, this); } else { - status = get_supported_ver_and_cost(this, + status = get_supported_ver_and_cost(logopt, this, selected_version, options, random_selection); if (status) { @@ -886,11 +886,9 @@ static int add_host_addrs(struct host **list, const char *host, unsigned int wei buf, MAX_IFC_BUF, &result, &ghn_errno); if (ret || !result) { if (ghn_errno == -1) - error(LOGOPT_ANY, - "host %s: lookup failure %d", host, errno); + logmsg("host %s: lookup failure %d", host, errno); else - error(LOGOPT_ANY, - "host %s: lookup failure %d", host, ghn_errno); + logmsg("host %s: lookup failure %d", host, ghn_errno); return 0; } @@ -965,7 +963,7 @@ static int add_local_path(struct host **hosts, const char *path) return 1; } -int parse_location(struct host **hosts, const char *list) +int parse_location(unsigned logopt, struct host **hosts, const char *list) { char *str, *p, *delim; unsigned int empty = 1; @@ -1072,8 +1070,7 @@ void dump_host_list(struct host *hosts) this = hosts; while (this) { - debug(LOGOPT_ANY, - "name %s path %s version %x proximity %u weight %u cost %u", + logmsg("name %s path %s version %x proximity %u weight %u cost %u", this->name, this->path, this->version, this->proximity, this->weight, this->cost); this = this->next;