summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Brewer <ben.brewer@codethink.co.uk>2014-05-30 16:57:55 +0100
committerBen Brewer <ben.brewer@codethink.co.uk>2014-06-02 15:53:42 +0100
commit17155e951f1995e768d43eb363b64062a2521202 (patch)
tree6e010c5b89a69351b0030532238dc241d2db2d81
parentf36953fc9083da892057f102619a893dfb3bbb38 (diff)
downloadtbdiff-17155e951f1995e768d43eb363b64062a2521202.tar.gz
Use POSIX file operations internally in tbdiff-create
This keeps the code consistent by using the same file functions internally as are used when reading from or writing to the stream. The code is also simplified somewhat since POSIX file operations are cleaner and more consistent than stdio.
-rw-r--r--tbdiff/tbdiff-create.c76
1 files changed, 35 insertions, 41 deletions
diff --git a/tbdiff/tbdiff-create.c b/tbdiff/tbdiff-create.c
index 1f0312a..0c5823d 100644
--- a/tbdiff/tbdiff-create.c
+++ b/tbdiff/tbdiff-create.c
@@ -16,13 +16,13 @@
*/
#include <stdlib.h>
-#include <stdio.h>
#include <string.h>
#include <stdint.h>
#include <stdbool.h>
#include <sys/stat.h>
#include <dirent.h>
+#include <fcntl.h>
#include <unistd.h>
#include "tbdiff-common.h"
@@ -236,20 +236,20 @@ tbd_create_cmd_file_create(int stream,
if(!tbd_write_uint32(size, stream))
return TBD_ERROR(TBD_ERROR_UNABLE_TO_WRITE_STREAM);
- FILE *fp = tbd_stat_fopen(f, "rb");
- if(fp == NULL)
+ int fd = tbd_stat_open(f, O_RDONLY);
+ if(fd < 0)
return TBD_ERROR(TBD_ERROR_UNABLE_TO_OPEN_FILE_FOR_READING);
uint8_t buff[256];
uintptr_t b = 256;
for(b = 256; b == 256; ) {
- b = fread(buff, 1, b, fp);
+ b = read(fd, buff, b);
if(write(stream, buff, b) != b) {
- fclose(fp);
+ close(fd);
return TBD_ERROR(TBD_ERROR_UNABLE_TO_WRITE_STREAM);
}
}
- fclose(fp);
+ close(fd);
return tbd_create_cmd_write_xattrs(stream, f);
}
@@ -300,12 +300,12 @@ tbd_create_cmd_file_delta(int stream,
struct tbd_stat *a,
struct tbd_stat *b)
{
- FILE *fpa = tbd_stat_fopen(a, "rb");
- if(fpa == NULL)
+ int fda = tbd_stat_open(a, O_RDONLY);
+ if(fda < 0)
return TBD_ERROR(TBD_ERROR_UNABLE_TO_OPEN_FILE_FOR_READING);
- FILE *fpb = tbd_stat_fopen(b, "rb");
- if(fpb == NULL) {
- fclose(fpa);
+ int fdb = tbd_stat_open(b, O_RDONLY);
+ if(fdb < 0) {
+ close(fda);
return TBD_ERROR(TBD_ERROR_UNABLE_TO_OPEN_FILE_FOR_READING);
}
@@ -315,8 +315,8 @@ tbd_create_cmd_file_delta(int stream,
uintptr_t o;
for(o = 0; (blks[1] == blks[0]) && (blks[0] != 0); o += blks[1]) {
- blks[0] = fread(buff[0], 1, blks[0], fpa);
- blks[1] = fread(buff[1], 1, blks[0], fpb);
+ blks[0] = read(fda, buff[0], blks[0]);
+ blks[1] = read(fdb, buff[1], blks[0]);
if((blks[0] == 0) || (blks[1] == 0))
break;
@@ -332,20 +332,14 @@ tbd_create_cmd_file_delta(int stream,
}
uint32_t start = o;
- if((fseek(fpa, 0, SEEK_END) != 0) || (fseek(fpb, 0, SEEK_END) != 0)) {
- fclose(fpa);
- fclose(fpb);
- return TBD_ERROR(TBD_ERROR_UNABLE_TO_SEEK_THROUGH_STREAM);
- }
-
/* Find length. */
- long flena = ftell(fpa);
- long flenb = ftell(fpb);
+ off_t flena = lseek(fda, 0, SEEK_END);
+ off_t flenb = lseek(fdb, 0, SEEK_END);
if((flena < 0) || (flenb < 0)) {
- fclose(fpa);
- fclose(fpb);
- return TBD_ERROR(TBD_ERROR_UNABLE_TO_DETECT_STREAM_POSITION);
+ close(fda);
+ close(fdb);
+ return TBD_ERROR(TBD_ERROR_UNABLE_TO_SEEK_THROUGH_STREAM);
}
/* Find end. */
@@ -357,17 +351,17 @@ tbd_create_cmd_file_delta(int stream,
if((blks[0] == 0) || (blks[1] == 0))
break;
- if((fseek(fpa, flena - (o + blks[0]), SEEK_SET) != 0)
- || (fseek(fpb, flenb - (o + blks[1]), SEEK_SET) != 0)) {
- fclose(fpa);
- fclose(fpb);
+ if((lseek(fda, flena - (o + blks[0]), SEEK_SET) < 0)
+ || (lseek(fdb, flenb - (o + blks[1]), SEEK_SET) < 0)) {
+ close(fda);
+ close(fdb);
return TBD_ERROR(TBD_ERROR_UNABLE_TO_SEEK_THROUGH_STREAM);
}
- if((fread(buff[0], 1, blks[0], fpa) != blks[0])
- || (fread(buff[1], 1, blks[1], fpb) != blks[1])) {
- fclose(fpa);
- fclose(fpb);
+ if((read(fda, buff[0], blks[0]) != blks[0])
+ || (read(fdb, buff[1], blks[1]) != blks[1])) {
+ close(fda);
+ close(fdb);
return TBD_ERROR(TBD_ERROR_UNABLE_TO_READ_STREAM);
}
@@ -381,7 +375,7 @@ tbd_create_cmd_file_delta(int stream,
if(i < blks[1])
break;
}
- fclose(fpa);
+ close(fda);
/* Ensure that the start and end don't overlap for the new file. */
if((flenb - o) < start)
@@ -396,7 +390,7 @@ tbd_create_cmd_file_delta(int stream,
/* Data is identical, only alter metadata */
if((end == start) && (size == 0)) {
tbd_create_cmd_file_metadata_update(stream, a, b);
- fclose(fpb);
+ close(fdb);
return tbd_create_cmd_write_xattrs(stream, b);
}
@@ -411,7 +405,7 @@ tbd_create_cmd_file_delta(int stream,
((err = tbd_create_write_uid (stream, b->uid)) != 0) ||
((err = tbd_create_write_gid (stream, b->gid)) != 0) ||
((err = tbd_create_write_mode (stream, b->mode)) != 0)) {
- fclose(fpb);
+ close(fdb);
return err;
}
@@ -421,24 +415,24 @@ tbd_create_cmd_file_delta(int stream,
close(fdb);
return TBD_ERROR(TBD_ERROR_UNABLE_TO_WRITE_STREAM);
}
- if(fseek(fpb, start, SEEK_SET) != 0) {
- fclose(fpb);
+ if(lseek(fdb, start, SEEK_SET) < 0) {
+ close(fdb);
return TBD_ERROR(TBD_ERROR_UNABLE_TO_SEEK_THROUGH_STREAM);
}
for(o = 0; o < size; o += 256) {
uintptr_t csize = ((size - o) > 256 ? 256 : (size - o));
- if(fread(buff[0], 1, csize, fpb) != csize) {
- fclose(fpb);
+ if(read(fdb, buff[0], csize) != csize) {
+ close(fdb);
return TBD_ERROR(TBD_ERROR_UNABLE_TO_READ_STREAM);
}
if(write(stream, buff[0], csize) != csize) {
- fclose(fpb);
+ close(fdb);
return TBD_ERROR(TBD_ERROR_UNABLE_TO_WRITE_STREAM);
}
}
- fclose(fpb);
+ close(fdb);
return tbd_create_cmd_write_xattrs(stream, b);
}