]>
git.proxmox.com Git - mirror_iproute2.git/blob - lib/names.c
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation; either version
7 * 2 of the License, or (at your option) any later version.
19 #define MAX_ENTRIES 256
20 #define NAME_MAX_LEN 512
22 static int read_id_name(FILE *fp
, int *id
, char *name
)
24 char buf
[NAME_MAX_LEN
];
27 while (fgets(buf
, sizeof(buf
), fp
)) {
30 while (*p
== ' ' || *p
== '\t')
33 if (*p
== '#' || *p
== '\n' || *p
== 0)
36 if (sscanf(p
, "%x:%x %s\n", &maj
, &min
, name
) == 3) {
37 *id
= (maj
<< 16) | min
;
38 } else if (sscanf(p
, "%x:%x %s #", &maj
, &min
, name
) == 3) {
39 *id
= (maj
<< 16) | min
;
40 } else if (sscanf(p
, "0x%x %s\n", id
, name
) != 2 &&
41 sscanf(p
, "0x%x %s #", id
, name
) != 2 &&
42 sscanf(p
, "%d %s\n", id
, name
) != 2 &&
43 sscanf(p
, "%d %s #", id
, name
) != 2) {
53 struct db_names
*db_names_alloc(void)
57 db
= calloc(1, sizeof(*db
));
61 db
->size
= MAX_ENTRIES
;
62 db
->hash
= calloc(db
->size
, sizeof(struct db_entry
*));
67 int db_names_load(struct db_names
*db
, const char *path
)
69 struct db_entry
*entry
;
72 char namebuf
[NAME_MAX_LEN
] = {0};
75 fp
= fopen(path
, "r");
79 while ((ret
= read_id_name(fp
, &id
, &namebuf
[0]))) {
81 fprintf(stderr
, "Database %s is corrupted at %s\n",
90 entry
= malloc(sizeof(*entry
));
94 entry
->name
= strdup(namebuf
);
101 entry
->next
= db
->hash
[id
& (db
->size
- 1)];
102 db
->hash
[id
& (db
->size
- 1)] = entry
;
111 void db_names_free(struct db_names
*db
)
118 for (i
= 0; i
< db
->size
; i
++) {
119 struct db_entry
*entry
= db
->hash
[i
];
122 struct db_entry
*next
= entry
->next
;
134 char *id_to_name(struct db_names
*db
, int id
, char *name
)
136 struct db_entry
*entry
;
141 entry
= db
->hash
[id
& (db
->size
- 1)];
142 while (entry
&& entry
->id
!= id
)
146 strncpy(name
, entry
->name
, IDNAME_MAX
);
150 snprintf(name
, IDNAME_MAX
, "%d", id
);