=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/mandoc/read.c,v retrieving revision 1.17 retrieving revision 1.18 diff -c -r1.17 -r1.18 *** src/usr.bin/mandoc/read.c 2013/09/16 00:25:06 1.17 --- src/usr.bin/mandoc/read.c 2014/01/02 16:29:46 1.18 *************** *** 1,7 **** ! /* $Id: read.c,v 1.17 2013/09/16 00:25:06 schwarze Exp $ */ /* * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons ! * Copyright (c) 2010, 2011, 2012, 2013 Ingo Schwarze * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above --- 1,7 ---- ! /* $Id: read.c,v 1.18 2014/01/02 16:29:46 schwarze Exp $ */ /* * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons ! * Copyright (c) 2010-2014 Ingo Schwarze * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above *************** *** 20,25 **** --- 20,26 ---- #include #include + #include #include #include #include *************** *** 60,66 **** static void resize_buf(struct buf *, size_t); static void mparse_buf_r(struct mparse *, struct buf, int); static void pset(const char *, int, struct mparse *); ! static int read_whole_file(const char *, int, struct buf *, int *); static void mparse_end(struct mparse *); static void mparse_parse_buffer(struct mparse *, struct buf, const char *); --- 61,68 ---- static void resize_buf(struct buf *, size_t); static void mparse_buf_r(struct mparse *, struct buf, int); static void pset(const char *, int, struct mparse *); ! static int read_whole_file(struct mparse *, const char *, int, ! struct buf *, int *); static void mparse_end(struct mparse *); static void mparse_parse_buffer(struct mparse *, struct buf, const char *); *************** *** 184,189 **** --- 186,192 ---- "generic fatal error", + "input too large", "not a manual", "column syntax is inconsistent", "NOT IMPLEMENTED: .Bd -file", *************** *** 194,199 **** --- 197,207 ---- "no document body", "no document prologue", "static buffer exhausted", + + /* system errors */ + "cannot open file", + "cannot stat file", + "cannot read file", }; static const char * const mandoclevels[MANDOCLEVEL_MAX] = { *************** *** 560,573 **** } static int ! read_whole_file(const char *file, int fd, struct buf *fb, int *with_mmap) { struct stat st; size_t off; ssize_t ssz; if (-1 == fstat(fd, &st)) { ! perror(file); return(0); } --- 568,585 ---- } static int ! read_whole_file(struct mparse *curp, const char *file, int fd, ! struct buf *fb, int *with_mmap) { struct stat st; size_t off; ssize_t ssz; if (-1 == fstat(fd, &st)) { ! curp->file_status = MANDOCLEVEL_SYSERR; ! if (curp->mmsg) ! (*curp->mmsg)(MANDOCERR_SYSSTAT, curp->file_status, ! file, 0, 0, strerror(errno)); return(0); } *************** *** 580,586 **** if (S_ISREG(st.st_mode)) { if (st.st_size >= (1U << 31)) { ! fprintf(stderr, "%s: input too large\n", file); return(0); } *with_mmap = 1; --- 592,601 ---- if (S_ISREG(st.st_mode)) { if (st.st_size >= (1U << 31)) { ! curp->file_status = MANDOCLEVEL_FATAL; ! if (curp->mmsg) ! (*curp->mmsg)(MANDOCERR_TOOLARGE, ! curp->file_status, file, 0, 0, NULL); return(0); } *with_mmap = 1; *************** *** 602,608 **** for (;;) { if (off == fb->sz) { if (fb->sz == (1U << 31)) { ! fprintf(stderr, "%s: input too large\n", file); break; } resize_buf(fb, 65536); --- 617,627 ---- for (;;) { if (off == fb->sz) { if (fb->sz == (1U << 31)) { ! curp->file_status = MANDOCLEVEL_FATAL; ! if (curp->mmsg) ! (*curp->mmsg)(MANDOCERR_TOOLARGE, ! curp->file_status, ! file, 0, 0, NULL); break; } resize_buf(fb, 65536); *************** *** 613,619 **** return(1); } if (ssz == -1) { ! perror(file); break; } off += (size_t)ssz; --- 632,642 ---- return(1); } if (ssz == -1) { ! curp->file_status = MANDOCLEVEL_SYSERR; ! if (curp->mmsg) ! (*curp->mmsg)(MANDOCERR_SYSREAD, ! curp->file_status, file, 0, 0, ! strerror(errno)); break; } off += (size_t)ssz; *************** *** 681,692 **** struct buf blk; int with_mmap; ! if (-1 == fd) ! if (-1 == (fd = open(file, O_RDONLY, 0))) { ! perror(file); ! curp->file_status = MANDOCLEVEL_SYSERR; ! goto out; ! } /* * Run for each opened file; may be called more than once for * each full parse sequence if the opened file is nested (i.e., --- 704,718 ---- struct buf blk; int with_mmap; ! if (-1 == fd && -1 == (fd = open(file, O_RDONLY, 0))) { ! curp->file_status = MANDOCLEVEL_SYSERR; ! if (curp->mmsg) ! (*curp->mmsg)(MANDOCERR_SYSOPEN, ! curp->file_status, ! file, 0, 0, strerror(errno)); ! goto out; ! } ! /* * Run for each opened file; may be called more than once for * each full parse sequence if the opened file is nested (i.e., *************** *** 694,703 **** * the parse phase for the file. */ ! if ( ! read_whole_file(file, fd, &blk, &with_mmap)) { ! curp->file_status = MANDOCLEVEL_SYSERR; goto out; - } mparse_parse_buffer(curp, blk, file); --- 720,727 ---- * the parse phase for the file. */ ! if ( ! read_whole_file(curp, file, fd, &blk, &with_mmap)) goto out; mparse_parse_buffer(curp, blk, file);