chiark / gitweb /
[PATCH] first cut at standalone udev_selinux program.
[elogind.git] / udev-add.c
index ed0286d1fc2e9175ab688abb8ab8121e27ed88a6..aef755442fd3c4ecfab6d36489d65cb8c963a28e 100644 (file)
@@ -37,9 +37,8 @@
 
 #include "libsysfs/sysfs/libsysfs.h"
 #include "udev.h"
+#include "udev_lib.h"
 #include "udev_version.h"
-#include "udev_dbus.h"
-#include "udev_selinux.h"
 #include "logging.h"
 #include "namedev.h"
 #include "udevdb.h"
@@ -141,7 +140,7 @@ static void set_to_local_user(char *user)
        struct utmp *u;
        time_t recent = 0;
 
-       strnfieldcpy(user, default_owner_str, OWNER_SIZE);
+       strfieldcpymax(user, default_owner_str, OWNER_SIZE);
        setutent();
        while (1) {
                u = getutent();
@@ -158,7 +157,7 @@ static void set_to_local_user(char *user)
 
                if (u->ut_time > recent) {
                        recent = u->ut_time;
-                       strnfieldcpy(user, u->ut_user, OWNER_SIZE);
+                       strfieldcpymax(user, u->ut_user, OWNER_SIZE);
                        dbg("local user is '%s'", user);
                        break;
                }
@@ -186,16 +185,17 @@ static int unlink_entry(char *filename)
 
 static int create_node(struct udevice *dev, int fake)
 {
-       char filename[255];
-       char linktarget[255];
-       char partitionname[255];
-       char *linkname;
-       char *symlinks;
+       char filename[NAME_SIZE];
+       char linkname[NAME_SIZE];
+       char linktarget[NAME_SIZE];
+       char partitionname[NAME_SIZE];
        int retval = 0;
        uid_t uid = 0;
        gid_t gid = 0;
        int i;
        int tail;
+       char *pos;
+       int len;
 
        strfieldcpy(filename, udev_root);
        strfieldcat(filename, dev->name);
@@ -226,10 +226,11 @@ static int create_node(struct udevice *dev, int fake)
                if (endptr[0] == '\0')
                        uid = (uid_t) id;
                else {
+                       struct passwd *pw;
                        if (strncmp(dev->owner, LOCAL_USER, sizeof(LOCAL_USER)) == 0)
                                set_to_local_user(dev->owner);
 
-                       struct passwd *pw = getpwnam(dev->owner);
+                       pw = getpwnam(dev->owner);
                        if (pw == NULL)
                                dbg("specified user unknown '%s'", dev->owner);
                        else
@@ -275,51 +276,42 @@ static int create_node(struct udevice *dev, int fake)
                }
        }
 
-       if (!fake)
-               selinux_add_node(filename);
-
        /* create symlink if requested */
-       if (dev->symlink[0] != '\0') {
-               symlinks = dev->symlink;
-               while (1) {
-                       linkname = strsep(&symlinks, " ");
-                       if (linkname == NULL || linkname[0] == '\0')
-                               break;
-
-                       strfieldcpy(filename, udev_root);
-                       strfieldcat(filename, linkname);
-                       dbg("symlink '%s' to node '%s' requested", filename, dev->name);
-                       if (!fake)
-                               if (strrchr(linkname, '/'))
-                                       create_path(filename);
-
-                       /* optimize relative link */
-                       linktarget[0] = '\0';
-                       i = 0;
-                       tail = 0;
-                       while ((dev->name[i] == linkname[i]) && dev->name[i]) {
-                               if (dev->name[i] == '/')
-                                       tail = i+1;
-                               i++;
-                       }
-                       while (linkname[i] != '\0') {
-                               if (linkname[i] == '/')
-                                       strfieldcat(linktarget, "../");
-                               i++;
-                       }
+       foreach_strpart(dev->symlink, " ", pos, len) {
+               strfieldcpymax(linkname, pos, len+1);
+               strfieldcpy(filename, udev_root);
+               strfieldcat(filename, linkname);
+               dbg("symlink '%s' to node '%s' requested", filename, dev->name);
+               if (!fake)
+                       if (strrchr(linkname, '/'))
+                               create_path(filename);
+
+               /* optimize relative link */
+               linktarget[0] = '\0';
+               i = 0;
+               tail = 0;
+               while ((dev->name[i] == linkname[i]) && dev->name[i]) {
+                       if (dev->name[i] == '/')
+                               tail = i+1;
+                       i++;
+               }
+               while (linkname[i] != '\0') {
+                       if (linkname[i] == '/')
+                               strfieldcat(linktarget, "../");
+                       i++;
+               }
 
-                       strfieldcat(linktarget, &dev->name[tail]);
+               strfieldcat(linktarget, &dev->name[tail]);
 
-                       if (!fake)
-                               unlink_entry(filename);
+               if (!fake)
+                       unlink_entry(filename);
 
-                       dbg("symlink(%s, %s)", linktarget, filename);
-                       if (!fake) {
-                               retval = symlink(linktarget, filename);
-                               if (retval != 0)
-                                       dbg("symlink(%s, %s) failed with error '%s'",
-                                           linktarget, filename, strerror(errno));
-                       }
+               dbg("symlink(%s, %s)", linktarget, filename);
+               if (!fake) {
+                       retval = symlink(linktarget, filename);
+                       if (retval != 0)
+                               dbg("symlink(%s, %s) failed with error '%s'",
+                                   linktarget, filename, strerror(errno));
                }
        }
 
@@ -421,7 +413,7 @@ int udev_add_device(char *path, char *subsystem, int fake)
        retval = create_node(&dev, fake);
 
        if ((retval == 0) && (!fake))
-               sysbus_send_create(&dev, path);
+               dev_d_send(&dev, subsystem);
 
 exit:
        if (class_dev)