1 /* $OpenBSD: file.c,v 1.9 2006/02/09 09:54:46 otto 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>
38 static char fname
[MAXPATHLEN
];
41 static size_t lnbuflen
;
62 gzfgetln(gzFile
*f
, size_t *len
)
76 gzerrstr
= gzerror(f
, &gzerr
);
80 errx(2, "%s: %s", fname
, gzerrstr
);
84 lnbuf
= grep_realloc(lnbuf
, ++lnbuflen
);
91 if (gzeof(f
) && n
== 0)
99 grep_fdopen(int fd
, char *mode
)
103 if (fd
== STDIN_FILENO
)
104 snprintf(fname
, sizeof fname
, "(standard input)");
106 snprintf(fname
, sizeof fname
, "(fd %d)", fd
);
108 f
= grep_malloc(sizeof *f
);
113 f
->noseek
= lseek(fd
, 0L, SEEK_SET
) == -1;
114 if ((f
->gzf
= gzdopen(fd
, mode
)) != NULL
)
119 f
->type
= FILE_STDIO
;
120 f
->noseek
= isatty(fd
);
121 if ((f
->f
= fdopen(fd
, mode
)) != NULL
)
130 grep_open(char *path
, char *mode
)
134 snprintf(fname
, sizeof fname
, "%s", path
);
136 f
= grep_malloc(sizeof *f
);
142 if ((f
->gzf
= gzopen(fname
, mode
)) != NULL
)
148 /* try mmap first; if it fails, try stdio */
149 if ((f
->mmf
= mmopen(fname
, mode
)) != NULL
) {
154 f
->type
= FILE_STDIO
;
155 if ((f
->f
= fopen(path
, mode
)) != NULL
)
164 grep_bin_file(file_t
*f
)
171 return bin_file(f
->f
);
174 return mmbin_file(f
->mmf
);
178 return gzbin_file(f
->gzf
);
182 errx(2, "invalid file type");
187 grep_fgetln(file_t
*f
, size_t *l
)
191 return fgetln(f
->f
, l
);
194 return mmfgetln(f
->mmf
, l
);
198 return gzfgetln(f
->gzf
, l
);
202 errx(2, "invalid file type");
207 grep_close(file_t
*f
)
225 errx(2, "invalid file type");