chiark / gitweb /
[PATCH] remove udev_lib dependency from udevsend, which makes it smaller
[elogind.git] / udev_lib.c
index e9c16c863a3407ac0705923c375b8264441b3f39..84daf9fd19fba4bac7c5d3356c73ab6e27ca542e 100644 (file)
 #include <sys/stat.h>
 #include <sys/mman.h>
 
-#include "libsysfs/sysfs/libsysfs.h"
 #include "udev.h"
 #include "logging.h"
 #include "udev_lib.h"
 #include "list.h"
 
 
-char *get_action(void)
-{
-       char *action;
-
-       action = getenv("ACTION");
-       if (action != NULL && strlen(action) > ACTION_SIZE)
-               action[ACTION_SIZE-1] = '\0';
-
-       return action;
-}
+#define BLOCK_PATH             "/block/"
+#define CLASS_PATH             "/class/"
+#define NET_PATH               "/class/net/"
 
-char *get_devpath(void)
+char get_device_type(const char *path, const char *subsystem)
 {
-       char *devpath;
+       if (strcmp(subsystem, "block") == 0)
+               return 'b';
 
-       devpath = getenv("DEVPATH");
-       if (devpath != NULL && strlen(devpath) > DEVPATH_SIZE)
-               devpath[DEVPATH_SIZE-1] = '\0';
+       if (strcmp(subsystem, "net") == 0)
+               return 'n';
 
-       return devpath;
-}
+       if (strncmp(path, BLOCK_PATH, strlen(BLOCK_PATH)) == 0 &&
+           strlen(path) > strlen(BLOCK_PATH))
+               return 'b';
 
-char *get_devnode(void)
-{
-       char *devnode;
+       if (strncmp(path, NET_PATH, strlen(NET_PATH)) == 0 &&
+           strlen(path) > strlen(NET_PATH))
+               return 'n';
 
-       devnode = getenv("DEVNODE");
-       if (devnode != NULL && strlen(devnode) > NAME_SIZE)
-               devnode[NAME_SIZE-1] = '\0';
+       if (strncmp(path, CLASS_PATH, strlen(CLASS_PATH)) == 0 &&
+           strlen(path) > strlen(CLASS_PATH))
+               return 'c';
 
-       return devnode;
+       return '\0';
 }
 
-char *get_seqnum(void)
+void udev_set_values(struct udevice *udev, const char* devpath,
+                    const char *subsystem, const char* action)
 {
-       char *seqnum;
-
-       seqnum = getenv("SEQNUM");
-
-       return seqnum;
+       memset(udev, 0x00, sizeof(struct udevice));
+       strfieldcpy(udev->devpath, devpath);
+       strfieldcpy(udev->subsystem, subsystem);
+       strfieldcpy(udev->action, action);
+       udev->type = get_device_type(devpath, subsystem);
 }
 
-char *get_subsystem(char *subsystem)
+int create_path(const char *path)
 {
-       if (subsystem != NULL && strlen(subsystem) > SUBSYSTEM_SIZE)
-               subsystem[SUBSYSTEM_SIZE-1] = '\0';
+       char p[NAME_SIZE];
+       char *pos;
+       struct stat stats;
 
-       return subsystem;
-}
+       strcpy (p, path);
+       pos = strrchr(p, '/');
+       if (pos == p || pos == NULL)
+               return 0;
 
-char get_device_type(const char *path, const char *subsystem)
-{
-       if (strcmp(subsystem, "block") == 0 ||
-           strstr(path, "/block/") != NULL)
-               return 'b';
+       while (pos[-1] == '/')
+               pos--;
 
-       if (strcmp(subsystem, "net") == 0 ||
-           strstr(path, "/class/net/") != NULL)
-               return 'n';
+       pos[0] = '\0';
 
-       if (strstr(path, "/class/") != NULL)
-               return 'c';
+       dbg("stat '%s'\n", p);
+       if (stat (p, &stats) == 0 && (stats.st_mode & S_IFMT) == S_IFDIR)
+               return 0;
 
-       return '\0';
+       if (create_path (p) != 0)
+               return -1;
+
+       dbg("mkdir '%s'\n", p);
+       return mkdir(p, 0755);
 }
 
 int file_map(const char *filename, char **buf, size_t *bufsize)
@@ -113,11 +110,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;
@@ -141,6 +140,15 @@ size_t buf_get_line(char *buf, size_t buflen, size_t cur)
        return count - cur;
 }
 
+void no_trailing_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];
@@ -169,7 +177,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;
@@ -209,9 +217,8 @@ int call_foreach_file(int fnct(char *f) , char *dirname, char *suffix)
 
        /* call function for every file in the list */
        list_for_each_entry_safe(loop_file, tmp_file, &file_list, list) {
-               strfieldcpy(file, dirname);
-               strfieldcat(file, "/");
-               strfieldcat(file, loop_file->name);
+               snprintf(file, NAME_SIZE-1, "%s/%s", dirname, loop_file->name);
+               file[NAME_SIZE-1] = '\0';
 
                fnct(file);