summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiles Bader <miles@gnu.org>1996-05-22 00:08:04 +0000
committerMiles Bader <miles@gnu.org>1996-05-22 00:08:04 +0000
commit6a166c06f9b38c4cddaccdafe96540511d226e87 (patch)
treed29fe0a99b0c539febeb53451cfd23d714ab22b4
parentcafe54ffad1b3381cf911234c6037594ab78aaad (diff)
(store_file_open, file_decode): New functions.
(store_file_create): Always set STORE_ENFORCED. (file_class): Renamed from file_meths. Add more fields. Make std with _STORE_STD_CLASS. (file_byte_class): Renamed from file_byte_meths. (store_file_create, _store_file_create): CLASS param removed, METHS param renamed CLASS; all callers changed. FLAGS param added. <fcntl.h>, <hurd.h>: New includes.
-rw-r--r--libstore/file.c55
1 files changed, 44 insertions, 11 deletions
diff --git a/libstore/file.c b/libstore/file.c
index 44e34c7b..44cb7b9d 100644
--- a/libstore/file.c
+++ b/libstore/file.c
@@ -22,6 +22,8 @@
#include <stdio.h>
#include <string.h>
+#include <fcntl.h>
+#include <hurd.h>
#include <hurd/io.h>
@@ -63,9 +65,21 @@ file_write (struct store *store,
return io_write (store->port, buf, len, addr * bsize, amount);
}
-static struct store_meths
-file_meths = {file_read, file_write};
+static error_t
+file_decode (struct store_enc *enc, struct store_class *classes,
+ struct store **store)
+{
+ return store_std_leaf_decode (enc, _store_file_create, store);
+}
+static struct store_class
+file_class =
+{
+ STORAGE_HURD_FILE, "file", file_read, file_write,
+ store_std_leaf_allocate_encoding, store_std_leaf_encode, file_decode
+};
+_STORE_STD_CLASS (file_class);
+
static error_t
file_byte_read (struct store *store,
off_t addr, size_t index, mach_msg_type_number_t amount,
@@ -101,13 +115,13 @@ file_byte_write (struct store *store,
return io_write (store->port, buf, len, addr, amount);
}
-static struct store_meths
-file_byte_meths = {file_byte_read, file_byte_write};
+static struct store_class
+file_byte_class = {STORAGE_HURD_FILE, "file", file_byte_read, file_byte_write};
/* Return a new store in STORE referring to the mach file FILE. Consumes
the send right FILE. */
error_t
-store_file_create (file_t file, struct store **store)
+store_file_create (file_t file, int flags, struct store **store)
{
struct store_run run;
struct stat stat;
@@ -119,22 +133,41 @@ store_file_create (file_t file, struct store **store)
run.start = 0;
run.length = stat.st_size;
- return _store_file_create (file, 1, &run, 1, store);
+ flags |= STORE_ENFORCED; /* 'cause it's the whole file. */
+
+ return _store_file_create (file, flags, 1, &run, 1, store);
}
/* Like store_file_create, but doesn't query the file for information. */
error_t
-_store_file_create (file_t file, size_t block_size,
+_store_file_create (file_t file, int flags, size_t block_size,
const struct store_run *runs, size_t num_runs,
struct store **store)
{
if (block_size == 1)
- *store = _make_store (STORAGE_HURD_FILE, &file_byte_meths, file, 1,
- runs, num_runs, 0);
+ *store = _make_store (&file_byte_class, file, flags, 1, runs, num_runs, 0);
else if ((block_size & (block_size - 1)) == 0)
- *store = _make_store (STORAGE_HURD_FILE, &file_meths, file, block_size,
- runs, num_runs, 0);
+ *store =
+ _make_store (&file_class, file, flags, block_size, runs, num_runs, 0);
else
return EINVAL; /* block size not a power of two */
return *store ? 0 : ENOMEM;
}
+
+/* Open the file NAME, and return the corresponding store in STORE. */
+error_t
+store_file_open (const char *name, int flags, struct store **store)
+{
+ error_t err;
+ int open_flags = (flags & STORE_HARD_READONLY) ? O_RDONLY : O_RDWR;
+ file_t node = file_name_lookup (name, open_flags, 0);
+
+ if (node == MACH_PORT_NULL)
+ return errno;
+
+ err = store_file_create (node, flags, store);
+ if (err)
+ mach_port_deallocate (mach_task_self (), node);
+
+ return err;
+}