#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
+#include <sys/stat.h>
#include "udev.h"
#include "udev_version.h"
#include "udevdb.h"
#include "libsysfs/libsysfs.h"
-static char sysfs_path[SYSFS_PATH_MAX];
-
/*
* Right now the major/minor of a device is stored in a file called
* "dev" in sysfs.
{
char filename[255];
int retval = 0;
+ dev_t res;
- strncpy(filename, UDEV_ROOT, sizeof(filename));
+ strncpy(filename, udev_root, sizeof(filename));
strncat(filename, dev->name, sizeof(filename));
+#ifdef __KLIBC__
+ res = (dev->major << 8) | (dev->minor);
+#else
+ res = makedev(dev->major, dev->minor);
+#endif
+
switch (dev->type) {
case 'b':
dev->mode |= S_IFBLK;
}
dbg("mknod(%s, %#o, %u, %u)", filename, dev->mode, dev->major, dev->minor);
- retval = mknod(filename, dev->mode, makedev(dev->major, dev->minor));
+ retval = mknod(filename, dev->mode, res);
if (retval)
dbg("mknod(%s, %#o, %u, %u) failed with error '%s'",
filename, dev->mode, dev->major, dev->minor, strerror(errno));
* If it doesn't happen in about 10 seconds, give up.
*/
#define SECONDS_TO_WAIT_FOR_DEV 10
-int sleep_for_dev(char *path)
+static int sleep_for_dev(char *path)
{
char filename[SYSFS_PATH_MAX + 6];
struct stat buf;
/* sleep for a second or two to give the kernel a chance to
* create the dev file */
sleep(1);
+ ++loop;
}
retval = -ENODEV;
exit:
{
struct sysfs_class_device *class_dev;
struct udevice dev;
- struct device_attr attr;
int retval = -EINVAL;
/* for now, the block layer is the only place where block devices are */
else
dev.type = 'c';
- retval = sysfs_get_mnt_path(sysfs_path, SYSFS_PATH_MAX);
- dbg("sysfs_path = %s", sysfs_path);
- if (retval) {
- dbg("sysfs_get_mnt_path failed");
- goto exit;
- }
-
retval = sleep_for_dev(path);
if (retval)
goto exit;
if (class_dev == NULL)
goto exit;
- retval = namedev_name_device(class_dev, &attr);
+ retval = namedev_name_device(class_dev, &dev);
if (retval)
return retval;
goto exit;
}
- strcpy(dev.name, attr.name);
- strcpy(dev.owner, attr.owner);
- strcpy(dev.group, attr.group);
- dev.mode = attr.mode;
+// strcpy(dev.name, attr.name);
+// strcpy(dev.owner, attr.owner);
+// strcpy(dev.group, attr.group);
+// dev.mode = attr.mode;
retval = udevdb_add_dev(path, &dev);
if (retval != 0)