Line data Source code
1 : /* zmapfd - read contents of file descriptor into a newly-allocated buffer */ 2 : 3 : /* Copyright (C) 2006 Free Software Foundation, Inc. 4 : 5 : This file is part of GNU Bash, the Bourne Again SHell. 6 : 7 : Bash is free software: you can redistribute it and/or modify 8 : it under the terms of the GNU General Public License as published by 9 : the Free Software Foundation, either version 3 of the License, or 10 : (at your option) any later version. 11 : 12 : Bash is distributed in the hope that it will be useful, 13 : but WITHOUT ANY WARRANTY; without even the implied warranty of 14 : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 : GNU General Public License for more details. 16 : 17 : You should have received a copy of the GNU General Public License 18 : along with Bash. If not, see <http://www.gnu.org/licenses/>. 19 : */ 20 : 21 : #include <config.h> 22 : 23 : #include <sys/types.h> 24 : 25 : #if defined (HAVE_UNISTD_H) 26 : # include <unistd.h> 27 : #endif 28 : 29 : #include <errno.h> 30 : 31 : #include "bashansi.h" 32 : #include "command.h" 33 : #include "general.h" 34 : 35 : #if !defined (errno) 36 : extern int errno; 37 : #endif 38 : 39 : extern ssize_t zread __P((int, char *, size_t)); 40 : 41 : /* Dump contents of file descriptor FD to *OSTR. FN is the filename for 42 : error messages (not used right now). */ 43 : int 44 0 : zmapfd (fd, ostr, fn) 45 : int fd; 46 : char **ostr; 47 : char *fn; 48 : { 49 0 : ssize_t nr; 50 0 : int rval; 51 0 : char lbuf[128]; 52 0 : char *result; 53 0 : int rsize, rind; 54 : 55 0 : rval = 0; 56 0 : result = (char *)xmalloc (rsize = 64); 57 0 : rind = 0; 58 : 59 0 : while (1) 60 : { 61 0 : nr = zread (fd, lbuf, sizeof (lbuf)); 62 0 : if (nr == 0) 63 : { 64 0 : rval = rind; 65 0 : break; 66 : } 67 0 : else if (nr < 0) 68 : { 69 0 : free (result); 70 0 : if (ostr) 71 0 : *ostr = (char *)NULL; 72 0 : return -1; 73 : } 74 : 75 0 : RESIZE_MALLOCED_BUFFER (result, rind, nr, rsize, 128); 76 0 : memcpy (result+rind, lbuf, nr); 77 0 : rind += nr; 78 : } 79 : 80 0 : RESIZE_MALLOCED_BUFFER (result, rind, 1, rsize, 128); 81 0 : result[rind] = '\0'; 82 : 83 0 : if (ostr) 84 0 : *ostr = result; 85 : else 86 0 : free (result); 87 : 88 : return rval; 89 : }