diff options
author | Marcel Holtmann <marcel@holtmann.org> | 2009-12-24 07:05:53 -0800 |
---|---|---|
committer | Marcel Holtmann <marcel@holtmann.org> | 2009-12-24 07:05:53 -0800 |
commit | da5d569557a805dd3f4cc4c0d4cd582481b4c7cd (patch) | |
tree | 01dd92069bce2f5868f6a907f8e86c9d497032f4 /src/resolver.c | |
parent | c7fdd26c2410fc18195baa313700a47fa76fec67 (diff) | |
download | connman-da5d569557a805dd3f4cc4c0d4cd582481b4c7cd.tar.gz connman-da5d569557a805dd3f4cc4c0d4cd582481b4c7cd.tar.bz2 connman-da5d569557a805dd3f4cc4c0d4cd582481b4c7cd.zip |
Fix permissions of newly created /etc/resolv.conf
Diffstat (limited to 'src/resolver.c')
-rw-r--r-- | src/resolver.c | 24 |
1 files changed, 20 insertions, 4 deletions
diff --git a/src/resolver.c b/src/resolver.c index fa6880c8..59adeab4 100644 --- a/src/resolver.c +++ b/src/resolver.c @@ -338,30 +338,46 @@ static int resolvfile_append(const char *interface, const char *domain, { char *cmd; int fd, len, err; + mode_t old_umask; DBG("interface %s server %s", interface, server); if (interface == NULL) return -ENOENT; + old_umask = umask(022); + fd = open("/etc/resolv.conf", O_RDWR | O_CREAT, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); - if (fd < 0) - return -errno; + if (fd < 0) { + err = -errno; + goto done; + } + + if (ftruncate(fd, 0) < 0) { + err = -errno; + goto failed; + } - err = ftruncate(fd, 0); + err = 0; cmd = g_strdup_printf("# Generated by Connection Manager\n" "options edns0\n" "nameserver %s\n", server); len = write(fd, cmd, strlen(cmd)); + if (len < 0) + err = -errno; g_free(cmd); +failed: close(fd); - return 0; +done: + umask(old_umask); + + return err; } static int resolvfile_remove(const char *interface, const char *domain, |