modpost: add read_text_file() and get_line() helpers
authorMasahiro Yamada <masahiroy@kernel.org>
Mon, 1 Jun 2020 05:57:17 +0000 (14:57 +0900)
committerMasahiro Yamada <masahiroy@kernel.org>
Sat, 6 Jun 2020 14:38:12 +0000 (23:38 +0900)
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>
scripts/mod/modpost.c
scripts/mod/modpost.h

index a5da633..0a84490 100644 (file)
@@ -112,6 +112,55 @@ void *do_nofail(void *ptr, const char *expr)
        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 */
 static struct module *modules;
 
index e5eace0..f4412fe 100644 (file)
@@ -191,6 +191,8 @@ void add_moddevtable(struct buffer *buf, struct module *mod);
 void get_src_version(const char *modname, char sum[], unsigned sumlen);
 
 /* from modpost.c */
+char *read_text_file(const char *filename);
+char *get_line(char **stringp);
 void *grab_file(const char *filename, unsigned long *size);
 char* get_next_line(unsigned long *pos, void *file, unsigned long size);
 void release_file(void *file, unsigned long size);