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