diff options
Diffstat (limited to 'extension/rwarray.c')
-rw-r--r-- | extension/rwarray.c | 103 |
1 files changed, 52 insertions, 51 deletions
diff --git a/extension/rwarray.c b/extension/rwarray.c index 75c735a4..e45a499e 100644 --- a/extension/rwarray.c +++ b/extension/rwarray.c @@ -55,13 +55,13 @@ static awk_bool_t (*init_func)(void) = NULL; int plugin_is_GPL_compatible; -static awk_bool_t write_array(int fd, awk_array_t array); -static awk_bool_t write_elem(int fd, awk_element_t *element); -static awk_bool_t write_value(int fd, awk_value_t *val); +static awk_bool_t write_array(FILE *fp, awk_array_t array); +static awk_bool_t write_elem(FILE *fp, awk_element_t *element); +static awk_bool_t write_value(FILE *fp, awk_value_t *val); -static awk_bool_t read_array(int fd, awk_array_t array); -static awk_bool_t read_elem(int fd, awk_element_t *element); -static awk_bool_t read_value(int fd, awk_value_t *value); +static awk_bool_t read_array(FILE *fp, awk_array_t array); +static awk_bool_t read_elem(FILE *fp, awk_element_t *element); +static awk_bool_t read_value(FILE *fp, awk_value_t *value); /* * Format of array info: @@ -93,7 +93,7 @@ static awk_value_t * do_writea(int nargs, awk_value_t *result) { awk_value_t filename, array; - int fd = -1; + FILE *fp; uint32_t major = MAJOR; uint32_t minor = MINOR; @@ -120,22 +120,22 @@ do_writea(int nargs, awk_value_t *result) } /* open the file, if error, set ERRNO and return */ - fd = creat(filename.str_value.str, 0600); - if (fd < 0) + fp = fopen(filename.str_value.str, "wb"); + if (fp == NULL) goto done1; - if (write(fd, MAGIC, strlen(MAGIC)) != strlen(MAGIC)) + if (fwrite(MAGIC, 1, strlen(MAGIC), fp) != strlen(MAGIC)) goto done1; major = htonl(major); - if (write(fd, & major, sizeof(major)) != sizeof(major)) + if (fwrite(& major, 1, sizeof(major), fp) != sizeof(major)) goto done1; minor = htonl(minor); - if (write(fd, & minor, sizeof(minor)) != sizeof(minor)) + if (fwrite(& minor, 1, sizeof(minor), fp) != sizeof(minor)) goto done1; - if (write_array(fd, array.array_cookie)) { + if (write_array(fp, array.array_cookie)) { make_number(1.0, result); goto done0; } @@ -145,7 +145,7 @@ done1: unlink(filename.str_value.str); done0: - close(fd); + fclose(fp); out: return result; } @@ -154,7 +154,7 @@ out: /* write_array --- write out an array or a sub-array */ static awk_bool_t -write_array(int fd, awk_array_t array) +write_array(FILE *fp, awk_array_t array) { uint32_t i; uint32_t count; @@ -166,11 +166,11 @@ write_array(int fd, awk_array_t array) } count = htonl(flat_array->count); - if (write(fd, & count, sizeof(count)) != sizeof(count)) + if (fwrite(& count, 1, sizeof(count), fp) != sizeof(count)) return 0; for (i = 0; i < flat_array->count; i++) { - if (! write_elem(fd, & flat_array->elements[i])) + if (! write_elem(fp, & flat_array->elements[i])) return 0; } @@ -185,56 +185,56 @@ write_array(int fd, awk_array_t array) /* write_elem --- write out a single element */ static awk_bool_t -write_elem(int fd, awk_element_t *element) +write_elem(FILE *fp, awk_element_t *element) { uint32_t indexval_len; ssize_t write_count; indexval_len = htonl(element->index.str_value.len); - if (write(fd, & indexval_len, sizeof(indexval_len)) != sizeof(indexval_len)) + if (fwrite(& indexval_len, 1, sizeof(indexval_len), fp) != sizeof(indexval_len)) return 0; if (element->index.str_value.len > 0) { - write_count = write(fd, element->index.str_value.str, - element->index.str_value.len); + write_count = fwrite(element->index.str_value.str, + 1, element->index.str_value.len, fp); if (write_count != (ssize_t) element->index.str_value.len) return 0; } - return write_value(fd, & element->value); + return write_value(fp, & element->value); } /* write_value --- write a number or a string or a array */ static int -write_value(int fd, awk_value_t *val) +write_value(FILE *fp, awk_value_t *val) { uint32_t code, len; if (val->val_type == AWK_ARRAY) { code = htonl(2); - if (write(fd, & code, sizeof(code)) != sizeof(code)) + if (fwrite(& code, 1, sizeof(code), fp) != sizeof(code)) return 0; - return write_array(fd, val->array_cookie); + return write_array(fp, val->array_cookie); } if (val->val_type == AWK_NUMBER) { code = htonl(1); - if (write(fd, & code, sizeof(code)) != sizeof(code)) + if (fwrite(& code, 1, sizeof(code), fp) != sizeof(code)) return 0; - if (write(fd, & val->num_value, sizeof(val->num_value)) != sizeof(val->num_value)) + if (fwrite(& val->num_value, 1, sizeof(val->num_value), fp) != sizeof(val->num_value)) return 0; } else { code = 0; - if (write(fd, & code, sizeof(code)) != sizeof(code)) + if (fwrite(& code, 1, sizeof(code), fp) != sizeof(code)) return 0; len = htonl(val->str_value.len); - if (write(fd, & len, sizeof(len)) != sizeof(len)) + if (fwrite(& len, 1, sizeof(len), fp) != sizeof(len)) return 0; - if (write(fd, val->str_value.str, val->str_value.len) + if (fwrite(val->str_value.str, 1, val->str_value.len, fp) != (ssize_t) val->str_value.len) return 0; } @@ -248,7 +248,7 @@ static awk_value_t * do_reada(int nargs, awk_value_t *result) { awk_value_t filename, array; - int fd = -1; + FILE *fp = NULL; uint32_t major; uint32_t minor; char magic_buf[30]; @@ -275,12 +275,12 @@ do_reada(int nargs, awk_value_t *result) goto done1; } - fd = open(filename.str_value.str, O_RDONLY); - if (fd < 0) + fp = fopen(filename.str_value.str, "rb"); + if (fp == NULL) goto done1; memset(magic_buf, '\0', sizeof(magic_buf)); - if (read(fd, magic_buf, strlen(MAGIC)) != strlen(MAGIC)) { + if (fread(magic_buf, 1, strlen(MAGIC), fp) != strlen(MAGIC)) { errno = EBADF; goto done1; } @@ -290,7 +290,7 @@ do_reada(int nargs, awk_value_t *result) goto done1; } - if (read(fd, & major, sizeof(major)) != sizeof(major)) { + if (fread(& major, 1, sizeof(major), fp) != sizeof(major)) { errno = EBADF; goto done1; } @@ -301,7 +301,7 @@ do_reada(int nargs, awk_value_t *result) goto done1; } - if (read(fd, & minor, sizeof(minor)) != sizeof(minor)) { + if (fread(& minor, 1, sizeof(minor), fp) != sizeof(minor)) { /* read() sets errno */ goto done1; } @@ -318,7 +318,7 @@ do_reada(int nargs, awk_value_t *result) goto done1; } - if (read_array(fd, array.array_cookie)) { + if (read_array(fp, array.array_cookie)) { make_number(1.0, result); goto done0; } @@ -326,7 +326,8 @@ do_reada(int nargs, awk_value_t *result) done1: update_ERRNO_int(errno); done0: - close(fd); + if (fp != NULL) + fclose(fp); out: return result; } @@ -335,19 +336,19 @@ out: /* read_array --- read in an array or sub-array */ static awk_bool_t -read_array(int fd, awk_array_t array) +read_array(FILE *fp, awk_array_t array) { uint32_t i; uint32_t count; awk_element_t new_elem; - if (read(fd, & count, sizeof(count)) != sizeof(count)) { + if (fread(& count, 1, sizeof(count), fp) != sizeof(count)) { return 0; } count = ntohl(count); for (i = 0; i < count; i++) { - if (read_elem(fd, & new_elem)) { + if (read_elem(fp, & new_elem)) { /* add to array */ if (! set_array_element_by_elem(array, & new_elem)) { fprintf(stderr, _("read_array: set_array_element failed\n")); @@ -366,14 +367,14 @@ read_array(int fd, awk_array_t array) /* read_elem --- read in a single element */ static awk_bool_t -read_elem(int fd, awk_element_t *element) +read_elem(FILE *fp, awk_element_t *element) { uint32_t index_len; static char *buffer; static uint32_t buflen; ssize_t ret; - if ((ret = read(fd, & index_len, sizeof(index_len))) != sizeof(index_len)) { + if ((ret = fread(& index_len, 1, sizeof(index_len), fp)) != sizeof(index_len)) { return 0; } index_len = ntohl(index_len); @@ -396,7 +397,7 @@ read_elem(int fd, awk_element_t *element) buflen = index_len; } - if (read(fd, buffer, index_len) != (ssize_t) index_len) { + if (fread(buffer, 1, index_len, fp) != (ssize_t) index_len) { return 0; } make_const_string(buffer, index_len, & element->index); @@ -404,7 +405,7 @@ read_elem(int fd, awk_element_t *element) make_null_string(& element->index); } - if (! read_value(fd, & element->value)) + if (! read_value(fp, & element->value)) return 0; return 1; @@ -413,11 +414,11 @@ read_elem(int fd, awk_element_t *element) /* read_value --- read a number or a string */ static awk_bool_t -read_value(int fd, awk_value_t *value) +read_value(FILE *fp, awk_value_t *value) { uint32_t code, len; - if (read(fd, & code, sizeof(code)) != sizeof(code)) + if (fread(& code, 1, sizeof(code), fp) != sizeof(code)) return 0; code = ntohl(code); @@ -425,7 +426,7 @@ read_value(int fd, awk_value_t *value) if (code == 2) { awk_array_t array = create_array(); - if (read_array(fd, array) != 0) + if (read_array(fp, array) != 0) return 0; /* hook into value */ @@ -434,14 +435,14 @@ read_value(int fd, awk_value_t *value) } else if (code == 1) { double d; - if (read(fd, & d, sizeof(d)) != sizeof(d)) + if (fread(& d, 1, sizeof(d), fp) != sizeof(d)) return 0; /* hook into value */ value->val_type = AWK_NUMBER; value->num_value = d; } else { - if (read(fd, & len, sizeof(len)) != sizeof(len)) { + if (fread(& len, 1, sizeof(len), fp) != sizeof(len)) { return 0; } len = ntohl(len); @@ -450,7 +451,7 @@ read_value(int fd, awk_value_t *value) value->str_value.str = malloc(len + 2); memset(value->str_value.str, '\0', len + 2); - if (read(fd, value->str_value.str, len) != (ssize_t) len) { + if (fread(value->str_value.str, 1, len, fp) != (ssize_t) len) { free(value->str_value.str); return 0; } |