X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=libatalk%2Futil%2Funix.c;h=d202b99a31f9d1dc165c7836b8b43d3d0fcd6f4c;hb=2fdd522410f80afcd055d7333f491ee6c0b4b9fa;hp=9e71fcb4b71a3b7fd53479c4cebc2cef7cb3bb30;hpb=6f2cdbbc7b3cf66adc0477903caa4951dc812e6f;p=netatalk.git diff --git a/libatalk/util/unix.c b/libatalk/util/unix.c index 9e71fcb4..d202b99a 100644 --- a/libatalk/util/unix.c +++ b/libatalk/util/unix.c @@ -40,6 +40,60 @@ #include #include #include +#include + +/* close all FDs >= a specified value */ +static void closeall(int fd) +{ + int fdlimit = sysconf(_SC_OPEN_MAX); + + while (fd < fdlimit) + close(fd++); +} + +/*! + * Daemonize + * + * Fork, exit parent, setsid(), optionally chdir("/"), optionally close all fds + * + * returns -1 on failure, but you can't do much except exit in that case + * since we may already have forked + */ +int daemonize(int nochdir, int noclose) +{ + switch (fork()) { + case 0: + break; + case -1: + return -1; + default: + _exit(0); + } + + if (setsid() < 0) + return -1; + + switch (fork()) { + case 0: + break; + case -1: + return -1; + default: + _exit(0); + } + + if (!nochdir) + chdir("/"); + + if (!noclose) { + closeall(0); + open("/dev/null",O_RDWR); + dup(0); + dup(0); + } + + return 0; +} /*! * @brief get cwd in static buffer @@ -57,6 +111,31 @@ const char *getcwdpath(void) return strerror(errno); } +/*! + * Make argument path absoulte + * + * @returns pointer to path or pointer to error messages on error + */ +const char *abspath(const char *name) +{ + static char buf[MAXPATHLEN + 1]; + char *p; + int n; + + if (name[0] == '/') + return name; + + if ((p = getcwd(buf, MAXPATHLEN)) == NULL) + return strerror(errno); + + n = strlen(buf); + if (buf[n-1] != '/') + buf[n++] = '/'; + + strlcpy(buf + n, name, MAXPATHLEN - n); + return buf; +} + /*! * Takes a buffer with a path, strips slashs, returns basename *