From: Mathieu Desnoyers Date: Fri, 2 Mar 2012 19:01:42 +0000 (-0500) Subject: Fix: Use PERROR all across lttng-tools, never make it quiet X-Git-Tag: v2.0.0-rc2~9 X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=commitdiff_plain;h=4c462e790c62ed5f6c5d61b3a182762fe02f7e9a Fix: Use PERROR all across lttng-tools, never make it quiet We never want to hide these errors, even in quiet mode. For those "errors" that are expected and part of the normal operation (e.g. send consumer channel: Socket operation on non-socket), we will have to handle the return values and errno explicitly in the code. Signed-off-by: Mathieu Desnoyers --- diff --git a/src/bin/lttng/utils.c b/src/bin/lttng/utils.c index 1f491db1b..514bfe645 100644 --- a/src/bin/lttng/utils.c +++ b/src/bin/lttng/utils.c @@ -16,6 +16,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ +#define _GNU_SOURCE #include #include diff --git a/src/common/compat/compat-epoll.c b/src/common/compat/compat-epoll.c index 77f5b922a..008dba702 100644 --- a/src/common/compat/compat-epoll.c +++ b/src/common/compat/compat-epoll.c @@ -15,6 +15,7 @@ * Place - Suite 330, Boston, MA 02111-1307, USA. */ +#define _GNU_SOURCE #include #include #include @@ -49,7 +50,7 @@ int compat_epoll_create(struct lttng_poll_event *events, int size, int flags) ret = epoll_create1(flags); if (ret < 0) { /* At this point, every error is fatal */ - perror("epoll_create1"); + PERROR("epoll_create1"); goto error; } @@ -58,7 +59,7 @@ int compat_epoll_create(struct lttng_poll_event *events, int size, int flags) /* This *must* be freed by using lttng_poll_free() */ events->events = zmalloc(size * sizeof(struct epoll_event)); if (events->events == NULL) { - perror("zmalloc epoll set"); + PERROR("zmalloc epoll set"); goto error_close; } @@ -68,7 +69,10 @@ int compat_epoll_create(struct lttng_poll_event *events, int size, int flags) return 0; error_close: - close(events->epfd); + ret = close(events->epfd); + if (ret) { + PERROR("close"); + } error: return -1; } @@ -97,11 +101,11 @@ int compat_epoll_add(struct lttng_poll_event *events, int fd, uint32_t req_event goto end; case ENOSPC: case EPERM: - /* Print perror and goto end not failing. Show must go on. */ - perror("epoll_ctl ADD"); + /* Print PERROR and goto end not failing. Show must go on. */ + PERROR("epoll_ctl ADD"); goto end; default: - perror("epoll_ctl ADD fatal"); + PERROR("epoll_ctl ADD fatal"); goto error; } } @@ -112,7 +116,7 @@ int compat_epoll_add(struct lttng_poll_event *events, int fd, uint32_t req_event new_size = 2 * events->events_size; ptr = realloc(events->events, new_size * sizeof(struct epoll_event)); if (ptr == NULL) { - perror("realloc epoll add"); + PERROR("realloc epoll add"); goto error; } events->events = ptr; @@ -142,14 +146,14 @@ int compat_epoll_del(struct lttng_poll_event *events, int fd) switch (errno) { case ENOENT: case EPERM: - /* Print perror and goto end not failing. Show must go on. */ - perror("epoll_ctl DEL"); + /* Print PERROR and goto end not failing. Show must go on. */ + PERROR("epoll_ctl DEL"); goto end; default: - perror("epoll_ctl DEL fatal"); + PERROR("epoll_ctl DEL fatal"); goto error; } - perror("epoll_ctl del"); + PERROR("epoll_ctl del"); goto error; } @@ -180,7 +184,7 @@ int compat_epoll_wait(struct lttng_poll_event *events, int timeout) } while (ret == -1 && errno == EINTR); if (ret < 0) { /* At this point, every error is fatal */ - perror("epoll_wait"); + PERROR("epoll_wait"); goto error; } @@ -207,7 +211,7 @@ void compat_epoll_set_max_size(void) ret = read(fd, buf, sizeof(buf)); if (ret < 0) { - perror("read set max size"); + PERROR("read set max size"); goto error; } @@ -220,5 +224,8 @@ void compat_epoll_set_max_size(void) DBG("epoll set max size is %d", poll_max_size); error: - close(fd); + ret = close(fd); + if (ret) { + PERROR("close"); + } } diff --git a/src/common/consumer.c b/src/common/consumer.c index 026d9f0f8..9c54b84cf 100644 --- a/src/common/consumer.c +++ b/src/common/consumer.c @@ -174,13 +174,22 @@ void consumer_del_stream(struct lttng_consumer_stream *stream) goto end; } if (stream->out_fd >= 0) { - close(stream->out_fd); + ret = close(stream->out_fd); + if (ret) { + PERROR("close"); + } } if (stream->wait_fd >= 0 && !stream->wait_fd_is_copy) { - close(stream->wait_fd); + ret = close(stream->wait_fd); + if (ret) { + PERROR("close"); + } } if (stream->shm_fd >= 0 && stream->wait_fd != stream->shm_fd) { - close(stream->shm_fd); + ret = close(stream->shm_fd); + if (ret) { + PERROR("close"); + } } if (!--stream->chan->refcount) free_chan = stream->chan; @@ -361,10 +370,16 @@ void consumer_del_channel(struct lttng_consumer_channel *channel) } } if (channel->wait_fd >= 0 && !channel->wait_fd_is_copy) { - close(channel->wait_fd); + ret = close(channel->wait_fd); + if (ret) { + PERROR("close"); + } } if (channel->shm_fd >= 0 && channel->wait_fd != channel->shm_fd) { - close(channel->shm_fd); + ret = close(channel->shm_fd); + if (ret) { + PERROR("close"); + } } free(channel); end: @@ -699,14 +714,18 @@ error_thread_pipe: int err; err = close(ctx->consumer_should_quit[i]); - assert(!err); + if (err) { + PERROR("close"); + } } error_quit_pipe: for (i = 0; i < 2; i++) { int err; err = close(ctx->consumer_poll_pipe[i]); - assert(!err); + if (err) { + PERROR("close"); + } } error_poll_pipe: free(ctx); @@ -719,13 +738,36 @@ error: */ void lttng_consumer_destroy(struct lttng_consumer_local_data *ctx) { - close(ctx->consumer_error_socket); - close(ctx->consumer_thread_pipe[0]); - close(ctx->consumer_thread_pipe[1]); - close(ctx->consumer_poll_pipe[0]); - close(ctx->consumer_poll_pipe[1]); - close(ctx->consumer_should_quit[0]); - close(ctx->consumer_should_quit[1]); + int ret; + + ret = close(ctx->consumer_error_socket); + if (ret) { + PERROR("close"); + } + ret = close(ctx->consumer_thread_pipe[0]); + if (ret) { + PERROR("close"); + } + ret = close(ctx->consumer_thread_pipe[1]); + if (ret) { + PERROR("close"); + } + ret = close(ctx->consumer_poll_pipe[0]); + if (ret) { + PERROR("close"); + } + ret = close(ctx->consumer_poll_pipe[1]); + if (ret) { + PERROR("close"); + } + ret = close(ctx->consumer_should_quit[0]); + if (ret) { + PERROR("close"); + } + ret = close(ctx->consumer_should_quit[1]); + if (ret) { + PERROR("close"); + } unlink(ctx->consumer_command_sock_path); free(ctx); } diff --git a/src/common/error.h b/src/common/error.h index 822dccfed..93c947c0d 100644 --- a/src/common/error.h +++ b/src/common/error.h @@ -22,6 +22,10 @@ #include #include +#ifndef _GNU_SOURCE +#error "lttng-tools error.h needs _GNU_SOURCE" +#endif + /* Stringify the expansion of a define */ #define XSTR(d) STR(d) #define STR(s) #s @@ -40,21 +44,22 @@ extern int opt_verbose; /* * Macro for printing message depending on command line option and verbosity. */ -#define __lttng_print(type, fmt, args...) \ - do { \ - if (opt_quiet == 0) { \ - if (type == PRINT_MSG) { \ - fprintf(stdout, fmt, ## args); \ - } else if (((type & PRINT_DBG) && opt_verbose == 1) || \ - ((type & (PRINT_DBG | PRINT_DBG2)) && \ - opt_verbose == 2) || \ - ((type & (PRINT_DBG | PRINT_DBG2 | PRINT_DBG3)) && \ - opt_verbose == 3)) { \ - fprintf(stderr, fmt, ## args); \ - } else if (type & (PRINT_ERR | PRINT_WARN | PRINT_BUG)) { \ - fprintf(stderr, fmt, ## args); \ - } \ - } \ +#define __lttng_print(type, fmt, args...) \ + do { \ + if (opt_quiet == 0 && type == PRINT_MSG) { \ + fprintf(stdout, fmt, ## args); \ + } else if (opt_quiet == 0 && \ + (((type & PRINT_DBG) && opt_verbose == 1) || \ + ((type & (PRINT_DBG | PRINT_DBG2)) && \ + opt_verbose == 2) || \ + ((type & (PRINT_DBG | PRINT_DBG2 | PRINT_DBG3)) && \ + opt_verbose == 3))) { \ + fprintf(stderr, fmt, ## args); \ + } else if (opt_quiet == 0 && (type & (PRINT_WARN))) { \ + fprintf(stderr, fmt, ## args); \ + } else if (type & (PRINT_ERR | PRINT_BUG)) { \ + fprintf(stderr, fmt, ## args); \ + } \ } while (0); #define MSG(fmt, args...) \ @@ -79,7 +84,7 @@ extern int opt_verbose; " [in %s() at " __FILE__ ":" XSTR(__LINE__) "]\n", ## args, __func__) #define PERROR(call, args...) \ - do { \ + do { \ char *buf; \ char tmp[200]; \ buf = strerror_r(errno, tmp, sizeof(tmp)); \ diff --git a/src/common/runas.c b/src/common/runas.c index 745a6d0d1..60e02a2bf 100644 --- a/src/common/runas.c +++ b/src/common/runas.c @@ -154,14 +154,14 @@ int child_run_as(void *_data) if (data->gid != getegid()) { ret = setegid(data->gid); if (ret < 0) { - perror("setegid"); + PERROR("setegid"); return EXIT_FAILURE; } } if (data->uid != geteuid()) { ret = seteuid(data->uid); if (ret < 0) { - perror("seteuid"); + PERROR("seteuid"); return EXIT_FAILURE; } } @@ -177,7 +177,7 @@ int child_run_as(void *_data) writelen = write(data->retval_pipe, &sendret.c[index], writeleft); if (writelen < 0) { - perror("write"); + PERROR("write"); return EXIT_FAILURE; } writeleft -= writelen; @@ -214,7 +214,7 @@ int run_as(int (*cmd)(void *data), void *data, uid_t uid, gid_t gid) ret = pipe(retval_pipe); if (ret < 0) { - perror("pipe"); + PERROR("pipe"); retval.i = ret; goto end; } @@ -228,7 +228,7 @@ int run_as(int (*cmd)(void *data), void *data, uid_t uid, gid_t gid) MAP_PRIVATE | MAP_GROWSDOWN | MAP_ANONYMOUS | MAP_STACK, -1, 0); if (child_stack == MAP_FAILED) { - perror("mmap"); + PERROR("mmap"); retval.i = -ENOMEM; goto close_pipe; } @@ -240,7 +240,7 @@ int run_as(int (*cmd)(void *data), void *data, uid_t uid, gid_t gid) CLONE_FILES | SIGCHLD, &run_as_data, NULL); if (pid < 0) { - perror("clone"); + PERROR("clone"); retval.i = pid; goto unmap_stack; } @@ -250,7 +250,7 @@ int run_as(int (*cmd)(void *data), void *data, uid_t uid, gid_t gid) do { readlen = read(retval_pipe[0], &retval.c[index], readleft); if (readlen < 0) { - perror("read"); + PERROR("read"); ret = -1; break; } @@ -264,18 +264,24 @@ int run_as(int (*cmd)(void *data), void *data, uid_t uid, gid_t gid) */ pid = waitpid(pid, &status, 0); if (pid < 0 || !WIFEXITED(status) || WEXITSTATUS(status) != 0) { - perror("wait"); + PERROR("wait"); retval.i = -1; } unmap_stack: ret = munmap(child_stack, RUNAS_CHILD_STACK_SIZE); if (ret < 0) { - perror("munmap"); + PERROR("munmap"); retval.i = ret; } close_pipe: - close(retval_pipe[0]); - close(retval_pipe[1]); + ret = close(retval_pipe[0]); + if (ret) { + PERROR("close"); + } + ret = close(retval_pipe[1]); + if (ret) { + PERROR("close"); + } end: return retval.i; } diff --git a/src/common/sessiond-comm/sessiond-comm.c b/src/common/sessiond-comm/sessiond-comm.c index 0c29003a6..8a5ff1d3f 100644 --- a/src/common/sessiond-comm/sessiond-comm.c +++ b/src/common/sessiond-comm/sessiond-comm.c @@ -29,6 +29,7 @@ #include #include +#include #include "sessiond-comm.h" @@ -141,12 +142,11 @@ const char *lttcomm_get_readable_code(enum lttcomm_return_code code) int lttcomm_connect_unix_sock(const char *pathname) { struct sockaddr_un sun; - int fd; - int ret; + int fd, ret, closeret; fd = socket(PF_UNIX, SOCK_STREAM, 0); if (fd < 0) { - perror("socket"); + PERROR("socket"); ret = fd; goto error; } @@ -168,7 +168,10 @@ int lttcomm_connect_unix_sock(const char *pathname) return fd; error_connect: - close(fd); + closeret = close(fd); + if (closeret) { + PERROR("close"); + } error: return ret; } @@ -186,7 +189,7 @@ int lttcomm_accept_unix_sock(int sock) /* Blocking call */ new_fd = accept(sock, (struct sockaddr *) &sun, &len); if (new_fd < 0) { - perror("accept"); + PERROR("accept"); } return new_fd; @@ -204,7 +207,7 @@ int lttcomm_create_unix_sock(const char *pathname) /* Create server socket */ if ((fd = socket(PF_UNIX, SOCK_STREAM, 0)) < 0) { - perror("socket"); + PERROR("socket"); goto error; } @@ -217,7 +220,7 @@ int lttcomm_create_unix_sock(const char *pathname) (void) unlink(pathname); ret = bind(fd, (struct sockaddr *) &sun, sizeof(sun)); if (ret < 0) { - perror("bind"); + PERROR("bind"); goto error; } @@ -236,7 +239,7 @@ int lttcomm_listen_unix_sock(int sock) ret = listen(sock, LTTNG_SESSIOND_COMM_MAX_LISTEN); if (ret < 0) { - perror("listen"); + PERROR("listen"); } return ret; @@ -263,7 +266,7 @@ ssize_t lttcomm_recv_unix_sock(int sock, void *buf, size_t len) ret = recvmsg(sock, &msg, MSG_WAITALL); if (ret < 0) { - perror("recvmsg"); + PERROR("recvmsg"); } return ret; @@ -289,7 +292,7 @@ ssize_t lttcomm_send_unix_sock(int sock, void *buf, size_t len) ret = sendmsg(sock, &msg, 0); if (ret < 0) { - perror("sendmsg"); + PERROR("sendmsg"); } return ret; @@ -300,15 +303,18 @@ ssize_t lttcomm_send_unix_sock(int sock, void *buf, size_t len) */ int lttcomm_close_unix_sock(int sock) { - int ret; + int ret, closeret; /* Shutdown receptions and transmissions */ ret = shutdown(sock, SHUT_RDWR); if (ret < 0) { - perror("shutdown"); + PERROR("shutdown"); } - close(sock); + closeret = close(sock); + if (closeret) { + PERROR("close"); + } return ret; } @@ -351,7 +357,7 @@ ssize_t lttcomm_send_fds_unix_sock(int sock, int *fds, size_t nb_fd) ret = sendmsg(sock, &msg, 0); if (ret < 0) { - perror("sendmsg"); + PERROR("sendmsg"); } return ret; } @@ -386,7 +392,7 @@ ssize_t lttcomm_recv_fds_unix_sock(int sock, int *fds, size_t nb_fd) ret = recvmsg(sock, &msg, 0); if (ret < 0) { - perror("recvmsg fds"); + PERROR("recvmsg fds"); goto end; } if (ret != 1) { @@ -460,7 +466,7 @@ ssize_t lttcomm_send_creds_unix_sock(int sock, void *buf, size_t len) ret = sendmsg(sock, &msg, 0); if (ret < 0) { - perror("sendmsg"); + PERROR("sendmsg"); } return ret; @@ -500,7 +506,7 @@ ssize_t lttcomm_recv_creds_unix_sock(int sock, void *buf, size_t len, ret = recvmsg(sock, &msg, 0); if (ret < 0) { - perror("recvmsg fds"); + PERROR("recvmsg fds"); goto end; } @@ -547,7 +553,7 @@ int lttcomm_setsockopt_creds_unix_sock(int sock) /* Set socket for credentials retrieval */ ret = setsockopt(sock, SOL_SOCKET, SO_PASSCRED, &on, sizeof(on)); if (ret < 0) { - perror("setsockopt creds unix sock"); + PERROR("setsockopt creds unix sock"); } return ret; diff --git a/src/common/ust-consumer/ust-consumer.c b/src/common/ust-consumer/ust-consumer.c index 04c6157e5..20d0405a3 100644 --- a/src/common/ust-consumer/ust-consumer.c +++ b/src/common/ust-consumer/ust-consumer.c @@ -58,7 +58,7 @@ ssize_t lttng_ustconsumer_on_read_subbuffer_mmap( stream->buf, &mmap_offset); if (ret != 0) { errno = -ret; - perror("ustctl_get_mmap_read_offset"); + PERROR("ustctl_get_mmap_read_offset"); goto end; } while (len > 0) { @@ -67,7 +67,7 @@ ssize_t lttng_ustconsumer_on_read_subbuffer_mmap( len = 0; } else if (ret < 0) { errno = -ret; - perror("Error in file write"); + PERROR("Error in file write"); goto end; } /* This won't block, but will start writeout asynchronously */ @@ -109,7 +109,7 @@ int lttng_ustconsumer_take_snapshot(struct lttng_consumer_local_data *ctx, ret = ustctl_snapshot(stream->chan->handle, stream->buf); if (ret != 0) { errno = -ret; - perror("Getting sub-buffer snapshot."); + PERROR("Getting sub-buffer snapshot."); } return ret; @@ -131,7 +131,7 @@ int lttng_ustconsumer_get_produced_snapshot( stream->buf, pos); if (ret != 0) { errno = -ret; - perror("kernctl_snapshot_get_produced"); + PERROR("kernctl_snapshot_get_produced"); } return ret; @@ -260,7 +260,7 @@ end: /* signal the poll thread */ ret = write(ctx->consumer_poll_pipe[1], "4", 1); if (ret < 0) { - perror("write consumer poll"); + PERROR("write consumer poll"); } end_nosignal: return 0; @@ -400,7 +400,7 @@ int lttng_ustconsumer_on_recv_stream(struct lttng_consumer_stream *stream) stream->uid, stream->gid); if (ret < 0) { ERR("Opening %s", stream->path_name); - perror("open"); + PERROR("open"); goto error; } stream->out_fd = ret;