#include "udev.h"
#include "udev_lib.h"
#include "udev_version.h"
+#include "udev_db.h"
#include "logging.h"
-#include "udevdb.h"
-# define SYSFS_VALUE_MAX 200
-
-char **main_argv;
-int main_argc;
+#define SYSFS_VALUE_SIZE 256
#ifdef LOG
unsigned char logname[LOGNAME_SIZE];
struct dlist *attributes;
struct sysfs_attribute *attr;
struct sysfs_directory *sysfs_dir;
- char value[SYSFS_VALUE_MAX];
+ char value[SYSFS_VALUE_SIZE];
int len;
int retval = 0;
return retval;
}
-static int process_options(void)
+/* print all class/main block devices with major/minor, physical device, driver and bus */
+static int print_sysfs_devices(void)
{
- static const char short_options[] = "adn:p:q:rVh";
+ struct dlist *subsyslist;
+ char *class;
+
+ subsyslist = sysfs_open_subsystem_list("class");
+ if (!subsyslist)
+ return -1;
+
+ dlist_for_each_data(subsyslist, class, char) {
+ struct sysfs_class *cls;
+ struct dlist *class_devices;
+ struct sysfs_class_device *class_dev;
+ struct sysfs_device *phys_dev;
+ struct sysfs_driver *driver;
+
+ cls = sysfs_open_class(class);
+ if (!cls)
+ continue;
+
+ class_devices = sysfs_get_class_devices(cls);
+ if (!class_devices)
+ continue;
+
+ dlist_for_each_data(class_devices, class_dev, struct sysfs_class_device) {
+ struct sysfs_attribute *attr;
+
+ printf("\n");
+ printf("DEVPATH '%s'\n", class_dev->path);
+ printf("SUBSYSTEM '%s'\n", class_dev->classname);
+
+ attr = sysfs_get_classdev_attr(class_dev, "dev");
+ if (attr) {
+ char *pos = &(attr->value[strlen(attr->value)-1]);
+
+ if (pos[0] == '\n')
+ pos[0] = '\0';
+
+ printf("DEVMAJORMINOR '%s'\n", attr->value);
+ }
+
+ driver = sysfs_get_classdev_driver(class_dev);
+ if (driver)
+ printf("DEVDRIVER '%s'\n", driver->name);
+
+ phys_dev = sysfs_get_classdev_device(class_dev);
+ if (phys_dev) {
+ printf("PHYSDEVPATH '%s'\n", phys_dev->path);
+ if (phys_dev->bus[0] != '\0')
+ printf("PHYSDEVBUS '%s'\n", phys_dev->bus);
+ }
+ }
+ sysfs_close_class(cls);
+ }
+ sysfs_close_list(subsyslist);
+
+ return 0;
+}
+
+static int process_options(int argc, char *argv[])
+{
+ static const char short_options[] = "adn:p:q:rsVh";
int option;
int retval = 1;
struct udevice udev;
int root = 0;
int attributes = 0;
enum query_type query = NONE;
- char result[NAME_SIZE] = "";
+ char result[1024] = "";
char path[NAME_SIZE] = "";
char name[NAME_SIZE] = "";
char temp[NAME_SIZE];
/* get command line options */
while (1) {
- option = getopt(main_argc, main_argv, short_options);
+ option = getopt(argc, argv, short_options);
if (option == -1)
break;
root = 1;
break;
+ case 's':
+ print_sysfs_devices();
+ exit(0);
+
case 'a':
attributes = 1;
break;
}
memset(&udev, 0x00, sizeof(struct udevice));
strfieldcpy(udev.devpath, pos);
- retval = udevdb_get_dev(&udev);
+ retval = udev_db_get_device(&udev);
if (retval != 0) {
printf("device not found in database\n");
goto exit;
memset(&udev, 0x00, sizeof(struct udevice));
strfieldcpy(udev.name, pos);
- retval = udevdb_get_dev_byname(&udev, pos);
+ retval = udev_db_get_device_byname(&udev, pos);
if (retval != 0) {
printf("device not found in database\n");
goto exit;
break;
case SYMLINK:
- strfieldcpy(result, udev.symlink);
+ if (root) {
+ int slen;
+ char *spos;
+ char slink[NAME_SIZE];
+
+ pos = result;
+ foreach_strpart(udev.symlink, " \n\r", spos, slen) {
+ strncpy(slink, spos, slen);
+ slink[slen] = '\0';
+ pos += sprintf(pos, "%s/%s ", udev_root, slink);
+ }
+ } else {
+ strfieldcpy(result, udev.symlink);
+ }
break;
case PATH:
"\n"
" -r print udev root\n"
" -a print all SYSFS_attributes along the device chain\n"
+ " -s print all sysfs devices with major/minor, physical device and bus\n"
" -V print udev version\n"
" -h print this help text\n"
"\n");
{
int rc = 0;
- main_argv = argv;
- main_argc = argc;
-
logging_init("udevinfo");
/* initialize our configuration */
udev_init_config();
- rc = process_options();
+ rc = process_options(argc, argv);
logging_close();
exit(rc);