59 lines
		
	
	
	
		
			948 B
			
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			59 lines
		
	
	
	
		
			948 B
			
		
	
	
	
		
			C
		
	
	
	
	
	
| 
								 | 
							
								#include "symbol/kallsyms.h"
							 | 
						||
| 
								 | 
							
								#include <stdio.h>
							 | 
						||
| 
								 | 
							
								#include <stdlib.h>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								int kallsyms__parse(const char *filename, void *arg,
							 | 
						||
| 
								 | 
							
										    int (*process_symbol)(void *arg, const char *name,
							 | 
						||
| 
								 | 
							
													  char type, u64 start))
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									char *line = NULL;
							 | 
						||
| 
								 | 
							
									size_t n;
							 | 
						||
| 
								 | 
							
									int err = -1;
							 | 
						||
| 
								 | 
							
									FILE *file = fopen(filename, "r");
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									if (file == NULL)
							 | 
						||
| 
								 | 
							
										goto out_failure;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									err = 0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									while (!feof(file)) {
							 | 
						||
| 
								 | 
							
										u64 start;
							 | 
						||
| 
								 | 
							
										int line_len, len;
							 | 
						||
| 
								 | 
							
										char symbol_type;
							 | 
						||
| 
								 | 
							
										char *symbol_name;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										line_len = getline(&line, &n, file);
							 | 
						||
| 
								 | 
							
										if (line_len < 0 || !line)
							 | 
						||
| 
								 | 
							
											break;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										line[--line_len] = '\0'; /* \n */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										len = hex2u64(line, &start);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										len++;
							 | 
						||
| 
								 | 
							
										if (len + 2 >= line_len)
							 | 
						||
| 
								 | 
							
											continue;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										symbol_type = line[len];
							 | 
						||
| 
								 | 
							
										len += 2;
							 | 
						||
| 
								 | 
							
										symbol_name = line + len;
							 | 
						||
| 
								 | 
							
										len = line_len - len;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										if (len >= KSYM_NAME_LEN) {
							 | 
						||
| 
								 | 
							
											err = -1;
							 | 
						||
| 
								 | 
							
											break;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										err = process_symbol(arg, symbol_name, symbol_type, start);
							 | 
						||
| 
								 | 
							
										if (err)
							 | 
						||
| 
								 | 
							
											break;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									free(line);
							 | 
						||
| 
								 | 
							
									fclose(file);
							 | 
						||
| 
								 | 
							
									return err;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								out_failure:
							 | 
						||
| 
								 | 
							
									return -1;
							 | 
						||
| 
								 | 
							
								}
							 |