#include <sys/un.h>
#include <unistd.h>
#include <pwd.h>
+#include <err.h>
#include <nettle/sha.h>
static int numservers;
void diee(const char *m) {
- fprintf(stderr,"cgi-fcgi-: error: %s failed: %s\n", m, strerror(errno));
- exit(127);
+ err(127, "error: %s failed", m);
}
static void fusagemessage(FILE *f) {
diee("stat /var/run/user/UID");
}
if (!S_ISDIR(stab.st_mode)) {
- fprintf(stderr,"%s not a directory, falling back to ~\n", try);
+ warnx("%s not a directory, falling back to ~\n", try);
return 0;
}
if (stab.st_uid != us) {
- fprintf(stderr,"%s not owned by uid %lu, falling back to ~\n",
- try, (unsigned long)us);
+ warnx("%s not owned by uid %lu, falling back to ~\n", try,
+ (unsigned long)us);
return 0;
}
if (stab.st_mode & 0077) {
- fprintf(stderr,"%s writeable by group or other, falling back to ~\n",try);
+ warnx("%s writeable by group or other, falling back to ~\n", try);
return 0;
}
run_base = m_asprintf("%s/%s", try, "cgi-fcgi-perl");
static void find_socket_path(void) {
struct sockaddr_un sun;
+ int r;
us = getuid(); if (us==(uid_t)-1) diee("getuid");
int maxidentlen = sizeof(sun.sun_path) - strlen(run_base) - 10 - 2;
if (!ident) {
- if (maxidentlen < MINHEXHASH) {
- fprintf(stderr,"cgi-fcgi-perl: base directory `%s'"
- " leaves only %d characters for command name hash"
- " which is too little (<%d)\n",
- run_base, maxidentlen, MINHEXHASH);
- exit(127);
- }
+ if (maxidentlen < MINHEXHASH)
+ errx(127,"cgi-fcgi-perl: base directory `%s'"
+ " leaves only %d characters for command name hash"
+ " which is too little (<%d)",
+ run_base, maxidentlen, MINHEXHASH);
int identlen = maxidentlen > 64 ? 64 : maxidentlen;
char *hexident = xmalloc(identlen + 2);
ident = hexident;
}
- if (strlen(ident) > maxidentlen) {
- fprintf(stderr,"cgi-fgci-perl: base directory `%s'"
- " plus ident `%s' too long (with spare) for socket\n",
- run_base, ident);
- exit(127);
+ if (strlen(ident) > maxidentlen)
+ errx(127, "base directory `%s' plus ident `%s' too long"
+ " (with spare) for socket (max ident %d)\n",
+ run_base, ident, maxidentlen);
+
+ r = mkdir(run_base, 0700);
+ if (r) {
+ if (!(errno == EEXIST))
+ err(127,"mkdir %s",run_base);
}
socket_path = m_asprintf("%s/g%s",run_base,ident);
myopt(&argv, cmdinfos);
command = *argv++;
- if (!command || *argv) {
- fprintf(stderr,"wrong number of arguments\n");
- exit(127);
- }
+ if (!command) errx(127,"need command argument");
+ if (*argv) errx(127,"too many arguments");
find_socket_path();