diff options
author | Alberto Ruiz <alberto.ruiz@codethink.co.uk> | 2011-09-28 20:00:57 +0100 |
---|---|---|
committer | Alberto Ruiz <alberto.ruiz@codethink.co.uk> | 2011-09-28 20:00:57 +0100 |
commit | 9e29ca87af21f80566f0dae4501dea029a832f0b (patch) | |
tree | 68a843dc254da1351ca5b843def804029ed739ce | |
parent | e1a68159e3df89fe5defe89244ac3aae5852ff39 (diff) | |
download | tbdiff-9e29ca87af21f80566f0dae4501dea029a832f0b.tar.gz |
Implemented special file deltas
-rw-r--r-- | otap.h | 3 | ||||
-rw-r--r-- | otap_apply.c | 2 | ||||
-rw-r--r-- | otap_create.c | 63 |
3 files changed, 42 insertions, 26 deletions
@@ -21,7 +21,7 @@ typedef enum OTAP_CMD_ENTITY_COPY = 0x31, OTAP_CMD_ENTITY_DELETE = 0x32, OTAP_CMD_SYMLINK_CREATE = 0x40, - OTAP_CMD_SPECIAL_CREATE = 0x50 + OTAP_CMD_SPECIAL_CREATE = 0x50, } otap_cmd_e; typedef enum @@ -31,6 +31,7 @@ typedef enum OTAP_METADATA_MODE = 0x2, OTAP_METADATA_UID = 0x4, OTAP_METADATA_GID = 0x8, + OTAP_METADATA_RDEV = 0x10, } otap_metadata_type_e; extern const char* otap_ident; diff --git a/otap_apply.c b/otap_apply.c index f263b2e..475e37d 100644 --- a/otap_apply.c +++ b/otap_apply.c @@ -486,7 +486,7 @@ _otap_apply_cmd_dir_delta(FILE *stream) if (dname == NULL) otap_error(OTAP_ERROR_UNABLE_TO_READ_STREAM); - fprintf(stderr, "cmd_special_delta %s\n", dname); + fprintf(stderr, "cmd_dir_delta %s\n", dname); if (metadata_mask & OTAP_METADATA_MTIME) { diff --git a/otap_create.c b/otap_create.c index 6562096..32fdd0b 100644 --- a/otap_create.c +++ b/otap_create.c @@ -148,13 +148,13 @@ _otap_metadata_mask (otap_stat_t *a, uint16_t metadata_mask = OTAP_METADATA_NONE; /* If nothing changes we issue no command */ - if (a->mtime == b->mtime) + if (a->mtime != b->mtime) metadata_mask |= OTAP_METADATA_MTIME; - if (a->uid == b->uid) + if (a->uid != b->uid) metadata_mask |= OTAP_METADATA_UID; - if (a->gid == b->gid) + if (a->gid != b->gid) metadata_mask |= OTAP_METADATA_GID; - if (a->mode == b->mode) + if (a->mode != b->mode) metadata_mask |= OTAP_METADATA_MODE; return metadata_mask; @@ -552,31 +552,45 @@ static int _otap_create_cmd_special_create (FILE *stream, otap_stat_t *nod) { - int err = _otap_create_fwrite_cmd(stream, OTAP_CMD_SPECIAL_CREATE); - if (err != 0) - return err; - - err = _otap_create_fwrite_string(stream, nod->name); - if (err != 0) + int err; + + if ((err = _otap_create_fwrite_cmd(stream, OTAP_CMD_SPECIAL_CREATE)) != 0 || + (err = _otap_create_fwrite_string(stream, nod->name)) != 0 || + (err = _otap_create_fwrite_mtime (stream, nod->mtime)) != 0 || + (err = _otap_create_fwrite_mode (stream, nod->mode)) != 0 || + (err = _otap_create_fwrite_uid (stream, nod->uid)) != 0 || + (err = _otap_create_fwrite_gid (stream, nod->gid)) != 0) return err; + return _otap_create_fwrite_dev (stream, nod->rdev); +} - err = _otap_create_fwrite_mtime (stream, nod->mtime); - if (err != 0) - return err; +static int +_otap_create_cmd_special_delta(FILE *stream, + otap_stat_t *a, + otap_stat_t *b) +{ + uint16_t metadata_mask = OTAP_METADATA_NONE; - err = _otap_create_fwrite_mode (stream, nod->mode); - if (err != 0) - return err; + /* If nothing changes we issue no command */ + if (a->mtime != b->mtime) + metadata_mask |= OTAP_METADATA_MTIME; + if (a->uid != b->uid) + metadata_mask |= OTAP_METADATA_UID; + if (a->gid != b->gid) + metadata_mask |= OTAP_METADATA_GID; + if (a->mode != b->mode) + metadata_mask |= OTAP_METADATA_MODE; + if (a->rdev != b->rdev) + metadata_mask |= OTAP_METADATA_RDEV; - err = _otap_create_fwrite_uid (stream, nod->uid); - if (err != 0) - return err; + if (metadata_mask != OTAP_METADATA_NONE) + return 0; - err = _otap_create_fwrite_gid (stream, nod->gid); - if (err != 0) + int err; + if ((err = _otap_create_cmd_entity_delete(stream, a->name)) != 0) return err; - return _otap_create_fwrite_dev (stream, nod->rdev); + return _otap_create_cmd_special_create(stream, b); } static int @@ -624,9 +638,10 @@ _otap_create (FILE *stream, case OTAP_STAT_TYPE_BLKDEV: case OTAP_STAT_TYPE_FIFO: case OTAP_STAT_TYPE_SOCKET: - otap_error(OTAP_ERROR_FEATURE_NOT_IMPLEMENTED); + return _otap_create_cmd_special_delta(stream, a, b); case OTAP_STAT_TYPE_DIR: - _otap_create_cmd_dir_delta (stream, a, b); + if (!top) + _otap_create_cmd_dir_delta (stream, a, b); default: break; } |