diff options
Diffstat (limited to 'src/satd.c')
-rw-r--r-- | src/satd.c | 60 |
1 files changed, 11 insertions, 49 deletions
@@ -19,56 +19,21 @@ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ -#include <stdio.h> -#include <stdlib.h> -#include <string.h> +#include <unistd.h> #include <errno.h> -#include <grp.h> #include <sys/stat.h> #include <sys/socket.h> +#include <sys/un.h> #include "daemonise.h" +#include "common.h" -#define t(...) do { if (__VA_ARGS__) goto fail; } while (0) +COMMAND("satd") +USAGE("[-f]") -/** - * The name of the process. - */ -char *argv0 = "satd"; - - - -/** - * Print usage information. - */ -static void -usage(void) -{ - fprintf(stderr, "usage: [-f] %s\n", - strrchr(argv0) ? (strrchr(argv0) + 1) : argv0); - exit(2); -} - - -/** - * Get the group ID of a group. - * - * @param name The name of the group. - * @param fallback The group ID to return if the group is not found. - * @return The ID of the group, -1 on error. - */ -static gid_t -getgroup(const char* name, gid_t fallback) -{ - struct group *g; - if (!(g = getgrnam(name))) - return errno ? (gid_t)-1 : fallback; - return g->gr_gid; -} - /** * Create the socket. @@ -82,22 +47,19 @@ create_socket(struct sockaddr_un *address) int fd = -1; ssize_t len; char *dir; - gid_t group; + int saved_errno; - dir = getenv("XDG_RUNTIME_DIR"), dir = (dir ? dir : "/run") + dir = getenv("XDG_RUNTIME_DIR"), dir = (dir ? dir : "/run"); t (snprintf(NULL, 0, "%s/satd.socket%zn", dir, &len) == -1); - if ((len < 0) || (len >= sizeof(address->sun_path))) { - errno = ENAMETOOLING; - goto fail; - } - sprintf(address->sun_path, "%s/satd.socket", dir) + if ((len < 0) || ((size_t)len >= sizeof(address->sun_path))) + t ((errno = ENAMETOOLONG)); + sprintf(address->sun_path, "%s/satd.socket", dir); address->sun_family = AF_UNIX; /* TODO test flock */ unlink(address->sun_path); t ((fd = socket(PF_UNIX, SOCK_STREAM, 0)) == -1); t (fchmod(fd, S_IRWXU) == -1); - t ((group = getgroup("nobody", 0)) == -1); - t (fchown(fd, getuid(), group) == -1); + t (fchown(fd, getuid(), getgid()) == -1); t (bind(fd, (struct sockaddr *)address, sizeof(*address)) == -1); /* TODO flock */ |