1/* gdbmsetopt.c - set options pertaining to a GDBM descriptor. */
2
3/*  This file is part of GDBM, the GNU data base manager, by Philip A. Nelson.
4    Copyright (C) 1993, 1994  Free Software Foundation, Inc.
5
6    GDBM is free software; you can redistribute it and/or modify
7    it under the terms of the GNU General Public License as published by
8    the Free Software Foundation; either version 2, or (at your option)
9    any later version.
10
11    GDBM is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14    GNU General Public License for more details.
15
16    You should have received a copy of the GNU General Public License
17    along with GDBM; see the file COPYING.  If not, write to
18    the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
19
20    You may contact the original author by:
21       e-mail:  phil@cs.wwu.edu
22      us-mail:  Philip A. Nelson
23                Computer Science Department
24                Western Washington University
25                Bellingham, WA 98226
26
27    The author of this file is:
28       e-mail:  downsj@downsj.com
29
30*************************************************************************/
31
32
33/* include system configuration before all else. */
34#include "autoconf.h"
35
36#include "gdbmdefs.h"
37#include "gdbmerrno.h"
38
39/* operate on an already open descriptor. */
40
41/* ARGSUSED */
42int
43gdbm_setopt(dbf, optflag, optval, optlen)
44    gdbm_file_info *dbf;	/* descriptor to operate on. */
45    int optflag;		/* option to set. */
46    int *optval;		/* pointer to option value. */
47    int optlen;			/* size of optval. */
48{
49  switch(optflag)
50    {
51      case GDBM_CACHESIZE:
52        /* Optval will point to the new size of the cache. */
53        if (dbf->bucket_cache != NULL)
54          {
55            gdbm_errno = GDBM_OPT_ALREADY_SET;
56            return(-1);
57          }
58
59        return(_gdbm_init_cache(dbf, ((*optval) > 9) ? (*optval) : 10));
60
61      case GDBM_FASTMODE:
62      	/* Obsolete form of SYNCMODE. */
63	if ((*optval != TRUE) && (*optval != FALSE))
64	  {
65	    gdbm_errno = GDBM_OPT_ILLEGAL;
66	    return(-1);
67	  }
68
69	dbf->fast_write = *optval;
70	break;
71
72      case GDBM_SYNCMODE:
73      	/* Optval will point to either true or false. */
74	if ((*optval != TRUE) && (*optval != FALSE))
75	  {
76	    gdbm_errno = GDBM_OPT_ILLEGAL;
77	    return(-1);
78	  }
79
80	dbf->fast_write = !(*optval);
81	break;
82
83      case GDBM_CENTFREE:
84      	/* Optval will point to either true or false. */
85	if ((*optval != TRUE) && (*optval != FALSE))
86	  {
87	    gdbm_errno = GDBM_OPT_ILLEGAL;
88	    return(-1);
89	  }
90
91	dbf->fast_write = *optval;
92	break;
93
94      case GDBM_COALESCEBLKS:
95      	/* Optval will point to either true or false. */
96	if ((*optval != TRUE) && (*optval != FALSE))
97	  {
98	    gdbm_errno = GDBM_OPT_ILLEGAL;
99	    return(-1);
100	  }
101
102	dbf->fast_write = *optval;
103	break;
104
105      default:
106        gdbm_errno = GDBM_OPT_ILLEGAL;
107        return(-1);
108    }
109
110  return(0);
111}
112