You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
This repository has been archived by the owner on Apr 14, 2020. It is now read-only.
gcc -m32 testcase.c -o testcase32 # for 32bit binary
gcc testcase.c -o testcase # for 64bit binary
./testcase /path/to/file # gives correct values for total and free
./testcase32 /path/to/file # gives incorrect values for total and free space if the partition has over 2GiB of total/free space.
Compiling the testcase with
gcc -m32 -D_FILE_OFFSET_BITS=64 testcase.c -o testcase32
Makes the testcase32 produce the same output as the 64bit binary.
Probably the correct fix is to add AC_SYS_LARGEFILE to the configure.ac file. Sadly i don't have a 32bit chroot right now to test the configure script. I will post again if i can find a 32bit system to make a full build to test that this fix is valid.
Proposed patch to enable 64bit structures on 32bit systems and use fseeko instead of fseek (who doesn't support files greater than 2GiB on 32bit systems) https://gist.github.com/codestation/6081325
edit: i am gonna pospone this patch until i find a proper fix since i found some casting problems in the opencma code, like castings from uint64_t to size_t who are undefined in 32bit code.
edit2: patch updated: the OP of the issue #27 has confirmed me that the new patch solves his transfer problems under 32bit.
Let me explain the patch:
Add AC_SYS_LARGEFILE to configure.ac so the 64bit version of the fopen/fseeko/ftello are used under the hood.
Add config.h to database.c, opencma.c and utilities.c so the largefile flags gets passed to the opencma binary. The config.h should be referented by all the compilation units in a particular binary so the ABI is the same (else the binary will fail silenty at runtime with stack corruption).
Change writeFileFromBuffer and readFileToBuffer seek param to off_t so the values from vitamtp doesn't get truncated.
Replace ftell and fseek with ftello/fseeko. Those functions are 64bit aware, even on 32 bit systems.
Modified writeFileFromBuffer to reopen the file in RW mode when a seek value inside the file is detected, so the file pointer can be moved. The original function tried to move the file pointer while in append mode ("a+") but that isn't possible for writtes.
Sign up for freeto subscribe to this conversation on GitHub.
Already have an account?
Sign in.
The 32bit builds of opencma doesn't have LARGEFILE support so functions like statvfs gets the wrong values.
Here is a testcase using the getDiskSpace function defined in utilities.c.
https://gist.github.com/codestation/6058882
Compile the testcase like this in a 64bit system:
gcc -m32 testcase.c -o testcase32 # for 32bit binary
gcc testcase.c -o testcase # for 64bit binary
./testcase /path/to/file # gives correct values for total and free
./testcase32 /path/to/file # gives incorrect values for total and free space if the partition has over 2GiB of total/free space.
Compiling the testcase with
gcc -m32 -D_FILE_OFFSET_BITS=64 testcase.c -o testcase32
Makes the testcase32 produce the same output as the 64bit binary.
Probably the correct fix is to add AC_SYS_LARGEFILE to the configure.ac file. Sadly i don't have a 32bit chroot right now to test the configure script. I will post again if i can find a 32bit system to make a full build to test that this fix is valid.
Note: probably this bug solves the issue #27
The text was updated successfully, but these errors were encountered: