aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog.txt3
-rw-r--r--pseudo_server.c25
-rw-r--r--pseudo_util.c25
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;
}