summaryrefslogtreecommitdiff
path: root/tbdiff/tbdiff-apply.c
diff options
context:
space:
mode:
Diffstat (limited to 'tbdiff/tbdiff-apply.c')
-rw-r--r--tbdiff/tbdiff-apply.c224
1 files changed, 112 insertions, 112 deletions
diff --git a/tbdiff/tbdiff-apply.c b/tbdiff/tbdiff-apply.c
index 666d876..615032f 100644
--- a/tbdiff/tbdiff-apply.c
+++ b/tbdiff/tbdiff-apply.c
@@ -16,7 +16,6 @@
*/
#include <stdlib.h>
-#include <stdio.h>
#include <string.h>
#include <stdint.h>
#include <stdbool.h>
@@ -26,9 +25,12 @@
#include <sys/stat.h>
#include <sys/time.h>
#include <dirent.h>
+#include <fcntl.h>
#include <unistd.h>
#include <utime.h>
+#include <errno.h>
+
#include "config.h"
#if HAVE_ATTR_XATTR_H
@@ -37,19 +39,19 @@
#include <sys/xattr.h>
#endif
-#include <tbdiff/tbdiff-common.h>
-#include <tbdiff/tbdiff-io.h>
-#include <tbdiff/tbdiff-private.h>
-#include <tbdiff/tbdiff-xattrs.h>
+#include "tbdiff-common.h"
+#include "tbdiff-io.h"
+#include "tbdiff-private.h"
+#include "tbdiff-xattrs.h"
char*
-tbd_apply_read_string(FILE *stream)
+tbd_apply_read_string(int stream)
{
uint16_t dlen;
- if(tbd_read_uint16(&dlen, stream) != 1)
+ if(!tbd_read_uint16(&dlen, stream))
return NULL;
char dname[dlen + 1];
- if(fread(dname, 1, dlen, stream) != dlen)
+ if(read(stream, dname, dlen) != dlen)
return NULL;
dname[dlen] = '\0';
@@ -67,11 +69,11 @@ tbd_apply_read_string(FILE *stream)
* - or your allocator does nothing when asked to free non-allocated memory
*/
int
-tbd_apply_read_block(FILE *stream, void **data, size_t *size)
+tbd_apply_read_block(int stream, void **data, size_t *size)
{
{
size_t _size;
- if (fread(&_size, 1, sizeof(_size), stream) != sizeof(_size) ) {
+ if (read(stream, &_size, sizeof(_size)) != sizeof(_size) ) {
return TBD_ERROR(TBD_ERROR_UNABLE_TO_READ_STREAM);
}
if (_size > *size) {
@@ -84,27 +86,27 @@ tbd_apply_read_block(FILE *stream, void **data, size_t *size)
}
}
- if (fread(*data, 1, *size, stream) != *size) {
+ if (read(stream, *data, *size) != *size) {
return TBD_ERROR(TBD_ERROR_UNABLE_TO_READ_STREAM);
}
return TBD_ERROR_SUCCESS;
}
static int
-tbd_apply_identify(FILE *stream)
+tbd_apply_identify(int stream)
{
- tbd_cmd_t cmd;
- if(fread(&cmd, sizeof(tbd_cmd_t), 1, stream) != 1)
+ tbd_cmd_type cmd;
+ if(read(stream, &cmd, sizeof(tbd_cmd_type)) != sizeof(tbd_cmd_type))
return TBD_ERROR(TBD_ERROR_UNABLE_TO_READ_STREAM);
if(cmd != TBD_CMD_IDENTIFY)
return TBD_ERROR(TBD_ERROR_INVALID_PARAMETER);
uint16_t nlen;
- if(tbd_read_uint16(&nlen, stream) != 1)
+ if(!tbd_read_uint16(&nlen, stream))
return TBD_ERROR(TBD_ERROR_UNABLE_TO_READ_STREAM);
if(strlen(TB_DIFF_PROTOCOL_ID) != nlen)
return TBD_ERROR(TBD_ERROR_INVALID_PARAMETER);
char nstr[nlen];
- if(fread(nstr, 1, nlen, stream) != nlen)
+ if(read(stream, nstr, nlen) != nlen)
return TBD_ERROR(TBD_ERROR_UNABLE_TO_READ_STREAM);
if(strncmp(nstr, TB_DIFF_PROTOCOL_ID, nlen) != 0)
return TBD_ERROR(TBD_ERROR_INVALID_PARAMETER);
@@ -112,13 +114,13 @@ tbd_apply_identify(FILE *stream)
}
static int
-tbd_apply_cmd_dir_create(FILE *stream)
+tbd_apply_cmd_dir_create(int stream)
{
uint16_t dlen;
- if(tbd_read_uint16(&dlen, stream) != 1)
+ if(!tbd_read_uint16(&dlen, stream))
return TBD_ERROR(TBD_ERROR_UNABLE_TO_READ_STREAM);
char dname[dlen + 1];
- if(fread(dname, 1, dlen, stream) != dlen)
+ if(read(stream, dname, dlen) != dlen)
return TBD_ERROR(TBD_ERROR_UNABLE_TO_READ_STREAM);
dname[dlen] = '\0';
TBD_DEBUGF("cmd_dir_create %s\n", dname);
@@ -126,19 +128,19 @@ tbd_apply_cmd_dir_create(FILE *stream)
return TBD_ERROR(TBD_ERROR_INVALID_PARAMETER);
time_t mtime;
- if(tbd_read_time(&mtime, stream) != 1)
+ if(!tbd_read_time(&mtime, stream))
return TBD_ERROR(TBD_ERROR_UNABLE_TO_READ_STREAM);
uid_t uid;
- if(tbd_read_uid(&uid, stream) != 1)
+ if(!tbd_read_uid(&uid, stream))
return TBD_ERROR(TBD_ERROR_UNABLE_TO_READ_STREAM);
gid_t gid;
- if(tbd_read_gid(&gid, stream) != 1)
+ if(!tbd_read_gid(&gid, stream))
return TBD_ERROR(TBD_ERROR_UNABLE_TO_READ_STREAM);
mode_t mode;
- if(tbd_read_mode(&mode, stream) != 1)
+ if(!tbd_read_mode(&mode, stream))
return TBD_ERROR(TBD_ERROR_UNABLE_TO_READ_STREAM);
if(mkdir(dname, (mode_t)mode) != 0)
@@ -156,14 +158,14 @@ tbd_apply_cmd_dir_create(FILE *stream)
}
static int
-tbd_apply_cmd_dir_enter(FILE *stream,
+tbd_apply_cmd_dir_enter(int stream,
uintptr_t *depth)
{
uint16_t dlen;
- if(tbd_read_uint16(&dlen, stream) != 1)
+ if(!tbd_read_uint16(&dlen, stream))
return TBD_ERROR(TBD_ERROR_UNABLE_TO_READ_STREAM);
char dname[dlen + 1];
- if(fread(dname, 1, dlen, stream) != dlen)
+ if(read(stream, dname, dlen) != dlen)
return TBD_ERROR(TBD_ERROR_UNABLE_TO_READ_STREAM);
dname[dlen] = '\0';
TBD_DEBUGF("cmd_dir_enter %s\n", dname);
@@ -178,13 +180,13 @@ tbd_apply_cmd_dir_enter(FILE *stream,
}
static int
-tbd_apply_cmd_dir_leave(FILE *stream,
+tbd_apply_cmd_dir_leave(int stream,
uintptr_t *depth)
{
int err = TBD_ERROR_SUCCESS;
struct utimbuf time;
- if (tbd_read_time(&(time.modtime), stream) != 1) {
+ if (!tbd_read_time(&(time.modtime), stream)) {
return TBD_ERROR(TBD_ERROR_UNABLE_TO_READ_STREAM);
}
time.actime = time.modtime;/* not sure what the best atime to use is */
@@ -212,13 +214,13 @@ tbd_apply_cmd_dir_leave(FILE *stream,
}
static int
-tbd_apply_cmd_file_create(FILE *stream)
+tbd_apply_cmd_file_create(int stream)
{
uint16_t flen;
- if(tbd_read_uint16(&flen, stream) != 1)
+ if(!tbd_read_uint16(&flen, stream))
return TBD_ERROR(TBD_ERROR_UNABLE_TO_READ_STREAM);
char fname[flen + 1];
- if(fread(fname, 1, flen, stream) != flen)
+ if(read(stream, fname, flen) != flen)
return TBD_ERROR(TBD_ERROR_UNABLE_TO_READ_STREAM);
fname[flen] = '\0';
if((strchr(fname, '/') != NULL) || (strcmp(fname, "..") == 0))
@@ -230,40 +232,37 @@ tbd_apply_cmd_file_create(FILE *stream)
gid_t gid;
uint32_t fsize;
- if(tbd_read_time (&mtime, stream) != 1 ||
- tbd_read_uint32(&mode , stream) != 1 ||
- tbd_read_uid (&uid , stream) != 1 ||
- tbd_read_gid (&gid , stream) != 1 ||
- tbd_read_uint32(&fsize, stream) != 1)
+ if(!tbd_read_time (&mtime, stream) ||
+ !tbd_read_uint32(&mode , stream) ||
+ !tbd_read_uid (&uid , stream) ||
+ !tbd_read_gid (&gid , stream) ||
+ !tbd_read_uint32(&fsize, stream))
return TBD_ERROR(TBD_ERROR_UNABLE_TO_READ_STREAM);
TBD_DEBUGF("cmd_file_create %s:%"PRId32"\n", fname, fsize);
- FILE *fp = fopen(fname, "rb");
- if(fp != NULL) {
- fclose(fp);
- return TBD_ERROR(TBD_ERROR_FILE_ALREADY_EXISTS);
- }
-
- fp = fopen(fname, "wb");
- if(fp == NULL)
+ int fd = open(fname, O_WRONLY | O_CREAT | O_EXCL, mode);
+ if(fd < 0) {
+ if (errno == EEXIST)
+ return TBD_ERROR(TBD_ERROR_FILE_ALREADY_EXISTS);
return TBD_ERROR(TBD_ERROR_UNABLE_TO_OPEN_FILE_FOR_WRITING);
+ }
uintptr_t block = 256;
uint8_t fbuff[block];
for(; fsize != 0; fsize -= block) {
if(fsize < block)
block = fsize;
- if(fread(fbuff, 1, block, stream) != block) {
- fclose(fp);
+ if(read(stream, fbuff, block) != block) {
+ close(fd);
return TBD_ERROR(TBD_ERROR_UNABLE_TO_READ_STREAM);
}
- if(fwrite(fbuff, 1, block, fp) != block) {
- fclose(fp);
+ if(write(fd, fbuff, block) != block) {
+ close(fd);
return TBD_ERROR(TBD_ERROR_UNABLE_TO_WRITE_STREAM);
}
}
- fclose(fp);
+ close(fd);
/* Apply metadata. */
struct utimbuf timebuff = { time(NULL), mtime };
@@ -279,7 +278,7 @@ tbd_apply_cmd_file_create(FILE *stream)
}
static int
-tbd_apply_cmd_file_delta(FILE *stream)
+tbd_apply_cmd_file_delta(int stream)
{
uint16_t mdata_mask;
time_t mtime;
@@ -289,10 +288,10 @@ tbd_apply_cmd_file_delta(FILE *stream)
uint16_t flen;
int error;
- if(tbd_read_uint16(&flen, stream) != 1)
+ if(!tbd_read_uint16(&flen, stream))
return TBD_ERROR(TBD_ERROR_UNABLE_TO_READ_STREAM);
char fname[flen + 1];
- if(fread(fname, 1, flen, stream) != flen)
+ if(read(stream, fname, flen) != flen)
return TBD_ERROR(TBD_ERROR_UNABLE_TO_READ_STREAM);
fname[flen] = '\0';
@@ -303,32 +302,32 @@ tbd_apply_cmd_file_delta(FILE *stream)
return TBD_ERROR(TBD_ERROR_INVALID_PARAMETER);
/* Reading metadata */
- if(tbd_read_uint16(&mdata_mask, stream) != 1 ||
- tbd_read_time (&mtime , stream) != 1 ||
- tbd_read_uid (&uid , stream) != 1 ||
- tbd_read_gid (&gid , stream) != 1 ||
- tbd_read_uint32(&mode , stream) != 1)
+ if(!tbd_read_uint16(&mdata_mask, stream) ||
+ !tbd_read_time (&mtime , stream) ||
+ !tbd_read_uid (&uid , stream) ||
+ !tbd_read_gid (&gid , stream) ||
+ !tbd_read_uint32(&mode , stream))
return TBD_ERROR(TBD_ERROR_UNABLE_TO_READ_STREAM);
- FILE *op = fopen(fname, "rb");
- if(op == NULL)
+ int od = open(fname, O_RDONLY);
+ if(od < 0)
return TBD_ERROR(TBD_ERROR_UNABLE_TO_OPEN_FILE_FOR_READING);
if(remove(fname) != 0) {
- fclose(op);
+ close(od);
return TBD_ERROR(TBD_ERROR_UNABLE_TO_REMOVE_FILE);
}
- FILE *np = fopen(fname, "wb");
- if(np == NULL) {
- fclose(op);
+ int nd = open(fname, O_WRONLY | O_CREAT, mode);
+ if(nd < 0) {
+ close(od);
return TBD_ERROR(TBD_ERROR_UNABLE_TO_OPEN_FILE_FOR_WRITING);
}
uint32_t dstart, dend;
- if(tbd_read_uint32(&dstart, stream) != 1) {
+ if(!tbd_read_uint32(&dstart, stream)) {
error = TBD_ERROR(TBD_ERROR_UNABLE_TO_READ_STREAM);
goto tbd_apply_cmd_file_delta_error;
}
- if(tbd_read_uint32(&dend, stream) != 1) {
+ if(!tbd_read_uint32(&dend, stream)) {
error = TBD_ERROR(TBD_ERROR_UNABLE_TO_READ_STREAM);
goto tbd_apply_cmd_file_delta_error;
}
@@ -338,18 +337,18 @@ tbd_apply_cmd_file_delta(FILE *stream)
for(block = 256; dstart != 0; dstart -= block) {
if(dstart < block)
block = dstart;
- if(fread(fbuff, 1, block, op) != block) {
+ if(read(od, fbuff, block) != block) {
error = TBD_ERROR(TBD_ERROR_UNABLE_TO_READ_STREAM);
goto tbd_apply_cmd_file_delta_error;
}
- if(fwrite(fbuff, 1, block, np) != block) {
+ if(write(nd, fbuff, block) != block) {
error = TBD_ERROR(TBD_ERROR_UNABLE_TO_WRITE_STREAM);
goto tbd_apply_cmd_file_delta_error;
}
}
uint32_t fsize;
- if(tbd_read_uint32(&fsize, stream) != 1) {
+ if(!tbd_read_uint32(&fsize, stream)) {
error = TBD_ERROR(TBD_ERROR_UNABLE_TO_READ_STREAM);
goto tbd_apply_cmd_file_delta_error;
}
@@ -357,31 +356,31 @@ tbd_apply_cmd_file_delta(FILE *stream)
for(block = 256; fsize != 0; fsize -= block) {
if(fsize < block)
block = fsize;
- if(fread(fbuff, 1, block, stream) != block) {
+ if(read(stream, fbuff, block) != block) {
error = TBD_ERROR(TBD_ERROR_UNABLE_TO_READ_STREAM);
goto tbd_apply_cmd_file_delta_error;
}
- if(fwrite(fbuff, 1, block, np) != block) {
+ if(write(nd, fbuff, block) != block) {
error = TBD_ERROR(TBD_ERROR_UNABLE_TO_WRITE_STREAM);
goto tbd_apply_cmd_file_delta_error;
}
}
- if(fseek(op, dend, SEEK_SET) != 0) {
+ if(lseek(od, dend, SEEK_SET) < 0) {
error = TBD_ERROR(TBD_ERROR_UNABLE_TO_SEEK_THROUGH_STREAM);
goto tbd_apply_cmd_file_delta_error;
}
for(block = 256; block != 0;) {
- block = fread(fbuff, 1, block, op);
- if(fwrite(fbuff, 1, block, np) != block) {
+ block = read(od, fbuff, block);
+ if(write(nd, fbuff, block) != block) {
error = TBD_ERROR(TBD_ERROR_UNABLE_TO_WRITE_STREAM);
goto tbd_apply_cmd_file_delta_error;
}
}
- fclose(np);
- fclose(op);
+ close(nd);
+ close(od);
/* Apply metadata. */
/* file was removed so old permissions were lost
@@ -410,8 +409,8 @@ tbd_apply_cmd_file_delta(FILE *stream)
return 0;
tbd_apply_cmd_file_delta_error:
- fclose(np);
- fclose(op);
+ close(nd);
+ close(od);
return error;
}
@@ -477,13 +476,13 @@ tbd_apply_cmd_entity_delete_for_name(const char *name)
}
static int
-tbd_apply_cmd_entity_delete(FILE *stream)
+tbd_apply_cmd_entity_delete(int stream)
{
uint16_t elen;
- if(tbd_read_uint16(&elen, stream) != 1)
+ if(!tbd_read_uint16(&elen, stream))
return TBD_ERROR(TBD_ERROR_UNABLE_TO_READ_STREAM);
char ename[elen + 1];
- if(fread(ename, 1, elen, stream) != elen)
+ if(read(stream, ename, elen) != elen)
return TBD_ERROR(TBD_ERROR_UNABLE_TO_READ_STREAM);
ename[elen] = '\0';
@@ -495,34 +494,34 @@ tbd_apply_cmd_entity_delete(FILE *stream)
}
static int
-tbd_apply_cmd_symlink_create(FILE *stream)
+tbd_apply_cmd_symlink_create(int stream)
{
uint16_t len;
time_t mtime;
uid_t uid;
gid_t gid;
- if(tbd_read_time(&mtime, stream) != 1 ||
- tbd_read_uid(&uid , stream) != 1 ||
- tbd_read_gid(&gid , stream) != 1)
+ if(!tbd_read_time(&mtime, stream) ||
+ !tbd_read_uid (&uid , stream) ||
+ !tbd_read_gid (&gid , stream))
return TBD_ERROR(TBD_ERROR_UNABLE_TO_READ_STREAM);
/* Reading link file name */
- if(tbd_read_uint16(&len, stream) != 1)
+ if(!tbd_read_uint16(&len, stream))
return TBD_ERROR(TBD_ERROR_UNABLE_TO_READ_STREAM);
char linkname[len + 1];
linkname[len] = '\0';
- if(fread(linkname, sizeof(char), len, stream) != len)
+ if(read(stream, linkname, len) != len)
return TBD_ERROR(TBD_ERROR_UNABLE_TO_READ_STREAM);
/* Reading target path */
- if(tbd_read_uint16(&len, stream) != 1)
+ if(!tbd_read_uint16(&len, stream))
return TBD_ERROR(TBD_ERROR_UNABLE_TO_READ_STREAM);
char linkpath[len+1];
linkpath[len] = '\0';
- if(fread(linkpath, sizeof(char), len, stream) != len)
+ if(read(stream, linkpath, len) != len)
return TBD_ERROR(TBD_ERROR_UNABLE_TO_READ_STREAM);
TBD_DEBUGF("cmd_symlink_create %s -> %s\n", linkname, linkpath);
@@ -543,7 +542,7 @@ tbd_apply_cmd_symlink_create(FILE *stream)
}
static int
-tbd_apply_cmd_special_create(FILE *stream)
+tbd_apply_cmd_special_create(int stream)
{
char *name = tbd_apply_read_string(stream);
time_t mtime;
@@ -553,11 +552,11 @@ tbd_apply_cmd_special_create(FILE *stream)
uint32_t dev;
if(name == NULL ||
- tbd_read_time (&mtime, stream) != 1 ||
- tbd_read_mode (&mode , stream) != 1 ||
- tbd_read_uid (&uid , stream) != 1 ||
- tbd_read_gid (&gid , stream) != 1 ||
- tbd_read_uint32(&dev , stream) != 1) {
+ !tbd_read_time (&mtime, stream) ||
+ !tbd_read_mode (&mode , stream) ||
+ !tbd_read_uid (&uid , stream) ||
+ !tbd_read_gid (&gid , stream) ||
+ !tbd_read_uint32(&dev , stream)) {
free(name);
return TBD_ERROR(TBD_ERROR_UNABLE_TO_READ_STREAM);
}
@@ -581,7 +580,7 @@ tbd_apply_cmd_special_create(FILE *stream)
}
static int
-tbd_apply_cmd_dir_delta(FILE *stream)
+tbd_apply_cmd_dir_delta(int stream)
{
uint16_t metadata_mask;
time_t mtime;
@@ -589,11 +588,11 @@ tbd_apply_cmd_dir_delta(FILE *stream)
gid_t gid;
mode_t mode;
- if(tbd_read_uint16(&metadata_mask, stream) != 1 ||
- tbd_read_time (&mtime , stream) != 1 ||
- tbd_read_uid (&uid , stream) != 1 ||
- tbd_read_gid (&gid , stream) != 1 ||
- tbd_read_uint32(&mode , stream) != 1)
+ if(!tbd_read_uint16(&metadata_mask, stream) ||
+ !tbd_read_time (&mtime , stream) ||
+ !tbd_read_uid (&uid , stream) ||
+ !tbd_read_gid (&gid , stream) ||
+ !tbd_read_uint32(&mode , stream))
return TBD_ERROR(TBD_ERROR_UNABLE_TO_READ_STREAM);
char *dname = tbd_apply_read_string(stream);
@@ -618,7 +617,7 @@ tbd_apply_cmd_dir_delta(FILE *stream)
}
static int
-tbd_apply_cmd_file_mdata_update(FILE *stream)
+tbd_apply_cmd_file_mdata_update(int stream)
{
uint16_t metadata_mask;
time_t mtime;
@@ -626,11 +625,11 @@ tbd_apply_cmd_file_mdata_update(FILE *stream)
gid_t gid;
mode_t mode;
- if(tbd_read_uint16(&metadata_mask, stream) != 1 ||
- tbd_read_time (&mtime , stream) != 1 ||
- tbd_read_uid (&uid , stream) != 1 ||
- tbd_read_gid (&gid , stream) != 1 ||
- tbd_read_uint32(&mode , stream) != 1)
+ if(!tbd_read_uint16(&metadata_mask, stream) ||
+ !tbd_read_time (&mtime , stream) ||
+ !tbd_read_uid (&uid , stream) ||
+ !tbd_read_gid (&gid , stream) ||
+ !tbd_read_uint32(&mode , stream))
return TBD_ERROR(TBD_ERROR_UNABLE_TO_READ_STREAM);
char *dname = tbd_apply_read_string(stream);
@@ -656,7 +655,7 @@ tbd_apply_cmd_file_mdata_update(FILE *stream)
}
static int
-tbd_apply_cmd_xattrs_update(FILE *stream)
+tbd_apply_cmd_xattrs_update(int stream)
{
int err = TBD_ERROR_SUCCESS;
char *fname;
@@ -674,7 +673,7 @@ tbd_apply_cmd_xattrs_update(FILE *stream)
}
/* read how many attributes to process */
- if (tbd_read_uint32(&count, stream) != 1) {
+ if (!tbd_read_uint32(&count, stream)) {
err = TBD_ERROR(TBD_ERROR_UNABLE_TO_READ_STREAM);
goto cleanup;
}
@@ -709,9 +708,9 @@ cleanup:
}
int
-tbd_apply(FILE *stream)
+tbd_apply(int stream)
{
- if(stream == NULL)
+ if(stream < 0)
return TBD_ERROR(TBD_ERROR_NULL_POINTER);
int err;
@@ -721,8 +720,9 @@ tbd_apply(FILE *stream)
uintptr_t depth = 0;
bool flush = false;
while(!flush) {
- tbd_cmd_t cmd;
- if(fread(&cmd, sizeof(tbd_cmd_t), 1, stream) != 1)
+ tbd_cmd_type cmd;
+ if(read(stream, &cmd, sizeof(tbd_cmd_type)) !=
+ sizeof(tbd_cmd_type))
return TBD_ERROR(TBD_ERROR_UNABLE_TO_READ_STREAM);
switch(cmd) {
case TBD_CMD_DIR_CREATE: