Main Page | Class List | Directories | File List | Class Members | File Members

readfile.c File Reference

#include "awk.h"
#include <fcntl.h>

Go to the source code of this file.

Functions

NODEdo_readfile (NODE *tree)
NODEdlload (NODE *tree, void *dl)


Function Documentation

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 }

NODE* do_readfile NODE tree  ) 
 

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 }


© sourcejam.com 2005-2008