bb_full_fd_action: remove potential xmalloc from NOFORK path
cat: stop using stdio.h opens
libbb: introduce & use open[3]_or_warn
function                                             old     new   delta
open3_or_warn                                          -      54     +54
bb_cat                                               115     144     +29
open_or_warn                                           -      25     +25
unlzma                                              2404    2412      +8
chattr_main                                          334     339      +5
xstrtoul_range_sfx                                   251     255      +4
telnet_main                                         1514    1510      -4
static.opt                                             4       -      -4
qgravechar                                           122     118      -4
fuser_add_pid                                         61      54      -7
fuser_add_inode                                      154     147      -7
writeFileToTarball                                  1542    1534      -8
refresh                                             1156    1148      -8
do_show                                              856     846     -10
read_leases                                          212     200     -12
setup_redirects                                      236     222     -14
iproute_list_or_flush                               1582    1568     -14
read_config                                          427     411     -16
write_leases                                         284     264     -20
hash_file                                            338     318     -20
copy_file                                           1760    1740     -20
do_iproute                                          2610    2588     -22
bb_full_fd_action                                    320     269     -51
open_to_or_warn                                      103      49     -54
fuser_main                                          1660    1596     -64
.rodata                                           131160  131096     -64
------------------------------------------------------------------------------
(add/remove: 2/1 grow/shrink: 4/19 up/down: 125/-423)        Total: -298 bytes

diff --git a/coreutils/cat.c b/coreutils/cat.c
index eb141dc..ed3f336 100644
--- a/coreutils/cat.c
+++ b/coreutils/cat.c
@@ -19,18 +19,21 @@
 {
 	static const char *const argv_dash[] = { "-", NULL };
 
-	FILE *f;
+	int fd;
 	int retval = EXIT_SUCCESS;
 
 	if (!*argv)
 		argv = (char**) &argv_dash;
 
 	do {
-		f = fopen_or_warn_stdin(*argv);
-		if (f) {
+		fd = STDIN_FILENO;
+		if (!LONE_DASH(*argv))
+			fd = open_or_warn(*argv, O_RDONLY);
+		if (fd >= 0) {
 			/* This is not an xfunc - never exits */
-			off_t r = bb_copyfd_eof(fileno(f), STDOUT_FILENO);
-			fclose_if_not_stdin(f);
+			off_t r = bb_copyfd_eof(fd, STDOUT_FILENO);
+			if (fd != STDIN_FILENO)
+				close(fd);
 			if (r >= 0)
 				continue;
 		}