#include "awk.h"#include <fcntl.h>Go to the source code of this file.
Functions | |
| NODE * | do_readfile (NODE *tree) |
| NODE * | dlload (NODE *tree, void *dl) |
|
||||||||||||
|
Definition at line 108 of file readfile.c. References AWKNUM, do_readfile(), and tmp_number. 00111 { 00112 make_builtin("readfile", do_readfile, 1); 00113 00114 return tmp_number((AWKNUM) 0); 00115 }
|
|
|
Definition at line 41 of file readfile.c. References AWKNUM, do_lint, emalloc, errno, force_string, free_temp, lintwarn, memset(), NULL, O_BINARY, O_RDONLY, open, read, tmp_number, tmp_string(), and update_ERRNO(). Referenced by dlload(). 00043 { 00044 NODE *filename; 00045 int ret = -1; 00046 struct stat sbuf; 00047 char *text; 00048 int fd; 00049 00050 if (do_lint && tree->param_cnt > 1) 00051 lintwarn("readfile: called with too many arguments"); 00052 00053 filename = get_argument(tree, 0); 00054 if (filename != NULL) { 00055 (void) force_string(filename); 00056 00057 ret = stat(filename->stptr, & sbuf); 00058 if (ret < 0) { 00059 update_ERRNO(); 00060 free_temp(filename); 00061 goto done; 00062 } else if ((sbuf.st_mode & S_IFMT) != S_IFREG) { 00063 errno = EINVAL; 00064 ret = -1; 00065 update_ERRNO(); 00066 free_temp(filename); 00067 goto done; 00068 } 00069 00070 if ((fd = open(filename->stptr, O_RDONLY|O_BINARY)) < 0) { 00071 ret = -1; 00072 update_ERRNO(); 00073 free_temp(filename); 00074 goto done; 00075 } 00076 00077 emalloc(text, char *, sbuf.st_size + 2, "do_readfile"); 00078 memset(text, '\0', sbuf.st_size + 2); 00079 00080 if ((ret = read(fd, text, sbuf.st_size)) != sbuf.st_size) { 00081 (void) close(fd); 00082 ret = -1; 00083 update_ERRNO(); 00084 free_temp(filename); 00085 goto done; 00086 } 00087 00088 close(fd); 00089 free_temp(filename); 00090 set_value(tmp_string(text, sbuf.st_size)); 00091 return tmp_number((AWKNUM) 0); 00092 } else if (do_lint) 00093 lintwarn("filename: called with no arguments"); 00094 00095 00096 done: 00097 /* Set the return value */ 00098 set_value(tmp_number((AWKNUM) ret)); 00099 00100 /* Just to make the interpreter happy */ 00101 return tmp_number((AWKNUM) 0); 00102 }
|