10
10
* of the GNU General Public License, incorporated herein by reference.
11
11
*/
12
12
13
+ #include <stdarg.h>
14
+ #include <stdio.h>
15
+
16
+ #include "list.h"
17
+ #include "xalloc.h"
18
+
13
19
#include "modpost.h"
14
20
#include "devicetable-offsets.h"
15
21
@@ -31,6 +37,58 @@ typedef Elf64_Addr kernel_ulong_t;
31
37
#include <ctype.h>
32
38
#include <stdbool.h>
33
39
40
+ /**
41
+ * module_alias_printf - add auto-generated MODULE_ALIAS()
42
+ *
43
+ * @mod: module
44
+ * @append_wildcard: append '*' for future extension if not exist yet
45
+ * @fmt: printf(3)-like format
46
+ */
47
+ static void __attribute__((format (printf , 3 , 4 )))
48
+ module_alias_printf (struct module * mod , bool append_wildcard ,
49
+ const char * fmt , ...)
50
+ {
51
+ struct module_alias * new ;
52
+ size_t len ;
53
+ int n ;
54
+ va_list ap ;
55
+
56
+ /* Determine required size. */
57
+ va_start (ap , fmt );
58
+ n = vsnprintf (NULL , 0 , fmt , ap );
59
+ va_end (ap );
60
+
61
+ if (n < 0 ) {
62
+ error ("vsnprintf failed\n" );
63
+ return ;
64
+ }
65
+
66
+ len = n + 1 ; /* extra byte for '\0' */
67
+
68
+ if (append_wildcard )
69
+ len ++ ; /* extra byte for '*' */
70
+
71
+ new = xmalloc (sizeof (* new ) + len );
72
+
73
+ /* Now, really print it to the allocated buffer */
74
+ va_start (ap , fmt );
75
+ n = vsnprintf (new -> str , len , fmt , ap );
76
+ va_end (ap );
77
+
78
+ if (n < 0 ) {
79
+ error ("vsnprintf failed\n" );
80
+ free (new );
81
+ return ;
82
+ }
83
+
84
+ if (append_wildcard && (n == 0 || new -> str [n - 1 ] != '*' )) {
85
+ new -> str [n ] = '*' ;
86
+ new -> str [n + 1 ] = '\0' ;
87
+ }
88
+
89
+ list_add_tail (& new -> node , & mod -> aliases );
90
+ }
91
+
34
92
typedef uint32_t __u32 ;
35
93
typedef uint16_t __u16 ;
36
94
typedef unsigned char __u8 ;
@@ -229,9 +287,7 @@ static void do_usb_entry(void *symval,
229
287
ADD (alias , "in" , match_flags & USB_DEVICE_ID_MATCH_INT_NUMBER ,
230
288
bInterfaceNumber );
231
289
232
- add_wildcard (alias );
233
- buf_printf (& mod -> dev_table_buf ,
234
- "MODULE_ALIAS(\"%s\");\n" , alias );
290
+ module_alias_printf (mod , true, "%s" , alias );
235
291
}
236
292
237
293
/* Handles increment/decrement of BCD formatted integers */
@@ -375,10 +431,8 @@ static void do_of_entry_multi(void *symval, struct module *mod)
375
431
if (isspace (* tmp ))
376
432
* tmp = '_' ;
377
433
378
- buf_printf (& mod -> dev_table_buf , "MODULE_ALIAS(\"%s\");\n" , alias );
379
- strcat (alias , "C" );
380
- add_wildcard (alias );
381
- buf_printf (& mod -> dev_table_buf , "MODULE_ALIAS(\"%s\");\n" , alias );
434
+ module_alias_printf (mod , false, "%s" , alias );
435
+ module_alias_printf (mod , false, "%sC*" , alias );
382
436
}
383
437
384
438
static void do_of_table (void * symval , unsigned long size ,
@@ -608,14 +662,12 @@ static void do_pnp_device_entry(void *symval, unsigned long size,
608
662
char acpi_id [sizeof (* id )];
609
663
int j ;
610
664
611
- buf_printf (& mod -> dev_table_buf ,
612
- "MODULE_ALIAS(\"pnp:d%s*\");\n" , * id );
665
+ module_alias_printf (mod , false, "pnp:d%s*" , * id );
613
666
614
667
/* fix broken pnp bus lowercasing */
615
668
for (j = 0 ; j < sizeof (acpi_id ); j ++ )
616
669
acpi_id [j ] = toupper ((* id )[j ]);
617
- buf_printf (& mod -> dev_table_buf ,
618
- "MODULE_ALIAS(\"acpi*:%s:*\");\n" , acpi_id );
670
+ module_alias_printf (mod , false, "acpi*:%s:*" , acpi_id );
619
671
}
620
672
}
621
673
@@ -666,14 +718,12 @@ static void do_pnp_card_entries(void *symval, unsigned long size,
666
718
char acpi_id [PNP_ID_LEN ];
667
719
int k ;
668
720
669
- buf_printf (& mod -> dev_table_buf ,
670
- "MODULE_ALIAS(\"pnp:d%s*\");\n" , id );
721
+ module_alias_printf (mod , false, "pnp:d%s*" , id );
671
722
672
723
/* fix broken pnp bus lowercasing */
673
724
for (k = 0 ; k < sizeof (acpi_id ); k ++ )
674
725
acpi_id [k ] = toupper (id [k ]);
675
- buf_printf (& mod -> dev_table_buf ,
676
- "MODULE_ALIAS(\"acpi*:%s:*\");\n" , acpi_id );
726
+ module_alias_printf (mod , false, "acpi*:%s:*" , acpi_id );
677
727
}
678
728
}
679
729
}
@@ -1534,8 +1584,7 @@ static void do_table(void *symval, unsigned long size,
1534
1584
1535
1585
for (i = 0 ; i < size ; i += id_size ) {
1536
1586
if (do_entry (mod -> name , symval + i , alias )) {
1537
- buf_printf (& mod -> dev_table_buf ,
1538
- "MODULE_ALIAS(\"%s\");\n" , alias );
1587
+ module_alias_printf (mod , false, "%s" , alias );
1539
1588
}
1540
1589
}
1541
1590
}
@@ -1660,11 +1709,3 @@ void handle_moddevtable(struct module *mod, struct elf_info *info,
1660
1709
}
1661
1710
free (zeros );
1662
1711
}
1663
-
1664
- /* Now add out buffered information to the generated C source */
1665
- void add_moddevtable (struct buffer * buf , struct module * mod )
1666
- {
1667
- buf_printf (buf , "\n" );
1668
- buf_write (buf , mod -> dev_table_buf .p , mod -> dev_table_buf .pos );
1669
- free (mod -> dev_table_buf .p );
1670
- }
0 commit comments