diff options
author | Kay Sievers <kay.sievers@suse.de> | 2005-08-10 16:54:14 +0200 |
---|---|---|
committer | Kay Sievers <kay.sievers@suse.de> | 2005-08-10 16:54:14 +0200 |
commit | 59d6bfefceac1a31b0408e60cd251b5035cf3b50 (patch) | |
tree | 73459c4cec1c944afcb41bda6f3c3737805961bb /udev_utils.c | |
parent | d33c51c24531b602c9f45a8914c6b1db82c003ec (diff) |
split udev_util in several files
It too big for the small tools to link against for only the log function.
Signed-off-by: Kay Sievers <kay.sievers@suse.de>
Diffstat (limited to 'udev_utils.c')
-rw-r--r-- | udev_utils.c | 248 |
1 files changed, 0 insertions, 248 deletions
diff --git a/udev_utils.c b/udev_utils.c index 500d595c01..de43dee30d 100644 --- a/udev_utils.c +++ b/udev_utils.c @@ -28,11 +28,6 @@ #include <ctype.h> #include <dirent.h> #include <syslog.h> -#include <sys/socket.h> -#include <sys/un.h> -#include <sys/wait.h> -#include <sys/stat.h> -#include <sys/mman.h> #include <sys/utsname.h> #include "udev_libc_wrapper.h" @@ -148,109 +143,6 @@ int kernel_release_satisfactory(unsigned int version, unsigned int patchlevel, u return 0; } -int create_path(const char *path) -{ - char p[PATH_SIZE]; - char *pos; - struct stat stats; - - strcpy (p, path); - pos = strrchr(p, '/'); - if (pos == p || pos == NULL) - return 0; - - while (pos[-1] == '/') - pos--; - - pos[0] = '\0'; - - dbg("stat '%s'\n", p); - if (stat (p, &stats) == 0 && (stats.st_mode & S_IFMT) == S_IFDIR) - return 0; - - if (create_path (p) != 0) - return -1; - - dbg("mkdir '%s'\n", p); - return mkdir(p, 0755); -} - -/* Reset permissions on the device node, before unlinking it to make sure, - * that permisions of possible hard links will be removed too. - */ -int unlink_secure(const char *filename) -{ - int retval; - - retval = chown(filename, 0, 0); - if (retval) - dbg("chown(%s, 0, 0) failed with error '%s'", filename, strerror(errno)); - - retval = chmod(filename, 0000); - if (retval) - dbg("chmod(%s, 0000) failed with error '%s'", filename, strerror(errno)); - - retval = unlink(filename); - if (errno == ENOENT) - retval = 0; - - if (retval) - dbg("unlink(%s) failed with error '%s'", filename, strerror(errno)); - - return retval; -} - -int file_map(const char *filename, char **buf, size_t *bufsize) -{ - struct stat stats; - int fd; - - fd = open(filename, O_RDONLY); - if (fd < 0) { - return -1; - } - - if (fstat(fd, &stats) < 0) { - close(fd); - return -1; - } - - *buf = mmap(NULL, stats.st_size, PROT_READ, MAP_SHARED, fd, 0); - if (*buf == MAP_FAILED) { - close(fd); - return -1; - } - *bufsize = stats.st_size; - - close(fd); - - return 0; -} - -void file_unmap(void *buf, size_t bufsize) -{ - munmap(buf, bufsize); -} - -/* return number of chars until the next newline, skip escaped newline */ -size_t buf_get_line(const char *buf, size_t buflen, size_t cur) -{ - int escape = 0; - size_t count; - - for (count = cur; count < buflen; count++) { - if (!escape && buf[count] == '\n') - break; - - if (buf[count] == '\\') - escape = 1; - else - escape = 0; - } - - return count - cur; -} - void replace_untrusted_chars(char *string) { size_t len; @@ -373,143 +265,3 @@ int add_matching_files(struct list_head *name_list, const char *dirname, const c closedir(dir); return 0; } - -int pass_env_to_socket(const char *sockname, const char *devpath, const char *action) -{ - int sock; - struct sockaddr_un saddr; - socklen_t addrlen; - char buf[2048]; - size_t bufpos = 0; - int i; - int retval; - - dbg("pass environment to socket '%s'", sockname); - sock = socket(AF_LOCAL, SOCK_DGRAM, 0); - memset(&saddr, 0x00, sizeof(struct sockaddr_un)); - saddr.sun_family = AF_LOCAL; - /* only abstract namespace is supported */ - strcpy(&saddr.sun_path[1], sockname); - addrlen = offsetof(struct sockaddr_un, sun_path) + strlen(saddr.sun_path+1) + 1; - - bufpos = snprintf(buf, sizeof(buf)-1, "%s@%s", action, devpath); - bufpos++; - for (i = 0; environ[i] != NULL && bufpos < sizeof(buf); i++) { - bufpos += strlcpy(&buf[bufpos], environ[i], sizeof(buf) - bufpos-1); - bufpos++; - } - - retval = sendto(sock, &buf, bufpos, 0, (struct sockaddr *)&saddr, addrlen); - if (retval != -1) - retval = 0; - - close(sock); - return retval; -} - -int execute_program(const char *command, const char *subsystem, - char *result, size_t ressize, size_t *reslen) -{ - int retval = 0; - int count; - int status; - int pipefds[2]; - pid_t pid; - char *pos; - char arg[PATH_SIZE]; - char *argv[(sizeof(arg) / 2) + 1]; - int devnull; - int i; - size_t len; - - strlcpy(arg, command, sizeof(arg)); - i = 0; - if (strchr(arg, ' ')) { - pos = arg; - while (pos != NULL) { - if (pos[0] == '\'') { - /* don't separate if in apostrophes */ - pos++; - argv[i] = strsep(&pos, "\'"); - while (pos && pos[0] == ' ') - pos++; - } else { - argv[i] = strsep(&pos, " "); - } - dbg("arg[%i] '%s'", i, argv[i]); - i++; - } - argv[i] = NULL; - dbg("execute '%s' with parsed arguments", arg); - } else { - argv[0] = arg; - argv[1] = (char *) subsystem; - argv[2] = NULL; - dbg("execute '%s' with subsystem '%s' argument", arg, argv[1]); - } - - if (result) { - if (pipe(pipefds) != 0) { - err("pipe failed"); - return -1; - } - } - - pid = fork(); - switch(pid) { - case 0: - /* child dup2 write side of pipe to STDOUT */ - devnull = open("/dev/null", O_RDWR); - if (devnull >= 0) { - dup2(devnull, STDIN_FILENO); - if (!result) - dup2(devnull, STDOUT_FILENO); - dup2(devnull, STDERR_FILENO); - close(devnull); - } - if (result) - dup2(pipefds[1], STDOUT_FILENO); - execv(arg, argv); - err("exec of program failed"); - _exit(1); - case -1: - err("fork of '%s' failed", arg); - return -1; - default: - /* parent reads from pipefds[0] */ - if (result) { - close(pipefds[1]); - len = 0; - while (1) { - count = read(pipefds[0], result + len, ressize - len-1); - if (count < 0) { - err("read failed with '%s'", strerror(errno)); - retval = -1; - break; - } - - if (count == 0) - break; - - len += count; - if (len >= ressize-1) { - err("ressize %ld too short", (long)ressize); - retval = -1; - break; - } - } - result[len] = '\0'; - close(pipefds[0]); - if (reslen) - *reslen = len; - } - waitpid(pid, &status, 0); - - if (!WIFEXITED(status) || (WEXITSTATUS(status) != 0)) { - dbg("exec program status 0x%x", status); - retval = -1; - } - } - - return retval; -} |