summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlberto Ruiz <alberto.ruiz@codethink.co.uk>2011-09-28 20:00:57 +0100
committerAlberto Ruiz <alberto.ruiz@codethink.co.uk>2011-09-28 20:00:57 +0100
commit9e29ca87af21f80566f0dae4501dea029a832f0b (patch)
tree68a843dc254da1351ca5b843def804029ed739ce
parente1a68159e3df89fe5defe89244ac3aae5852ff39 (diff)
downloadtbdiff-9e29ca87af21f80566f0dae4501dea029a832f0b.tar.gz
Implemented special file deltas
-rw-r--r--otap.h3
-rw-r--r--otap_apply.c2
-rw-r--r--otap_create.c63
3 files changed, 42 insertions, 26 deletions
diff --git a/otap.h b/otap.h
index 6371f39..b5dd076 100644
--- a/otap.h
+++ b/otap.h
@@ -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;
}