]> git.ozlabs.org Git - ccan/blobdiff - ccan/failtest/failtest.c
failtest: fix fascist warn_unused_result warnings
[ccan] / ccan / failtest / failtest.c
index 4f7542f5b16b44f6c8a794cb66033f1f45030c16..30903e3f3c4ecf232d474e2d09bc82f5238e777c 100644 (file)
@@ -84,8 +84,9 @@ static struct failtest_call *add_history_(enum failtest_call_type type,
 #define add_history(type, file, line, elem) \
        add_history_((type), (file), (line), (elem), sizeof(*(elem)))
 
+/* We do a fake call inside a sizeof(), to check types. */
 #define set_cleanup(call, clean, type)                 \
-       (call)->cleanup = (void *)((void)sizeof(clean((type *)NULL)), (clean))
+       (call)->cleanup = (void *)((void)sizeof(clean((type *)NULL),1), (clean))
 
 static bool read_write_info(int fd)
 {
@@ -247,7 +248,8 @@ static struct saved_file *save_file(struct saved_file *next, int fd)
        s->len = lseek(fd, 0, SEEK_END);
        lseek(fd, 0, SEEK_SET);
        s->contents = malloc(s->len);
-       read(fd, s->contents, s->len);
+       if (read(fd, s->contents, s->len) != s->len)
+               err(1, "Failed to save %zu bytes", (size_t)s->len);
        lseek(fd, s->off, SEEK_SET);
        return s;
 }
@@ -292,8 +294,11 @@ static void restore_files(struct saved_file *s)
                struct saved_file *next = s->next;
 
                lseek(s->fd, 0, SEEK_SET);
-               write(s->fd, s->contents, s->len);
-               ftruncate(s->fd, s->len);
+               if (write(s->fd, s->contents, s->len) != s->len)
+                       err(1, "Failed to restore %zu bytes", (size_t)s->len);
+               if (ftruncate(s->fd, s->len) != 0)
+                       err(1, "Failed to trim file to length %zu",
+                           (size_t)s->len);
                free(s->contents);
                lseek(s->fd, s->off, SEEK_SET);
                free(s);
@@ -330,8 +335,9 @@ static NORETURN void failtest_cleanup(bool forced_cleanup, int status)
                if (!history[i].cleanup)
                        continue;
                if (!forced_cleanup) {
-                       printf("Leak at %s:%u\n",
-                              history[i].file, history[i].line);
+                       printf("Leak at %s:%u: --failpath=%s\n",
+                              history[i].file, history[i].line,
+                              failpath_string());
                        status = 1;
                }
                history[i].cleanup(&history[i].u);
@@ -362,11 +368,15 @@ static bool should_fail(struct failtest_call *call)
                /* + means continue after end, like normal. */
                if (*failpath == '+')
                        failpath = NULL;
-               else {
-                       if (tolower(*failpath) != info_to_arg[call->type])
+               else if (*failpath == '\0') {
+                       /* Continue, but don't inject errors. */
+                       return call->fail = false;
+               } else {
+                       if (tolower((unsigned char)*failpath)
+                           != info_to_arg[call->type])
                                errx(1, "Failpath expected '%c' got '%c'\n",
                                     info_to_arg[call->type], *failpath);
-                       call->fail = isupper(*(failpath++));
+                       call->fail = isupper((unsigned char)*(failpath++));
                        return call->fail;
                }
        }
@@ -376,7 +386,7 @@ static bool should_fail(struct failtest_call *call)
                unsigned int i;
 
                for (i = 0; i < history_num; i++) {
-                       char c = info_to_arg[history[i].type];
+                       unsigned char c = info_to_arg[history[i].type];
                        if (history[i].fail)
                                c = toupper(c);
                        if (c != debugpath[i])
@@ -389,8 +399,8 @@ static bool should_fail(struct failtest_call *call)
                        signal(SIGUSR1, SIG_IGN);
                        sprintf(str, "xterm -e gdb /proc/%d/exe %d &",
                                getpid(), getpid());
-                       system(str);
-                       sleep(5);
+                       if (system(str) == 0)
+                               sleep(5);
                }
        }
 
@@ -430,7 +440,7 @@ static bool should_fail(struct failtest_call *call)
        if (child == 0) {
                if (tracefd != -1) {
                        struct timeval now;
-                       char *p;
+                       const char *p;
                        gettimeofday(&now, NULL);
                        if (now.tv_usec < start.tv_usec) {
                                now.tv_sec--;
@@ -441,7 +451,7 @@ static bool should_fail(struct failtest_call *call)
                        p = failpath_string();
                        trace("%u->%u (%u.%02u): %s (", getppid(), getpid(),
                              (int)now.tv_sec, (int)now.tv_usec / 10000, p);
-                       free(p);
+                       free((char *)p);
                        p = strrchr(history[history_num-1].file, '/');
                        if (p)
                                trace("%s", p+1);
@@ -480,8 +490,13 @@ static bool should_fail(struct failtest_call *call)
                else
                        ret = poll(pfd, 2, failtest_timeout_ms);
 
-               if (ret <= 0)
+               if (ret == 0)
                        hand_down(SIGUSR1);
+               if (ret < 0) {
+                       if (errno == EINTR)
+                               continue;
+                       err(1, "Poll returned %i", ret);
+               }
 
                if (pfd[0].revents & POLLIN) {
                        ssize_t len;