mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	modpost: add read_text_file() and get_line() helpers
modpost uses grab_file() to open a file, but it is not suitable for a text file because the mmap'ed file is not terminated by null byte. Actually, I see some issues for the use of grab_file(). The new helper, read_text_file() loads the whole file content into a malloc'ed buffer, and appends a null byte. Then, get_line() reads each line. To handle text files, I intend to replace as follows: grab_file() -> read_text_file() get_new_line() -> get_line() Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
This commit is contained in:
		
							parent
							
								
									4ddea2f8e8
								
							
						
					
					
						commit
						ac5100f543
					
				
					 2 changed files with 51 additions and 0 deletions
				
			
		| 
						 | 
					@ -112,6 +112,55 @@ void *do_nofail(void *ptr, const char *expr)
 | 
				
			||||||
	return ptr;
 | 
						return ptr;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					char *read_text_file(const char *filename)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct stat st;
 | 
				
			||||||
 | 
						size_t nbytes;
 | 
				
			||||||
 | 
						int fd;
 | 
				
			||||||
 | 
						char *buf;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						fd = open(filename, O_RDONLY);
 | 
				
			||||||
 | 
						if (fd < 0) {
 | 
				
			||||||
 | 
							perror(filename);
 | 
				
			||||||
 | 
							exit(1);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (fstat(fd, &st) < 0) {
 | 
				
			||||||
 | 
							perror(filename);
 | 
				
			||||||
 | 
							exit(1);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						buf = NOFAIL(malloc(st.st_size + 1));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						nbytes = st.st_size;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						while (nbytes) {
 | 
				
			||||||
 | 
							ssize_t bytes_read;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							bytes_read = read(fd, buf, nbytes);
 | 
				
			||||||
 | 
							if (bytes_read < 0) {
 | 
				
			||||||
 | 
								perror(filename);
 | 
				
			||||||
 | 
								exit(1);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							nbytes -= bytes_read;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						buf[st.st_size] = '\0';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						close(fd);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return buf;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					char *get_line(char **stringp)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						/* do not return the unwanted extra line at EOF */
 | 
				
			||||||
 | 
						if (*stringp && **stringp == '\0')
 | 
				
			||||||
 | 
							return NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return strsep(stringp, "\n");
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* A list of all modules we processed */
 | 
					/* A list of all modules we processed */
 | 
				
			||||||
static struct module *modules;
 | 
					static struct module *modules;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -191,6 +191,8 @@ void add_moddevtable(struct buffer *buf, struct module *mod);
 | 
				
			||||||
void get_src_version(const char *modname, char sum[], unsigned sumlen);
 | 
					void get_src_version(const char *modname, char sum[], unsigned sumlen);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* from modpost.c */
 | 
					/* from modpost.c */
 | 
				
			||||||
 | 
					char *read_text_file(const char *filename);
 | 
				
			||||||
 | 
					char *get_line(char **stringp);
 | 
				
			||||||
void *grab_file(const char *filename, unsigned long *size);
 | 
					void *grab_file(const char *filename, unsigned long *size);
 | 
				
			||||||
char* get_next_line(unsigned long *pos, void *file, unsigned long size);
 | 
					char* get_next_line(unsigned long *pos, void *file, unsigned long size);
 | 
				
			||||||
void release_file(void *file, unsigned long size);
 | 
					void release_file(void *file, unsigned long size);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue