#include "config.h"
#include <sys/types.h>
#include <sys/queue.h>
#include <sys/stat.h>
#include <bitstring.h>
#include <errno.h>
#include <fcntl.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include "../common/common.h"
int
ex_sourcefd(SCR *sp, EXCMD *cmdp, int fd)
{
struct stat sb;
int len;
char *bp, *name;
name = cmdp->argv[0]->bp;
if (fstat(fd, &sb))
goto err;
#define MEGABYTE 1048576
if (sb.st_size > MEGABYTE) {
errno = ENOMEM;
goto err;
}
MALLOC(sp, bp, (size_t)sb.st_size + 1);
if (bp == NULL) {
(void)close(fd);
return (1);
}
bp[sb.st_size] = '\0';
len = read(fd, bp, (int)sb.st_size);
(void)close(fd);
if (len == -1 || len != sb.st_size) {
if (len != sb.st_size)
errno = EIO;
free(bp);
err: msgq_str(sp, M_SYSERR, name, "%s");
return (1);
}
return (ex_run_str(sp, name, bp, (size_t)sb.st_size, 1, 1));
}
int
ex_source(SCR *sp, EXCMD *cmdp)
{
char *name;
int fd;
name = cmdp->argv[0]->bp;
if ((fd = open(name, O_RDONLY)) >= 0)
return (ex_sourcefd(sp, cmdp, fd));
msgq_str(sp, M_SYSERR, name, "%s");
return (1);
}