Skip to content
This repository has been archived by the owner on Apr 14, 2020. It is now read-only.

Add LARGEFILE support for 32bit builds #31

Open
codestation opened this issue Jul 23, 2013 · 1 comment
Open

Add LARGEFILE support for 32bit builds #31

codestation opened this issue Jul 23, 2013 · 1 comment
Assignees

Comments

@codestation
Copy link

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

@ghost ghost assigned yifanlu Jul 25, 2013
@codestation
Copy link
Author

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 free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants