summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Brewer <ben.brewer@codethink.co.uk>2014-05-30 16:45:53 +0100
committerBen Brewer <ben.brewer@codethink.co.uk>2014-06-04 12:44:01 +0100
commit0398b8bca477daf22f549fa3152a04abdc8da947 (patch)
treeb5cd3e1399ba42fd5a07785f8b6c5589638c65d9
parent56bb60f7e0a4b79ec8da62dccd054b87d7469fb6 (diff)
downloadtbdiff-0398b8bca477daf22f549fa3152a04abdc8da947.tar.gz
Use POSIX file functions for tbdiff-create stream
POSIX file functions are more consistent and simple, originally stdio was used to make the code as portable as possible, however since it now relies on POSIX functionality anyway there's no need for the inconsistency.
-rw-r--r--tbdiff-create/main.c16
-rw-r--r--tbdiff/tbdiff-common.h2
-rw-r--r--tbdiff/tbdiff-create.c104
-rw-r--r--tbdiff/tbdiff-io.c30
-rw-r--r--tbdiff/tbdiff-io.h15
5 files changed, 88 insertions, 79 deletions
diff --git a/tbdiff-create/main.c b/tbdiff-create/main.c
index 79b35e2..c8df2bf 100644
--- a/tbdiff-create/main.c
+++ b/tbdiff-create/main.c
@@ -18,7 +18,9 @@
#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
+#include <errno.h>
+#include <fcntl.h>
#include <unistd.h>
#include <tbdiff/tbdiff.h>
@@ -62,15 +64,17 @@ main(int argc,
return EXIT_FAILURE;
}
- FILE *fp = fopen(argv[1], "wb");
- if(fp == NULL) {
- fprintf(stderr, "ERROR: Unable to open patch for writing.\n");
+ int fd = open(argv[1],
+ O_WRONLY | O_CREAT | O_TRUNC,
+ S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
+ if(fd < 0) {
+ fprintf(stderr, "Error(%d): Unable to open patch for writing.\n", errno);
return EXIT_FAILURE;
}
int err;
- if((err = tbd_create(fp, tstat[0], tstat[1])) != 0) {
- fclose(fp);
+ if((err = tbd_create(fd, tstat[0], tstat[1])) != 0) {
+ close(fd);
tbd_stat_free(tstat[0]);
tbd_stat_free(tstat[1]);
@@ -89,7 +93,7 @@ main(int argc,
return EXIT_FAILURE;
}
- fclose(fp);
+ close(fd);
tbd_stat_free(tstat[0]);
tbd_stat_free(tstat[1]);
diff --git a/tbdiff/tbdiff-common.h b/tbdiff/tbdiff-common.h
index 193b462..9b5b5f3 100644
--- a/tbdiff/tbdiff-common.h
+++ b/tbdiff/tbdiff-common.h
@@ -127,6 +127,6 @@ tbd_error(enum tbd_error e, char const *s, char const *func, int line,
#endif
int tbd_apply (FILE *stream);
-int tbd_create(FILE *stream, struct tbd_stat *a, struct tbd_stat *b);
+int tbd_create(int stream, struct tbd_stat *a, struct tbd_stat *b);
#endif /* !__TBDIFF_COMMON_H__ */
diff --git a/tbdiff/tbdiff-create.c b/tbdiff/tbdiff-create.c
index 57ab4fe..1f0312a 100644
--- a/tbdiff/tbdiff-create.c
+++ b/tbdiff/tbdiff-create.c
@@ -33,96 +33,96 @@
#define PATH_BUFFER_LENGTH 4096
static int
-tbd_create_write_cmd(FILE *stream,
+tbd_create_write_cmd(int stream,
tbd_cmd_type cmd)
{
- if(fwrite(&cmd, sizeof(tbd_cmd_type), 1, stream) != 1)
+ if(write(stream, &cmd, sizeof(tbd_cmd_type)) != sizeof(tbd_cmd_type))
return TBD_ERROR(TBD_ERROR_UNABLE_TO_WRITE_STREAM);
return 0;
}
static int
-tbd_create_write_string(FILE *stream,
+tbd_create_write_string(int stream,
const char *string)
{
uint16_t slen = strlen(string);
- if((tbd_write_uint16(slen, stream) != 1)
- || (fwrite(string, 1, slen, stream) != slen))
+ if((!tbd_write_uint16(slen, stream))
+ || (write(stream, string, slen) != slen))
return TBD_ERROR(TBD_ERROR_UNABLE_TO_WRITE_STREAM);
return 0;
}
static int
-tbd_create_write_block(FILE *stream,
+tbd_create_write_block(int stream,
void const *data,
size_t size)
{
- if (fwrite(&size, 1, sizeof(size), stream) != sizeof(size)) {
+ if (write(stream, &size, sizeof(size)) != sizeof(size)) {
return TBD_ERROR(TBD_ERROR_UNABLE_TO_WRITE_STREAM);
}
- if (fwrite(data, 1, size, stream) != size) {
+ if (write(stream, data, size) != size) {
return TBD_ERROR(TBD_ERROR_UNABLE_TO_WRITE_STREAM);
}
return TBD_ERROR_SUCCESS;
}
static int
-tbd_create_write_mdata_mask(FILE *stream,
+tbd_create_write_mdata_mask(int stream,
uint16_t mask)
{
- if(tbd_write_uint16(mask, stream) != 1)
+ if(!tbd_write_uint16(mask, stream))
return TBD_ERROR(TBD_ERROR_UNABLE_TO_WRITE_STREAM);
return 0;
}
static int
-tbd_create_write_mtime(FILE *stream,
+tbd_create_write_mtime(int stream,
time_t mtime)
{
- if(tbd_write_time(mtime, stream) != 1)
+ if(!tbd_write_time(mtime, stream))
return TBD_ERROR(TBD_ERROR_UNABLE_TO_WRITE_STREAM);
return 0;
}
static int
-tbd_create_write_mode(FILE *stream,
+tbd_create_write_mode(int stream,
mode_t mode)
{
- if(tbd_write_mode(mode, stream) != 1)
+ if(!tbd_write_mode(mode, stream))
return TBD_ERROR(TBD_ERROR_UNABLE_TO_WRITE_STREAM);
return 0;
}
static int
-tbd_create_write_gid(FILE *stream,
+tbd_create_write_gid(int stream,
gid_t gid)
{
- if(tbd_write_gid(gid, stream) != 1)
+ if(!tbd_write_gid(gid, stream))
return TBD_ERROR(TBD_ERROR_UNABLE_TO_WRITE_STREAM);
return 0;
}
static int
-tbd_create_write_uid(FILE *stream,
+tbd_create_write_uid(int stream,
uid_t uid)
{
- if(tbd_write_uid(uid, stream) != 1)
+ if(!tbd_write_uid(uid, stream))
return TBD_ERROR(TBD_ERROR_UNABLE_TO_WRITE_STREAM);
return 0;
}
static int
-tbd_create_write_dev(FILE *stream,
+tbd_create_write_dev(int stream,
uint32_t dev)
{
- if(tbd_write_uint32(dev, stream) != 1)
+ if(!tbd_write_uint32(dev, stream))
return TBD_ERROR(TBD_ERROR_UNABLE_TO_WRITE_STREAM);
return 0;
}
static int
-tbd_create_cmd_ident(FILE *stream)
+tbd_create_cmd_ident(int stream)
{
int err;
@@ -134,7 +134,7 @@ tbd_create_cmd_ident(FILE *stream)
}
static int
-tbd_create_cmd_update(FILE *stream)
+tbd_create_cmd_update(int stream)
{
return tbd_create_write_cmd(stream, TBD_CMD_UPDATE);
}
@@ -146,9 +146,10 @@ static int
tbd_create_cmd_write_xattr_pair(char const *name,
void const *data,
size_t size,
- void *stream)
+ void *ud)
{
int err;
+ int stream = *((int *)ud);
if ((err = tbd_create_write_string(stream, name)) !=
TBD_ERROR_SUCCESS)
@@ -162,7 +163,7 @@ tbd_create_cmd_write_xattr_pair(char const *name,
}
static int
-tbd_create_cmd_write_xattrs(FILE *stream, struct tbd_stat *f)
+tbd_create_cmd_write_xattrs(int stream, struct tbd_stat *f)
{
int err = TBD_ERROR_SUCCESS;
struct tbd_xattrs_names names;
@@ -199,7 +200,7 @@ tbd_create_cmd_write_xattrs(FILE *stream, struct tbd_stat *f)
goto cleanup_names;
}
- if (tbd_write_uint32(count, stream) != 1) {
+ if (!tbd_write_uint32(count, stream)) {
err = TBD_ERROR(TBD_ERROR_UNABLE_TO_WRITE_STREAM);
goto cleanup_names;
}
@@ -209,7 +210,7 @@ tbd_create_cmd_write_xattrs(FILE *stream, struct tbd_stat *f)
err = tbd_xattrs_pairs(&names,
path,
tbd_create_cmd_write_xattr_pair,
- stream);
+ &stream);
cleanup_names:
tbd_xattrs_names_free(&names);
@@ -219,7 +220,7 @@ cleanup_path:
}
static int
-tbd_create_cmd_file_create(FILE *stream,
+tbd_create_cmd_file_create(int stream,
struct tbd_stat *f)
{
int err;
@@ -232,7 +233,7 @@ tbd_create_cmd_file_create(FILE *stream,
return err;
uint32_t size = f->size;
- if(tbd_write_uint32(size, stream) != 1)
+ if(!tbd_write_uint32(size, stream))
return TBD_ERROR(TBD_ERROR_UNABLE_TO_WRITE_STREAM);
FILE *fp = tbd_stat_fopen(f, "rb");
@@ -243,7 +244,7 @@ tbd_create_cmd_file_create(FILE *stream,
uintptr_t b = 256;
for(b = 256; b == 256; ) {
b = fread(buff, 1, b, fp);
- if(fwrite(buff, 1, b, stream) != b) {
+ if(write(stream, buff, b) != b) {
fclose(fp);
return TBD_ERROR(TBD_ERROR_UNABLE_TO_WRITE_STREAM);
}
@@ -273,7 +274,7 @@ tbd_metadata_mask(struct tbd_stat *a,
}
static int
-tbd_create_cmd_file_metadata_update(FILE *stream,
+tbd_create_cmd_file_metadata_update(int stream,
struct tbd_stat *a,
struct tbd_stat *b)
{
@@ -295,7 +296,7 @@ tbd_create_cmd_file_metadata_update(FILE *stream,
}
static int
-tbd_create_cmd_file_delta(FILE *stream,
+tbd_create_cmd_file_delta(int stream,
struct tbd_stat *a,
struct tbd_stat *b)
{
@@ -413,10 +414,11 @@ tbd_create_cmd_file_delta(FILE *stream,
fclose(fpb);
return err;
}
- if((tbd_write_uint32(start, stream) != 1) ||
- (tbd_write_uint32(end, stream) != 1) ||
- (tbd_write_uint32(size, stream) != 1)) {
- fclose(fpb);
+
+ if((!tbd_write_uint32(start, stream)) ||
+ (!tbd_write_uint32(end , stream)) ||
+ (!tbd_write_uint32(size , stream))) {
+ close(fdb);
return TBD_ERROR(TBD_ERROR_UNABLE_TO_WRITE_STREAM);
}
if(fseek(fpb, start, SEEK_SET) != 0) {
@@ -430,7 +432,7 @@ tbd_create_cmd_file_delta(FILE *stream,
fclose(fpb);
return TBD_ERROR(TBD_ERROR_UNABLE_TO_READ_STREAM);
}
- if(fwrite(buff[0], 1, csize, stream) != csize) {
+ if(write(stream, buff[0], csize) != csize) {
fclose(fpb);
return TBD_ERROR(TBD_ERROR_UNABLE_TO_WRITE_STREAM);
}
@@ -441,7 +443,7 @@ tbd_create_cmd_file_delta(FILE *stream,
}
static int
-tbd_create_cmd_dir_create(FILE *stream,
+tbd_create_cmd_dir_create(int stream,
struct tbd_stat *d)
{
int err;
@@ -457,7 +459,7 @@ tbd_create_cmd_dir_create(FILE *stream,
}
static int
-tbd_create_cmd_dir_enter(FILE *stream,
+tbd_create_cmd_dir_enter(int stream,
const char *name)
{
int err;
@@ -467,7 +469,7 @@ tbd_create_cmd_dir_enter(FILE *stream,
}
static int
-tbd_create_cmd_dir_leave(FILE *stream,
+tbd_create_cmd_dir_leave(int stream,
struct tbd_stat *dir)
{
int err;
@@ -480,7 +482,7 @@ tbd_create_cmd_dir_leave(FILE *stream,
}
static int
-tbd_create_cmd_entity_delete(FILE *stream,
+tbd_create_cmd_entity_delete(int stream,
const char *name)
{
int err;
@@ -490,7 +492,7 @@ tbd_create_cmd_entity_delete(FILE *stream,
}
static int
-tbd_create_cmd_dir_delta(FILE *stream,
+tbd_create_cmd_dir_delta(int stream,
struct tbd_stat *a,
struct tbd_stat *b)
{
@@ -512,7 +514,7 @@ tbd_create_cmd_dir_delta(FILE *stream,
}
static int
-tbd_create_cmd_symlink_create(FILE *stream,
+tbd_create_cmd_symlink_create(int stream,
struct tbd_stat *symlink)
{
int err;
@@ -536,7 +538,7 @@ tbd_create_cmd_symlink_create(FILE *stream,
}
static int
-tbd_create_cmd_symlink_delta(FILE *stream,
+tbd_create_cmd_symlink_delta(int stream,
struct tbd_stat *a,
struct tbd_stat *b)
{
@@ -574,7 +576,7 @@ tbd_create_cmd_symlink_delta(FILE *stream,
}
static int
-tbd_create_cmd_special_create(FILE *stream,
+tbd_create_cmd_special_create(int stream,
struct tbd_stat *nod)
{
int err;
@@ -590,7 +592,7 @@ tbd_create_cmd_special_create(FILE *stream,
}
static int
-tbd_create_cmd_special_delta(FILE *stream,
+tbd_create_cmd_special_delta(int stream,
struct tbd_stat *a,
struct tbd_stat *b)
{
@@ -610,7 +612,7 @@ tbd_create_cmd_special_delta(FILE *stream,
}
static int
-tbd_create_cmd_socket_create(FILE *stream,
+tbd_create_cmd_socket_create(int stream,
struct tbd_stat *nod)
{
(void)stream;
@@ -619,7 +621,7 @@ tbd_create_cmd_socket_create(FILE *stream,
}
static int
-tbd_create_cmd_socket_delta(FILE *stream,
+tbd_create_cmd_socket_delta(int stream,
struct tbd_stat *a,
struct tbd_stat *b)
{
@@ -630,7 +632,7 @@ tbd_create_cmd_socket_delta(FILE *stream,
}
static int
-tbd_create_dir(FILE *stream,
+tbd_create_dir(int stream,
struct tbd_stat *d)
{
int err;
@@ -675,7 +677,7 @@ tbd_create_dir(FILE *stream,
}
static int
-tbd_create_impl(FILE *stream,
+tbd_create_impl(int stream,
struct tbd_stat *a,
struct tbd_stat *b,
bool top)
@@ -786,12 +788,12 @@ tbd_create_impl(FILE *stream,
}
int
-tbd_create(FILE *stream,
+tbd_create(int stream,
struct tbd_stat *a,
struct tbd_stat *b)
{
int err;
- if((stream == NULL) || (a == NULL) || (b == NULL))
+ if((stream < 0) || (a == NULL) || (b == NULL))
return TBD_ERROR(TBD_ERROR_NULL_POINTER);
if((err = tbd_create_cmd_ident(stream)) != 0 ||
diff --git a/tbdiff/tbdiff-io.c b/tbdiff/tbdiff-io.c
index f9324aa..54bcfa7 100644
--- a/tbdiff/tbdiff-io.c
+++ b/tbdiff/tbdiff-io.c
@@ -15,6 +15,7 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
+#include <stdbool.h>
#include <endian.h>
#include <unistd.h>
#include <assert.h>
@@ -52,42 +53,43 @@ static inline void endianswap(void* value, size_t size)
#define ENDIANSWAP(v)
#endif
-size_t tbd_write_uint16(uint16_t value, FILE *stream) {
+bool tbd_write_uint16(uint16_t value, int stream) {
ENDIANSWAP(&value);
- return fwrite(&value, sizeof(value), 1, stream);
+ return (write(stream, &value, sizeof(value)) == sizeof(value));
}
-size_t tbd_write_uint32(uint32_t value, FILE *stream) {
+bool tbd_write_uint32(uint32_t value, int stream) {
ENDIANSWAP(&value);
- return fwrite(&value, sizeof(value), 1, stream);
+ return (write(stream, &value, sizeof(value)) == sizeof(value));
}
-size_t tbd_write_uint64(uint64_t value, FILE *stream) {
+bool tbd_write_uint64(uint64_t value, int stream) {
ENDIANSWAP(&value);
- return fwrite(&value, sizeof(value), 1, stream);
+ return (write(stream, &value, sizeof(value)) == sizeof(value));
}
-size_t tbd_write_time(time_t value, FILE *stream) {
+bool tbd_write_time(time_t value, int stream) {
uint64_t realv = value;
ENDIANSWAP(&realv);
- return fwrite(&realv, sizeof(realv), 1, stream);
+ return (write(stream, &realv, sizeof(realv)) == sizeof(value));
}
-size_t tbd_write_mode(mode_t value, FILE *stream) {
+bool tbd_write_mode(mode_t value, int stream) {
ENDIANSWAP(&value);
- return fwrite(&value, sizeof(value), 1, stream);
+ return (write(stream, &value, sizeof(value)) == sizeof(value));
}
-size_t tbd_write_uid(uid_t value, FILE *stream) {
+bool tbd_write_uid(uid_t value, int stream) {
ENDIANSWAP(&value);
- return fwrite(&value, sizeof(value), 1, stream);
+ return (write(stream, &value, sizeof(value)) == sizeof(value));
}
-size_t tbd_write_gid(gid_t value, FILE *stream) {
+bool tbd_write_gid(gid_t value, int stream) {
ENDIANSWAP(&value);
- return fwrite(&value, sizeof(value), 1, stream);
+ return (write(stream, &value, sizeof(value)) == sizeof(value));
}
+
size_t tbd_read_uint16(uint16_t *value, FILE *stream) {
assert(value != NULL);
size_t rval = fread(value, sizeof(*value), 1, stream);
diff --git a/tbdiff/tbdiff-io.h b/tbdiff/tbdiff-io.h
index dc18475..3bb93c6 100644
--- a/tbdiff/tbdiff-io.h
+++ b/tbdiff/tbdiff-io.h
@@ -22,19 +22,20 @@
#ifndef __TBDIFF_IO_H__
#define __TBDIFF_IO_H__
+#include <stdbool.h>
#include <endian.h>
#include <unistd.h>
#include <assert.h>
#include <tbdiff/tbdiff-stat.h>
-size_t tbd_write_uint16(uint16_t value, FILE* stream);
-size_t tbd_write_uint32(uint32_t value, FILE* stream);
-size_t tbd_write_uint64(uint64_t value, FILE* stream);
-size_t tbd_write_time(time_t value, FILE* stream);
-size_t tbd_write_mode(mode_t value, FILE* stream);
-size_t tbd_write_uid(uid_t value, FILE* stream);
-size_t tbd_write_gid(gid_t value, FILE* stream);
+bool tbd_write_uint16(uint16_t value, int stream);
+bool tbd_write_uint32(uint32_t value, int stream);
+bool tbd_write_uint64(uint64_t value, int stream);
+bool tbd_write_time (time_t value, int stream);
+bool tbd_write_mode (mode_t value, int stream);
+bool tbd_write_uid (uid_t value, int stream);
+bool tbd_write_gid (gid_t value, int stream);
size_t tbd_read_uint16(uint16_t *value, FILE* stream);
size_t tbd_read_uint32(uint32_t *value, FILE* stream);