1 /* $OpenBSD: file.c,v 1.11 2010/07/02 20:48:48 nicm Exp $ */
4 * Copyright (c) 1999 James Howard and Dag-Erling Coïdan Smørgrav
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29 #include <sys/param.h>
36 #include <unistd.h> /* isatty */
41 static char fname
[MAXPATHLEN
];
44 static size_t lnbuflen
;
61 gzfgetln(gzFile
*f
, size_t *len
)
75 gzerrstr
= gzerror(f
, &gzerr
);
79 errx(2, "%s: %s", fname
, gzerrstr
);
83 lnbuf
= grep_realloc(lnbuf
, ++lnbuflen
);
90 if (gzeof(f
) && n
== 0)
98 grep_fdopen(int fd
, const char *mode
)
102 if (fd
== STDIN_FILENO
)
103 snprintf(fname
, sizeof fname
, "(standard input)");
105 snprintf(fname
, sizeof fname
, "(fd %d)", fd
);
107 f
= grep_malloc(sizeof *f
);
112 f
->noseek
= lseek(fd
, 0L, SEEK_SET
) == -1;
113 if ((f
->gzf
= gzdopen(fd
, mode
)) != NULL
)
118 f
->type
= FILE_STDIO
;
119 f
->noseek
= isatty(fd
);
120 if ((f
->f
= fdopen(fd
, mode
)) != NULL
)
129 grep_open(const char *path
, const char *mode
)
133 snprintf(fname
, sizeof fname
, "%s", path
);
135 f
= grep_malloc(sizeof *f
);
141 if ((f
->gzf
= gzopen(fname
, mode
)) != NULL
)
147 /* try mmap first; if it fails, try stdio */
148 if ((f
->mmf
= mmopen(fname
, mode
)) != NULL
) {
153 f
->type
= FILE_STDIO
;
154 if ((f
->f
= fopen(path
, mode
)) != NULL
)
163 grep_bin_file(file_t
*f
)
170 return bin_file(f
->f
);
173 return mmbin_file(f
->mmf
);
177 return gzbin_file(f
->gzf
);
181 errx(2, "invalid file type");
186 grep_fgetln(file_t
*f
, size_t *l
)
190 return fgetln(f
->f
, l
);
193 return mmfgetln(f
->mmf
, l
);
197 return gzfgetln(f
->gzf
, l
);
201 errx(2, "invalid file type");
206 grep_close(file_t
*f
)
224 errx(2, "invalid file type");