summaryrefslogtreecommitdiff
path: root/libstore
diff options
context:
space:
mode:
authorMiles Bader <miles@gnu.org>1996-03-22 01:09:23 +0000
committerMiles Bader <miles@gnu.org>1996-03-22 01:09:23 +0000
commitca870026d30398b8a916dfff7759f7ccb71e0be6 (patch)
tree52cbf73f6534a5447ecb50c4cc23c897a7e6d16a /libstore
parent3e3c0752ad06c38a71b248c9af6886cf065f13e9 (diff)
Formerly create.c.~4~
Diffstat (limited to 'libstore')
-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);