diff options
-rw-r--r-- | ChangeLog.txt | 3 | ||||
-rw-r--r-- | pseudo_server.c | 25 | ||||
-rw-r--r-- | pseudo_util.c | 25 |
3 files changed, 42 insertions, 11 deletions
diff --git a/ChangeLog.txt b/ChangeLog.txt index 2d40a7c..138e54c 100644 --- a/ChangeLog.txt +++ b/ChangeLog.txt @@ -1,3 +1,6 @@ +2010-03-16: + * (seebs) Fix missing error checking noted by comp.lang.c reader. + 2010-03-16: 0.2 * first public release diff --git a/pseudo_server.c b/pseudo_server.c index 962c7ce..81fbd4a 100644 --- a/pseudo_server.c +++ b/pseudo_server.c @@ -102,13 +102,17 @@ pseudo_server_start(int daemonize) { /* cd to the data directory */ pseudo_path = pseudo_prefix_path(PSEUDO_DATA); + if (!pseudo_path) { + pseudo_diag("can't find prefix/%s directory.\n", PSEUDO_DATA); + return 1; + } if (chdir(pseudo_path) == -1) { pseudo_diag("can't get to '%s': %s\n", pseudo_path, strerror(errno)); return 1; } free(pseudo_path); - /* remove existing socket */ + /* remove existing socket -- if it exists */ unlink(sun.sun_path); if (bind(listen_fd, (struct sockaddr *) &sun, sizeof(sun)) == -1) { pseudo_diag("couldn't bind listening socket: %s\n", strerror(errno)); @@ -120,7 +124,7 @@ pseudo_server_start(int daemonize) { } if (daemonize && ((rc = fork()) != 0)) { if (rc == -1) { - pseudo_diag("couldn't spawn server: errno %d\n", errno); + pseudo_diag("couldn't spawn server: %s\n", strerror(errno)); return 0; } pseudo_debug(2, "started server, pid %d\n", rc); @@ -129,8 +133,17 @@ pseudo_server_start(int daemonize) { } setsid(); pseudo_path = pseudo_prefix_path(PSEUDO_PIDFILE); + if (!pseudo_path) { + pseudo_diag("Couldn't get path for prefix/%s\n", PSEUDO_PIDFILE); + return 1; + } fp = fopen(pseudo_path, "w"); - fprintf(fp, "%d\n", getpid()); + if (!fp) { + pseudo_diag("Couldn't open %s: %s\n", + pseudo_path, strerror(errno)); + return 1; + } + fprintf(fp, "%lld\n", (long long) getpid()); fclose(fp); free(pseudo_path); if (daemonize) { @@ -140,9 +153,13 @@ pseudo_server_start(int daemonize) { fclose(stdin); fclose(stdout); pseudo_path = pseudo_prefix_path(PSEUDO_LOGFILE); + if (!pseudo_path) { + pseudo_diag("can't get path for prefix/%s\n", PSEUDO_LOGFILE); + return 1; + } fd = open(pseudo_path, O_WRONLY | O_APPEND | O_CREAT, 0644); if (fd == -1) { - pseudo_diag("help: can't open pseudo.log: %s\n", strerror(errno)); + pseudo_diag("help: can't open %s: %s\n", PSEUDO_LOGFILE, strerror(errno)); } else { pseudo_util_debug_fd = fd; fclose(stderr); diff --git a/pseudo_util.c b/pseudo_util.c index 2e21824..0a2c683 100644 --- a/pseudo_util.c +++ b/pseudo_util.c @@ -415,7 +415,7 @@ pseudo_setupenv(char *opts) { * setting the prefix all set it in the environment. */ char * -pseudo_prefix_path(char *s) { +pseudo_prefix_path(char *file) { static char *prefix = NULL; static size_t prefix_len; char *path; @@ -427,17 +427,28 @@ pseudo_prefix_path(char *s) { exit(1); } prefix_len = strlen(prefix); - while ((prefix[prefix_len - 1] == '/') && (prefix_len > 0)) { - prefix[--prefix_len] = '\0'; - } } - if (!s) { + if (!file) { return strdup(prefix); } else { - size_t len = prefix_len + strlen(s) + 2; + size_t len = prefix_len + strlen(file) + 2; path = malloc(len); if (path) { - snprintf(path, len, "%s/%s", prefix, s); + char *endptr; + int rc; + + rc = snprintf(path, len, "%s", prefix); + /* this certainly SHOULD be impossible */ + if (rc >= len) + rc = len - 1; + endptr = path + rc; + /* strip extra slashes. + * This probably has no real effect, but I don't like + * seeing "//" in paths. + */ + while ((endptr > path) && (endptr[-1] == '/')) + --endptr; + snprintf(endptr, len - (endptr - path), "/%s", file); } return path; } |