1#include "symbol/kallsyms.h"
2#include <stdio.h>
3#include <stdlib.h>
4
5int kallsyms__parse(const char *filename, void *arg,
6		    int (*process_symbol)(void *arg, const char *name,
7					  char type, u64 start))
8{
9	char *line = NULL;
10	size_t n;
11	int err = -1;
12	FILE *file = fopen(filename, "r");
13
14	if (file == NULL)
15		goto out_failure;
16
17	err = 0;
18
19	while (!feof(file)) {
20		u64 start;
21		int line_len, len;
22		char symbol_type;
23		char *symbol_name;
24
25		line_len = getline(&line, &n, file);
26		if (line_len < 0 || !line)
27			break;
28
29		line[--line_len] = '\0'; /* \n */
30
31		len = hex2u64(line, &start);
32
33		len++;
34		if (len + 2 >= line_len)
35			continue;
36
37		symbol_type = line[len];
38		len += 2;
39		symbol_name = line + len;
40		len = line_len - len;
41
42		if (len >= KSYM_NAME_LEN) {
43			err = -1;
44			break;
45		}
46
47		err = process_symbol(arg, symbol_name, symbol_type, start);
48		if (err)
49			break;
50	}
51
52	free(line);
53	fclose(file);
54	return err;
55
56out_failure:
57	return -1;
58}
59