rcfile.c revision 613a2f6ba31e891e3d947a356daf5e563d43c1ce
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Copyright (c) 2000, Boris Popov
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * All rights reserved.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Redistribution and use in source and binary forms, with or without
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * modification, are permitted provided that the following conditions
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * 1. Redistributions of source code must retain the above copyright
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * notice, this list of conditions and the following disclaimer.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * 2. Redistributions in binary form must reproduce the above copyright
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * notice, this list of conditions and the following disclaimer in the
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * documentation and/or other materials provided with the distribution.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * 3. All advertising materials mentioning features or use of this software
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * must display the following acknowledgement:
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * This product includes software developed by Boris Popov.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * 4. Neither the name of the author nor the names of any co-contributors
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * may be used to endorse or promote products derived from this software
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * without specific prior written permission.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * SUCH DAMAGE.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * $Id: rcfile.c,v 1.1.1.2 2001/07/06 22:38:43 conrad Exp $
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross#if 0 /* before SMF */
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross#define OLD_SMB_CFG_FILE "/usr/local/etc/nsmb.conf"
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross#define SMBFS_SHARECTL_CMD "/usr/sbin/sharectl get smbfs"
4bff34e37def8a90f9194d81bc345c52ba20086athurlowstatic struct rcfile *rc_cachelookup(const char *filename);
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Rossstatic struct rcsection *rc_findsect(struct rcfile *rcp, const char *sectname);
4bff34e37def8a90f9194d81bc345c52ba20086athurlowstatic struct rcsection *rc_addsect(struct rcfile *rcp, const char *sectname);
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Rossstatic int rc_freesect(struct rcfile *rcp, struct rcsection *rsp);
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Rossstatic struct rckey *rc_sect_findkey(struct rcsection *rsp, const char *key);
4bff34e37def8a90f9194d81bc345c52ba20086athurlowstatic struct rckey *rc_sect_addkey(struct rcsection *rsp, const char *name,
4bff34e37def8a90f9194d81bc345c52ba20086athurlow const char *value);
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross/* lock for the variables below */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * open rcfile and load its content, if already open - return previous handle
4bff34e37def8a90f9194d81bc345c52ba20086athurlowrc_open(const char *filename, const char *mode, struct rcfile **rcfile)
4bff34e37def8a90f9194d81bc345c52ba20086athurlow return (0);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow return (0);
4bff34e37def8a90f9194d81bc345c52ba20086athurlowrc_merge(const char *filename, struct rcfile **rcfile)
4bff34e37def8a90f9194d81bc345c52ba20086athurlow return (0);
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * Like rc_open, but does popen of command:
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * sharectl get smbfs
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Rossrc_popen_cmd(const char *command, struct rcfile **rcfile)
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross /* fclose(f) in rc_close */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow return (0);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow struct rcsection *p, *n;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow return (0);
4bff34e37def8a90f9194d81bc345c52ba20086athurlowstatic struct rcfile *
4bff34e37def8a90f9194d81bc345c52ba20086athurlow return (p);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow return (0);
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Rossstatic struct rcsection *
4bff34e37def8a90f9194d81bc345c52ba20086athurlowrc_findsect(struct rcfile *rcp, const char *sectname)
4bff34e37def8a90f9194d81bc345c52ba20086athurlow return (p);
4bff34e37def8a90f9194d81bc345c52ba20086athurlowstatic struct rcsection *
4bff34e37def8a90f9194d81bc345c52ba20086athurlow return (p);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow p = malloc(sizeof (*p));
4bff34e37def8a90f9194d81bc345c52ba20086athurlow return (p);
4bff34e37def8a90f9194d81bc345c52ba20086athurlowrc_freesect(struct rcfile *rcp, struct rcsection *rsp)
4bff34e37def8a90f9194d81bc345c52ba20086athurlow struct rckey *p, *n;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow SLIST_REMOVE(&rcp->rf_sect, rsp, rcsection, rs_next);
4bff34e37def8a90f9194d81bc345c52ba20086athurlow return (0);
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Rossstatic struct rckey *
4bff34e37def8a90f9194d81bc345c52ba20086athurlowrc_sect_findkey(struct rcsection *rsp, const char *keyname)
4bff34e37def8a90f9194d81bc345c52ba20086athurlow return (p);
4bff34e37def8a90f9194d81bc345c52ba20086athurlowstatic struct rckey *
4bff34e37def8a90f9194d81bc345c52ba20086athurlowrc_sect_addkey(struct rcsection *rsp, const char *name, const char *value)
4bff34e37def8a90f9194d81bc345c52ba20086athurlow p = malloc(sizeof (*p));
4bff34e37def8a90f9194d81bc345c52ba20086athurlow return (p);
4bff34e37def8a90f9194d81bc345c52ba20086athurlowrc_sect_delkey(struct rcsection *rsp, struct rckey *p)
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Rossstatic char *minauth_values[] = {
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross for (i = 0; minauth_values[i]; i++)
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross return (-1);
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * Ensure that "minauth" is set to the highest level
4bff34e37def8a90f9194d81bc345c52ba20086athurlowset_value(struct rcfile *rcp, struct rcsection *rsp, struct rckey *rkp,
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross "set_value: rejecting %s=%s"
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross " in %s from %s\n",
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross "set_value: applying %s=%s in %s from %s\n",
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross/* states in rc_parse */
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Rossenum { stNewLine, stHeader, stSkipToEOL, stGetKey, stGetValue};
4bff34e37def8a90f9194d81bc345c52ba20086athurlow if (c == '\r')
4bff34e37def8a90f9194d81bc345c52ba20086athurlow continue; /* skip leading junk */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow if (c == '[') {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow } else { /* something meaningfull */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow /* ignore long lines */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow if (c == '\n') {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow if (c == ']') {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow /* side effect: 'key name=' */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow continue; /* become 'keyname=' */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow if (c != '=') {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow "option %s may not be set "
4bff34e37def8a90f9194d81bc345c52ba20086athurlow "Warning: .nsmbrc file not secure, "
4bff34e37def8a90f9194d81bc345c52ba20086athurlow "ignoring passwords\n"));
4bff34e37def8a90f9194d81bc345c52ba20086athurlow /* only stGetValue left */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow if (c != '\n') {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow } /* while */
4bff34e37def8a90f9194d81bc345c52ba20086athurlowrc_getstringptr(struct rcfile *rcp, const char *section, const char *key,
4bff34e37def8a90f9194d81bc345c52ba20086athurlowrc_getstring(struct rcfile *rcp, const char *section, const char *key,
4bff34e37def8a90f9194d81bc345c52ba20086athurlow "line too long for key '%s' in section '%s', max = %d\n"),
4bff34e37def8a90f9194d81bc345c52ba20086athurlow return (0);
4bff34e37def8a90f9194d81bc345c52ba20086athurlowrc_getint(struct rcfile *rcp, const char *section, const char *key, int *value)
4bff34e37def8a90f9194d81bc345c52ba20086athurlow "invalid int value '%s' for key '%s' in section '%s'\n"),
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * 1,yes,true
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * 0,no,false
4bff34e37def8a90f9194d81bc345c52ba20086athurlowrc_getbool(struct rcfile *rcp, const char *section, const char *key, int *value)
4bff34e37def8a90f9194d81bc345c52ba20086athurlow while (*p && isspace(*p)) p++;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow if (*p == '0' ||
4bff34e37def8a90f9194d81bc345c52ba20086athurlow if (*p == '1' ||
4bff34e37def8a90f9194d81bc345c52ba20086athurlow "invalid boolean value '%s' for key '%s' in section '%s' \n"),
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * first parse "sharectl get smbfs, then $HOME/.nsmbrc
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * This is called by library consumers (commands)
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross#if 0 /* before SMF */
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross /* Error from fopen. strerror is OK. */
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross /* Mostly ignore error returns above. */
613a2f6ba31e891e3d947a356daf5e563d43c1ceGordon Ross * This is called by library consumers (commands)