+struct udevice {
+ char name[NAME_SIZE];
+ char owner[OWNER_SIZE];
+ char group[GROUP_SIZE];
+ char type;
+ int major;
+ int minor;
+ unsigned int mode; /* not mode_t due to conflicting definitions in different libcs */
+ char symlink[NAME_SIZE];
+ int partitions;
+
+ /* private data that help us in building strings */
+ char bus_id[SYSFS_NAME_LEN];
+ char program_result[NAME_SIZE];
+ char kernel_number[NAME_SIZE];
+ char kernel_name[NAME_SIZE];
+};
+
+#define strfieldcpy(to, from) \
+do { \
+ to[sizeof(to)-1] = '\0'; \
+ strncpy(to, from, sizeof(to)-1); \
+} while (0)
+
+#define strfieldcat(to, from) \
+do { \
+ to[sizeof(to)-1] = '\0'; \
+ strncat(to, from, sizeof(to) - strlen(to)-1); \
+} while (0)
+
+#define strnfieldcpy(to, from, maxsize) \
+do { \
+ to[maxsize-1] = '\0'; \
+ strncpy(to, from, maxsize-1); \
+} while (0)
+
+#define strnfieldcat(to, from, maxsize) \
+do { \
+ to[maxsize-1] = '\0'; \
+ strncat(to, from, maxsize - strlen(to)-1); \
+} while (0)
+
+static inline char *get_action(void)
+{
+ char *action;
+
+ action = getenv("ACTION");
+ if (action != NULL && strlen(action) > ACTION_SIZE)
+ action[ACTION_SIZE-1] = '\0';
+
+ return action;
+}
+
+static inline char *get_devpath(void)
+{
+ char *devpath;