summaryrefslogtreecommitdiff
path: root/udev_device.c
diff options
context:
space:
mode:
authorKay Sievers <kay.sievers@suse.de>2005-07-22 12:35:58 -0400
committerKay Sievers <kay.sievers@suse.de>2005-07-22 12:35:58 -0400
commite8d569b4145a358775e87058829133fa725b32fd (patch)
tree840f9b66b6e0948faacbcb42b78f0672fd1ca758 /udev_device.c
parent761e5b476f8e69f41958a62ed787f5d886fa212e (diff)
move code to its own files
Signed-off-by: Kay Sievers <kay.sievers@suse.de>
Diffstat (limited to 'udev_device.c')
-rw-r--r--udev_device.c121
1 files changed, 121 insertions, 0 deletions
diff --git a/udev_device.c b/udev_device.c
new file mode 100644
index 0000000000..45bb6a2876
--- /dev/null
+++ b/udev_device.c
@@ -0,0 +1,121 @@
+/*
+ * udev_utils.c - generic stuff used by udev
+ *
+ * Copyright (C) 2004, 2005 Kay Sievers <kay.sievers@vrfy.org>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <stddef.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <ctype.h>
+#include <dirent.h>
+#include <syslog.h>
+#include <sys/wait.h>
+#include <sys/stat.h>
+#include <sys/mman.h>
+#include <sys/utsname.h>
+
+#include "udev_libc_wrapper.h"
+#include "udev.h"
+#include "logging.h"
+#include "udev_utils.h"
+#include "udev_sysfs.h"
+#include "list.h"
+
+
+int udev_init_device(struct udevice *udev, const char* devpath, const char *subsystem, const char *action)
+{
+ char *pos;
+
+ memset(udev, 0x00, sizeof(struct udevice));
+ INIT_LIST_HEAD(&udev->symlink_list);
+ INIT_LIST_HEAD(&udev->run_list);
+ INIT_LIST_HEAD(&udev->env_list);
+
+ if (subsystem)
+ strlcpy(udev->subsystem, subsystem, sizeof(udev->subsystem));
+
+ if (action)
+ strlcpy(udev->action, action, sizeof(udev->action));
+
+ if (devpath) {
+ strlcpy(udev->devpath, devpath, sizeof(udev->devpath));
+ remove_trailing_char(udev->devpath, '/');
+
+ if (strncmp(udev->devpath, "/block/", 7) == 0)
+ udev->type = DEV_BLOCK;
+ else if (strncmp(udev->devpath, "/class/net/", 11) == 0)
+ udev->type = DEV_NET;
+ else if (strncmp(udev->devpath, "/class/", 7) == 0)
+ udev->type = DEV_CLASS;
+ else if (strncmp(udev->devpath, "/devices/", 9) == 0)
+ udev->type = DEV_DEVICE;
+
+ /* get kernel name */
+ pos = strrchr(udev->devpath, '/');
+ if (pos) {
+ strlcpy(udev->kernel_name, &pos[1], sizeof(udev->kernel_name));
+ dbg("kernel_name='%s'", udev->kernel_name);
+
+ /* Some block devices have '!' in their name, change that to '/' */
+ pos = udev->kernel_name;
+ while (pos[0] != '\0') {
+ if (pos[0] == '!')
+ pos[0] = '/';
+ pos++;
+ }
+
+ /* get kernel number */
+ pos = &udev->kernel_name[strlen(udev->kernel_name)];
+ while (isdigit(pos[-1]))
+ pos--;
+ strlcpy(udev->kernel_number, pos, sizeof(udev->kernel_number));
+ dbg("kernel_number='%s'", udev->kernel_number);
+ }
+ }
+
+ if (udev->type == DEV_BLOCK || udev->type == DEV_CLASS) {
+ udev->mode = 0660;
+ strcpy(udev->owner, "root");
+ strcpy(udev->group, "root");
+ }
+
+ return 0;
+}
+
+void udev_cleanup_device(struct udevice *udev)
+{
+ struct name_entry *name_loop;
+ struct name_entry *temp_loop;
+
+ list_for_each_entry_safe(name_loop, temp_loop, &udev->symlink_list, node) {
+ list_del(&name_loop->node);
+ free(name_loop);
+ }
+ list_for_each_entry_safe(name_loop, temp_loop, &udev->run_list, node) {
+ list_del(&name_loop->node);
+ free(name_loop);
+ }
+ list_for_each_entry_safe(name_loop, temp_loop, &udev->env_list, node) {
+ list_del(&name_loop->node);
+ free(name_loop);
+ }
+}