chiark / gitweb /
[PATCH] Exit, if udevtest cannot open the device (segfault).
[elogind.git] / udev_lib.c
index 381492db01feb4bf51f0cf84f7c5250b20759fac..bd3eeba661184957d2f6401012922411cc109b59 100644 (file)
@@ -29,7 +29,6 @@
 #include <sys/stat.h>
 #include <sys/mman.h>
 
-#include "libsysfs/sysfs/libsysfs.h"
 #include "udev.h"
 #include "logging.h"
 #include "udev_lib.h"
@@ -113,6 +112,14 @@ char get_device_type(const char *path, const char *subsystem)
        return '\0';
 }
 
+void udev_set_values(struct udevice *udev, const char* devpath, const char *subsystem)
+{
+       memset(udev, 0x00, sizeof(struct udevice));
+       strfieldcpy(udev->devpath, devpath);
+       strfieldcpy(udev->subsystem, subsystem);
+       udev->type = get_device_type(devpath, subsystem);
+}
+
 int file_map(const char *filename, char **buf, size_t *bufsize)
 {
        struct stat stats;
@@ -124,11 +131,13 @@ int file_map(const char *filename, char **buf, size_t *bufsize)
        }
 
        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;
@@ -152,6 +161,26 @@ size_t buf_get_line(char *buf, size_t buflen, size_t cur)
        return count - cur;
 }
 
+void leading_slash(char *path)
+{
+       int len;
+
+       len = strlen(path);
+       if (len > 0 && path[len-1] != '/') {
+               path[len] = '/';
+               path[len+1] = '\0';
+       }
+}
+
+void no_leading_slash(char *path)
+{
+       int len;
+
+       len = strlen(path);
+       if (len > 0 && path[len-1] == '/')
+               path[len-1] = '\0';
+}
+
 struct files {
        struct list_head list;
        char name[NAME_SIZE];
@@ -180,7 +209,7 @@ static int file_list_insert(char *filename, struct list_head *file_list)
        return 0;
 }
 
-/* calls function for file or every file found in directory */
+/* calls function for every file found in specified directory */
 int call_foreach_file(int fnct(char *f) , char *dirname, char *suffix)
 {
        struct dirent *ent;
@@ -233,3 +262,22 @@ int call_foreach_file(int fnct(char *f) , char *dirname, char *suffix)
        closedir(dir);
        return 0;
 }
+
+/* Set the FD_CLOEXEC  flag of desc if value is nonzero,
+   or clear the flag if value is 0.
+   Return 0 on success, or -1 on error with errno  set. */ 
+       
+int set_cloexec_flag (int desc, int value)
+{
+       int oldflags = fcntl (desc, F_GETFD, 0);
+       /* If reading the flags failed, return error indication now. */
+       if (oldflags < 0)
+               return oldflags;
+       /* Set just the flag we want to set. */
+       if (value != 0)
+               oldflags |= FD_CLOEXEC;
+       else
+               oldflags &= ~FD_CLOEXEC;
+       /* Store modified flag word in the descriptor. */
+       return fcntl (desc, F_SETFD, oldflags);
+}