aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGuy Harris <guy@alum.mit.edu>2011-04-10 18:22:47 +0000
committerGuy Harris <guy@alum.mit.edu>2011-04-10 18:22:47 +0000
commitc349caf925ce533d403a6c3dd4380c30d6552ea7 (patch)
tree47be42075ef0ca489ee8fb4e6427977c9d2fefd9
parentd7d45f8072523ecca0c6823bf3f55b7f61134d92 (diff)
Use AC_SYS_LARGEFILE to turn on large file support on platforms that
support it. Rename ws_lseek to ws_lseek64, as it should be given a 64-bit offset, and have it use _lseeki64 on Windows, to try to get 64-bit offset support; AC_SYS_LARGEFILE should cause lseek() to support 64-bit offsets on UN*X if possible. svn path=/trunk/; revision=36542
-rw-r--r--configure.in5
-rw-r--r--wiretap/file_wrappers.c18
-rw-r--r--wiretap/wtap.c4
-rw-r--r--wsutil/file_util.h20
4 files changed, 20 insertions, 27 deletions
diff --git a/configure.in b/configure.in
index 8db1d08000..1da5ce6830 100644
--- a/configure.in
+++ b/configure.in
@@ -138,6 +138,11 @@ AC_PATH_PROG(DOXYGEN, doxygen)
AC_CHECK_PROG(HAVE_DOXYGEN, doxygen, "yes", "no")
AM_CONDITIONAL(HAVE_DOXYGEN, test x$HAVE_DOXYGEN = xyes)
+#
+# Try to arrange for large file support.
+#
+AC_SYS_LARGEFILE
+
# gnu tls
tls_message="no"
AC_ARG_WITH([gnutls],
diff --git a/wiretap/file_wrappers.c b/wiretap/file_wrappers.c
index daaec5d51b..2bb2ce78f3 100644
--- a/wiretap/file_wrappers.c
+++ b/wiretap/file_wrappers.c
@@ -106,8 +106,6 @@ struct wtap_reader {
#define ZLIB 2 /* decompress a zlib stream */
#endif
-/* XXX, lseek64() instead of ws_lseek()? */
-
static int /* gz_load */
raw_read(FILE_T state, unsigned char *buf, unsigned int count, unsigned *have)
{
@@ -415,7 +413,7 @@ filed_open(int fd)
state->fd = fd;
/* save the current position for rewinding (only if reading) */
- state->start = ws_lseek(state->fd, 0, SEEK_CUR);
+ state->start = ws_lseek64(state->fd, 0, SEEK_CUR);
if (state->start == -1) state->start = 0;
/* initialize stream */
@@ -517,12 +515,7 @@ file_seek(FILE_T file, gint64 offset, int whence, int *err)
/* if within raw area while reading, just go there */
if (file->compression == UNCOMPRESSED && file->pos + offset >= file->raw) {
- /* XXX - handle 64-bit offsets better */
-#ifdef _WIN32
- if (ws_lseek(file->fd, (long)(offset - file->have), SEEK_CUR) == -1) {
-#else
- if (ws_lseek(file->fd, (off_t)(offset - file->have), SEEK_CUR) == -1) {
-#endif
+ if (ws_lseek64(file->fd, offset - file->have, SEEK_CUR) == -1) {
*err = errno;
return -1;
}
@@ -545,12 +538,7 @@ file_seek(FILE_T file, gint64 offset, int whence, int *err)
/* rewind, then skip to offset */
/* back up and start over */
- /* XXX - handle 64-bit offsets better */
-#ifdef _WIN32
- if (ws_lseek(file->fd, (long)file->start, SEEK_SET) == -1) {
-#else
- if (ws_lseek(file->fd, (off_t)file->start, SEEK_SET) == -1) {
-#endif
+ if (ws_lseek64(file->fd, file->start, SEEK_SET) == -1) {
*err = errno;
return -1;
}
diff --git a/wiretap/wtap.c b/wiretap/wtap.c
index 80d5a204fa..30c71810e2 100644
--- a/wiretap/wtap.c
+++ b/wiretap/wtap.c
@@ -717,9 +717,9 @@ wtap_read(wtap *wth, int *err, gchar **err_info, gint64 *data_offset)
gint64
wtap_read_so_far(wtap *wth, int *err)
{
- off_t file_pos;
+ gint64 file_pos;
- file_pos = ws_lseek(wth->fd, 0, SEEK_CUR);
+ file_pos = ws_lseek64(wth->fd, 0, SEEK_CUR);
if (file_pos == -1) {
if (err != NULL)
*err = errno;
diff --git a/wsutil/file_util.h b/wsutil/file_util.h
index 4225fe5933..e81d8773a7 100644
--- a/wsutil/file_util.h
+++ b/wsutil/file_util.h
@@ -92,11 +92,11 @@ extern FILE * ws_stdio_freopen (const gchar *filename, const gchar *mode, FILE *
/* some common file function differences between UNIX and WIN32 */
#ifdef _WIN32
/* the Win32 API prepends underscores for whatever reasons */
-#define ws_read _read
-#define ws_write _write
-#define ws_close _close
-#define ws_dup _dup
-#define ws_lseek _lseek
+#define ws_read _read
+#define ws_write _write
+#define ws_close _close
+#define ws_dup _dup
+#define ws_lseek64 _lseeki64 /* use _lseeki64 for 64-bit offset support */
/* DLL loading */
@@ -130,11 +130,11 @@ GModule *ws_module_open(gchar *module_name, GModuleFlags flags);
extern char *getenv_utf8(const char *varname);
#else /* _WIN32 */
-#define ws_read read
-#define ws_write write
-#define ws_close close
-#define ws_dup dup
-#define ws_lseek lseek
+#define ws_read read
+#define ws_write write
+#define ws_close close
+#define ws_dup dup
+#define ws_lseek64 lseek /* AC_SYS_LARGEFILE should make off_t 64-bit */
#define O_BINARY 0 /* Win32 needs the O_BINARY flag for open() */
#endif /* _WIN32 */