From 4576b50e4746510453ae4818485ba756d7b8763e Mon Sep 17 00:00:00 2001 From: Gerhard Rieger Date: Tue, 5 May 2009 22:42:50 +0200 Subject: [PATCH] ftruncate64 cut its argument to 32 bits on systems with 32 bit long type --- CHANGES | 3 +++ VERSION | 2 +- compat.h | 8 +++++++- config.h.in | 1 + configure.in | 3 +++ xio.h | 8 ++++++++ xioopts.c | 41 +++++++++++++++++++++++++++++++---------- 7 files changed, 54 insertions(+), 12 deletions(-) diff --git a/CHANGES b/CHANGES index 4f328b1..63d4c2d 100644 --- a/CHANGES +++ b/CHANGES @@ -1,4 +1,7 @@ +corrections: + ftruncate64 cut its argument to 32 bits on systems with 32 bit long type + ####################### V 1.7.1.0: new features: diff --git a/VERSION b/VERSION index 978ec68..a025ef4 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -"1.7.1.0" +"1.7.1.0+ftruncate64" diff --git a/compat.h b/compat.h index 5f7c588..78e299e 100644 --- a/compat.h +++ b/compat.h @@ -263,7 +263,13 @@ /* might be checked in later versions */ #ifndef F_off -#define F_off "%ld" +# if HAVE_BASIC_OFF_T==3 +# define F_off "%d" +# elif HAVE_BASIC_OFF_T==5 +# define F_off "%ld" +# else +#error "HAVE_BASIC_OFF_T is out of range:" HAVE_BASIC_OFF_T +# endif #endif /* default: long long */ diff --git a/config.h.in b/config.h.in index ad1ed55..7700c34 100644 --- a/config.h.in +++ b/config.h.in @@ -448,6 +448,7 @@ #undef HAVE_BASIC_UID_T #undef HAVE_BASIC_GID_T #undef HAVE_BASIC_TIME_T +#undef HAVE_BASIC_OFF_T #undef HAVE_BASIC_OFF64_T #undef HAVE_BASIC_SOCKLEN_T diff --git a/configure.in b/configure.in index fc82ae3..2297c62 100644 --- a/configure.in +++ b/configure.in @@ -1371,6 +1371,9 @@ AC_BASIC_TYPE([#include #include ], socklen_t, HAVE_BASIC_SOCKLEN_T, sc_cv_type_socklent_basic) +AC_BASIC_TYPE([#include +#include ], off_t, HAVE_BASIC_OFF_T, sc_cv_type_off_basic) + AC_BASIC_TYPE([#include #include ], off64_t, HAVE_BASIC_OFF64_T, sc_cv_type_off64_basic) diff --git a/xio.h b/xio.h index 5419826..35d4d95 100644 --- a/xio.h +++ b/xio.h @@ -349,6 +349,14 @@ union integral { /* some aliases */ #define u_off u_long /* please report when this causes problems */ +#if HAVE_BASIC_OFF_T==3 +# define u_off u_int +#elif HAVE_BASIC_OFF_T==5 +# define u_off u_long +#else +# error "unexpected size of off_t, please report this as bug" +#endif + #if defined(HAVE_BASIC_OFF64_T) && HAVE_BASIC_OFF64_T # if HAVE_BASIC_OFF64_T==5 # define u_off64 u_long diff --git a/xioopts.c b/xioopts.c index 3a455b7..4509a61 100644 --- a/xioopts.c +++ b/xioopts.c @@ -1877,6 +1877,9 @@ int parseopts_table(const char **a, unsigned int groups, struct opt **opts, Info2("setting option \"%s\" to %d", ent->desc->defname, (*opts)[i].value.u_byte); break; +#if HAVE_BASIC_OFF_T==3 + case TYPE_OFF32: +#endif case TYPE_INT: if (assign) { char *rest; @@ -1939,7 +1942,9 @@ int parseopts_table(const char **a, unsigned int groups, struct opt **opts, (*opts)[i].value.u_ushort); break; +#if HAVE_BASIC_OFF_T==5 case TYPE_OFF32: +#endif #if HAVE_STAT64 && defined(HAVE_BASIC_OFF64_T) && HAVE_BASIC_OFF64_T==5 case TYPE_OFF64: #endif @@ -1991,6 +1996,7 @@ int parseopts_table(const char **a, unsigned int groups, struct opt **opts, (*opts)[i].value.u_longlong); break; #endif /* HAVE_TYPE_LONGLONG */ + case TYPE_UIDT: if (!assign) { Error1("option \"%s\": value required", a0); @@ -2010,6 +2016,7 @@ int parseopts_table(const char **a, unsigned int groups, struct opt **opts, Info2("setting option \"%s\" to %u", ent->desc->defname, (*opts)[i].value.u_uidt); break; + case TYPE_GIDT: if (!assign) { Error1("option \"%s\": value required", a0); continue; } @@ -2028,6 +2035,7 @@ int parseopts_table(const char **a, unsigned int groups, struct opt **opts, Info2("setting option \"%s\" to %u", ent->desc->defname, (*opts)[i].value.u_gidt); break; + case TYPE_MODET: if (!assign) { Error1("option \"%s\": value required", a0); continue; @@ -2039,6 +2047,7 @@ int parseopts_table(const char **a, unsigned int groups, struct opt **opts, Info2("setting option \"%s\" to %u", ent->desc->defname, (*opts)[i].value.u_modet); break; + case TYPE_STRING: if (!assign) { Error1("option \"%s\": value required", a0); @@ -2050,6 +2059,7 @@ int parseopts_table(const char **a, unsigned int groups, struct opt **opts, Info2("setting option \"%s\" to \"%s\"", ent->desc->defname, (*opts)[i].value.u_string); break; + case TYPE_STRING_NULL: if (!assign) { (*opts)[i].value.u_string = NULL; @@ -2060,11 +2070,13 @@ int parseopts_table(const char **a, unsigned int groups, struct opt **opts, (*opts)[i].value.u_string); } break; + #if LATER case TYPE_INT3: break; #endif + case TYPE_TIMEVAL: if (!assign) { Error1("option \"%s\": value required", a0); @@ -2082,6 +2094,7 @@ int parseopts_table(const char **a, unsigned int groups, struct opt **opts, (val-(*opts)[i].value.u_timeval.tv_sec) * 1000000; } break; + #if HAVE_STRUCT_TIMESPEC case TYPE_TIMESPEC: if (!assign) { @@ -2101,6 +2114,7 @@ int parseopts_table(const char **a, unsigned int groups, struct opt **opts, } break; #endif /* HAVE_STRUCT_TIMESPEC */ + #if HAVE_STRUCT_LINGER case TYPE_LINGER: if (!assign) { @@ -2117,6 +2131,7 @@ int parseopts_table(const char **a, unsigned int groups, struct opt **opts, (*opts)[i].value.u_linger.l_linger); break; #endif /* HAVE_STRUCT_LINGER */ + case TYPE_INT_INT: if (!assign) { Error1("option \"%s\": values required", a0); @@ -2135,6 +2150,7 @@ int parseopts_table(const char **a, unsigned int groups, struct opt **opts, Info3("setting option \"%s\" to %d:%d", ent->desc->defname, (*opts)[i].value.u_int, (*opts)[i].value2.u_int); break; + case TYPE_INT_BIN: if (!assign) { Error1("option \"%s\": values required", a0); @@ -2162,6 +2178,7 @@ int parseopts_table(const char **a, unsigned int groups, struct opt **opts, Info2("setting option \"%s\" to %d:..."/*!!!*/, ent->desc->defname, (*opts)[i].value.u_int); break; + case TYPE_INT_STRING: if (!assign) { Error1("option \"%s\": values required", a0); @@ -2182,6 +2199,7 @@ int parseopts_table(const char **a, unsigned int groups, struct opt **opts, Info3("setting option \"%s\" to %d:\"%s\"", ent->desc->defname, (*opts)[i].value.u_int, (*opts)[i].value2.u_string); break; + case TYPE_INT_INT_INT: if (!assign) { Error1("option \"%s\": values required", a0); @@ -2206,6 +2224,7 @@ int parseopts_table(const char **a, unsigned int groups, struct opt **opts, Info4("setting option \"%s\" to %d:%d:%d", ent->desc->defname, (*opts)[i].value.u_int, (*opts)[i].value2.u_int, (*opts)[i].value3.u_int); break; + case TYPE_INT_INT_BIN: if (!assign) { Error1("option \"%s\": values required", a0); @@ -2239,6 +2258,7 @@ int parseopts_table(const char **a, unsigned int groups, struct opt **opts, Info3("setting option \"%s\" to %d:%d:..."/*!!!*/, ent->desc->defname, (*opts)[i].value.u_int, (*opts)[i].value2.u_int); break; + case TYPE_INT_INT_STRING: if (!assign) { Error1("option \"%s\": values required", a0); @@ -2267,6 +2287,7 @@ int parseopts_table(const char **a, unsigned int groups, struct opt **opts, (*opts)[i].value3.u_string); break; #if defined(HAVE_STRUCT_IP_MREQ) || defined (HAVE_STRUCT_IP_MREQN) + case TYPE_IP_MREQN: { /* we do not resolve the addresses here because we do not yet know @@ -2866,16 +2887,16 @@ int applyopts(int fd, struct opt *opts, enum e_phase phase) { ++opt; continue; } if (opt->desc->func == OFUNC_SEEK32) { - if (Lseek(fd, opt->value.u_long, opt->desc->major) < 0) { - Error4("lseek(%d, %ld, %d): %s", - fd, opt->value.u_long, opt->desc->major, strerror(errno)); + if (Lseek(fd, opt->value.u_off, opt->desc->major) < 0) { + Error4("lseek(%d, "F_off", %d): %s", + fd, opt->value.u_off, opt->desc->major, strerror(errno)); } #if HAVE_LSEEK64 } else if (opt->desc->func == OFUNC_SEEK64) { /*! this depends on off64_t atomic type */ if (Lseek64(fd, opt->value.u_off64, opt->desc->major) < 0) { - Error4("lseek64(%d, %Ld, %d): %s", + Error4("lseek64(%d, "F_off64", %d): %s", fd, opt->value.u_off64, opt->desc->major, strerror(errno)); } #endif /* HAVE_LSEEK64 */ @@ -3217,17 +3238,17 @@ int applyopts(int fd, struct opt *opts, enum e_phase phase) { } break; case OPT_FTRUNCATE32: - if (Ftruncate(fd, opt->value.u_long) < 0) { - Error3("ftruncate(%d, %ld): %s", - fd, opt->value.u_long, strerror(errno)); + if (Ftruncate(fd, opt->value.u_off) < 0) { + Error3("ftruncate(%d, "F_off"): %s", + fd, opt->value.u_off, strerror(errno)); opt->desc = ODESC_ERROR; ++opt; continue; } break; #if HAVE_FTRUNCATE64 case OPT_FTRUNCATE64: - if (Ftruncate64(fd, opt->value.u_long) < 0) { - Error3("ftruncate64(%d, %ld): %s", - fd, opt->value.u_long, strerror(errno)); + if (Ftruncate64(fd, opt->value.u_off64) < 0) { + Error3("ftruncate64(%d, "F_off64"): %s", + fd, opt->value.u_off64, strerror(errno)); opt->desc = ODESC_ERROR; ++opt; continue; } #endif /* HAVE_FTRUNCATE64 */