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-04 12:44:01 +0100
commit4f69a8fadbd90eb6ff979b6dad57f6de631e3734 (patch)
tree7097ea9f70551d59bfb2105133ccabdc0286badf
parent0398b8bca477daf22f549fa3152a04abdc8da947 (diff)
downloadtbdiff-4f69a8fadbd90eb6ff979b6dad57f6de631e3734.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);
}