1 static FILE *tempFileDes (void) {
6 const char *tag
= "/TempFileXXXXXXXXXX";
7 size_t tmpDirLen
, tagLen
;
10 tmpDir
= getenv ("TMP");
12 tmpDir
= getenv ("TMPDIR");
16 tmpDirLen
= strlen(tmpDir
);
18 template = malloc_safe (tmpDirLen
+ tagLen
+ 1);
19 strncpy (template, tmpDir
, tmpDirLen
+ 1);
20 strncpy (template + tmpDirLen
, tag
, tagLen
+ 1);
22 fd
= mkstemp_safe (template);
23 f
= fdopen_safe (fd
, "w+");
25 unlink_safe (template);
34 void GC_diskBack_read (void *data
, pointer buf
, size_t size
) {
37 const size_t READ_CHUNK_SIZE
= 0x2000000; /* 32M */
39 f
= ((WriteToDiskData
)data
)->f
;
40 fseek_safe (f
, 0, SEEK_SET
);
41 /* fread (_, 1, size, _) succeeds
43 * for a 32-bit executable on 64-bit linux.
44 * Nonetheless, match GC_diskBack_write.
47 size_t s
= min (READ_CHUNK_SIZE
, size
);
48 fread_safe (buf
, 1, s
, f
);
54 void GC_diskBack_close (void *data
) {
57 f
= ((WriteToDiskData
)data
)->f
;
62 void *GC_diskBack_write (pointer buf
, size_t size
) {
66 const size_t WRITE_CHUNK_SIZE
= 0x2000000; /* 32M */
69 /* fwrite (_, 1, size, _) fails
70 * (with no helpful error conditions!)
75 size_t s
= min (WRITE_CHUNK_SIZE
, size
);
76 fwrite_safe (buf
, 1, s
, f
);
80 d
= (WriteToDiskData
)(malloc_safe (sizeof(*d
)));