libbb: introduce xmalloc_xopen_read_close and use where appropriate
authorDenis Vlasenko <vda.linux@googlemail.com>
Sat, 19 Apr 2008 19:32:08 +0000 (19:32 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Sat, 19 Apr 2008 19:32:08 +0000 (19:32 -0000)
instead of xmalloc_open_read_close.

function                                             old     new   delta
xmalloc_xopen_read_close                               -      34     +34
xmalloc_open_read_close                              163     171      +8
passwd_main                                         1070    1074      +4
rexecve                                              254     257      +3
handle_incoming_and_exit                            2657    2659      +2
parse_command                                       1509    1510      +1
buffer_fill_and_print                                 76      73      -3
evaltreenr                                           599     589     -10
evaltree                                             599     589     -10
------------------------------------------------------------------------------
(add/remove: 1/0 grow/shrink: 5/3 up/down: 52/-23)             Total: 29 bytes

include/libbb.h
libbb/read.c
miscutils/chat.c
printutils/lpd.c
util-linux/readprofile.c

index 1c54a32d5c0e44a43677112de9528a3da65ad400..f9f28f9836d34e97f052b7c80fc168240cffb513 100644 (file)
@@ -556,7 +556,10 @@ extern char *reads(int fd, char *buf, size_t count);
 extern char *xmalloc_reads(int fd, char *pfx, size_t *maxsz_p);
 extern ssize_t read_close(int fd, void *buf, size_t maxsz);
 extern ssize_t open_read_close(const char *filename, void *buf, size_t maxsz);
+/* Returns NULL if file can't be opened */
 extern void *xmalloc_open_read_close(const char *filename, size_t *maxsz_p);
+/* Never returns NULL */
+extern void *xmalloc_xopen_read_close(const char *filename, size_t *maxsz_p);
 
 extern ssize_t safe_write(int fd, const void *buf, size_t count);
 // NB: will return short write on error, not -1,
@@ -568,9 +571,9 @@ extern void xwrite(int fd, const void *buf, size_t count);
 extern void xprint_and_close_file(FILE *file);
 /* Reads up to (and including) TERMINATING_STRING: */
 extern char *xmalloc_fgets_str(FILE *file, const char *terminating_string);
-/* Chops off TERMINATING_STRING: from the end: */
+/* Chops off TERMINATING_STRING from the end: */
 extern char *xmalloc_fgetline_str(FILE *file, const char *terminating_string);
-/* Reads up to (and including) "\n" or NUL byte */
+/* Reads up to (and including) "\n" or NUL byte: */
 extern char *xmalloc_fgets(FILE *file);
 /* Chops off '\n' from the end, unlike fgets: */
 extern char *xmalloc_fgetline(FILE *file);
index 1d31fb076618098488938b0e86388e85d6bee773..ba366cb972635c47a681dc304dc1dd7c4a1eb7bc 100644 (file)
@@ -212,7 +212,9 @@ void *xmalloc_open_read_close(const char *filename, size_t *sizep)
        int fd;
        off_t len;
 
-       fd = xopen(filename, O_RDONLY);
+       fd = open(filename, O_RDONLY);
+       if (fd < 0)
+               return NULL;
        /* /proc/N/stat files report len 0 here */
        /* In order to make such files readable, we add small const */
        len = xlseek(fd, 0, SEEK_END) | 0x3ff; /* + up to 1k */
@@ -229,3 +231,11 @@ void *xmalloc_open_read_close(const char *filename, size_t *sizep)
                *sizep = size;
        return buf;
 }
+
+void *xmalloc_xopen_read_close(const char *filename, size_t *sizep)
+{
+       void *buf = xmalloc_open_read_close(filename, sizep);
+       if (!buf)
+               bb_perror_msg_and_die("can't read '%s'", filename);
+       return buf;
+}
index 64d4ba4fd3a6c65b59c24c793cf1d3f8d0d0eac1..5bbbb688fcdee9de694a7cdea082e3e6b62b97eb 100644 (file)
@@ -363,7 +363,7 @@ int chat_main(int argc ATTRIBUTE_UNUSED, char **argv)
                                if ('@' == *buf) {
                                        // skip the @ and any following white-space
                                        trim(++buf);
-                                       buf = loaded = xmalloc_open_read_close(buf, NULL);
+                                       buf = loaded = xmalloc_xopen_read_close(buf, NULL);
                                }
 
                                // expand escape sequences in command
index 953324452d7c8b3e7c1b3e80804965b4725c93ee..11920d21180fe4cb5a325b547624ec6cfa35d4a2 100644 (file)
@@ -160,7 +160,7 @@ int lpd_main(int argc ATTRIBUTE_UNUSED, char *argv[])
                        // (we exit 127 if helper cannot be executed)
                        var[1] = '\0';
                        // read and delete ctrlfile
-                       q = xmalloc_open_read_close(filenames[0], NULL);
+                       q = xmalloc_xopen_read_close(filenames[0], NULL);
                        unlink(filenames[0]);
                        // provide datafile name
                        // we can use leaky setenv since we are about to exec or exit
index e25d07d2b972f76457285c1a3c44b6763efe7f21..cac5fa4a136b0495a6c42deb8a4dda9b947dc367 100644 (file)
@@ -109,9 +109,9 @@ int readprofile_main(int argc ATTRIBUTE_UNUSED, char **argv)
         * Use an fd for the profiling buffer, to skip stdio overhead
         */
        len = MAXINT(ssize_t);
-       buf = xmalloc_open_read_close(proFile, &len);
+       buf = xmalloc_xopen_read_close(proFile, &len);
        if (!optNative) {
-               int entries = len/sizeof(*buf);
+               int entries = len / sizeof(*buf);
                int big = 0, small = 0, i;
                unsigned *p;