summaryrefslogtreecommitdiff
path: root/libstore/create.c
diff options
context:
space:
mode:
Diffstat (limited to 'libstore/create.c')
-rw-r--r--libstore/create.c53
1 files changed, 17 insertions, 36 deletions
diff --git a/libstore/create.c b/libstore/create.c
index 6c09e177..89e6c221 100644
--- a/libstore/create.c
+++ b/libstore/create.c
@@ -30,47 +30,28 @@
error_t store_create (file_t source, struct store **store)
{
error_t err;
- mach_port_t port;
- string_t name_buf;
- char *misc;
- mach_msg_type_number_t misc_len = 0;
- off_t *runs;
- mach_msg_type_number_t runs_len = 0;
- int flags;
- size_t block_size;
- int class;
-
- err = file_get_storage_info (source, &class, &runs, &runs_len, &block_size,
- name_buf, &port, &misc, &misc_len, &flags);
+ struct store_enc enc;
+ mach_port_t inline_ports[10]
+ int inline_ints[60];
+ off_t inline_offsets[60];
+ char inline_data[100];
+
+ store_enc_init (&enc, inline_ports, 10, inline_ints, 60,
+ inline_offsets, 60, inline_data, 100);
+
+ err = file_get_storage_info (source,
+ &enc->ports, &enc->ports_len,
+ &enc->ints, &enc->ints_len,
+ &enc->offsets, &enc->offsets_len,
+ &enc->data, &enc->data_len);
if (err)
return err;
- if (misc_len > 0)
- vm_deallocate (mach_task_self (), (vm_address_t)misc, misc_len);
-
- switch (class)
- {
- case STORAGE_DEVICE:
- err = _store_device_create (port, block_size, runs, runs_len, store);
- break;
- case STORAGE_HURD_FILE:
- err = _store_file_create (port, block_size, runs, runs_len, store);
- break;
- default:
- err = EINVAL;
- }
-
- if (!err && *name_buf)
- /* Copy out of our stack buffer NAME_BUF. */
- store_set_name (*store, name_buf);
+ err = store_decode (&enc, store);
- if (runs_len > 0)
- /* RUNS is copied into malloced storage above. */
- vm_deallocate (mach_task_self (), (vm_address_t)runs, runs_len);
+ store_enc_dealloc (&enc);
- if (err)
- mach_port_deallocate (mach_task_self (), port);
- else
+ if (! err)
/* Keep a reference to SOURCE around. */
{
mach_port_mod_refs (mach_task_self (), source, MACH_PORT_RIGHT_SEND, 1);