diff options
author | Denis Vlasenko <vda.linux@googlemail.com> | 2006-10-08 21:54:47 +0400 |
---|---|---|
committer | Denis Vlasenko <vda.linux@googlemail.com> | 2006-10-08 21:54:47 +0400 |
commit | 7039a66b58706457c7423de60556e04545432943 (patch) | |
tree | a512daebc3674c819766664c8ea17d41ef7fef02 /include | |
parent | 1385899416a4396385ad421ae1f532be7103738a (diff) |
correct largefile support, add comments about it.
Diffstat (limited to 'include')
-rw-r--r-- | include/libbb.h | 70 |
1 files changed, 48 insertions, 22 deletions
diff --git a/include/libbb.h b/include/libbb.h index a7c770400..bc86e5faf 100644 --- a/include/libbb.h +++ b/include/libbb.h @@ -61,30 +61,56 @@ #define PATH_MAX 256 #endif +/* Not (yet) used, but tested to work correctly +#define MAXINT(T) (T)( \ + ((T)-1) > 0 \ + ? (T)-1 \ + : (T)~((T)1 << (sizeof(T)*8-1)) \ + ) + +#define MININT(T) (T)( \ + ((T)-1) > 0 \ + ? (T)0 \ + : ((T)1 << (sizeof(T)*8-1)) \ + ) +*/ + /* Large file support */ -#ifdef CONFIG_LFS -# define FILEOFF_TYPE off64_t -# define FILEOFF_FMT "%lld" -# define LSEEK lseek64 -# define STAT stat64 -# define LSTAT lstat64 -# define STRUCT_STAT struct stat64 -# define STRTOOFF strtoll -# define SAFE_STRTOOFF safe_strtoll +/* Note that CONFIG_LFS forces bbox to be built with all common ops + * (stat, lseek etc) mapped to "largefile" variants by libc. + * Practically it means that open() automatically has O_LARGEFILE added + * and all filesize/file_offset parameters and struct members are "large" + * (in today's world - signed 64bit). For full support of large files, + * we need a few helper #defines (below) and careful use of off_t + * instead of int/ssize_t. No lseek64(), O_LARGEFILE etc necessary */ +#if ENBALE_LFS +/* CONFIG_LFS is on */ +# if ULONG_MAX > 0xffffffff +/* "long" is long enough on this system */ +# define STRTOOFF strtol +# define SAFE_STRTOOFF safe_strtol +# define OFF_FMT "%ld" +# else +/* "long" is too short, need "lomg long" */ +# define STRTOOFF strtoll +# define SAFE_STRTOOFF safe_strtoll +# define OFF_FMT "%lld" +# endif #else -# define FILEOFF_TYPE off_t -# define FILEOFF_FMT "%ld" -# define LSEEK lseek -# define STAT stat -# define LSTAT lstat -# define STRUCT_STAT struct stat -# define STRTOOFF strtol -# define SAFE_STRTOOFF safe_strtol -/* Do we need to undefine O_LARGEFILE? */ +# if 0 /* UINT_MAX == 0xffffffff */ +/* Doesn't work. off_t is a long. gcc will throw warnings on printf("%d", off_t) + * even if long==int on this arch. Crap... */ +# define STRTOOFF strtol +# define SAFE_STRTOOFF safe_strtoi +# define OFF_FMT "%d" +# else +# define STRTOOFF strtol +# define SAFE_STRTOOFF safe_strtol +# define OFF_FMT "%ld" +# endif #endif /* scary. better ideas? (but do *test* them first!) */ -#define MAX_FILEOFF_TYPE \ - ((FILEOFF_TYPE)~((FILEOFF_TYPE)1 << (sizeof(FILEOFF_TYPE)*8-1))) +#define OFF_T_MAX ((off_t)~((off_t)1 << (sizeof(off_t)*8-1))) /* Some useful definitions */ #undef FALSE @@ -203,8 +229,8 @@ extern char *find_block_device(char *path); extern char *bb_get_line_from_file(FILE *file); extern char *bb_get_chomped_line_from_file(FILE *file); extern char *bb_get_chunk_from_file(FILE *file, int *end); -extern int bb_copyfd_size(int fd1, int fd2, const off_t size); -extern int bb_copyfd_eof(int fd1, int fd2); +extern off_t bb_copyfd_size(int fd1, int fd2, off_t size); +extern off_t bb_copyfd_eof(int fd1, int fd2); extern char bb_process_escape_sequence(const char **ptr); extern char *bb_get_last_path_component(char *path); extern FILE *bb_wfopen(const char *path, const char *mode); |