diff options
Diffstat (limited to 'libstore/create.c')
-rw-r--r-- | libstore/create.c | 53 |
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); |