@@ -77,7 +77,7 @@ is_fido(const char *path)
77
77
78
78
static int
79
79
parse_uevent (const char * uevent , int * bus , int16_t * vendor_id ,
80
- int16_t * product_id )
80
+ int16_t * product_id , char * * hid_name )
81
81
{
82
82
char * cp ;
83
83
char * p ;
@@ -97,8 +97,12 @@ parse_uevent(const char *uevent, int *bus, int16_t *vendor_id,
97
97
* vendor_id = (int16_t )y ;
98
98
* product_id = (int16_t )z ;
99
99
ok = 0 ;
100
- break ;
101
100
}
101
+ continue ;
102
+ }
103
+ if (strncmp (p , "HID_NAME=" , 9 ) == 0 && hid_name != NULL && * hid_name == NULL ) {
104
+ * hid_name = strdup (p + 9 );
105
+ continue ;
102
106
}
103
107
}
104
108
@@ -137,6 +141,7 @@ copy_info(fido_dev_info_t *di, struct udev *udev,
137
141
char * uevent = NULL ;
138
142
struct udev_device * dev = NULL ;
139
143
int bus = 0 ;
144
+ char * hid_name = NULL ;
140
145
int ok = -1 ;
141
146
142
147
memset (di , 0 , sizeof (* di ));
@@ -148,7 +153,7 @@ copy_info(fido_dev_info_t *di, struct udev *udev,
148
153
goto fail ;
149
154
150
155
if ((uevent = get_parent_attr (dev , "hid" , NULL , "uevent" )) == NULL ||
151
- parse_uevent (uevent , & bus , & di -> vendor_id , & di -> product_id ) < 0 ) {
156
+ parse_uevent (uevent , & bus , & di -> vendor_id , & di -> product_id , & hid_name ) < 0 ) {
152
157
fido_log_debug ("%s: uevent" , __func__ );
153
158
goto fail ;
154
159
}
@@ -165,6 +170,13 @@ copy_info(fido_dev_info_t *di, struct udev *udev,
165
170
di -> manufacturer = strdup ("" );
166
171
if ((di -> product = get_usb_attr (dev , "product" )) == NULL )
167
172
di -> product = strdup ("" );
173
+ if ( di -> manufacturer != NULL && * di -> manufacturer == '\0' &&
174
+ di -> product != NULL && * di -> product == '\0' &&
175
+ hid_name != NULL ) {
176
+
177
+ free (di -> product );
178
+ di -> product = strdup (hid_name );
179
+ }
168
180
if (di -> path == NULL || di -> manufacturer == NULL || di -> product == NULL )
169
181
goto fail ;
170
182
@@ -174,6 +186,7 @@ copy_info(fido_dev_info_t *di, struct udev *udev,
174
186
udev_device_unref (dev );
175
187
176
188
free (uevent );
189
+ free (hid_name );
177
190
178
191
if (ok < 0 ) {
179
192
free (di -> path );
0 commit comments