aboutsummaryrefslogtreecommitdiff
path: root/libstore/create.c
diff options
context:
space:
mode:
Diffstat (limited to 'libstore/create.c')
-rw-r--r--libstore/create.c41
1 files changed, 27 insertions, 14 deletions
diff --git a/libstore/create.c b/libstore/create.c
index e332e85c..010a053e 100644
--- a/libstore/create.c
+++ b/libstore/create.c
@@ -1,9 +1,7 @@
/* Store creation
- Copyright (C) 1995, 1996 Free Software Foundation, Inc.
-
- Written by Miles Bader <miles@gnu.ai.mit.edu>
-
+ Copyright (C) 1995,96,97,2001 Free Software Foundation, Inc.
+ Written by Miles Bader <miles@gnu.org>
This file is part of the GNU Hurd.
The GNU Hurd is free software; you can redistribute it and/or
@@ -18,19 +16,23 @@
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. */
#include <hurd/fs.h>
#include "store.h"
-/* Return a new store in STORE, which refers to the storage underlying
- SOURCE. CLASSES is used to select classes specified by the provider; if
- it is 0, STORE_STD_CLASSES is used. FLAGS is set with store_set_flags. A
- reference to SOURCE is created (but may be destroyed with
- store_close_source). */
+/* Return a new store in STORE, which refers to the storage underlying SOURCE.
+ CLASSES is used to select classes specified by the provider; if it is 0,
+ STORE_STD_CLASSES is used. FLAGS is set with store_set_flags, with the
+ exception of STORE_INACTIVE, which merely indicates that no attempt should
+ be made to activate an inactive store; if STORE_INACTIVE is not specified,
+ and the store returned for SOURCE is inactive, an attempt is made to
+ activate it (failure of which causes an error to be returned). A reference
+ to SOURCE is created (but may be destroyed with store_close_source). */
error_t
-store_create (file_t source, int flags, struct store_class *classes,
+store_create (file_t source, int flags,
+ const struct store_class *const *classes,
struct store **store)
{
error_t err;
@@ -52,9 +54,20 @@ store_create (file_t source, int flags, struct store_class *classes,
return err;
err = store_decode (&enc, classes, store);
-
- if (!err && flags)
- store_set_flags (*store, flags);
+ if (! err)
+ {
+ if (flags & STORE_INACTIVE)
+ flags &= ~STORE_INACTIVE; /* Don't actually make store inactive. */
+ else if ((*store)->flags & STORE_INACTIVE)
+ err = store_clear_flags (*store, STORE_INACTIVE);
+ if (!err && flags)
+ err = store_set_flags (*store, flags);
+ if (err)
+ store_free (*store);
+ }
+ else if (err == EINVAL && (flags &~ STORE_INACTIVE) == STORE_NO_FILEIO)
+ /* Open a generic "unknown" store that can regurgitate this encoding. */
+ err = store_unknown_decode (&enc, classes, store);
store_enc_dealloc (&enc);