Keep track where more objects are declared so that we can print where things
have been redefined.
This commit is contained in:
parent
ae9c1adc3b
commit
202553924e
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: defs.h,v 1.104 2018/08/27 16:04:45 riastradh Exp $ */
|
||||
/* $NetBSD: defs.h,v 1.105 2020/03/07 19:26:13 christos Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1992, 1993
|
||||
@ -110,6 +110,10 @@ extern const char *progname;
|
||||
#define CONFIG_VERSION 20180827
|
||||
#define CONFIG_MINVERSION 0
|
||||
|
||||
struct where {
|
||||
const char *w_srcfile; /* file name where we are defined */
|
||||
u_short w_srcline; /* line number where we are defined */
|
||||
};
|
||||
/*
|
||||
* Name/value lists. Values can be strings or pointers and/or can carry
|
||||
* integers. The names can be NULL, resulting in simple value lists.
|
||||
@ -123,6 +127,7 @@ struct nvlist {
|
||||
int nv_ifunit; /* XXX XXX XXX */
|
||||
int nv_flags;
|
||||
#define NV_DEPENDED 1
|
||||
struct where nv_where;
|
||||
};
|
||||
|
||||
/*
|
||||
@ -131,10 +136,10 @@ struct nvlist {
|
||||
struct config {
|
||||
TAILQ_ENTRY(config) cf_next;
|
||||
const char *cf_name; /* "netbsd" */
|
||||
int cf_lineno; /* source line */
|
||||
const char *cf_fstype; /* file system type */
|
||||
struct nvlist *cf_root; /* "root on ra0a" */
|
||||
struct nvlist *cf_dump; /* "dumps on ra0b" */
|
||||
struct where cf_where;
|
||||
};
|
||||
|
||||
/*
|
||||
@ -147,6 +152,7 @@ struct defoptlist {
|
||||
const char *dl_lintvalue;
|
||||
int dl_obsolete;
|
||||
struct nvlist *dl_depends;
|
||||
struct where dl_where;
|
||||
};
|
||||
|
||||
struct files;
|
||||
@ -199,6 +205,7 @@ struct attr {
|
||||
|
||||
/* "device class" */
|
||||
const char *a_devclass; /* device class described */
|
||||
struct where a_where;
|
||||
};
|
||||
|
||||
/*
|
||||
@ -277,8 +284,7 @@ struct devbase {
|
||||
struct deva *d_ahead; /* first attachment, if any */
|
||||
struct deva **d_app; /* used for tacking on attachments */
|
||||
struct attr *d_classattr; /* device class attribute (if any) */
|
||||
const char *d_srcfile; /* file name where we are defined */
|
||||
u_short d_srcline; /* line number where we are defined */
|
||||
struct where d_where;
|
||||
};
|
||||
|
||||
struct deva {
|
||||
@ -291,8 +297,7 @@ struct deva {
|
||||
struct attrlist *d_attrs; /* attributes, if any */
|
||||
struct devi *d_ihead; /* first instance, if any */
|
||||
struct devi **d_ipp; /* used for tacking on more instances */
|
||||
const char *d_srcfile; /* file name where we are defined */
|
||||
u_short d_srcline; /* line number where we are defined */
|
||||
struct where d_where;
|
||||
};
|
||||
|
||||
/*
|
||||
@ -319,8 +324,6 @@ struct devi {
|
||||
struct deva *i_atdeva;
|
||||
const char **i_locs; /* locators (as given by pspec's iattr) */
|
||||
int i_cfflags; /* flags from config line */
|
||||
int i_lineno; /* line # in config, for later errors */
|
||||
const char *i_srcfile; /* file it appears in */
|
||||
int i_level; /* position between negated instances */
|
||||
int i_active;
|
||||
#define DEVI_ORPHAN 0 /* instance has no active parent */
|
||||
@ -333,7 +336,7 @@ struct devi {
|
||||
short i_collapsed; /* set => this alias no longer needed */
|
||||
u_short i_cfindex; /* our index in cfdata */
|
||||
int i_locoff; /* offset in locators.vec */
|
||||
|
||||
struct where i_where;
|
||||
};
|
||||
/* special units */
|
||||
#define STAR (-1) /* unit number for, e.g., "sd*" */
|
||||
@ -346,8 +349,7 @@ struct devi {
|
||||
struct files {
|
||||
TAILQ_ENTRY(files) fi_next;
|
||||
TAILQ_ENTRY(files) fi_snext; /* per-suffix list */
|
||||
const char *fi_srcfile; /* the name of the "files" file that got us */
|
||||
u_short fi_srcline; /* and the line number */
|
||||
struct where fi_where;
|
||||
u_char fi_flags; /* as below */
|
||||
const char *fi_tail; /* name, i.e., strrchr(fi_path, '/') + 1 */
|
||||
const char *fi_base; /* tail minus ".c" (or whatever) */
|
||||
@ -418,13 +420,12 @@ struct prefix {
|
||||
*/
|
||||
struct devm {
|
||||
TAILQ_ENTRY(devm) dm_next;
|
||||
const char *dm_srcfile; /* the name of the "majors" file */
|
||||
u_short dm_srcline; /* the line number */
|
||||
const char *dm_name; /* [bc]devsw name */
|
||||
devmajor_t dm_cmajor; /* character major */
|
||||
devmajor_t dm_bmajor; /* block major */
|
||||
struct condexpr *dm_opts; /* options */
|
||||
struct nvlist *dm_devnodes; /* information on /dev nodes */
|
||||
struct where dm_where;
|
||||
};
|
||||
|
||||
/*
|
||||
@ -581,7 +582,7 @@ void deloption(const char *, int);
|
||||
void delfsoption(const char *, int);
|
||||
void delmkoption(const char *, int);
|
||||
int devbase_has_instances(struct devbase *, int);
|
||||
int is_declared_option(const char *);
|
||||
struct where *find_declared_option(const char *);
|
||||
int deva_has_instances(struct deva *, int);
|
||||
void setupdirs(void);
|
||||
void fixmaxusers(void);
|
||||
@ -594,7 +595,7 @@ const char *strtolower(const char *);
|
||||
#define OPT_DEFFLAG(n) (dlhash_lookup(defflagtab, (n)) != NULL)
|
||||
#define OPT_DEFPARAM(n) (dlhash_lookup(defparamtab, (n)) != NULL)
|
||||
#define OPT_OBSOLETE(n) (dlhash_lookup(obsopttab, (n)) != NULL)
|
||||
#define DEFINED_OPTION(n) (is_declared_option((n)))
|
||||
#define DEFINED_OPTION(n) (find_declared_option((n)))
|
||||
|
||||
/* main.c */
|
||||
void logconfig_include(FILE *, const char *);
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: files.c,v 1.36 2016/09/09 21:09:11 christos Exp $ */
|
||||
/* $NetBSD: files.c,v 1.37 2020/03/07 19:26:13 christos Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1992, 1993
|
||||
@ -45,7 +45,7 @@
|
||||
#endif
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__RCSID("$NetBSD: files.c,v 1.36 2016/09/09 21:09:11 christos Exp $");
|
||||
__RCSID("$NetBSD: files.c,v 1.37 2020/03/07 19:26:13 christos Exp $");
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <assert.h>
|
||||
@ -158,19 +158,19 @@ addfile(const char *path, struct condexpr *optx, u_char flags, const char *rule)
|
||||
* options for specific files.
|
||||
*/
|
||||
if (rule != NULL && optx == NULL && flags == 0 &&
|
||||
yyfile != fi->fi_srcfile) {
|
||||
yyfile != fi->fi_where.w_srcfile) {
|
||||
fi->fi_mkrule = rule;
|
||||
return;
|
||||
}
|
||||
cfgerror("duplicate file %s", path);
|
||||
cfgxerror(fi->fi_srcfile, fi->fi_srcline,
|
||||
cfgxerror(fi->fi_where.w_srcfile, fi->fi_where.w_srcline,
|
||||
"here is the original definition");
|
||||
goto bad;
|
||||
}
|
||||
memcpy(base, tail, baselen);
|
||||
base[baselen] = '\0';
|
||||
fi->fi_srcfile = yyfile;
|
||||
fi->fi_srcline = currentline();
|
||||
fi->fi_where.w_srcfile = yyfile;
|
||||
fi->fi_where.w_srcline = currentline();
|
||||
fi->fi_flags = flags;
|
||||
fi->fi_path = path;
|
||||
fi->fi_tail = tail;
|
||||
@ -204,7 +204,7 @@ addfile(const char *path, struct condexpr *optx, u_char flags, const char *rule)
|
||||
TAILQ_INSERT_TAIL(&allfiles, fi, fi_next);
|
||||
break;
|
||||
default:
|
||||
cfgxerror(fi->fi_srcfile, fi->fi_srcline,
|
||||
cfgxerror(fi->fi_where.w_srcfile, fi->fi_where.w_srcline,
|
||||
"unknown suffix");
|
||||
break;
|
||||
}
|
||||
@ -262,7 +262,7 @@ checkaux(const char *name, void *context)
|
||||
struct files *fi = context;
|
||||
|
||||
if (ht_lookup(devbasetab, name) == NULL) {
|
||||
cfgxerror(fi->fi_srcfile, fi->fi_srcline,
|
||||
cfgxerror(fi->fi_where.w_srcfile, fi->fi_where.w_srcline,
|
||||
"`%s' is not a countable device",
|
||||
name);
|
||||
/* keep fixfiles() from complaining again */
|
||||
@ -356,10 +356,10 @@ fixfiles(void)
|
||||
ofi->fi_flags &= (u_char)~FI_SEL;
|
||||
ofi->fi_flags |= FI_HIDDEN;
|
||||
} else {
|
||||
cfgxerror(fi->fi_srcfile, fi->fi_srcline,
|
||||
cfgxerror(fi->fi_where.w_srcfile, fi->fi_where.w_srcline,
|
||||
"object file collision on %s.o, from %s",
|
||||
fi->fi_base, fi->fi_path);
|
||||
cfgxerror(ofi->fi_srcfile, ofi->fi_srcline,
|
||||
cfgxerror(ofi->fi_where.w_srcfile, ofi->fi_where.w_srcline,
|
||||
"here is the previous file: %s",
|
||||
ofi->fi_path);
|
||||
err = 1;
|
||||
@ -412,22 +412,25 @@ fixdevsw(void)
|
||||
if (res != NULL) {
|
||||
if (res->dm_cmajor != dm->dm_cmajor ||
|
||||
res->dm_bmajor != dm->dm_bmajor) {
|
||||
cfgxerror(res->dm_srcfile, res->dm_srcline,
|
||||
"device-major '%s' "
|
||||
"block %d, char %d redefined"
|
||||
" at %s:%d as block %d, char %d",
|
||||
res->dm_name,
|
||||
res->dm_bmajor, res->dm_cmajor,
|
||||
dm->dm_srcfile, dm->dm_srcline,
|
||||
dm->dm_bmajor, dm->dm_cmajor);
|
||||
cfgxerror(res->dm_where.w_srcfile,
|
||||
res->dm_where.w_srcline,
|
||||
"device-major '%s' "
|
||||
"block %d, char %d redefined"
|
||||
" at %s:%d as block %d, char %d",
|
||||
res->dm_name,
|
||||
res->dm_bmajor, res->dm_cmajor,
|
||||
dm->dm_where.w_srcfile, dm->dm_where.w_srcline,
|
||||
dm->dm_bmajor, dm->dm_cmajor);
|
||||
} else {
|
||||
cfgxerror(res->dm_srcfile, res->dm_srcline,
|
||||
"device-major '%s' "
|
||||
"(block %d, char %d) duplicated"
|
||||
" at %s:%d",
|
||||
dm->dm_name, dm->dm_bmajor,
|
||||
dm->dm_cmajor,
|
||||
dm->dm_srcfile, dm->dm_srcline);
|
||||
cfgxerror(res->dm_where.w_srcfile,
|
||||
res->dm_where.w_srcline,
|
||||
"device-major '%s' "
|
||||
"(block %d, char %d) duplicated"
|
||||
" at %s:%d",
|
||||
dm->dm_name, dm->dm_bmajor,
|
||||
dm->dm_cmajor,
|
||||
dm->dm_where.w_srcfile,
|
||||
dm->dm_where.w_srcline);
|
||||
}
|
||||
error = 1;
|
||||
goto out;
|
||||
@ -443,15 +446,16 @@ fixdevsw(void)
|
||||
|
||||
if (dm->dm_cmajor != NODEVMAJOR) {
|
||||
if (ht_lookup(cdevmtab, intern(dm->dm_name)) != NULL) {
|
||||
cfgxerror(dm->dm_srcfile, dm->dm_srcline,
|
||||
"device-major of character device '%s' "
|
||||
"is already defined", dm->dm_name);
|
||||
cfgxerror(dm->dm_where.w_srcfile,
|
||||
dm->dm_where.w_srcline,
|
||||
"device-major of character device '%s' "
|
||||
"is already defined", dm->dm_name);
|
||||
error = 1;
|
||||
goto out;
|
||||
}
|
||||
(void)snprintf(mstr, sizeof(mstr), "%d", dm->dm_cmajor);
|
||||
if (ht_lookup(cdevmtab, intern(mstr)) != NULL) {
|
||||
cfgxerror(dm->dm_srcfile, dm->dm_srcline,
|
||||
cfgxerror(dm->dm_where.w_srcfile, dm->dm_where.w_srcline,
|
||||
"device-major of character major '%d' "
|
||||
"is already defined", dm->dm_cmajor);
|
||||
error = 1;
|
||||
@ -465,7 +469,7 @@ fixdevsw(void)
|
||||
}
|
||||
if (dm->dm_bmajor != NODEVMAJOR) {
|
||||
if (ht_lookup(bdevmtab, intern(dm->dm_name)) != NULL) {
|
||||
cfgxerror(dm->dm_srcfile, dm->dm_srcline,
|
||||
cfgxerror(dm->dm_where.w_srcfile, dm->dm_where.w_srcline,
|
||||
"device-major of block device '%s' "
|
||||
"is already defined", dm->dm_name);
|
||||
error = 1;
|
||||
@ -473,7 +477,7 @@ fixdevsw(void)
|
||||
}
|
||||
(void)snprintf(mstr, sizeof(mstr), "%d", dm->dm_bmajor);
|
||||
if (ht_lookup(bdevmtab, intern(mstr)) != NULL) {
|
||||
cfgxerror(dm->dm_srcfile, dm->dm_srcline,
|
||||
cfgxerror(dm->dm_where.w_srcfile, dm->dm_where.w_srcline,
|
||||
"device-major of block major '%d' "
|
||||
"is already defined", dm->dm_bmajor);
|
||||
error = 1;
|
||||
|
@ -1,5 +1,5 @@
|
||||
%{
|
||||
/* $NetBSD: gram.y,v 1.54 2016/08/07 10:37:24 christos Exp $ */
|
||||
/* $NetBSD: gram.y,v 1.55 2020/03/07 19:26:13 christos Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1992, 1993
|
||||
@ -42,7 +42,7 @@
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__RCSID("$NetBSD: gram.y,v 1.54 2016/08/07 10:37:24 christos Exp $");
|
||||
__RCSID("$NetBSD: gram.y,v 1.55 2020/03/07 19:26:13 christos Exp $");
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/param.h>
|
||||
@ -898,7 +898,7 @@ no_option:
|
||||
conf:
|
||||
WORD {
|
||||
conf.cf_name = $1;
|
||||
conf.cf_lineno = currentline();
|
||||
conf.cf_where.w_srcline = currentline();
|
||||
conf.cf_fstype = NULL;
|
||||
conf.cf_root = NULL;
|
||||
conf.cf_dump = NULL;
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: main.c,v 1.98 2018/12/24 02:07:44 christos Exp $ */
|
||||
/* $NetBSD: main.c,v 1.99 2020/03/07 19:26:13 christos Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1992, 1993
|
||||
@ -45,7 +45,7 @@
|
||||
#endif
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__RCSID("$NetBSD: main.c,v 1.98 2018/12/24 02:07:44 christos Exp $");
|
||||
__RCSID("$NetBSD: main.c,v 1.99 2020/03/07 19:26:13 christos Exp $");
|
||||
|
||||
#ifndef MAKE_BOOTSTRAP
|
||||
#include <sys/cdefs.h>
|
||||
@ -756,7 +756,7 @@ check_dependencies(const char *thing, struct nvlist *deps)
|
||||
} else if (OPT_OBSOLETE(dep->nv_name)) {
|
||||
cfgerror("option `%s' dependency `%s' "
|
||||
"is obsolete", thing, dep->nv_name);
|
||||
} else if (!is_declared_option(dep->nv_name)) {
|
||||
} else if (!find_declared_option(dep->nv_name)) {
|
||||
cfgerror("option `%s' dependency `%s' "
|
||||
"is an unknown option",
|
||||
thing, dep->nv_name);
|
||||
@ -786,14 +786,16 @@ void
|
||||
deffilesystem(struct nvlist *fses, struct nvlist *deps)
|
||||
{
|
||||
struct nvlist *nv;
|
||||
struct where *w;
|
||||
|
||||
/*
|
||||
* Mark these options as ones to skip when creating the Makefile.
|
||||
*/
|
||||
for (nv = fses; nv != NULL; nv = nv->nv_next) {
|
||||
if (DEFINED_OPTION(nv->nv_name)) {
|
||||
cfgerror("file system or option `%s' already defined",
|
||||
nv->nv_name);
|
||||
if ((w = DEFINED_OPTION(nv->nv_name)) != NULL) {
|
||||
cfgerror("file system or option `%s' already defined"
|
||||
" at %s:%hu", nv->nv_name, w->w_srcfile,
|
||||
w->w_srcline);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -878,8 +880,8 @@ find_declared_fs_option(const char *name)
|
||||
* Like find_declared_option but doesn't return what it finds, so it
|
||||
* can search both the various kinds of options and also filesystems.
|
||||
*/
|
||||
int
|
||||
is_declared_option(const char *name)
|
||||
struct where *
|
||||
find_declared_option(const char *name)
|
||||
{
|
||||
struct defoptlist *option = NULL;
|
||||
struct nvlist *fs;
|
||||
@ -887,13 +889,13 @@ is_declared_option(const char *name)
|
||||
if ((option = dlhash_lookup(defopttab, name)) != NULL ||
|
||||
(option = dlhash_lookup(defparamtab, name)) != NULL ||
|
||||
(option = dlhash_lookup(defflagtab, name)) != NULL) {
|
||||
return 1;
|
||||
return &option->dl_where;
|
||||
}
|
||||
if ((fs = nvhash_lookup(deffstab, name)) != NULL) {
|
||||
return 1;
|
||||
return &fs->nv_where;
|
||||
}
|
||||
|
||||
return 0;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -908,6 +910,7 @@ defopt(struct dlhash *ht, const char *fname, struct defoptlist *opts,
|
||||
{
|
||||
struct defoptlist *dl, *nextdl, *olddl;
|
||||
const char *name;
|
||||
struct where *w;
|
||||
char buf[500];
|
||||
|
||||
if (fname != NULL && badfilename(fname)) {
|
||||
@ -930,15 +933,17 @@ defopt(struct dlhash *ht, const char *fname, struct defoptlist *opts,
|
||||
}
|
||||
|
||||
/* An option name can be declared at most once. */
|
||||
if (DEFINED_OPTION(dl->dl_name)) {
|
||||
cfgerror("file system or option `%s' already defined",
|
||||
dl->dl_name);
|
||||
if ((w = DEFINED_OPTION(dl->dl_name)) != NULL) {
|
||||
cfgerror("file system or option `%s' already defined"
|
||||
" at %s:%hu", dl->dl_name, w->w_srcfile,
|
||||
w->w_srcline);
|
||||
return;
|
||||
}
|
||||
|
||||
if (dlhash_insert(ht, dl->dl_name, dl)) {
|
||||
cfgerror("file system or option `%s' already defined",
|
||||
dl->dl_name);
|
||||
cfgerror("file system or option `%s' already defined"
|
||||
" at %s:%hu", dl->dl_name, dl->dl_where.w_srcfile,
|
||||
dl->dl_where.w_srcline);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -1379,8 +1384,8 @@ cfcrosscheck(struct config *cf, const char *what, struct nvlist *nv)
|
||||
goto loop;
|
||||
}
|
||||
(void)fprintf(stderr,
|
||||
"%s:%d: %s says %s on %s, but there's no %s\n",
|
||||
conffile, cf->cf_lineno,
|
||||
"%s:%hu: %s says %s on %s, but there's no %s\n",
|
||||
conffile, cf->cf_where.w_srcline,
|
||||
cf->cf_name, what, nv->nv_str, nv->nv_str);
|
||||
errs++;
|
||||
loop:
|
||||
|
@ -1,5 +1,5 @@
|
||||
%{
|
||||
/* $NetBSD: scan.l,v 1.26 2016/08/07 10:37:24 christos Exp $ */
|
||||
/* $NetBSD: scan.l,v 1.27 2020/03/07 19:26:13 christos Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1992, 1993
|
||||
@ -42,7 +42,7 @@
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__RCSID("$NetBSD: scan.l,v 1.26 2016/08/07 10:37:24 christos Exp $");
|
||||
__RCSID("$NetBSD: scan.l,v 1.27 2020/03/07 19:26:13 christos Exp $");
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <errno.h>
|
||||
@ -97,8 +97,7 @@ int st;
|
||||
struct incl {
|
||||
struct incl *in_prev; /* previous includes in effect, if any */
|
||||
YY_BUFFER_STATE in_buf; /* previous lex state */
|
||||
const char *in_fname; /* previous file name */
|
||||
int in_lineno; /* previous line number */
|
||||
struct where in_where;
|
||||
int in_ateof; /* token to insert at EOF */
|
||||
int in_interesting; /* previous value for "interesting" */
|
||||
int in_ifdefstate; /* conditional level */
|
||||
@ -526,8 +525,8 @@ include(const char *fname, int ateof, int conditional, int direct)
|
||||
in = ecalloc(1, sizeof *in);
|
||||
in->in_prev = incl;
|
||||
in->in_buf = YY_CURRENT_BUFFER;
|
||||
in->in_fname = yyfile;
|
||||
in->in_lineno = yyline;
|
||||
in->in_where.w_srcfile = yyfile;
|
||||
in->in_where.w_srcline = (u_short)yyline;
|
||||
in->in_ateof = ateof;
|
||||
in->in_interesting = interesting;
|
||||
in->in_ifdefstate = ifdefstate;
|
||||
@ -597,8 +596,8 @@ endinclude(void)
|
||||
yy_delete_buffer(YY_CURRENT_BUFFER);
|
||||
(void)fclose(yyin);
|
||||
yy_switch_to_buffer(in->in_buf);
|
||||
yyfile = in->in_fname;
|
||||
yyline = in->in_lineno;
|
||||
yyfile = in->in_where.w_srcfile;
|
||||
yyline = in->in_where.w_srcline;
|
||||
ateof = in->in_ateof;
|
||||
interesting = in->in_interesting;
|
||||
free(in);
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: sem.c,v 1.83 2018/04/09 17:46:56 christos Exp $ */
|
||||
/* $NetBSD: sem.c,v 1.84 2020/03/07 19:26:13 christos Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1992, 1993
|
||||
@ -45,7 +45,7 @@
|
||||
#endif
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__RCSID("$NetBSD: sem.c,v 1.83 2018/04/09 17:46:56 christos Exp $");
|
||||
__RCSID("$NetBSD: sem.c,v 1.84 2020/03/07 19:26:13 christos Exp $");
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <ctype.h>
|
||||
@ -276,17 +276,24 @@ setdefmaxusers(int min, int def, int max)
|
||||
}
|
||||
}
|
||||
|
||||
static const char *maxusers_srcfile;
|
||||
static u_short maxusers_srcline;
|
||||
|
||||
void
|
||||
setmaxusers(int n)
|
||||
{
|
||||
|
||||
if (maxusers == n) {
|
||||
cfgerror("duplicate maxusers parameter");
|
||||
cfgerror("duplicate maxusers parameter at %s:%hu",
|
||||
maxusers_srcfile, maxusers_srcline);
|
||||
return;
|
||||
}
|
||||
if (vflag && maxusers != 0)
|
||||
cfgwarn("warning: maxusers already defined");
|
||||
cfgwarn("warning: maxusers already defined at %s:%hu",
|
||||
maxusers_srcfile, maxusers_srcline);
|
||||
maxusers = n;
|
||||
maxusers_srcfile = yyfile;
|
||||
maxusers_srcline = currentline();
|
||||
if (n < minmaxusers) {
|
||||
cfgerror("warning: minimum of %d maxusers assumed",
|
||||
minmaxusers);
|
||||
@ -338,7 +345,8 @@ defattr(const char *name, struct loclist *locs, struct attrlist *deps,
|
||||
struct attrlist *al;
|
||||
|
||||
if (getrefattr(name, &a)) {
|
||||
cfgerror("attribute `%s' already defined", name);
|
||||
cfgerror("attribute `%s' already defined at %s:%hu", name,
|
||||
a->a_where.w_srcfile, a->a_where.w_srcline);
|
||||
loclist_destroy(locs);
|
||||
return (1);
|
||||
}
|
||||
@ -380,6 +388,8 @@ mkattr(const char *name)
|
||||
return NULL;
|
||||
}
|
||||
a->a_name = name;
|
||||
a->a_where.w_srcfile = yyfile;
|
||||
a->a_where.w_srcline = currentline();
|
||||
TAILQ_INIT(&a->a_files);
|
||||
CFGDBG(3, "attr `%s' allocated", name);
|
||||
|
||||
@ -510,7 +520,7 @@ defdev(struct devbase *dev, struct loclist *loclist, struct attrlist *attrs,
|
||||
goto bad;
|
||||
if (dev->d_isdef) {
|
||||
cfgerror("redefinition of `%s' (previously defined at %s:%d)",
|
||||
dev->d_name, dev->d_srcfile, dev->d_srcline);
|
||||
dev->d_name, dev->d_where.w_srcfile, dev->d_where.w_srcline);
|
||||
goto bad;
|
||||
}
|
||||
|
||||
@ -625,8 +635,8 @@ getdevbase(const char *name)
|
||||
dev->d_ahead = NULL;
|
||||
dev->d_app = &dev->d_ahead;
|
||||
dev->d_umax = 0;
|
||||
dev->d_srcfile = yyfile;
|
||||
dev->d_srcline = currentline();
|
||||
dev->d_where.w_srcfile = yyfile;
|
||||
dev->d_where.w_srcline = currentline();
|
||||
TAILQ_INSERT_TAIL(&allbases, dev, d_next);
|
||||
if (ht_insert(devbasetab, name, dev))
|
||||
panic("%s: Can't insert %s", __func__, name);
|
||||
@ -659,7 +669,7 @@ defdevattach(struct deva *deva, struct devbase *dev, struct nvlist *atlist,
|
||||
}
|
||||
if (deva->d_isdef) {
|
||||
cfgerror("redefinition of `%s' (previously defined at %s:%d)",
|
||||
deva->d_name, deva->d_srcfile, deva->d_srcline);
|
||||
deva->d_name, deva->d_where.w_srcfile, deva->d_where.w_srcline);
|
||||
goto bad;
|
||||
}
|
||||
if (dev->d_ispseudo) {
|
||||
@ -768,8 +778,8 @@ getdevattach(const char *name)
|
||||
deva->d_attrs = NULL;
|
||||
deva->d_ihead = NULL;
|
||||
deva->d_ipp = &deva->d_ihead;
|
||||
deva->d_srcfile = yyfile;
|
||||
deva->d_srcline = currentline();
|
||||
deva->d_where.w_srcfile = yyfile;
|
||||
deva->d_where.w_srcline = currentline();
|
||||
TAILQ_INSERT_TAIL(&alldevas, deva, d_next);
|
||||
if (ht_insert(devatab, name, deva))
|
||||
panic("%s: Can't insert %s", __func__, name);
|
||||
@ -1039,13 +1049,18 @@ addconf(struct config *cf0)
|
||||
const char *name;
|
||||
|
||||
name = cf0->cf_name;
|
||||
cf = ecalloc(1, sizeof *cf);
|
||||
if (ht_insert(cfhashtab, name, cf)) {
|
||||
cfgerror("configuration `%s' already defined", name);
|
||||
free(cf);
|
||||
if ((cf = ht_lookup(cfhashtab, name)) != NULL) {
|
||||
cfgerror("configuration `%s' already defined %s:%hu", name,
|
||||
cf->cf_where.w_srcfile, cf->cf_where.w_srcline);
|
||||
goto bad;
|
||||
}
|
||||
cf = ecalloc(1, sizeof *cf);
|
||||
if (ht_insert(cfhashtab, name, cf)) {
|
||||
free(cf);
|
||||
}
|
||||
*cf = *cf0;
|
||||
cf->cf_where.w_srcfile = yyfile;
|
||||
cf->cf_where.w_srcline = currentline();
|
||||
|
||||
/*
|
||||
* Resolve the root device.
|
||||
@ -1157,11 +1172,13 @@ newdevi(const char *name, int unit, struct devbase *d)
|
||||
i->i_atdeva = NULL;
|
||||
i->i_locs = NULL;
|
||||
i->i_cfflags = 0;
|
||||
i->i_lineno = currentline();
|
||||
i->i_srcfile = yyfile;
|
||||
i->i_where.w_srcline = currentline();
|
||||
i->i_where.w_srcfile = yyfile;
|
||||
i->i_active = DEVI_ORPHAN; /* Proper analysis comes later */
|
||||
i->i_level = devilevel;
|
||||
i->i_pseudoroot = 0;
|
||||
i->i_where.w_srcfile = yyfile;
|
||||
i->i_where.w_srcline = currentline();
|
||||
if (unit >= d->d_umax)
|
||||
d->d_umax = unit + 1;
|
||||
return (i);
|
||||
@ -1796,8 +1813,9 @@ addpseudo(const char *name, int number)
|
||||
cfgerror("%s is a real device, not a pseudo-device", name);
|
||||
return;
|
||||
}
|
||||
if (ht_lookup(devitab, name) != NULL) {
|
||||
cfgerror("`%s' already defined", name);
|
||||
if ((i = ht_lookup(devitab, name)) != NULL) {
|
||||
cfgerror("`%s' already defined at %s:%hu", name,
|
||||
i->i_where.w_srcfile, i->i_where.w_srcline);
|
||||
return;
|
||||
}
|
||||
i = newdevi(name, number - 1, d); /* foo 16 => "foo0..foo15" */
|
||||
@ -1855,8 +1873,8 @@ adddevm(const char *name, devmajor_t cmajor, devmajor_t bmajor,
|
||||
}
|
||||
|
||||
dm = ecalloc(1, sizeof(*dm));
|
||||
dm->dm_srcfile = yyfile;
|
||||
dm->dm_srcline = currentline();
|
||||
dm->dm_where.w_srcfile = yyfile;
|
||||
dm->dm_where.w_srcline = currentline();
|
||||
dm->dm_name = name;
|
||||
dm->dm_cmajor = cmajor;
|
||||
dm->dm_bmajor = bmajor;
|
||||
@ -1890,11 +1908,11 @@ fixdevis(void)
|
||||
p = i->i_pspec;
|
||||
msg = p == NULL ? "no parent" :
|
||||
(p->p_atunit == WILD ? "nothing matching" : "no");
|
||||
cfgxerror(i->i_srcfile, i->i_lineno,
|
||||
cfgxerror(i->i_where.w_srcfile, i->i_where.w_srcline,
|
||||
"`%s at %s' is orphaned (%s `%s' found)",
|
||||
i->i_name, i->i_at, msg, i->i_at);
|
||||
} else if (vflag && i->i_active == DEVI_IGNORED)
|
||||
cfgxwarn(i->i_srcfile, i->i_lineno, "ignoring "
|
||||
cfgxwarn(i->i_where.w_srcfile, i->i_where.w_srcline, "ignoring "
|
||||
"explicitly orphaned instance `%s at %s'",
|
||||
i->i_name, i->i_at);
|
||||
}
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: util.c,v 1.20 2015/09/01 13:42:48 uebayasi Exp $ */
|
||||
/* $NetBSD: util.c,v 1.21 2020/03/07 19:26:13 christos Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1992, 1993
|
||||
@ -45,7 +45,7 @@
|
||||
#endif
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__RCSID("$NetBSD: util.c,v 1.20 2015/09/01 13:42:48 uebayasi Exp $");
|
||||
__RCSID("$NetBSD: util.c,v 1.21 2020/03/07 19:26:13 christos Exp $");
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <assert.h>
|
||||
@ -58,6 +58,8 @@ __RCSID("$NetBSD: util.c,v 1.20 2015/09/01 13:42:48 uebayasi Exp $");
|
||||
#include <err.h>
|
||||
#include "defs.h"
|
||||
|
||||
extern const char *yyfile;
|
||||
|
||||
static void cfgvxerror(const char *, int, const char *, va_list)
|
||||
__printflike(3, 0);
|
||||
static void cfgvxdbg(const char *, int, const char *, va_list)
|
||||
@ -198,6 +200,8 @@ newnv(const char *name, const char *str, void *ptr, long long i, struct nvlist *
|
||||
nv->nv_str = str;
|
||||
nv->nv_ptr = ptr;
|
||||
nv->nv_num = i;
|
||||
nv->nv_where.w_srcfile = yyfile;
|
||||
nv->nv_where.w_srcline = currentline();
|
||||
return nv;
|
||||
}
|
||||
|
||||
@ -255,6 +259,8 @@ defoptlist_create(const char *name, const char *val, const char *lintval)
|
||||
dl->dl_lintvalue = lintval;
|
||||
dl->dl_obsolete = 0;
|
||||
dl->dl_depends = NULL;
|
||||
dl->dl_where.w_srcfile = yyfile;
|
||||
dl->dl_where.w_srcline = currentline();
|
||||
return dl;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user