MFH@261240.
This commit is contained in:
commit
9c3c6fdae0
@ -1385,6 +1385,7 @@ opt_add(const char *str)
|
||||
free(lstr);
|
||||
return(-1);
|
||||
}
|
||||
lstr = NULL; /* parts of string going onto the OPLIST */
|
||||
*pt++ = '\0';
|
||||
opt->name = frpt;
|
||||
opt->value = pt;
|
||||
@ -1400,6 +1401,7 @@ opt_add(const char *str)
|
||||
optail->fow = opt;
|
||||
optail = opt;
|
||||
}
|
||||
free(lstr);
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
@ -367,12 +367,16 @@ popstring(void)
|
||||
struct strpush *sp = parsefile->strpush;
|
||||
|
||||
INTOFF;
|
||||
if (sp->ap) {
|
||||
if (parsenextc != sp->ap->val &&
|
||||
(parsenextc[-1] == ' ' || parsenextc[-1] == '\t'))
|
||||
forcealias();
|
||||
sp->ap->flag &= ~ALIASINUSE;
|
||||
}
|
||||
parsenextc = sp->prevstring;
|
||||
parsenleft = sp->prevnleft;
|
||||
parselleft = sp->prevlleft;
|
||||
/*out2fmt_flush("*** calling popstring: restoring to '%s'\n", parsenextc);*/
|
||||
if (sp->ap)
|
||||
sp->ap->flag &= ~ALIASINUSE;
|
||||
parsefile->strpush = sp->prev;
|
||||
if (sp != &(parsefile->basestrpush))
|
||||
ckfree(sp);
|
||||
|
@ -682,6 +682,12 @@ makebinary(int type, union node *n1, union node *n2)
|
||||
return (n);
|
||||
}
|
||||
|
||||
void
|
||||
forcealias(void)
|
||||
{
|
||||
checkkwd |= CHKALIAS;
|
||||
}
|
||||
|
||||
void
|
||||
fixredir(union node *n, const char *text, int err)
|
||||
{
|
||||
|
@ -76,6 +76,7 @@ extern const char *const parsekwd[];
|
||||
|
||||
|
||||
union node *parsecmd(int);
|
||||
void forcealias(void);
|
||||
void fixredir(union node *, const char *, int);
|
||||
int goodname(const char *);
|
||||
int isassignment(const char *);
|
||||
|
16
bin/sh/sh.1
16
bin/sh/sh.1
@ -32,7 +32,7 @@
|
||||
.\" from: @(#)sh.1 8.6 (Berkeley) 5/4/95
|
||||
.\" $FreeBSD$
|
||||
.\"
|
||||
.Dd January 3, 2014
|
||||
.Dd January 26, 2014
|
||||
.Dt SH 1
|
||||
.Os
|
||||
.Sh NAME
|
||||
@ -533,6 +533,20 @@ would become
|
||||
.Pp
|
||||
.Dl "ls -F foobar"
|
||||
.Pp
|
||||
Aliases are also recognized after an alias
|
||||
whose value ends with a space or tab.
|
||||
For example, if there is also an alias called
|
||||
.Dq Li nohup
|
||||
with the value
|
||||
.Dq Li "nohup " ,
|
||||
then the input
|
||||
.Pp
|
||||
.Dl "nohup lf foobar"
|
||||
.Pp
|
||||
would become
|
||||
.Pp
|
||||
.Dl "nohup ls -F foobar"
|
||||
.Pp
|
||||
Aliases provide a convenient way for naive users to
|
||||
create shorthands for commands without having to learn how
|
||||
to create functions with arguments.
|
||||
|
@ -16,6 +16,10 @@ FILES+= alias8.0
|
||||
FILES+= alias9.0
|
||||
FILES+= alias10.0
|
||||
FILES+= alias11.0
|
||||
FILES+= alias12.0
|
||||
FILES+= alias13.0
|
||||
FILES+= alias14.0
|
||||
FILES+= alias15.0 alias15.0.stdout
|
||||
FILES+= and-pipe-not.0
|
||||
FILES+= case1.0
|
||||
FILES+= case2.0
|
||||
|
6
bin/sh/tests/parser/alias12.0
Normal file
6
bin/sh/tests/parser/alias12.0
Normal file
@ -0,0 +1,6 @@
|
||||
# $FreeBSD$
|
||||
|
||||
unalias -a
|
||||
alias alias0=command
|
||||
alias true='echo bad'
|
||||
eval 'alias0 true'
|
6
bin/sh/tests/parser/alias13.0
Normal file
6
bin/sh/tests/parser/alias13.0
Normal file
@ -0,0 +1,6 @@
|
||||
# $FreeBSD$
|
||||
|
||||
unalias -a
|
||||
alias command=command
|
||||
alias true='echo bad'
|
||||
eval 'command true'
|
6
bin/sh/tests/parser/alias14.0
Normal file
6
bin/sh/tests/parser/alias14.0
Normal file
@ -0,0 +1,6 @@
|
||||
# $FreeBSD$
|
||||
|
||||
alias command='command '
|
||||
alias alias0=exit
|
||||
eval 'command alias0 0'
|
||||
exit 3
|
12
bin/sh/tests/parser/alias15.0
Normal file
12
bin/sh/tests/parser/alias15.0
Normal file
@ -0,0 +1,12 @@
|
||||
# $FreeBSD$
|
||||
|
||||
f_echoanddo() {
|
||||
printf '%s\n' "$*"
|
||||
"$@"
|
||||
}
|
||||
|
||||
alias echoanddo='f_echoanddo '
|
||||
alias alias0='echo test2'
|
||||
eval 'echoanddo echo test1'
|
||||
eval 'echoanddo alias0'
|
||||
exit 0
|
4
bin/sh/tests/parser/alias15.0.stdout
Normal file
4
bin/sh/tests/parser/alias15.0.stdout
Normal file
@ -0,0 +1,4 @@
|
||||
echo test1
|
||||
test1
|
||||
echo test2
|
||||
test2
|
@ -1827,7 +1827,7 @@ md_assemble (line)
|
||||
{
|
||||
expressionS *exp;
|
||||
|
||||
if ((i.tm.cpu_flags & CpuSSE3) && i.operands > 0)
|
||||
if ((i.tm.cpu_flags & (CpuSSE3|CpuSMAP)) && i.operands > 0)
|
||||
{
|
||||
/* Streaming SIMD extensions 3 Instructions have the fixed
|
||||
operands with an opcode suffix which is coded in the same
|
||||
|
@ -6257,6 +6257,16 @@ PNI_Fixup (int extrachar ATTRIBUTE_UNUSED, int sizeflag)
|
||||
|
||||
codep++;
|
||||
}
|
||||
else if (modrm.mod == 3 && modrm.reg == 1 && modrm.rm <= 3)
|
||||
{
|
||||
size_t olen = strlen (obuf);
|
||||
char *p = obuf + olen - 4;
|
||||
if (*codep == 0xca)
|
||||
strcpy (p, "clac");
|
||||
else if (*codep == 0xcb)
|
||||
strcpy (p, "stac");
|
||||
codep++;
|
||||
}
|
||||
else
|
||||
OP_M (0, sizeflag);
|
||||
}
|
||||
|
@ -80,6 +80,7 @@ typedef struct template
|
||||
|
||||
#define CpuPCLMUL 0x10000000 /* Carry-less Multiplication extensions */
|
||||
#define CpuRdRnd 0x20000000 /* Intel Random Number Generator extensions */
|
||||
#define CpuSMAP 0x40000000 /* Intel Supervisor Mode Access Prevention */
|
||||
|
||||
/* SSE4.1/4.2 Instructions required */
|
||||
#define CpuSSE4 (CpuSSE4_1|CpuSSE4_2)
|
||||
@ -88,7 +89,7 @@ typedef struct template
|
||||
#define CpuUnknownFlags (Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|Cpu686 \
|
||||
|CpuP4|CpuSledgehammer|CpuMMX|CpuMMX2|CpuSSE|CpuSSE2|CpuSSE3|CpuVMX \
|
||||
|Cpu3dnow|Cpu3dnowA|CpuK6|CpuPadLock|CpuSVME|CpuSSSE3|CpuSSE4_1 \
|
||||
|CpuSSE4_2|CpuABM|CpuSSE4a|CpuXSAVE|CpuAES|CpuPCLMUL|CpuRdRnd)
|
||||
|CpuSSE4_2|CpuABM|CpuSSE4a|CpuXSAVE|CpuAES|CpuPCLMUL|CpuRdRnd|CpuSMAP)
|
||||
|
||||
/* the bits in opcode_modifier are used to generate the final opcode from
|
||||
the base_opcode. These bits also are used to detect alternate forms of
|
||||
|
@ -4379,6 +4379,12 @@ const template i386_optab[] =
|
||||
{"rdrand", 1, 0x0fc7, 0x6, CpuRdRnd,
|
||||
Modrm|NoSuf,
|
||||
{ Reg16|Reg32|Reg64 } },
|
||||
|
||||
/* Intel Supervisor Mode Access Prevention extensions */
|
||||
{"clac", 0, 0x0f01, 0xca, CpuSMAP,
|
||||
NoSuf|ImmExt, { 0, 0, 0 } },
|
||||
{"stac", 0, 0x0f01, 0xcb, CpuSMAP,
|
||||
NoSuf|ImmExt, { 0, 0, 0 } },
|
||||
|
||||
{ NULL, 0, 0, 0, 0, 0, { 0 } }
|
||||
};
|
||||
|
@ -1,3 +1,37 @@
|
||||
2014-01-03 Simon J. Gerraty <sjg@bad.crufty.net>
|
||||
|
||||
* boot-strap: ignore mksrc=none
|
||||
|
||||
2014-01-02 Simon J. Gerraty <sjg@bad.crufty.net>
|
||||
|
||||
* Makefile (DEFAULT_SYS_PATH?): use just ${prefix}/share/mk
|
||||
|
||||
2014-01-01 Simon J. Gerraty <sjg@bad.crufty.net>
|
||||
|
||||
* Makefile (MAKE_VERSION): 20140101
|
||||
* configure.in: set bmake_path_max to min(_SC_PATH_MAX,1024)
|
||||
* Makefile.config: defined BMAKE_PATH_MAX to bmake_path_max
|
||||
* make.h: use BMAKE_PATH_MAX if MAXPATHLEN not defined (needed for
|
||||
Hurd)
|
||||
* configure.in: Add AC_PREREQ and check for
|
||||
sysctl; patch from Andrew Shadura andrewsh at debian.org
|
||||
|
||||
2013-10-16 Simon J. Gerraty <sjg@bad.crufty.net>
|
||||
|
||||
* Makefile (MAKE_VERSION): 20131010
|
||||
* lose the const from arg to systcl to avoid problems on older BSDs.
|
||||
|
||||
2013-10-01 Simon J. Gerraty <sjg@bad.crufty.net>
|
||||
|
||||
* Makefile (MAKE_VERSION): 20131001
|
||||
Merge with NetBSD make, pick up
|
||||
o main.c: for NATIVE build sysctl to get MACHINE_ARCH from
|
||||
hw.machine_arch if necessary.
|
||||
o meta.c: meta_oodate - need to look at src of Link and target
|
||||
of Move as well.
|
||||
* main.c: check that CTL_HW and HW_MACHINE_ARCH exist.
|
||||
provide __arraycount() if needed.
|
||||
|
||||
2013-09-04 Simon J. Gerraty <sjg@bad.crufty.net>
|
||||
|
||||
* Makefile (MAKE_VERSION): 20130904
|
||||
|
@ -1,7 +1,7 @@
|
||||
# $Id: Makefile,v 1.20 2013/09/04 15:42:03 sjg Exp $
|
||||
# $Id: Makefile,v 1.23 2014/01/02 22:20:52 sjg Exp $
|
||||
|
||||
# Base version on src date
|
||||
MAKE_VERSION= 20130904
|
||||
MAKE_VERSION= 20140101
|
||||
|
||||
PROG= bmake
|
||||
|
||||
@ -68,7 +68,7 @@ SRCS+= ${LIBOBJS:T:.o=.c}
|
||||
prefix?= /usr
|
||||
srcdir?= ${.CURDIR}
|
||||
|
||||
DEFAULT_SYS_PATH?= .../share/mk:${prefix}/share/mk
|
||||
DEFAULT_SYS_PATH?= ${prefix}/share/mk
|
||||
|
||||
CPPFLAGS+= -DUSE_META
|
||||
CFLAGS+= ${CPPFLAGS}
|
||||
|
@ -14,3 +14,7 @@ LIBOBJS= @LIBOBJS@
|
||||
LDADD= @LIBS@
|
||||
USE_META= @use_meta@
|
||||
FILEMON_H= @filemon_h@
|
||||
BMAKE_PATH_MAX?= @bmake_path_max@
|
||||
# used if MAXPATHLEN not defined
|
||||
CPPFLAGS+= -DBMAKE_PATH_MAX=${BMAKE_PATH_MAX}
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
.\" $NetBSD: make.1,v 1.222 2013/08/11 09:53:49 apb Exp $
|
||||
.\" $NetBSD: make.1,v 1.226 2013/11/07 18:50:46 dholland Exp $
|
||||
.\"
|
||||
.\" Copyright (c) 1990, 1993
|
||||
.\" The Regents of the University of California. All rights reserved.
|
||||
@ -29,7 +29,7 @@
|
||||
.\"
|
||||
.\" from: @(#)make.1 8.4 (Berkeley) 3/19/94
|
||||
.\"
|
||||
.Dd August 11, 2013
|
||||
.Dd October 25, 2013
|
||||
.Dt MAKE 1
|
||||
.Os
|
||||
.Sh NAME
|
||||
@ -745,7 +745,7 @@ then output for each target is prefixed with a token
|
||||
.Ql --- target ---
|
||||
the first part of which can be controlled via
|
||||
.Va .MAKE.JOB.PREFIX .
|
||||
If
|
||||
If
|
||||
.Va .MAKE.JOB.PREFIX
|
||||
is empty, no token is printed.
|
||||
.br
|
||||
@ -1066,6 +1066,13 @@ may
|
||||
be used.
|
||||
The wildcard characters may be escaped with a backslash
|
||||
.Pq Ql \e .
|
||||
As a consequence of the way values are split into words, matched,
|
||||
and then joined, a construct like
|
||||
.Dl ${VAR:M*}
|
||||
will normalise the inter-word spacing, removing all leading and
|
||||
trailing space, and converting multiple consecutive spaces
|
||||
to single spaces.
|
||||
.
|
||||
.It Cm \&:N Ns Ar pattern
|
||||
This is identical to
|
||||
.Ql Cm \&:M ,
|
||||
@ -1209,7 +1216,7 @@ The
|
||||
modifier is just like the
|
||||
.Cm \&:S
|
||||
modifier except that the old and new strings, instead of being
|
||||
simple strings, are a regular expression (see
|
||||
simple strings, are an extended regular expression (see
|
||||
.Xr regex 3 )
|
||||
string
|
||||
.Ar pattern
|
||||
@ -1751,7 +1758,7 @@ or
|
||||
.Fl t
|
||||
options were specified.
|
||||
Normally used to mark recursive
|
||||
.Nm Ns 's .
|
||||
.Nm Ns s .
|
||||
.It Ic .META
|
||||
Create a meta file for the target, even if it is flagged as
|
||||
.Ic .PHONY ,
|
||||
|
@ -690,7 +690,13 @@ VVAARRIIAABBLLEE AASSSSIIGGNNMMEENNTTSS
|
||||
::MM_p_a_t_t_e_r_n
|
||||
Select only those words that match _p_a_t_t_e_r_n. The standard shell
|
||||
wildcard characters (`*', `?', and `[]') may be used. The wildcard
|
||||
characters may be escaped with a backslash (`\').
|
||||
characters may be escaped with a backslash (`\'). As a consequence
|
||||
of the way values are split into words, matched, and then joined, a
|
||||
construct like
|
||||
${VAR:M*}
|
||||
will normalise the inter-word spacing, removing all leading and
|
||||
trailing space, and converting multiple consecutive spaces to single
|
||||
spaces.
|
||||
|
||||
::NN_p_a_t_t_e_r_n
|
||||
This is identical to `::MM', but selects all words which do not match
|
||||
@ -777,18 +783,18 @@ VVAARRIIAABBLLEE AASSSSIIGGNNMMEENNTTSS
|
||||
|
||||
::CC/_p_a_t_t_e_r_n/_r_e_p_l_a_c_e_m_e_n_t/[11ggWW]
|
||||
The ::CC modifier is just like the ::SS modifier except that the old and
|
||||
new strings, instead of being simple strings, are a regular expres-
|
||||
sion (see regex(3)) string _p_a_t_t_e_r_n and an ed(1)-style string
|
||||
_r_e_p_l_a_c_e_m_e_n_t. Normally, the first occurrence of the pattern _p_a_t_t_e_r_n
|
||||
in each word of the value is substituted with _r_e_p_l_a_c_e_m_e_n_t. The `1'
|
||||
modifier causes the substitution to apply to at most one word; the
|
||||
`g' modifier causes the substitution to apply to as many instances
|
||||
of the search pattern _p_a_t_t_e_r_n as occur in the word or words it is
|
||||
found in; the `W' modifier causes the value to be treated as a sin-
|
||||
gle word (possibly containing embedded white space). Note that `1'
|
||||
and `g' are orthogonal; the former specifies whether multiple words
|
||||
are potentially affected, the latter whether multiple substitutions
|
||||
can potentially occur within each affected word.
|
||||
new strings, instead of being simple strings, are an extended regu-
|
||||
lar expression (see regex(3)) string _p_a_t_t_e_r_n and an ed(1)-style
|
||||
string _r_e_p_l_a_c_e_m_e_n_t. Normally, the first occurrence of the pattern
|
||||
_p_a_t_t_e_r_n in each word of the value is substituted with _r_e_p_l_a_c_e_m_e_n_t.
|
||||
The `1' modifier causes the substitution to apply to at most one
|
||||
word; the `g' modifier causes the substitution to apply to as many
|
||||
instances of the search pattern _p_a_t_t_e_r_n as occur in the word or
|
||||
words it is found in; the `W' modifier causes the value to be
|
||||
treated as a single word (possibly containing embedded white space).
|
||||
Note that `1' and `g' are orthogonal; the former specifies whether
|
||||
multiple words are potentially affected, the latter whether multiple
|
||||
substitutions can potentially occur within each affected word.
|
||||
|
||||
::TT Replaces each word in the variable with its last component.
|
||||
|
||||
@ -1107,7 +1113,7 @@ SSPPEECCIIAALL SSOOUURRCCEESS ((AATTTTRRIIBBUUTTEESS))
|
||||
|
||||
..MMAAKKEE Execute the commands associated with this target even if the --nn
|
||||
or --tt options were specified. Normally used to mark recursive
|
||||
bbmmaakkee's.
|
||||
bbmmaakkees.
|
||||
|
||||
..MMEETTAA Create a meta file for the target, even if it is flagged as
|
||||
..PPHHOONNYY, ..MMAAKKEE, or ..SSPPEECCIIAALL. Usage in conjunction with ..MMAAKKEE is
|
||||
@ -1378,4 +1384,4 @@ BBUUGGSS
|
||||
|
||||
There is no way of escaping a space character in a filename.
|
||||
|
||||
NetBSD 5.1 August 11, 2013 NetBSD 5.1
|
||||
NetBSD 5.1 October 25, 2013 NetBSD 5.1
|
||||
|
@ -111,7 +111,7 @@
|
||||
# Simon J. Gerraty <sjg@crufty.net>
|
||||
|
||||
# RCSid:
|
||||
# $Id: boot-strap,v 1.43 2013/03/02 18:55:23 sjg Exp $
|
||||
# $Id: boot-strap,v 1.44 2014/01/08 14:49:10 sjg Exp $
|
||||
#
|
||||
# @(#) Copyright (c) 2001 Simon J. Gerraty
|
||||
#
|
||||
@ -216,11 +216,9 @@ do
|
||||
--share=*) share_dir=`get_optarg "$1"`;;
|
||||
--share) share_dir="$2"; shift;;
|
||||
--with-default-sys-path=*)
|
||||
CONFIGURE_ARGS="$1"
|
||||
MAKESYSPATH=`get_optarg "$1"`;;
|
||||
CONFIGURE_ARGS="$1";;
|
||||
--with-default-sys-path)
|
||||
CONFIGURE_ARGS="$1 $2"
|
||||
MAKESYSPATH="$2"; shift;;
|
||||
CONFIGURE_ARGS="$1 $2";;
|
||||
--install) INSTALL_PREFIX=${INSTALL_PREFIX:-$prefix};;
|
||||
--install-host-target)
|
||||
INSTALL_PREFIX=${INSTALL_PREFIX:-$prefix}
|
||||
@ -330,8 +328,8 @@ add_path () {
|
||||
srcdir=`GetDir /bmake make-bootstrap.sh.in "$srcdir" "$2" "$Mydir" ./bmake* "$Mydir"/../bmake*`
|
||||
[ -d "${srcdir:-/dev/null}" ] || Usage
|
||||
case "$mksrc" in
|
||||
none|-) # we don't want it
|
||||
mksrc=
|
||||
none|-) # we ignore this now
|
||||
mksrc=$Mydir/mk
|
||||
;;
|
||||
.../*) # find here or above
|
||||
mksrc=`FindHereOrAbove -C "$Mydir" -s "$mksrc/sys.mk"`
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: compat.c,v 1.93 2013/09/02 19:26:42 sjg Exp $ */
|
||||
/* $NetBSD: compat.c,v 1.94 2014/01/03 00:02:01 sjg Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1988, 1989, 1990 The Regents of the University of California.
|
||||
@ -70,14 +70,14 @@
|
||||
*/
|
||||
|
||||
#ifndef MAKE_NATIVE
|
||||
static char rcsid[] = "$NetBSD: compat.c,v 1.93 2013/09/02 19:26:42 sjg Exp $";
|
||||
static char rcsid[] = "$NetBSD: compat.c,v 1.94 2014/01/03 00:02:01 sjg Exp $";
|
||||
#else
|
||||
#include <sys/cdefs.h>
|
||||
#ifndef lint
|
||||
#if 0
|
||||
static char sccsid[] = "@(#)compat.c 8.2 (Berkeley) 3/19/94";
|
||||
#else
|
||||
__RCSID("$NetBSD: compat.c,v 1.93 2013/09/02 19:26:42 sjg Exp $");
|
||||
__RCSID("$NetBSD: compat.c,v 1.94 2014/01/03 00:02:01 sjg Exp $");
|
||||
#endif
|
||||
#endif /* not lint */
|
||||
#endif
|
||||
@ -133,7 +133,7 @@ Compat_Init(void)
|
||||
|
||||
Shell_Init(); /* setup default shell */
|
||||
|
||||
for (cp = "#=|^(){};&<>*?[]:$`\\\n"; *cp != '\0'; cp++) {
|
||||
for (cp = "~#=|^(){};&<>*?[]:$`\\\n"; *cp != '\0'; cp++) {
|
||||
meta[(unsigned char) *cp] = 1;
|
||||
}
|
||||
/*
|
||||
|
31
contrib/bmake/configure
vendored
31
contrib/bmake/configure
vendored
@ -1,6 +1,6 @@
|
||||
#! /bin/sh
|
||||
# Guess values for system-dependent variables and create Makefiles.
|
||||
# Generated by GNU Autoconf 2.64 for bmake 20130706.
|
||||
# Generated by GNU Autoconf 2.64 for bmake 20140101.
|
||||
#
|
||||
# Report bugs to <sjg@NetBSD.org>.
|
||||
#
|
||||
@ -549,8 +549,8 @@ MAKEFLAGS=
|
||||
# Identity of this package.
|
||||
PACKAGE_NAME='bmake'
|
||||
PACKAGE_TARNAME='bmake'
|
||||
PACKAGE_VERSION='20130706'
|
||||
PACKAGE_STRING='bmake 20130706'
|
||||
PACKAGE_VERSION='20140101'
|
||||
PACKAGE_STRING='bmake 20140101'
|
||||
PACKAGE_BUGREPORT='sjg@NetBSD.org'
|
||||
PACKAGE_URL=''
|
||||
|
||||
@ -602,6 +602,7 @@ machine_arch
|
||||
force_machine
|
||||
machine
|
||||
LIBOBJS
|
||||
bmake_path_max
|
||||
ac_exe_suffix
|
||||
INSTALL_DATA
|
||||
INSTALL_SCRIPT
|
||||
@ -1220,7 +1221,7 @@ if test "$ac_init_help" = "long"; then
|
||||
# Omit some internal or obsolete options to make the list less imposing.
|
||||
# This message is too long to be a string in the A/UX 3.1 sh.
|
||||
cat <<_ACEOF
|
||||
\`configure' configures bmake 20130706 to adapt to many kinds of systems.
|
||||
\`configure' configures bmake 20140101 to adapt to many kinds of systems.
|
||||
|
||||
Usage: $0 [OPTION]... [VAR=VALUE]...
|
||||
|
||||
@ -1281,7 +1282,7 @@ fi
|
||||
|
||||
if test -n "$ac_init_help"; then
|
||||
case $ac_init_help in
|
||||
short | recursive ) echo "Configuration of bmake 20130706:";;
|
||||
short | recursive ) echo "Configuration of bmake 20140101:";;
|
||||
esac
|
||||
cat <<\_ACEOF
|
||||
|
||||
@ -1386,7 +1387,7 @@ fi
|
||||
test -n "$ac_init_help" && exit $ac_status
|
||||
if $ac_init_version; then
|
||||
cat <<\_ACEOF
|
||||
bmake configure 20130706
|
||||
bmake configure 20140101
|
||||
generated by GNU Autoconf 2.64
|
||||
|
||||
Copyright (C) 2009 Free Software Foundation, Inc.
|
||||
@ -1907,7 +1908,7 @@ cat >config.log <<_ACEOF
|
||||
This file contains any messages produced by compilers while
|
||||
running configure, to aid debugging if configure makes a mistake.
|
||||
|
||||
It was created by bmake $as_me 20130706, which was
|
||||
It was created by bmake $as_me 20140101, which was
|
||||
generated by GNU Autoconf 2.64. Invocation command line was
|
||||
|
||||
$ $0 $@
|
||||
@ -4244,7 +4245,15 @@ test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
|
||||
|
||||
test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
|
||||
|
||||
|
||||
if test -x /usr/bin/getconf; then
|
||||
bmake_path_max=`getconf PATH_MAX / 2> /dev/null`
|
||||
fi
|
||||
bmake_path_max=${bmake_path_max:-1024}
|
||||
if test $bmake_path_max -gt 1024; then
|
||||
# this is all we expect
|
||||
bmake_path_max=1024
|
||||
fi
|
||||
echo "Using: BMAKE_PATH_MAX=$bmake_path_max" >&6
|
||||
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
|
||||
$as_echo_n "checking for ANSI C header files... " >&6; }
|
||||
@ -4569,6 +4578,7 @@ for ac_header in \
|
||||
sys/mman.h \
|
||||
sys/select.h \
|
||||
sys/socket.h \
|
||||
sys/sysctl.h \
|
||||
sys/time.h \
|
||||
sys/uio.h \
|
||||
unistd.h \
|
||||
@ -5435,6 +5445,7 @@ for ac_func in \
|
||||
strsep \
|
||||
strtod \
|
||||
strtol \
|
||||
sysctl \
|
||||
unsetenv \
|
||||
vsnprintf \
|
||||
wait3 \
|
||||
@ -6367,7 +6378,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
|
||||
# report actual input values of CONFIG_FILES etc. instead of their
|
||||
# values after options handling.
|
||||
ac_log="
|
||||
This file was extended by bmake $as_me 20130706, which was
|
||||
This file was extended by bmake $as_me 20140101, which was
|
||||
generated by GNU Autoconf 2.64. Invocation command line was
|
||||
|
||||
CONFIG_FILES = $CONFIG_FILES
|
||||
@ -6427,7 +6438,7 @@ Report bugs to <sjg@NetBSD.org>."
|
||||
_ACEOF
|
||||
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
|
||||
ac_cs_version="\\
|
||||
bmake config.status 20130706
|
||||
bmake config.status 20140101
|
||||
configured by $0, generated by GNU Autoconf 2.64,
|
||||
with options \\"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\"
|
||||
|
||||
|
@ -1,10 +1,11 @@
|
||||
dnl
|
||||
dnl RCSid:
|
||||
dnl $Id: configure.in,v 1.49 2013/07/06 18:25:19 sjg Exp $
|
||||
dnl $Id: configure.in,v 1.51 2014/01/02 22:20:52 sjg Exp $
|
||||
dnl
|
||||
dnl Process this file with autoconf to produce a configure script
|
||||
dnl
|
||||
AC_INIT([bmake], [20130706], [sjg@NetBSD.org])
|
||||
AC_PREREQ(2.50)
|
||||
AC_INIT([bmake], [20140101], [sjg@NetBSD.org])
|
||||
AC_CONFIG_HEADER(config.h)
|
||||
|
||||
dnl make srcdir absolute
|
||||
@ -77,7 +78,18 @@ AC_PROG_GCC_TRADITIONAL
|
||||
AC_PROG_INSTALL
|
||||
dnl Executable suffix - normally empty; .exe on os2.
|
||||
AC_SUBST(ac_exe_suffix)dnl
|
||||
|
||||
dnl
|
||||
dnl Hurd refuses to define PATH_MAX or MAXPATHLEN
|
||||
if test -x /usr/bin/getconf; then
|
||||
bmake_path_max=`getconf PATH_MAX / 2> /dev/null`
|
||||
fi
|
||||
bmake_path_max=${bmake_path_max:-1024}
|
||||
if test $bmake_path_max -gt 1024; then
|
||||
# this is all we expect
|
||||
bmake_path_max=1024
|
||||
fi
|
||||
echo "Using: BMAKE_PATH_MAX=$bmake_path_max" >&6
|
||||
AC_SUBST(bmake_path_max)dnl
|
||||
dnl
|
||||
dnl AC_C_CROSS
|
||||
dnl
|
||||
@ -98,6 +110,7 @@ AC_CHECK_HEADERS( \
|
||||
sys/mman.h \
|
||||
sys/select.h \
|
||||
sys/socket.h \
|
||||
sys/sysctl.h \
|
||||
sys/time.h \
|
||||
sys/uio.h \
|
||||
unistd.h \
|
||||
@ -159,6 +172,7 @@ AC_CHECK_FUNCS( \
|
||||
strsep \
|
||||
strtod \
|
||||
strtol \
|
||||
sysctl \
|
||||
unsetenv \
|
||||
vsnprintf \
|
||||
wait3 \
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: hash.c,v 1.19 2009/01/24 10:59:09 dsl Exp $ */
|
||||
/* $NetBSD: hash.c,v 1.20 2013/11/14 00:27:05 sjg Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1988, 1989, 1990 The Regents of the University of California.
|
||||
@ -70,14 +70,14 @@
|
||||
*/
|
||||
|
||||
#ifndef MAKE_NATIVE
|
||||
static char rcsid[] = "$NetBSD: hash.c,v 1.19 2009/01/24 10:59:09 dsl Exp $";
|
||||
static char rcsid[] = "$NetBSD: hash.c,v 1.20 2013/11/14 00:27:05 sjg Exp $";
|
||||
#else
|
||||
#include <sys/cdefs.h>
|
||||
#ifndef lint
|
||||
#if 0
|
||||
static char sccsid[] = "@(#)hash.c 8.1 (Berkeley) 6/6/93";
|
||||
#else
|
||||
__RCSID("$NetBSD: hash.c,v 1.19 2009/01/24 10:59:09 dsl Exp $");
|
||||
__RCSID("$NetBSD: hash.c,v 1.20 2013/11/14 00:27:05 sjg Exp $");
|
||||
#endif
|
||||
#endif /* not lint */
|
||||
#endif
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: lstMember.c,v 1.13 2009/01/23 21:26:30 dsl Exp $ */
|
||||
/* $NetBSD: lstMember.c,v 1.14 2013/11/14 00:01:28 sjg Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1988, 1989, 1990, 1993
|
||||
@ -33,14 +33,14 @@
|
||||
*/
|
||||
|
||||
#ifndef MAKE_NATIVE
|
||||
static char rcsid[] = "$NetBSD: lstMember.c,v 1.13 2009/01/23 21:26:30 dsl Exp $";
|
||||
static char rcsid[] = "$NetBSD: lstMember.c,v 1.14 2013/11/14 00:01:28 sjg Exp $";
|
||||
#else
|
||||
#include <sys/cdefs.h>
|
||||
#ifndef lint
|
||||
#if 0
|
||||
static char sccsid[] = "@(#)lstMember.c 8.1 (Berkeley) 6/6/93";
|
||||
#else
|
||||
__RCSID("$NetBSD: lstMember.c,v 1.13 2009/01/23 21:26:30 dsl Exp $");
|
||||
__RCSID("$NetBSD: lstMember.c,v 1.14 2013/11/14 00:01:28 sjg Exp $");
|
||||
#endif
|
||||
#endif /* not lint */
|
||||
#endif
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: main.c,v 1.224 2013/09/04 15:38:26 sjg Exp $ */
|
||||
/* $NetBSD: main.c,v 1.225 2013/09/14 15:09:34 matt Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1988, 1989, 1990, 1993
|
||||
@ -69,7 +69,7 @@
|
||||
*/
|
||||
|
||||
#ifndef MAKE_NATIVE
|
||||
static char rcsid[] = "$NetBSD: main.c,v 1.224 2013/09/04 15:38:26 sjg Exp $";
|
||||
static char rcsid[] = "$NetBSD: main.c,v 1.225 2013/09/14 15:09:34 matt Exp $";
|
||||
#else
|
||||
#include <sys/cdefs.h>
|
||||
#ifndef lint
|
||||
@ -81,7 +81,7 @@ __COPYRIGHT("@(#) Copyright (c) 1988, 1989, 1990, 1993\
|
||||
#if 0
|
||||
static char sccsid[] = "@(#)main.c 8.3 (Berkeley) 3/19/94";
|
||||
#else
|
||||
__RCSID("$NetBSD: main.c,v 1.224 2013/09/04 15:38:26 sjg Exp $");
|
||||
__RCSID("$NetBSD: main.c,v 1.225 2013/09/14 15:09:34 matt Exp $");
|
||||
#endif
|
||||
#endif /* not lint */
|
||||
#endif
|
||||
@ -118,6 +118,9 @@ __RCSID("$NetBSD: main.c,v 1.224 2013/09/04 15:38:26 sjg Exp $");
|
||||
#include <sys/param.h>
|
||||
#include <sys/resource.h>
|
||||
#include <sys/stat.h>
|
||||
#if defined(MAKE_NATIVE) && defined(HAVE_SYSCTL)
|
||||
#include <sys/sysctl.h>
|
||||
#endif
|
||||
#include <sys/utsname.h>
|
||||
#include "wait.h"
|
||||
|
||||
@ -145,6 +148,10 @@ __RCSID("$NetBSD: main.c,v 1.224 2013/09/04 15:38:26 sjg Exp $");
|
||||
#define DEFMAXLOCAL DEFMAXJOBS
|
||||
#endif /* DEFMAXLOCAL */
|
||||
|
||||
#ifndef __arraycount
|
||||
# define __arraycount(__x) (sizeof(__x) / sizeof(__x[0]))
|
||||
#endif
|
||||
|
||||
Lst create; /* Targets to be made */
|
||||
time_t now; /* Time at start of make */
|
||||
GNode *DEFAULT; /* .DEFAULT node */
|
||||
@ -910,6 +917,20 @@ main(int argc, char **argv)
|
||||
}
|
||||
|
||||
if (!machine_arch) {
|
||||
#if defined(MAKE_NATIVE) && defined(HAVE_SYSCTL) && defined(CTL_HW) && defined(HW_MACHINE_ARCH)
|
||||
static char machine_arch_buf[sizeof(utsname.machine)];
|
||||
int mib[2] = { CTL_HW, HW_MACHINE_ARCH };
|
||||
size_t len = sizeof(machine_arch_buf);
|
||||
|
||||
if (sysctl(mib, __arraycount(mib), machine_arch_buf,
|
||||
&len, NULL, 0) < 0) {
|
||||
(void)fprintf(stderr, "%s: sysctl failed (%s).\n", progname,
|
||||
strerror(errno));
|
||||
exit(2);
|
||||
}
|
||||
|
||||
machine_arch = machine_arch_buf;
|
||||
#else
|
||||
#ifndef MACHINE_ARCH
|
||||
#ifdef MAKE_MACHINE_ARCH
|
||||
machine_arch = MAKE_MACHINE_ARCH;
|
||||
@ -918,6 +939,7 @@ main(int argc, char **argv)
|
||||
#endif
|
||||
#else
|
||||
machine_arch = MACHINE_ARCH;
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -11,7 +11,7 @@ yes) XDEFS="-DUSE_META ${XDEFS}";;
|
||||
esac
|
||||
|
||||
CC="@CC@"
|
||||
CFLAGS="@CFLAGS@ -I. -I${srcdir} @DEFS@ @CPPFLAGS@ -DMAKE_NATIVE ${XDEFS}"
|
||||
CFLAGS="@CFLAGS@ -I. -I${srcdir} @DEFS@ @CPPFLAGS@ -DMAKE_NATIVE ${XDEFS} -DBMAKE_PATH_MAX=@bmake_path_max@"
|
||||
|
||||
MAKE_VERSION=`sed -n '/^MAKE_VERSION=/s,.*=[^0-9]*,,p' $srcdir/Makefile`
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
.\" $NetBSD: make.1,v 1.222 2013/08/11 09:53:49 apb Exp $
|
||||
.\" $NetBSD: make.1,v 1.226 2013/11/07 18:50:46 dholland Exp $
|
||||
.\"
|
||||
.\" Copyright (c) 1990, 1993
|
||||
.\" The Regents of the University of California. All rights reserved.
|
||||
@ -29,7 +29,7 @@
|
||||
.\"
|
||||
.\" from: @(#)make.1 8.4 (Berkeley) 3/19/94
|
||||
.\"
|
||||
.Dd August 11, 2013
|
||||
.Dd October 25, 2013
|
||||
.Dt MAKE 1
|
||||
.Os
|
||||
.Sh NAME
|
||||
@ -756,7 +756,7 @@ then output for each target is prefixed with a token
|
||||
.Ql --- target ---
|
||||
the first part of which can be controlled via
|
||||
.Va .MAKE.JOB.PREFIX .
|
||||
If
|
||||
If
|
||||
.Va .MAKE.JOB.PREFIX
|
||||
is empty, no token is printed.
|
||||
.br
|
||||
@ -1077,6 +1077,13 @@ may
|
||||
be used.
|
||||
The wildcard characters may be escaped with a backslash
|
||||
.Pq Ql \e .
|
||||
As a consequence of the way values are split into words, matched,
|
||||
and then joined, a construct like
|
||||
.Dl ${VAR:M*}
|
||||
will normalise the inter-word spacing, removing all leading and
|
||||
trailing space, and converting multiple consecutive spaces
|
||||
to single spaces.
|
||||
.
|
||||
.It Cm \&:N Ns Ar pattern
|
||||
This is identical to
|
||||
.Ql Cm \&:M ,
|
||||
@ -1220,7 +1227,7 @@ The
|
||||
modifier is just like the
|
||||
.Cm \&:S
|
||||
modifier except that the old and new strings, instead of being
|
||||
simple strings, are a regular expression (see
|
||||
simple strings, are an extended regular expression (see
|
||||
.Xr regex 3 )
|
||||
string
|
||||
.Ar pattern
|
||||
@ -1762,7 +1769,7 @@ or
|
||||
.Fl t
|
||||
options were specified.
|
||||
Normally used to mark recursive
|
||||
.Nm Ns 's .
|
||||
.Nm Ns s .
|
||||
.It Ic .META
|
||||
Create a meta file for the target, even if it is flagged as
|
||||
.Ic .PHONY ,
|
||||
|
@ -518,4 +518,8 @@ int str2Lst_Append(Lst, char *, const char *);
|
||||
#define MAX(a, b) ((a > b) ? a : b)
|
||||
#endif
|
||||
|
||||
#ifndef MAXPATHLEN
|
||||
#define MAXPATHLEN BMAKE_PATH_MAX
|
||||
#endif
|
||||
|
||||
#endif /* _MAKE_H_ */
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: meta.c,v 1.32 2013/06/25 00:20:54 sjg Exp $ */
|
||||
/* $NetBSD: meta.c,v 1.33 2013/10/01 05:37:17 sjg Exp $ */
|
||||
|
||||
/*
|
||||
* Implement 'meta' mode.
|
||||
@ -860,6 +860,13 @@ string_match(const void *p, const void *q)
|
||||
continue; \
|
||||
}
|
||||
|
||||
#define DEQUOTE(p) if (*p == '\'') { \
|
||||
char *ep; \
|
||||
p++; \
|
||||
if ((ep = strchr(p, '\''))) \
|
||||
*ep = '\0'; \
|
||||
}
|
||||
|
||||
Boolean
|
||||
meta_oodate(GNode *gn, Boolean oodate)
|
||||
{
|
||||
@ -872,6 +879,8 @@ meta_oodate(GNode *gn, Boolean oodate)
|
||||
char fname2[MAXPATHLEN];
|
||||
char *p;
|
||||
char *cp;
|
||||
char *link_src;
|
||||
char *move_target;
|
||||
static size_t cwdlen = 0;
|
||||
static size_t tmplen = 0;
|
||||
FILE *fp;
|
||||
@ -938,6 +947,8 @@ meta_oodate(GNode *gn, Boolean oodate)
|
||||
oodate = TRUE;
|
||||
break;
|
||||
}
|
||||
link_src = NULL;
|
||||
move_target = NULL;
|
||||
/* Find the start of the build monitor section. */
|
||||
if (!f) {
|
||||
if (strncmp(buf, "-- filemon", 10) == 0) {
|
||||
@ -1051,16 +1062,21 @@ meta_oodate(GNode *gn, Boolean oodate)
|
||||
break;
|
||||
|
||||
case 'M': /* renaMe */
|
||||
if (Lst_IsEmpty(missingFiles))
|
||||
break;
|
||||
/*
|
||||
* For 'M'oves we want to check
|
||||
* the src as for 'R'ead
|
||||
* and the target as for 'W'rite.
|
||||
*/
|
||||
cp = p; /* save this for a second */
|
||||
/* now get target */
|
||||
if (strsep(&p, " ") == NULL)
|
||||
continue;
|
||||
CHECK_VALID_META(p);
|
||||
move_target = p;
|
||||
p = cp;
|
||||
/* 'L' and 'M' put single quotes around the args */
|
||||
if (*p == '\'') {
|
||||
char *ep;
|
||||
|
||||
p++;
|
||||
if ((ep = strchr(p, '\'')))
|
||||
*ep = '\0';
|
||||
}
|
||||
DEQUOTE(p);
|
||||
DEQUOTE(move_target);
|
||||
/* FALLTHROUGH */
|
||||
case 'D': /* unlink */
|
||||
if (*p == '/' && !Lst_IsEmpty(missingFiles)) {
|
||||
@ -1072,22 +1088,39 @@ meta_oodate(GNode *gn, Boolean oodate)
|
||||
ln = NULL; /* we're done with it */
|
||||
}
|
||||
}
|
||||
if (buf[0] == 'M') {
|
||||
/* the target of the mv is a file 'W'ritten */
|
||||
#ifdef DEBUG_META_MODE
|
||||
if (DEBUG(META))
|
||||
fprintf(debug_file, "meta_oodate: M %s -> %s\n",
|
||||
p, move_target);
|
||||
#endif
|
||||
p = move_target;
|
||||
goto check_write;
|
||||
}
|
||||
break;
|
||||
case 'L': /* Link */
|
||||
/* we want the target */
|
||||
/*
|
||||
* For 'L'inks check
|
||||
* the src as for 'R'ead
|
||||
* and the target as for 'W'rite.
|
||||
*/
|
||||
link_src = p;
|
||||
/* now get target */
|
||||
if (strsep(&p, " ") == NULL)
|
||||
continue;
|
||||
CHECK_VALID_META(p);
|
||||
/* 'L' and 'M' put single quotes around the args */
|
||||
if (*p == '\'') {
|
||||
char *ep;
|
||||
|
||||
p++;
|
||||
if ((ep = strchr(p, '\'')))
|
||||
*ep = '\0';
|
||||
}
|
||||
DEQUOTE(p);
|
||||
DEQUOTE(link_src);
|
||||
#ifdef DEBUG_META_MODE
|
||||
if (DEBUG(META))
|
||||
fprintf(debug_file, "meta_oodate: L %s -> %s\n",
|
||||
link_src, p);
|
||||
#endif
|
||||
/* FALLTHROUGH */
|
||||
case 'W': /* Write */
|
||||
check_write:
|
||||
/*
|
||||
* If a file we generated within our bailiwick
|
||||
* but outside of .OBJDIR is missing,
|
||||
@ -1119,6 +1152,14 @@ meta_oodate(GNode *gn, Boolean oodate)
|
||||
Lst_AtEnd(missingFiles, bmake_strdup(p));
|
||||
}
|
||||
break;
|
||||
check_link_src:
|
||||
p = link_src;
|
||||
link_src = NULL;
|
||||
#ifdef DEBUG_META_MODE
|
||||
if (DEBUG(META))
|
||||
fprintf(debug_file, "meta_oodate: L src %s\n", p);
|
||||
#endif
|
||||
/* FALLTHROUGH */
|
||||
case 'R': /* Read */
|
||||
case 'E': /* Exec */
|
||||
/*
|
||||
@ -1213,6 +1254,8 @@ meta_oodate(GNode *gn, Boolean oodate)
|
||||
default:
|
||||
break;
|
||||
}
|
||||
if (!oodate && buf[0] == 'L' && link_src != NULL)
|
||||
goto check_link_src;
|
||||
} else if (strcmp(buf, "CMD") == 0) {
|
||||
/*
|
||||
* Compare the current command with the one in the
|
||||
|
@ -1,3 +1,22 @@
|
||||
2013-12-12 Simon J. Gerraty <sjg@bad.crufty.net>
|
||||
|
||||
* install-mk (MK_VERSION): bump version
|
||||
* meta2deps.py: convert to print function for python3 compat.
|
||||
we also need to open files with mode 'r' rather than 'rb'
|
||||
otherwise we get bytes instead of strings.
|
||||
|
||||
2013-10-10 Simon J. Gerraty <sjg@bad.crufty.net>
|
||||
|
||||
* install-mk (MK_VERSION): bump version
|
||||
|
||||
* dirdeps.mk: when TARGET_SPEC_VARS is more than just MACHINE
|
||||
apply the same filtering (M_dep_qual_fixes) when setting _machines
|
||||
as _build_dirs.
|
||||
Also fix the filtering of Makefile.depend files - for reporting
|
||||
what we are looking for (M_dep_qual_fixes can get confused by
|
||||
Makefile.depend)
|
||||
Add some more debug info.
|
||||
|
||||
2013-09-04 Simon J. Gerraty <sjg@bad.crufty.net>
|
||||
|
||||
* gendirdeps.mk (_objtops): fix typo also
|
||||
|
@ -1,4 +1,4 @@
|
||||
# $Id: dirdeps.mk,v 1.28 2013/03/25 21:11:43 sjg Exp $
|
||||
# $Id: dirdeps.mk,v 1.29 2013/10/13 18:43:53 sjg Exp $
|
||||
|
||||
# Copyright (c) 2010-2013, Juniper Networks, Inc.
|
||||
# All rights reserved.
|
||||
@ -149,11 +149,11 @@ DEP_$v ?= ${$v}
|
||||
JOT ?= jot
|
||||
_tspec_x := ${${JOT} ${TARGET_SPEC_VARS:[#]}:L:sh}
|
||||
# this handles unqualified entries
|
||||
M_dep_qual_fixes = C;(/[^/.,]+)$$;\1.${DEP_TARGET_SPEC};
|
||||
M_dep_qual_fixes = C;(/[^/.,]+)$$;\1.$${DEP_TARGET_SPEC};
|
||||
# there needs to be at least one item missing for these to make sense
|
||||
.for i in ${_tspec_x:[2..-1]}
|
||||
_tspec_m$i := ${TARGET_SPEC_VARS:[2..$i]:@w@[^,]+@:ts,}
|
||||
_tspec_a$i := ,${TARGET_SPEC_VARS:[$i..-1]:@v@$${DEP_$v}@:ts,}
|
||||
_tspec_a$i := ,${TARGET_SPEC_VARS:[$i..-1]:@v@$$$${DEP_$v}@:ts,}
|
||||
M_dep_qual_fixes += C;(\.${_tspec_m$i})$$;\1${_tspec_a$i};
|
||||
.endfor
|
||||
.else
|
||||
@ -359,7 +359,8 @@ _machines := ${_machines:O:u}
|
||||
.if ${TARGET_SPEC_VARS:[#]} > 1
|
||||
# we need to tweak _machines
|
||||
_dm := ${DEP_MACHINE}
|
||||
_machines := ${_machines:@DEP_MACHINE@${DEP_TARGET_SPEC}@}
|
||||
# apply the same filtering that we do when qualifying DIRDEPS.
|
||||
_machines := ${_machines:@DEP_MACHINE@${DEP_TARGET_SPEC}@:${M_dep_qual_fixes:ts:}:O:u}
|
||||
DEP_MACHINE := ${_dm}
|
||||
.endif
|
||||
|
||||
@ -464,6 +465,9 @@ ${_this_dir}.$m: ${_build_dirs:M*.$m:N${_this_dir}.$m}
|
||||
.if ${_DIRDEP_CHECKED:M$d} == ""
|
||||
# once only
|
||||
_DIRDEP_CHECKED += $d
|
||||
.if !empty(_debug_search)
|
||||
.info checking $d
|
||||
.endif
|
||||
# Note: _build_dirs is fully qualifed so d:R is always the directory
|
||||
.if exists(${d:R})
|
||||
# Warning: there is an assumption here that MACHINE is always
|
||||
@ -471,7 +475,8 @@ _DIRDEP_CHECKED += $d
|
||||
# If TARGET_SPEC and MACHINE are insufficient, you have a problem.
|
||||
_m := ${.MAKE.DEPENDFILE_PREFERENCE:T:S;${TARGET_SPEC}$;${d:E};:S;${MACHINE};${d:E:C/,.*//};:@m@${exists(${d:R}/$m):?${d:R}/$m:}@:[1]}
|
||||
.if !empty(_m)
|
||||
_qm := ${_m:${M_dep_qual_fixes:ts:}}
|
||||
# M_dep_qual_fixes isn't geared to Makefile.depend
|
||||
_qm := ${_m:C;(\.depend)$;\1.${d:E};:${M_dep_qual_fixes:ts:}}
|
||||
.if !empty(_debug_search)
|
||||
.info Looking for ${_qm}
|
||||
.endif
|
||||
|
@ -55,7 +55,7 @@
|
||||
# Simon J. Gerraty <sjg@crufty.net>
|
||||
|
||||
# RCSid:
|
||||
# $Id: install-mk,v 1.93 2013/08/02 18:28:47 sjg Exp $
|
||||
# $Id: install-mk,v 1.95 2013/12/20 06:08:52 sjg Exp $
|
||||
#
|
||||
# @(#) Copyright (c) 1994 Simon J. Gerraty
|
||||
#
|
||||
@ -70,7 +70,7 @@
|
||||
# sjg@crufty.net
|
||||
#
|
||||
|
||||
MK_VERSION=20130801
|
||||
MK_VERSION=20131212
|
||||
OWNER=
|
||||
GROUP=
|
||||
MODE=444
|
||||
|
@ -1,5 +1,7 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
from __future__ import print_function
|
||||
|
||||
"""
|
||||
This script parses each "meta" file and extracts the
|
||||
information needed to deduce build and src dependencies.
|
||||
@ -35,7 +37,7 @@ We only pay attention to a subset of the information in the
|
||||
|
||||
"""
|
||||
RCSid:
|
||||
$Id: meta2deps.py,v 1.15 2013/07/29 20:41:23 sjg Exp $
|
||||
$Id: meta2deps.py,v 1.16 2013/12/20 06:08:52 sjg Exp $
|
||||
|
||||
Copyright (c) 2011-2013, Juniper Networks, Inc.
|
||||
All rights reserved.
|
||||
@ -90,14 +92,14 @@ def resolve(path, cwd, last_dir=None, debug=0, debug_out=sys.stderr):
|
||||
continue
|
||||
p = '/'.join([d,path])
|
||||
if debug > 2:
|
||||
print >> debug_out, "looking for:", p,
|
||||
print("looking for:", p, end=' ', file=debug_out)
|
||||
if not os.path.exists(p):
|
||||
if debug > 2:
|
||||
print >> debug_out, "nope"
|
||||
print("nope", file=debug_out)
|
||||
p = None
|
||||
continue
|
||||
if debug > 2:
|
||||
print >> debug_out, "found:", p
|
||||
print("found:", p, file=debug_out)
|
||||
return p
|
||||
return None
|
||||
|
||||
@ -236,21 +238,21 @@ class MetaFile:
|
||||
self.objroots.sort(reverse=True)
|
||||
|
||||
if self.debug:
|
||||
print >> self.debug_out, "host_target=", self.host_target
|
||||
print >> self.debug_out, "srctops=", self.srctops
|
||||
print >> self.debug_out, "objroots=", self.objroots
|
||||
print("host_target=", self.host_target, file=self.debug_out)
|
||||
print("srctops=", self.srctops, file=self.debug_out)
|
||||
print("objroots=", self.objroots, file=self.debug_out)
|
||||
|
||||
self.dirdep_re = re.compile(r'([^/]+)/(.+)')
|
||||
|
||||
if self.dpdeps and not self.reldir:
|
||||
if self.debug:
|
||||
print >> self.debug_out, "need reldir:",
|
||||
print("need reldir:", end=' ', file=self.debug_out)
|
||||
if self.curdir:
|
||||
srctop = self.find_top(self.curdir, self.srctops)
|
||||
if srctop:
|
||||
self.reldir = self.curdir.replace(srctop,'')
|
||||
if self.debug:
|
||||
print >> self.debug_out, self.reldir
|
||||
print(self.reldir, file=self.debug_out)
|
||||
if not self.reldir:
|
||||
self.dpdeps = None # we cannot do it?
|
||||
|
||||
@ -280,7 +282,7 @@ class MetaFile:
|
||||
if not self.reldir:
|
||||
return None
|
||||
for f in sort_unique(self.file_deps):
|
||||
print >> out, 'DPDEPS_%s += %s' % (f, self.reldir)
|
||||
print('DPDEPS_%s += %s' % (f, self.reldir), file=out)
|
||||
|
||||
def seenit(self, dir):
|
||||
"""rememer that we have seen dir."""
|
||||
@ -291,14 +293,14 @@ class MetaFile:
|
||||
if data not in list:
|
||||
list.append(data)
|
||||
if self.debug:
|
||||
print >> self.debug_out, "%s: %sAdd: %s" % (self.name, clue, data)
|
||||
print("%s: %sAdd: %s" % (self.name, clue, data), file=self.debug_out)
|
||||
|
||||
def find_top(self, path, list):
|
||||
"""the logical tree may be split accross multiple trees"""
|
||||
for top in list:
|
||||
if path.startswith(top):
|
||||
if self.debug > 2:
|
||||
print >> self.debug_out, "found in", top
|
||||
print("found in", top, file=self.debug_out)
|
||||
return top
|
||||
return None
|
||||
|
||||
@ -307,9 +309,9 @@ class MetaFile:
|
||||
ddep = None
|
||||
for ddepf in [path + '.dirdep', dir + '/.dirdep']:
|
||||
if not ddep and os.path.exists(ddepf):
|
||||
ddep = open(ddepf, 'rb').readline().strip('# \n')
|
||||
ddep = open(ddepf, 'r').readline().strip('# \n')
|
||||
if self.debug > 1:
|
||||
print >> self.debug_out, "found %s: %s\n" % (ddepf, ddep)
|
||||
print("found %s: %s\n" % (ddepf, ddep), file=self.debug_out)
|
||||
if ddep.endswith(self.machine):
|
||||
ddep = ddep[0:-(1+len(self.machine))]
|
||||
elif self.target_spec and ddep.endswith(self.target_spec):
|
||||
@ -331,7 +333,7 @@ class MetaFile:
|
||||
if not (self.machine == 'host' and
|
||||
dmachine == self.host_target):
|
||||
if self.debug > 2:
|
||||
print >> self.debug_out, "adding .%s to %s" % (dmachine, ddep)
|
||||
print("adding .%s to %s" % (dmachine, ddep), file=self.debug_out)
|
||||
ddep += '.' + dmachine
|
||||
|
||||
return ddep
|
||||
@ -342,7 +344,7 @@ class MetaFile:
|
||||
self.parse(name, file)
|
||||
except:
|
||||
# give a useful clue
|
||||
print >> sys.stderr, '{}:{}: '.format(self.name, self.line),
|
||||
print('{}:{}: '.format(self.name, self.line), end=' ', file=sys.stderr)
|
||||
raise
|
||||
|
||||
def parse(self, name=None, file=None):
|
||||
@ -379,7 +381,7 @@ class MetaFile:
|
||||
f = file
|
||||
cwd = last_dir = self.cwd
|
||||
else:
|
||||
f = open(self.name, 'rb')
|
||||
f = open(self.name, 'r')
|
||||
skip = True
|
||||
pid_cwd = {}
|
||||
pid_last_dir = {}
|
||||
@ -396,7 +398,7 @@ class MetaFile:
|
||||
if not line[0] in interesting:
|
||||
continue
|
||||
if self.debug > 2:
|
||||
print >> self.debug_out, "input:", line,
|
||||
print("input:", line, end=' ', file=self.debug_out)
|
||||
w = line.split()
|
||||
|
||||
if skip:
|
||||
@ -413,7 +415,7 @@ class MetaFile:
|
||||
self.cwd = cwd = last_dir = w[1]
|
||||
self.seenit(cwd) # ignore this
|
||||
if self.debug:
|
||||
print >> self.debug_out, "%s: CWD=%s" % (self.name, cwd)
|
||||
print("%s: CWD=%s" % (self.name, cwd), file=self.debug_out)
|
||||
continue
|
||||
|
||||
pid = int(w[1])
|
||||
@ -438,12 +440,12 @@ class MetaFile:
|
||||
cwd = cwd[0:-2]
|
||||
last_dir = cwd
|
||||
if self.debug > 1:
|
||||
print >> self.debug_out, "cwd=", cwd
|
||||
print("cwd=", cwd, file=self.debug_out)
|
||||
continue
|
||||
|
||||
if w[2] in self.seen:
|
||||
if self.debug > 2:
|
||||
print >> self.debug_out, "seen:", w[2]
|
||||
print("seen:", w[2], file=self.debug_out)
|
||||
continue
|
||||
# file operations
|
||||
if w[0] in 'ML':
|
||||
@ -461,7 +463,7 @@ class MetaFile:
|
||||
dir,base = os.path.split(path)
|
||||
if dir in self.seen:
|
||||
if self.debug > 2:
|
||||
print >> self.debug_out, "seen:", dir
|
||||
print("seen:", dir, file=self.debug_out)
|
||||
continue
|
||||
# we can have a path in an objdir which is a link
|
||||
# to the src dir, we may need to add dependencies for each
|
||||
@ -472,19 +474,19 @@ class MetaFile:
|
||||
# now put path back together
|
||||
path = '/'.join([dir,base])
|
||||
if self.debug > 1:
|
||||
print >> self.debug_out, "raw=%s rdir=%s dir=%s path=%s" % (w[2], rdir, dir, path)
|
||||
print("raw=%s rdir=%s dir=%s path=%s" % (w[2], rdir, dir, path), file=self.debug_out)
|
||||
if w[0] in 'SRWL':
|
||||
if w[0] == 'W' and path.endswith('.dirdep'):
|
||||
continue
|
||||
if path in [last_dir, cwd, self.cwd, self.curdir]:
|
||||
if self.debug > 1:
|
||||
print >> self.debug_out, "skipping:", path
|
||||
print("skipping:", path, file=self.debug_out)
|
||||
continue
|
||||
if os.path.isdir(path):
|
||||
if w[0] in 'RW':
|
||||
last_dir = path;
|
||||
if self.debug > 1:
|
||||
print >> self.debug_out, "ldir=", last_dir
|
||||
print("ldir=", last_dir, file=self.debug_out)
|
||||
continue
|
||||
|
||||
if w[0] in 'REWML':
|
||||
@ -642,10 +644,10 @@ def main(argv, klass=MetaFile, xopts='', xoptf=None):
|
||||
debug_out = getv(conf, 'debug_out', sys.stderr)
|
||||
|
||||
if debug:
|
||||
print >> debug_out, "config:"
|
||||
print >> debug_out, "psyco=", have_psyco
|
||||
for k,v in conf.items():
|
||||
print >> debug_out, "%s=%s" % (k,v)
|
||||
print("config:", file=debug_out)
|
||||
print("psyco=", have_psyco, file=debug_out)
|
||||
for k,v in list(conf.items()):
|
||||
print("%s=%s" % (k,v), file=debug_out)
|
||||
|
||||
for a in args:
|
||||
if a.endswith('.meta'):
|
||||
@ -657,9 +659,9 @@ def main(argv, klass=MetaFile, xopts='', xoptf=None):
|
||||
m = klass(f, conf)
|
||||
|
||||
if output:
|
||||
print m.dirdeps()
|
||||
print(m.dirdeps())
|
||||
|
||||
print m.src_dirdeps('\nsrc:')
|
||||
print(m.src_dirdeps('\nsrc:'))
|
||||
|
||||
dpdeps = getv(conf, 'DPDEPS')
|
||||
if dpdeps:
|
||||
@ -672,6 +674,6 @@ if __name__ == '__main__':
|
||||
main(sys.argv)
|
||||
except:
|
||||
# yes, this goes to stdout
|
||||
print "ERROR: ", sys.exc_info()[1]
|
||||
print("ERROR: ", sys.exc_info()[1])
|
||||
raise
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: parse.c,v 1.191 2013/08/28 21:56:49 sjg Exp $ */
|
||||
/* $NetBSD: parse.c,v 1.192 2013/10/18 20:47:06 christos Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1988, 1989, 1990, 1993
|
||||
@ -69,14 +69,14 @@
|
||||
*/
|
||||
|
||||
#ifndef MAKE_NATIVE
|
||||
static char rcsid[] = "$NetBSD: parse.c,v 1.191 2013/08/28 21:56:49 sjg Exp $";
|
||||
static char rcsid[] = "$NetBSD: parse.c,v 1.192 2013/10/18 20:47:06 christos Exp $";
|
||||
#else
|
||||
#include <sys/cdefs.h>
|
||||
#ifndef lint
|
||||
#if 0
|
||||
static char sccsid[] = "@(#)parse.c 8.3 (Berkeley) 3/19/94";
|
||||
#else
|
||||
__RCSID("$NetBSD: parse.c,v 1.191 2013/08/28 21:56:49 sjg Exp $");
|
||||
__RCSID("$NetBSD: parse.c,v 1.192 2013/10/18 20:47:06 christos Exp $");
|
||||
#endif
|
||||
#endif /* not lint */
|
||||
#endif
|
||||
@ -1216,9 +1216,8 @@ ParseDoDependency(char *line)
|
||||
*/
|
||||
int length;
|
||||
void *freeIt;
|
||||
char *result;
|
||||
|
||||
result = Var_Parse(cp, VAR_CMD, TRUE, &length, &freeIt);
|
||||
(void)Var_Parse(cp, VAR_CMD, TRUE, &length, &freeIt);
|
||||
if (freeIt)
|
||||
free(freeIt);
|
||||
cp += length-1;
|
||||
|
@ -1,18 +1,21 @@
|
||||
/* $NetBSD: util.c,v 1.53 2012/06/04 22:45:05 sjg Exp $ */
|
||||
/* $NetBSD: util.c,v 1.54 2013/11/26 13:44:41 joerg Exp $ */
|
||||
|
||||
/*
|
||||
* Missing stuff from OS's
|
||||
*
|
||||
* $Id: util.c,v 1.32 2012/06/06 20:08:44 sjg Exp $
|
||||
* $Id: util.c,v 1.33 2014/01/02 02:29:49 sjg Exp $
|
||||
*/
|
||||
#if defined(__MINT__) || defined(__linux__)
|
||||
#include <signal.h>
|
||||
#endif
|
||||
|
||||
#include "make.h"
|
||||
|
||||
#ifndef MAKE_NATIVE
|
||||
static char rcsid[] = "$NetBSD: util.c,v 1.53 2012/06/04 22:45:05 sjg Exp $";
|
||||
static char rcsid[] = "$NetBSD: util.c,v 1.54 2013/11/26 13:44:41 joerg Exp $";
|
||||
#else
|
||||
#ifndef lint
|
||||
__RCSID("$NetBSD: util.c,v 1.53 2012/06/04 22:45:05 sjg Exp $");
|
||||
__RCSID("$NetBSD: util.c,v 1.54 2013/11/26 13:44:41 joerg Exp $");
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
@ -3,6 +3,7 @@ Device Tree Compiler Manual
|
||||
|
||||
I - "dtc", the device tree compiler
|
||||
1) Obtaining Sources
|
||||
1.1) Submitting Patches
|
||||
2) Description
|
||||
3) Command Line
|
||||
4) Source File
|
||||
@ -44,6 +45,10 @@ Tarballs of the 1.0.0 and latest releases are here:
|
||||
http://www.jdl.com/software/dtc-v1.2.0.tgz
|
||||
http://www.jdl.com/software/dtc-latest.tgz
|
||||
|
||||
1.1) Submitting Patches
|
||||
|
||||
Patches should be sent to jdl@jdl.com, and CC'ed to
|
||||
devicetree-discuss@lists.ozlabs.org.
|
||||
|
||||
2) Description
|
||||
|
||||
|
@ -9,7 +9,7 @@
|
||||
# CONFIG_LOCALVERSION from some future config system.
|
||||
#
|
||||
VERSION = 1
|
||||
PATCHLEVEL = 3
|
||||
PATCHLEVEL = 4
|
||||
SUBLEVEL = 0
|
||||
EXTRAVERSION =
|
||||
LOCAL_VERSION =
|
||||
@ -160,18 +160,26 @@ endif
|
||||
# intermediate target and building them again "for real"
|
||||
.SECONDARY: $(DTC_GEN_SRCS) $(CONVERT_GEN_SRCS)
|
||||
|
||||
install: all $(SCRIPTS)
|
||||
@$(VECHO) INSTALL
|
||||
install-bin: all $(SCRIPTS)
|
||||
@$(VECHO) INSTALL-BIN
|
||||
$(INSTALL) -d $(DESTDIR)$(BINDIR)
|
||||
$(INSTALL) $(BIN) $(SCRIPTS) $(DESTDIR)$(BINDIR)
|
||||
|
||||
install-lib: all
|
||||
@$(VECHO) INSTALL-LIB
|
||||
$(INSTALL) -d $(DESTDIR)$(LIBDIR)
|
||||
$(INSTALL) $(LIBFDT_lib) $(DESTDIR)$(LIBDIR)
|
||||
ln -sf $(notdir $(LIBFDT_lib)) $(DESTDIR)$(LIBDIR)/$(LIBFDT_soname)
|
||||
ln -sf $(LIBFDT_soname) $(DESTDIR)$(LIBDIR)/libfdt.$(SHAREDLIB_EXT)
|
||||
$(INSTALL) -m 644 $(LIBFDT_archive) $(DESTDIR)$(LIBDIR)
|
||||
|
||||
install-includes:
|
||||
@$(VECHO) INSTALL-INC
|
||||
$(INSTALL) -d $(DESTDIR)$(INCLUDEDIR)
|
||||
$(INSTALL) -m 644 $(LIBFDT_include) $(DESTDIR)$(INCLUDEDIR)
|
||||
|
||||
install: install-bin install-lib install-includes
|
||||
|
||||
$(VERSION_FILE): Makefile FORCE
|
||||
$(call filechk,version)
|
||||
|
||||
|
@ -53,7 +53,7 @@ struct check {
|
||||
void *data;
|
||||
bool warn, error;
|
||||
enum checkstatus status;
|
||||
int inprogress;
|
||||
bool inprogress;
|
||||
int num_prereqs;
|
||||
struct check **prereq;
|
||||
};
|
||||
@ -141,9 +141,9 @@ static void check_nodes_props(struct check *c, struct node *dt, struct node *nod
|
||||
check_nodes_props(c, dt, child);
|
||||
}
|
||||
|
||||
static int run_check(struct check *c, struct node *dt)
|
||||
static bool run_check(struct check *c, struct node *dt)
|
||||
{
|
||||
int error = 0;
|
||||
bool error = false;
|
||||
int i;
|
||||
|
||||
assert(!c->inprogress);
|
||||
@ -151,11 +151,11 @@ static int run_check(struct check *c, struct node *dt)
|
||||
if (c->status != UNCHECKED)
|
||||
goto out;
|
||||
|
||||
c->inprogress = 1;
|
||||
c->inprogress = true;
|
||||
|
||||
for (i = 0; i < c->num_prereqs; i++) {
|
||||
struct check *prq = c->prereq[i];
|
||||
error |= run_check(prq, dt);
|
||||
error = error || run_check(prq, dt);
|
||||
if (prq->status != PASSED) {
|
||||
c->status = PREREQ;
|
||||
check_msg(c, "Failed prerequisite '%s'",
|
||||
@ -177,9 +177,9 @@ static int run_check(struct check *c, struct node *dt)
|
||||
TRACE(c, "\tCompleted, status %d", c->status);
|
||||
|
||||
out:
|
||||
c->inprogress = 0;
|
||||
c->inprogress = false;
|
||||
if ((c->status != PASSED) && (c->error))
|
||||
error = 1;
|
||||
error = true;
|
||||
return error;
|
||||
}
|
||||
|
||||
@ -256,11 +256,15 @@ static void check_duplicate_property_names(struct check *c, struct node *dt,
|
||||
{
|
||||
struct property *prop, *prop2;
|
||||
|
||||
for_each_property(node, prop)
|
||||
for (prop2 = prop->next; prop2; prop2 = prop2->next)
|
||||
for_each_property(node, prop) {
|
||||
for (prop2 = prop->next; prop2; prop2 = prop2->next) {
|
||||
if (prop2->deleted)
|
||||
continue;
|
||||
if (streq(prop->name, prop2->name))
|
||||
FAIL(c, "Duplicate property name %s in %s",
|
||||
prop->name, node->fullpath);
|
||||
}
|
||||
}
|
||||
}
|
||||
NODE_ERROR(duplicate_property_names, NULL);
|
||||
|
||||
@ -729,7 +733,7 @@ void parse_checks_option(bool warn, bool error, const char *optarg)
|
||||
die("Unrecognized check name \"%s\"\n", name);
|
||||
}
|
||||
|
||||
void process_checks(int force, struct boot_info *bi)
|
||||
void process_checks(bool force, struct boot_info *bi)
|
||||
{
|
||||
struct node *dt = bi->dt;
|
||||
int i;
|
||||
|
@ -250,20 +250,20 @@ struct data data_add_marker(struct data d, enum markertype type, char *ref)
|
||||
return data_append_markers(d, m);
|
||||
}
|
||||
|
||||
int data_is_one_string(struct data d)
|
||||
bool data_is_one_string(struct data d)
|
||||
{
|
||||
int i;
|
||||
int len = d.len;
|
||||
|
||||
if (len == 0)
|
||||
return 0;
|
||||
return false;
|
||||
|
||||
for (i = 0; i < len-1; i++)
|
||||
if (d.val[i] == '\0')
|
||||
return 0;
|
||||
return false;
|
||||
|
||||
if (d.val[len-1] != '\0')
|
||||
return 0;
|
||||
return false;
|
||||
|
||||
return 1;
|
||||
return true;
|
||||
}
|
||||
|
@ -44,6 +44,7 @@ YY_BUFFER_STATE include_stack[MAX_INCLUDE_NESTING];
|
||||
int include_stack_pointer = 0;
|
||||
|
||||
YYLTYPE yylloc;
|
||||
extern bool treesource_error;
|
||||
|
||||
/* CAUTION: this will stop working if we ever use yyless() or yyunput() */
|
||||
#define YY_USER_ACTION \
|
||||
@ -65,7 +66,8 @@ static int dts_version = 1;
|
||||
BEGIN(V1); \
|
||||
|
||||
static void push_input_file(const char *filename);
|
||||
static int pop_input_file(void);
|
||||
static bool pop_input_file(void);
|
||||
static void lexical_error(const char *fmt, ...);
|
||||
%}
|
||||
|
||||
%%
|
||||
@ -75,6 +77,27 @@ static int pop_input_file(void);
|
||||
push_input_file(name);
|
||||
}
|
||||
|
||||
<*>^"#"(line)?[ \t]+[0-9]+[ \t]+{STRING}([ \t]+[0-9]+)? {
|
||||
char *line, *tmp, *fn;
|
||||
/* skip text before line # */
|
||||
line = yytext;
|
||||
while (!isdigit((unsigned char)*line))
|
||||
line++;
|
||||
/* skip digits in line # */
|
||||
tmp = line;
|
||||
while (!isspace((unsigned char)*tmp))
|
||||
tmp++;
|
||||
/* "NULL"-terminate line # */
|
||||
*tmp = '\0';
|
||||
/* start of filename */
|
||||
fn = strchr(tmp + 1, '"') + 1;
|
||||
/* strip trailing " from filename */
|
||||
tmp = strchr(fn, '"');
|
||||
*tmp = 0;
|
||||
/* -1 since #line is the number of the next line */
|
||||
srcpos_set_line(xstrdup(fn), atoi(line) - 1);
|
||||
}
|
||||
|
||||
<*><<EOF>> {
|
||||
if (!pop_input_file()) {
|
||||
yyterminate();
|
||||
@ -107,6 +130,20 @@ static int pop_input_file(void);
|
||||
return DT_BITS;
|
||||
}
|
||||
|
||||
<*>"/delete-property/" {
|
||||
DPRINT("Keyword: /delete-property/\n");
|
||||
DPRINT("<PROPNODENAME>\n");
|
||||
BEGIN(PROPNODENAME);
|
||||
return DT_DEL_PROP;
|
||||
}
|
||||
|
||||
<*>"/delete-node/" {
|
||||
DPRINT("Keyword: /delete-node/\n");
|
||||
DPRINT("<PROPNODENAME>\n");
|
||||
BEGIN(PROPNODENAME);
|
||||
return DT_DEL_NODE;
|
||||
}
|
||||
|
||||
<*>{LABEL}: {
|
||||
DPRINT("Label: %s\n", yytext);
|
||||
yylval.labelref = xstrdup(yytext);
|
||||
@ -115,15 +152,42 @@ static int pop_input_file(void);
|
||||
}
|
||||
|
||||
<V1>([0-9]+|0[xX][0-9a-fA-F]+)(U|L|UL|LL|ULL)? {
|
||||
yylval.literal = xstrdup(yytext);
|
||||
DPRINT("Literal: '%s'\n", yylval.literal);
|
||||
char *e;
|
||||
DPRINT("Integer Literal: '%s'\n", yytext);
|
||||
|
||||
errno = 0;
|
||||
yylval.integer = strtoull(yytext, &e, 0);
|
||||
|
||||
assert(!(*e) || !e[strspn(e, "UL")]);
|
||||
|
||||
if (errno == ERANGE)
|
||||
lexical_error("Integer literal '%s' out of range",
|
||||
yytext);
|
||||
else
|
||||
/* ERANGE is the only strtoull error triggerable
|
||||
* by strings matching the pattern */
|
||||
assert(errno == 0);
|
||||
return DT_LITERAL;
|
||||
}
|
||||
|
||||
<*>{CHAR_LITERAL} {
|
||||
yytext[yyleng-1] = '\0';
|
||||
yylval.literal = xstrdup(yytext+1);
|
||||
DPRINT("Character literal: %s\n", yylval.literal);
|
||||
struct data d;
|
||||
DPRINT("Character literal: %s\n", yytext);
|
||||
|
||||
d = data_copy_escape_string(yytext+1, yyleng-2);
|
||||
if (d.len == 1) {
|
||||
lexical_error("Empty character literal");
|
||||
yylval.integer = 0;
|
||||
return DT_CHAR_LITERAL;
|
||||
}
|
||||
|
||||
yylval.integer = (unsigned char)d.val[0];
|
||||
|
||||
if (d.len > 2)
|
||||
lexical_error("Character literal has %d"
|
||||
" characters instead of 1",
|
||||
d.len - 1);
|
||||
|
||||
return DT_CHAR_LITERAL;
|
||||
}
|
||||
|
||||
@ -152,9 +216,10 @@ static int pop_input_file(void);
|
||||
return ']';
|
||||
}
|
||||
|
||||
<PROPNODENAME>{PROPNODECHAR}+ {
|
||||
<PROPNODENAME>\\?{PROPNODECHAR}+ {
|
||||
DPRINT("PropNodeName: %s\n", yytext);
|
||||
yylval.propnodename = xstrdup(yytext);
|
||||
yylval.propnodename = xstrdup((yytext[0] == '\\') ?
|
||||
yytext + 1 : yytext);
|
||||
BEGIN_DEFAULT();
|
||||
return DT_PROPNODENAME;
|
||||
}
|
||||
@ -210,10 +275,10 @@ static void push_input_file(const char *filename)
|
||||
}
|
||||
|
||||
|
||||
static int pop_input_file(void)
|
||||
static bool pop_input_file(void)
|
||||
{
|
||||
if (srcfile_pop() == 0)
|
||||
return 0;
|
||||
return false;
|
||||
|
||||
assert(include_stack_pointer > 0);
|
||||
|
||||
@ -223,5 +288,16 @@ static int pop_input_file(void)
|
||||
|
||||
yyin = current_srcfile->f;
|
||||
|
||||
return 1;
|
||||
return true;
|
||||
}
|
||||
|
||||
static void lexical_error(const char *fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
|
||||
va_start(ap, fmt);
|
||||
srcpos_verror(&yylloc, "Lexical error", fmt, ap);
|
||||
va_end(ap);
|
||||
|
||||
treesource_error = true;
|
||||
}
|
||||
|
@ -31,15 +31,11 @@ extern void print_error(char const *fmt, ...);
|
||||
extern void yyerror(char const *s);
|
||||
|
||||
extern struct boot_info *the_boot_info;
|
||||
extern int treesource_error;
|
||||
|
||||
static unsigned long long eval_literal(const char *s, int base, int bits);
|
||||
static unsigned char eval_char_literal(const char *s);
|
||||
extern bool treesource_error;
|
||||
%}
|
||||
|
||||
%union {
|
||||
char *propnodename;
|
||||
char *literal;
|
||||
char *labelref;
|
||||
unsigned int cbase;
|
||||
uint8_t byte;
|
||||
@ -62,9 +58,11 @@ static unsigned char eval_char_literal(const char *s);
|
||||
%token DT_MEMRESERVE
|
||||
%token DT_LSHIFT DT_RSHIFT DT_LE DT_GE DT_EQ DT_NE DT_AND DT_OR
|
||||
%token DT_BITS
|
||||
%token DT_DEL_PROP
|
||||
%token DT_DEL_NODE
|
||||
%token <propnodename> DT_PROPNODENAME
|
||||
%token <literal> DT_LITERAL
|
||||
%token <literal> DT_CHAR_LITERAL
|
||||
%token <integer> DT_LITERAL
|
||||
%token <integer> DT_CHAR_LITERAL
|
||||
%token <cbase> DT_BASE
|
||||
%token <byte> DT_BYTE
|
||||
%token <data> DT_STRING
|
||||
@ -153,6 +151,17 @@ devicetree:
|
||||
print_error("label or path, '%s', not found", $2);
|
||||
$$ = $1;
|
||||
}
|
||||
| devicetree DT_DEL_NODE DT_REF ';'
|
||||
{
|
||||
struct node *target = get_node_by_ref($1, $3);
|
||||
|
||||
if (!target)
|
||||
print_error("label or path, '%s', not found", $3);
|
||||
else
|
||||
delete_node(target);
|
||||
|
||||
$$ = $1;
|
||||
}
|
||||
;
|
||||
|
||||
nodedef:
|
||||
@ -182,6 +191,10 @@ propdef:
|
||||
{
|
||||
$$ = build_property($1, empty_data);
|
||||
}
|
||||
| DT_DEL_PROP DT_PROPNODENAME ';'
|
||||
{
|
||||
$$ = build_property_delete($2);
|
||||
}
|
||||
| DT_LABEL propdef
|
||||
{
|
||||
add_label(&$2->labels, $1);
|
||||
@ -213,10 +226,9 @@ propdata:
|
||||
|
||||
if ($6 != 0)
|
||||
if (fseek(f, $6, SEEK_SET) != 0)
|
||||
print_error("Couldn't seek to offset %llu in \"%s\": %s",
|
||||
(unsigned long long)$6,
|
||||
$4.val,
|
||||
strerror(errno));
|
||||
die("Couldn't seek to offset %llu in \"%s\": %s",
|
||||
(unsigned long long)$6, $4.val,
|
||||
strerror(errno));
|
||||
|
||||
d = data_copy_file(f, $8);
|
||||
|
||||
@ -257,18 +269,20 @@ propdataprefix:
|
||||
arrayprefix:
|
||||
DT_BITS DT_LITERAL '<'
|
||||
{
|
||||
$$.data = empty_data;
|
||||
$$.bits = eval_literal($2, 0, 7);
|
||||
unsigned long long bits;
|
||||
|
||||
if (($$.bits != 8) &&
|
||||
($$.bits != 16) &&
|
||||
($$.bits != 32) &&
|
||||
($$.bits != 64))
|
||||
bits = $2;
|
||||
|
||||
if ((bits != 8) && (bits != 16) &&
|
||||
(bits != 32) && (bits != 64))
|
||||
{
|
||||
print_error("Only 8, 16, 32 and 64-bit elements"
|
||||
" are currently supported");
|
||||
$$.bits = 32;
|
||||
bits = 32;
|
||||
}
|
||||
|
||||
$$.data = empty_data;
|
||||
$$.bits = bits;
|
||||
}
|
||||
| '<'
|
||||
{
|
||||
@ -317,13 +331,7 @@ arrayprefix:
|
||||
|
||||
integer_prim:
|
||||
DT_LITERAL
|
||||
{
|
||||
$$ = eval_literal($1, 0, 64);
|
||||
}
|
||||
| DT_CHAR_LITERAL
|
||||
{
|
||||
$$ = eval_char_literal($1);
|
||||
}
|
||||
| '(' integer_expr ')'
|
||||
{
|
||||
$$ = $2;
|
||||
@ -440,6 +448,10 @@ subnode:
|
||||
{
|
||||
$$ = name_node($2, $1);
|
||||
}
|
||||
| DT_DEL_NODE DT_PROPNODENAME ';'
|
||||
{
|
||||
$$ = name_node(build_node_delete(), $2);
|
||||
}
|
||||
| DT_LABEL subnode
|
||||
{
|
||||
add_label(&$2->labels, $1);
|
||||
@ -454,58 +466,12 @@ void print_error(char const *fmt, ...)
|
||||
va_list va;
|
||||
|
||||
va_start(va, fmt);
|
||||
srcpos_verror(&yylloc, fmt, va);
|
||||
srcpos_verror(&yylloc, "Error", fmt, va);
|
||||
va_end(va);
|
||||
|
||||
treesource_error = 1;
|
||||
treesource_error = true;
|
||||
}
|
||||
|
||||
void yyerror(char const *s) {
|
||||
print_error("%s", s);
|
||||
}
|
||||
|
||||
static unsigned long long eval_literal(const char *s, int base, int bits)
|
||||
{
|
||||
unsigned long long val;
|
||||
char *e;
|
||||
|
||||
errno = 0;
|
||||
val = strtoull(s, &e, base);
|
||||
if (*e) {
|
||||
size_t uls = strspn(e, "UL");
|
||||
if (e[uls])
|
||||
print_error("bad characters in literal");
|
||||
}
|
||||
if ((errno == ERANGE)
|
||||
|| ((bits < 64) && (val >= (1ULL << bits))))
|
||||
print_error("literal out of range");
|
||||
else if (errno != 0)
|
||||
print_error("bad literal");
|
||||
return val;
|
||||
}
|
||||
|
||||
static unsigned char eval_char_literal(const char *s)
|
||||
{
|
||||
int i = 1;
|
||||
char c = s[0];
|
||||
|
||||
if (c == '\0')
|
||||
{
|
||||
print_error("empty character literal");
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* If the first character in the character literal is a \ then process
|
||||
* the remaining characters as an escape encoding. If the first
|
||||
* character is neither an escape or a terminator it should be the only
|
||||
* character in the literal and will be returned.
|
||||
*/
|
||||
if (c == '\\')
|
||||
c = get_escape_char(s, &i);
|
||||
|
||||
if (s[i] != '\0')
|
||||
print_error("malformed character literal");
|
||||
|
||||
return c;
|
||||
}
|
||||
|
@ -21,8 +21,6 @@
|
||||
#include "dtc.h"
|
||||
#include "srcpos.h"
|
||||
|
||||
#include "version_gen.h"
|
||||
|
||||
/*
|
||||
* Command line options
|
||||
*/
|
||||
@ -49,55 +47,60 @@ static void fill_fullpaths(struct node *tree, const char *prefix)
|
||||
fill_fullpaths(child, tree->fullpath);
|
||||
}
|
||||
|
||||
static void __attribute__ ((noreturn)) usage(void)
|
||||
{
|
||||
fprintf(stderr, "Usage:\n");
|
||||
fprintf(stderr, "\tdtc [options] <input file>\n");
|
||||
fprintf(stderr, "\nOptions:\n");
|
||||
fprintf(stderr, "\t-h\n");
|
||||
fprintf(stderr, "\t\tThis help text\n");
|
||||
fprintf(stderr, "\t-q\n");
|
||||
fprintf(stderr, "\t\tQuiet: -q suppress warnings, -qq errors, -qqq all\n");
|
||||
fprintf(stderr, "\t-I <input format>\n");
|
||||
fprintf(stderr, "\t\tInput formats are:\n");
|
||||
fprintf(stderr, "\t\t\tdts - device tree source text\n");
|
||||
fprintf(stderr, "\t\t\tdtb - device tree blob\n");
|
||||
fprintf(stderr, "\t\t\tfs - /proc/device-tree style directory\n");
|
||||
fprintf(stderr, "\t-o <output file>\n");
|
||||
fprintf(stderr, "\t-O <output format>\n");
|
||||
fprintf(stderr, "\t\tOutput formats are:\n");
|
||||
fprintf(stderr, "\t\t\tdts - device tree source text\n");
|
||||
fprintf(stderr, "\t\t\tdtb - device tree blob\n");
|
||||
fprintf(stderr, "\t\t\tasm - assembler source\n");
|
||||
fprintf(stderr, "\t-V <output version>\n");
|
||||
fprintf(stderr, "\t\tBlob version to produce, defaults to %d (relevant for dtb\n\t\tand asm output only)\n", DEFAULT_FDT_VERSION);
|
||||
fprintf(stderr, "\t-d <output dependency file>\n");
|
||||
fprintf(stderr, "\t-R <number>\n");
|
||||
fprintf(stderr, "\t\tMake space for <number> reserve map entries (relevant for \n\t\tdtb and asm output only)\n");
|
||||
fprintf(stderr, "\t-S <bytes>\n");
|
||||
fprintf(stderr, "\t\tMake the blob at least <bytes> long (extra space)\n");
|
||||
fprintf(stderr, "\t-p <bytes>\n");
|
||||
fprintf(stderr, "\t\tAdd padding to the blob of <bytes> long (extra space)\n");
|
||||
fprintf(stderr, "\t-b <number>\n");
|
||||
fprintf(stderr, "\t\tSet the physical boot cpu\n");
|
||||
fprintf(stderr, "\t-f\n");
|
||||
fprintf(stderr, "\t\tForce - try to produce output even if the input tree has errors\n");
|
||||
fprintf(stderr, "\t-i\n");
|
||||
fprintf(stderr, "\t\tAdd a path to search for include files\n");
|
||||
fprintf(stderr, "\t-s\n");
|
||||
fprintf(stderr, "\t\tSort nodes and properties before outputting (only useful for\n\t\tcomparing trees)\n");
|
||||
fprintf(stderr, "\t-v\n");
|
||||
fprintf(stderr, "\t\tPrint DTC version and exit\n");
|
||||
fprintf(stderr, "\t-H <phandle format>\n");
|
||||
fprintf(stderr, "\t\tphandle formats are:\n");
|
||||
fprintf(stderr, "\t\t\tlegacy - \"linux,phandle\" properties only\n");
|
||||
fprintf(stderr, "\t\t\tepapr - \"phandle\" properties only\n");
|
||||
fprintf(stderr, "\t\t\tboth - Both \"linux,phandle\" and \"phandle\" properties\n");
|
||||
fprintf(stderr, "\t-W [no-]<checkname>\n");
|
||||
fprintf(stderr, "\t-E [no-]<checkname>\n");
|
||||
fprintf(stderr, "\t\t\tenable or disable warnings and errors\n");
|
||||
exit(3);
|
||||
}
|
||||
/* Usage related data. */
|
||||
static const char usage_synopsis[] = "dtc [options] <input file>";
|
||||
static const char usage_short_opts[] = "qI:O:o:V:d:R:S:p:fb:i:H:sW:E:hv";
|
||||
static struct option const usage_long_opts[] = {
|
||||
{"quiet", no_argument, NULL, 'q'},
|
||||
{"in-format", a_argument, NULL, 'I'},
|
||||
{"out", a_argument, NULL, 'o'},
|
||||
{"out-format", a_argument, NULL, 'O'},
|
||||
{"out-version", a_argument, NULL, 'V'},
|
||||
{"out-dependency", a_argument, NULL, 'd'},
|
||||
{"reserve", a_argument, NULL, 'R'},
|
||||
{"space", a_argument, NULL, 'S'},
|
||||
{"pad", a_argument, NULL, 'p'},
|
||||
{"boot-cpu", a_argument, NULL, 'b'},
|
||||
{"force", no_argument, NULL, 'f'},
|
||||
{"include", a_argument, NULL, 'i'},
|
||||
{"sort", no_argument, NULL, 's'},
|
||||
{"phandle", a_argument, NULL, 'H'},
|
||||
{"warning", a_argument, NULL, 'W'},
|
||||
{"error", a_argument, NULL, 'E'},
|
||||
{"help", no_argument, NULL, 'h'},
|
||||
{"version", no_argument, NULL, 'v'},
|
||||
{NULL, no_argument, NULL, 0x0},
|
||||
};
|
||||
static const char * const usage_opts_help[] = {
|
||||
"\n\tQuiet: -q suppress warnings, -qq errors, -qqq all",
|
||||
"\n\tInput formats are:\n"
|
||||
"\t\tdts - device tree source text\n"
|
||||
"\t\tdtb - device tree blob\n"
|
||||
"\t\tfs - /proc/device-tree style directory",
|
||||
"\n\tOutput file",
|
||||
"\n\tOutput formats are:\n"
|
||||
"\t\tdts - device tree source text\n"
|
||||
"\t\tdtb - device tree blob\n"
|
||||
"\t\tasm - assembler source",
|
||||
"\n\tBlob version to produce, defaults to %d (for dtb and asm output)", //, DEFAULT_FDT_VERSION);
|
||||
"\n\tOutput dependency file",
|
||||
"\n\ttMake space for <number> reserve map entries (for dtb and asm output)",
|
||||
"\n\tMake the blob at least <bytes> long (extra space)",
|
||||
"\n\tAdd padding to the blob of <bytes> long (extra space)",
|
||||
"\n\tSet the physical boot cpu",
|
||||
"\n\tTry to produce output even if the input tree has errors",
|
||||
"\n\tAdd a path to search for include files",
|
||||
"\n\tSort nodes and properties before outputting (useful for comparing trees)",
|
||||
"\n\tValid phandle formats are:\n"
|
||||
"\t\tlegacy - \"linux,phandle\" properties only\n"
|
||||
"\t\tepapr - \"phandle\" properties only\n"
|
||||
"\t\tboth - Both \"linux,phandle\" and \"phandle\" properties",
|
||||
"\n\tEnable/disable warnings (prefix with \"no-\")",
|
||||
"\n\tEnable/disable errors (prefix with \"no-\")",
|
||||
"\n\tPrint this help and exit",
|
||||
"\n\tPrint version and exit",
|
||||
NULL,
|
||||
};
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
@ -106,7 +109,7 @@ int main(int argc, char *argv[])
|
||||
const char *outform = "dts";
|
||||
const char *outname = "-";
|
||||
const char *depname = NULL;
|
||||
int force = 0, sort = 0;
|
||||
bool force = false, sort = false;
|
||||
const char *arg;
|
||||
int opt;
|
||||
FILE *outf = NULL;
|
||||
@ -118,8 +121,7 @@ int main(int argc, char *argv[])
|
||||
minsize = 0;
|
||||
padsize = 0;
|
||||
|
||||
while ((opt = getopt(argc, argv, "hI:O:o:V:d:R:S:p:fqb:i:vH:sW:E:"))
|
||||
!= EOF) {
|
||||
while ((opt = util_getopt_long()) != EOF) {
|
||||
switch (opt) {
|
||||
case 'I':
|
||||
inform = optarg;
|
||||
@ -146,7 +148,7 @@ int main(int argc, char *argv[])
|
||||
padsize = strtol(optarg, NULL, 0);
|
||||
break;
|
||||
case 'f':
|
||||
force = 1;
|
||||
force = true;
|
||||
break;
|
||||
case 'q':
|
||||
quiet++;
|
||||
@ -158,8 +160,7 @@ int main(int argc, char *argv[])
|
||||
srcfile_add_search_path(optarg);
|
||||
break;
|
||||
case 'v':
|
||||
printf("Version: %s\n", DTC_VERSION);
|
||||
exit(0);
|
||||
util_version();
|
||||
case 'H':
|
||||
if (streq(optarg, "legacy"))
|
||||
phandle_format = PHANDLE_LEGACY;
|
||||
@ -173,7 +174,7 @@ int main(int argc, char *argv[])
|
||||
break;
|
||||
|
||||
case 's':
|
||||
sort = 1;
|
||||
sort = true;
|
||||
break;
|
||||
|
||||
case 'W':
|
||||
@ -185,13 +186,14 @@ int main(int argc, char *argv[])
|
||||
break;
|
||||
|
||||
case 'h':
|
||||
usage(NULL);
|
||||
default:
|
||||
usage();
|
||||
usage("unknown option");
|
||||
}
|
||||
}
|
||||
|
||||
if (argc > (optind+1))
|
||||
usage();
|
||||
usage("missing files");
|
||||
else if (argc < (optind+1))
|
||||
arg = "-";
|
||||
else
|
||||
@ -201,9 +203,6 @@ int main(int argc, char *argv[])
|
||||
if (minsize && padsize)
|
||||
die("Can't set both -p and -S\n");
|
||||
|
||||
if (minsize)
|
||||
fprintf(stderr, "DTC: Use of \"-S\" is deprecated; it will be removed soon, use \"-p\" instead\n");
|
||||
|
||||
if (depname) {
|
||||
depfile = fopen(depname, "w");
|
||||
if (!depfile)
|
||||
|
@ -66,7 +66,6 @@ typedef uint32_t cell_t;
|
||||
#define strneq(a, b, n) (strncmp((a), (b), (n)) == 0)
|
||||
|
||||
#define ALIGN(x, a) (((x) + (a) - 1) & ~((a) - 1))
|
||||
#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
|
||||
|
||||
/* Data blobs */
|
||||
enum markertype {
|
||||
@ -119,7 +118,7 @@ struct data data_append_align(struct data d, int align);
|
||||
|
||||
struct data data_add_marker(struct data d, enum markertype type, char *ref);
|
||||
|
||||
int data_is_one_string(struct data d);
|
||||
bool data_is_one_string(struct data d);
|
||||
|
||||
/* DT constraints */
|
||||
|
||||
@ -128,11 +127,13 @@ int data_is_one_string(struct data d);
|
||||
|
||||
/* Live trees */
|
||||
struct label {
|
||||
bool deleted;
|
||||
char *label;
|
||||
struct label *next;
|
||||
};
|
||||
|
||||
struct property {
|
||||
bool deleted;
|
||||
char *name;
|
||||
struct data val;
|
||||
|
||||
@ -142,6 +143,7 @@ struct property {
|
||||
};
|
||||
|
||||
struct node {
|
||||
bool deleted;
|
||||
char *name;
|
||||
struct property *proplist;
|
||||
struct node *children;
|
||||
@ -158,28 +160,47 @@ struct node {
|
||||
struct label *labels;
|
||||
};
|
||||
|
||||
#define for_each_label(l0, l) \
|
||||
#define for_each_label_withdel(l0, l) \
|
||||
for ((l) = (l0); (l); (l) = (l)->next)
|
||||
|
||||
#define for_each_property(n, p) \
|
||||
#define for_each_label(l0, l) \
|
||||
for_each_label_withdel(l0, l) \
|
||||
if (!(l)->deleted)
|
||||
|
||||
#define for_each_property_withdel(n, p) \
|
||||
for ((p) = (n)->proplist; (p); (p) = (p)->next)
|
||||
|
||||
#define for_each_child(n, c) \
|
||||
#define for_each_property(n, p) \
|
||||
for_each_property_withdel(n, p) \
|
||||
if (!(p)->deleted)
|
||||
|
||||
#define for_each_child_withdel(n, c) \
|
||||
for ((c) = (n)->children; (c); (c) = (c)->next_sibling)
|
||||
|
||||
#define for_each_child(n, c) \
|
||||
for_each_child_withdel(n, c) \
|
||||
if (!(c)->deleted)
|
||||
|
||||
void add_label(struct label **labels, char *label);
|
||||
void delete_labels(struct label **labels);
|
||||
|
||||
struct property *build_property(char *name, struct data val);
|
||||
struct property *build_property_delete(char *name);
|
||||
struct property *chain_property(struct property *first, struct property *list);
|
||||
struct property *reverse_properties(struct property *first);
|
||||
|
||||
struct node *build_node(struct property *proplist, struct node *children);
|
||||
struct node *build_node_delete(void);
|
||||
struct node *name_node(struct node *node, char *name);
|
||||
struct node *chain_node(struct node *first, struct node *list);
|
||||
struct node *merge_nodes(struct node *old_node, struct node *new_node);
|
||||
|
||||
void add_property(struct node *node, struct property *prop);
|
||||
void delete_property_by_name(struct node *node, char *name);
|
||||
void delete_property(struct property *prop);
|
||||
void add_child(struct node *parent, struct node *child);
|
||||
void delete_node_by_name(struct node *parent, char *name);
|
||||
void delete_node(struct node *node);
|
||||
|
||||
const char *get_unitname(struct node *node);
|
||||
struct property *get_property(struct node *node, const char *propname);
|
||||
@ -227,7 +248,7 @@ void sort_tree(struct boot_info *bi);
|
||||
/* Checks */
|
||||
|
||||
void parse_checks_option(bool warn, bool error, const char *optarg);
|
||||
void process_checks(int force, struct boot_info *bi);
|
||||
void process_checks(bool force, struct boot_info *bi);
|
||||
|
||||
/* Flattened trees */
|
||||
|
||||
|
@ -2,14 +2,16 @@
|
||||
* fdtdump.c - Contributed by Pantelis Antoniou <pantelis.antoniou AT gmail.com>
|
||||
*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <ctype.h>
|
||||
|
||||
#include <fdt.h>
|
||||
#include <libfdt.h>
|
||||
#include <libfdt_env.h>
|
||||
#include <fdt.h>
|
||||
|
||||
#include "util.h"
|
||||
|
||||
@ -17,33 +19,29 @@
|
||||
#define PALIGN(p, a) ((void *)(ALIGN((unsigned long)(p), (a))))
|
||||
#define GET_CELL(p) (p += 4, *((const uint32_t *)(p-4)))
|
||||
|
||||
static void print_data(const char *data, int len)
|
||||
static const char *tagname(uint32_t tag)
|
||||
{
|
||||
int i;
|
||||
const char *p = data;
|
||||
|
||||
/* no data, don't print */
|
||||
if (len == 0)
|
||||
return;
|
||||
|
||||
if (util_is_printable_string(data, len)) {
|
||||
printf(" = \"%s\"", (const char *)data);
|
||||
} else if ((len % 4) == 0) {
|
||||
printf(" = <");
|
||||
for (i = 0; i < len; i += 4)
|
||||
printf("0x%08x%s", fdt32_to_cpu(GET_CELL(p)),
|
||||
i < (len - 4) ? " " : "");
|
||||
printf(">");
|
||||
} else {
|
||||
printf(" = [");
|
||||
for (i = 0; i < len; i++)
|
||||
printf("%02x%s", *p++, i < len - 1 ? " " : "");
|
||||
printf("]");
|
||||
}
|
||||
static const char * const names[] = {
|
||||
#define TN(t) [t] #t
|
||||
TN(FDT_BEGIN_NODE),
|
||||
TN(FDT_END_NODE),
|
||||
TN(FDT_PROP),
|
||||
TN(FDT_NOP),
|
||||
TN(FDT_END),
|
||||
#undef TN
|
||||
};
|
||||
if (tag < ARRAY_SIZE(names))
|
||||
if (names[tag])
|
||||
return names[tag];
|
||||
return "FDT_???";
|
||||
}
|
||||
|
||||
static void dump_blob(void *blob)
|
||||
#define dumpf(fmt, args...) \
|
||||
do { if (debug) printf("// " fmt, ## args); } while (0)
|
||||
|
||||
static void dump_blob(void *blob, bool debug)
|
||||
{
|
||||
uintptr_t blob_off = (uintptr_t)blob;
|
||||
struct fdt_header *bph = blob;
|
||||
uint32_t off_mem_rsvmap = fdt32_to_cpu(bph->off_mem_rsvmap);
|
||||
uint32_t off_dt = fdt32_to_cpu(bph->off_dt_struct);
|
||||
@ -97,7 +95,8 @@ static void dump_blob(void *blob)
|
||||
p = p_struct;
|
||||
while ((tag = fdt32_to_cpu(GET_CELL(p))) != FDT_END) {
|
||||
|
||||
/* printf("tag: 0x%08x (%d)\n", tag, p - p_struct); */
|
||||
dumpf("%04zx: tag: 0x%08x (%s)\n",
|
||||
(uintptr_t)p - blob_off - 4, tag, tagname(tag));
|
||||
|
||||
if (tag == FDT_BEGIN_NODE) {
|
||||
s = p;
|
||||
@ -136,27 +135,93 @@ static void dump_blob(void *blob)
|
||||
|
||||
p = PALIGN(p + sz, 4);
|
||||
|
||||
dumpf("%04zx: string: %s\n", (uintptr_t)s - blob_off, s);
|
||||
dumpf("%04zx: value\n", (uintptr_t)t - blob_off);
|
||||
printf("%*s%s", depth * shift, "", s);
|
||||
print_data(t, sz);
|
||||
utilfdt_print_data(t, sz);
|
||||
printf(";\n");
|
||||
}
|
||||
}
|
||||
|
||||
/* Usage related data. */
|
||||
static const char usage_synopsis[] = "fdtdump [options] <file>";
|
||||
static const char usage_short_opts[] = "ds" USAGE_COMMON_SHORT_OPTS;
|
||||
static struct option const usage_long_opts[] = {
|
||||
{"debug", no_argument, NULL, 'd'},
|
||||
{"scan", no_argument, NULL, 's'},
|
||||
USAGE_COMMON_LONG_OPTS
|
||||
};
|
||||
static const char * const usage_opts_help[] = {
|
||||
"Dump debug information while decoding the file",
|
||||
"Scan for an embedded fdt in file",
|
||||
USAGE_COMMON_OPTS_HELP
|
||||
};
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
int opt;
|
||||
const char *file;
|
||||
char *buf;
|
||||
bool debug = false;
|
||||
bool scan = false;
|
||||
off_t len;
|
||||
|
||||
if (argc < 2) {
|
||||
fprintf(stderr, "supply input filename\n");
|
||||
return 5;
|
||||
while ((opt = util_getopt_long()) != EOF) {
|
||||
switch (opt) {
|
||||
case_USAGE_COMMON_FLAGS
|
||||
|
||||
case 'd':
|
||||
debug = true;
|
||||
break;
|
||||
case 's':
|
||||
scan = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (optind != argc - 1)
|
||||
usage("missing input filename");
|
||||
file = argv[optind];
|
||||
|
||||
buf = utilfdt_read_len(file, &len);
|
||||
if (!buf)
|
||||
die("could not read: %s\n", file);
|
||||
|
||||
/* try and locate an embedded fdt in a bigger blob */
|
||||
if (scan) {
|
||||
unsigned char smagic[4];
|
||||
char *p = buf;
|
||||
char *endp = buf + len;
|
||||
|
||||
fdt_set_magic(smagic, FDT_MAGIC);
|
||||
|
||||
/* poor man's memmem */
|
||||
while (true) {
|
||||
p = memchr(p, smagic[0], endp - p - 4);
|
||||
if (!p)
|
||||
break;
|
||||
if (fdt_magic(p) == FDT_MAGIC) {
|
||||
/* try and validate the main struct */
|
||||
off_t this_len = endp - p;
|
||||
fdt32_t max_version = 17;
|
||||
if (fdt_version(p) <= max_version &&
|
||||
fdt_last_comp_version(p) < max_version &&
|
||||
fdt_totalsize(p) < this_len &&
|
||||
fdt_off_dt_struct(p) < this_len &&
|
||||
fdt_off_dt_strings(p) < this_len)
|
||||
break;
|
||||
if (debug)
|
||||
printf("%s: skipping fdt magic at offset %#zx\n",
|
||||
file, p - buf);
|
||||
}
|
||||
++p;
|
||||
}
|
||||
if (!p)
|
||||
die("%s: could not locate fdt magic\n", file);
|
||||
printf("%s: found fdt at offset %#zx\n", file, p - buf);
|
||||
buf = p;
|
||||
}
|
||||
|
||||
buf = utilfdt_read(argv[1]);
|
||||
if (buf)
|
||||
dump_blob(buf);
|
||||
else
|
||||
return 10;
|
||||
dump_blob(buf, debug);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -277,33 +277,33 @@ static int do_fdtget(struct display_info *disp, const char *filename,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const char *usage_msg =
|
||||
"fdtget - read values from device tree\n"
|
||||
"\n"
|
||||
"Each value is printed on a new line.\n\n"
|
||||
"Usage:\n"
|
||||
/* Usage related data. */
|
||||
static const char usage_synopsis[] =
|
||||
"read values from device tree\n"
|
||||
" fdtget <options> <dt file> [<node> <property>]...\n"
|
||||
" fdtget -p <options> <dt file> [<node> ]...\n"
|
||||
"Options:\n"
|
||||
"\t-t <type>\tType of data\n"
|
||||
"\t-p\t\tList properties for each node\n"
|
||||
"\t-l\t\tList subnodes for each node\n"
|
||||
"\t-d\t\tDefault value to display when the property is "
|
||||
"missing\n"
|
||||
"\t-h\t\tPrint this help\n\n"
|
||||
"\n"
|
||||
"Each value is printed on a new line.\n"
|
||||
USAGE_TYPE_MSG;
|
||||
|
||||
static void usage(const char *msg)
|
||||
{
|
||||
if (msg)
|
||||
fprintf(stderr, "Error: %s\n\n", msg);
|
||||
|
||||
fprintf(stderr, "%s", usage_msg);
|
||||
exit(2);
|
||||
}
|
||||
static const char usage_short_opts[] = "t:pld:" USAGE_COMMON_SHORT_OPTS;
|
||||
static struct option const usage_long_opts[] = {
|
||||
{"type", a_argument, NULL, 't'},
|
||||
{"properties", no_argument, NULL, 'p'},
|
||||
{"list", no_argument, NULL, 'l'},
|
||||
{"default", a_argument, NULL, 'd'},
|
||||
USAGE_COMMON_LONG_OPTS,
|
||||
};
|
||||
static const char * const usage_opts_help[] = {
|
||||
"Type of data",
|
||||
"List properties for each node",
|
||||
"List subnodes for each node",
|
||||
"Default value to display when the property is missing",
|
||||
USAGE_COMMON_OPTS_HELP
|
||||
};
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
int opt;
|
||||
char *filename = NULL;
|
||||
struct display_info disp;
|
||||
int args_per_step = 2;
|
||||
@ -312,20 +312,14 @@ int main(int argc, char *argv[])
|
||||
memset(&disp, '\0', sizeof(disp));
|
||||
disp.size = -1;
|
||||
disp.mode = MODE_SHOW_VALUE;
|
||||
for (;;) {
|
||||
int c = getopt(argc, argv, "d:hlpt:");
|
||||
if (c == -1)
|
||||
break;
|
||||
|
||||
switch (c) {
|
||||
case 'h':
|
||||
case '?':
|
||||
usage(NULL);
|
||||
while ((opt = util_getopt_long()) != EOF) {
|
||||
switch (opt) {
|
||||
case_USAGE_COMMON_FLAGS
|
||||
|
||||
case 't':
|
||||
if (utilfdt_decode_type(optarg, &disp.type,
|
||||
&disp.size))
|
||||
usage("Invalid type string");
|
||||
usage("invalid type string");
|
||||
break;
|
||||
|
||||
case 'p':
|
||||
@ -347,7 +341,7 @@ int main(int argc, char *argv[])
|
||||
if (optind < argc)
|
||||
filename = argv[optind++];
|
||||
if (!filename)
|
||||
usage("Missing filename");
|
||||
usage("missing filename");
|
||||
|
||||
argv += optind;
|
||||
argc -= optind;
|
||||
@ -358,7 +352,7 @@ int main(int argc, char *argv[])
|
||||
|
||||
/* Check for node, property arguments */
|
||||
if (args_per_step == 2 && (argc % 2))
|
||||
usage("Must have an even number of arguments");
|
||||
usage("must have an even number of arguments");
|
||||
|
||||
if (do_fdtget(&disp, filename, argv, argc, args_per_step))
|
||||
return 1;
|
||||
|
@ -131,19 +131,59 @@ static int encode_value(struct display_info *disp, char **arg, int arg_count,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int store_key_value(void *blob, const char *node_name,
|
||||
#define ALIGN(x) (((x) + (FDT_TAGSIZE) - 1) & ~((FDT_TAGSIZE) - 1))
|
||||
|
||||
static char *_realloc_fdt(char *fdt, int delta)
|
||||
{
|
||||
int new_sz = fdt_totalsize(fdt) + delta;
|
||||
fdt = xrealloc(fdt, new_sz);
|
||||
fdt_open_into(fdt, fdt, new_sz);
|
||||
return fdt;
|
||||
}
|
||||
|
||||
static char *realloc_node(char *fdt, const char *name)
|
||||
{
|
||||
int delta;
|
||||
/* FDT_BEGIN_NODE, node name in off_struct and FDT_END_NODE */
|
||||
delta = sizeof(struct fdt_node_header) + ALIGN(strlen(name) + 1)
|
||||
+ FDT_TAGSIZE;
|
||||
return _realloc_fdt(fdt, delta);
|
||||
}
|
||||
|
||||
static char *realloc_property(char *fdt, int nodeoffset,
|
||||
const char *name, int newlen)
|
||||
{
|
||||
int delta = 0;
|
||||
int oldlen = 0;
|
||||
|
||||
if (!fdt_get_property(fdt, nodeoffset, name, &oldlen))
|
||||
/* strings + property header */
|
||||
delta = sizeof(struct fdt_property) + strlen(name) + 1;
|
||||
|
||||
if (newlen > oldlen)
|
||||
/* actual value in off_struct */
|
||||
delta += ALIGN(newlen) - ALIGN(oldlen);
|
||||
|
||||
return _realloc_fdt(fdt, delta);
|
||||
}
|
||||
|
||||
static int store_key_value(char **blob, const char *node_name,
|
||||
const char *property, const char *buf, int len)
|
||||
{
|
||||
int node;
|
||||
int err;
|
||||
|
||||
node = fdt_path_offset(blob, node_name);
|
||||
node = fdt_path_offset(*blob, node_name);
|
||||
if (node < 0) {
|
||||
report_error(node_name, -1, node);
|
||||
return -1;
|
||||
}
|
||||
|
||||
err = fdt_setprop(blob, node, property, buf, len);
|
||||
err = fdt_setprop(*blob, node, property, buf, len);
|
||||
if (err == -FDT_ERR_NOSPACE) {
|
||||
*blob = realloc_property(*blob, node, property, len);
|
||||
err = fdt_setprop(*blob, node, property, buf, len);
|
||||
}
|
||||
if (err) {
|
||||
report_error(property, -1, err);
|
||||
return -1;
|
||||
@ -161,7 +201,7 @@ static int store_key_value(void *blob, const char *node_name,
|
||||
* @param in_path Path to process
|
||||
* @return 0 if ok, -1 on error
|
||||
*/
|
||||
static int create_paths(void *blob, const char *in_path)
|
||||
static int create_paths(char **blob, const char *in_path)
|
||||
{
|
||||
const char *path = in_path;
|
||||
const char *sep;
|
||||
@ -177,10 +217,11 @@ static int create_paths(void *blob, const char *in_path)
|
||||
if (!sep)
|
||||
sep = path + strlen(path);
|
||||
|
||||
node = fdt_subnode_offset_namelen(blob, offset, path,
|
||||
node = fdt_subnode_offset_namelen(*blob, offset, path,
|
||||
sep - path);
|
||||
if (node == -FDT_ERR_NOTFOUND) {
|
||||
node = fdt_add_subnode_namelen(blob, offset, path,
|
||||
*blob = realloc_node(*blob, path);
|
||||
node = fdt_add_subnode_namelen(*blob, offset, path,
|
||||
sep - path);
|
||||
}
|
||||
if (node < 0) {
|
||||
@ -203,7 +244,7 @@ static int create_paths(void *blob, const char *in_path)
|
||||
* @param node_name Name of node to create
|
||||
* @return new node offset if found, or -1 on failure
|
||||
*/
|
||||
static int create_node(void *blob, const char *node_name)
|
||||
static int create_node(char **blob, const char *node_name)
|
||||
{
|
||||
int node = 0;
|
||||
char *p;
|
||||
@ -215,15 +256,17 @@ static int create_node(void *blob, const char *node_name)
|
||||
}
|
||||
*p = '\0';
|
||||
|
||||
*blob = realloc_node(*blob, p + 1);
|
||||
|
||||
if (p > node_name) {
|
||||
node = fdt_path_offset(blob, node_name);
|
||||
node = fdt_path_offset(*blob, node_name);
|
||||
if (node < 0) {
|
||||
report_error(node_name, -1, node);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
node = fdt_add_subnode(blob, node, p + 1);
|
||||
node = fdt_add_subnode(*blob, node, p + 1);
|
||||
if (node < 0) {
|
||||
report_error(p + 1, -1, node);
|
||||
return -1;
|
||||
@ -250,66 +293,64 @@ static int do_fdtput(struct display_info *disp, const char *filename,
|
||||
* store them into the property.
|
||||
*/
|
||||
assert(arg_count >= 2);
|
||||
if (disp->auto_path && create_paths(blob, *arg))
|
||||
if (disp->auto_path && create_paths(&blob, *arg))
|
||||
return -1;
|
||||
if (encode_value(disp, arg + 2, arg_count - 2, &value, &len) ||
|
||||
store_key_value(blob, *arg, arg[1], value, len))
|
||||
store_key_value(&blob, *arg, arg[1], value, len))
|
||||
ret = -1;
|
||||
break;
|
||||
case OPER_CREATE_NODE:
|
||||
for (; ret >= 0 && arg_count--; arg++) {
|
||||
if (disp->auto_path)
|
||||
ret = create_paths(blob, *arg);
|
||||
ret = create_paths(&blob, *arg);
|
||||
else
|
||||
ret = create_node(blob, *arg);
|
||||
ret = create_node(&blob, *arg);
|
||||
}
|
||||
break;
|
||||
}
|
||||
if (ret >= 0)
|
||||
if (ret >= 0) {
|
||||
fdt_pack(blob);
|
||||
ret = utilfdt_write(filename, blob);
|
||||
}
|
||||
|
||||
free(blob);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static const char *usage_msg =
|
||||
"fdtput - write a property value to a device tree\n"
|
||||
"\n"
|
||||
"The command line arguments are joined together into a single value.\n"
|
||||
"\n"
|
||||
"Usage:\n"
|
||||
/* Usage related data. */
|
||||
static const char usage_synopsis[] =
|
||||
"write a property value to a device tree\n"
|
||||
" fdtput <options> <dt file> <node> <property> [<value>...]\n"
|
||||
" fdtput -c <options> <dt file> [<node>...]\n"
|
||||
"Options:\n"
|
||||
"\t-c\t\tCreate nodes if they don't already exist\n"
|
||||
"\t-p\t\tAutomatically create nodes as needed for the node path\n"
|
||||
"\t-t <type>\tType of data\n"
|
||||
"\t-v\t\tVerbose: display each value decoded from command line\n"
|
||||
"\t-h\t\tPrint this help\n\n"
|
||||
"\n"
|
||||
"The command line arguments are joined together into a single value.\n"
|
||||
USAGE_TYPE_MSG;
|
||||
|
||||
static void usage(const char *msg)
|
||||
{
|
||||
if (msg)
|
||||
fprintf(stderr, "Error: %s\n\n", msg);
|
||||
|
||||
fprintf(stderr, "%s", usage_msg);
|
||||
exit(2);
|
||||
}
|
||||
static const char usage_short_opts[] = "cpt:v" USAGE_COMMON_SHORT_OPTS;
|
||||
static struct option const usage_long_opts[] = {
|
||||
{"create", no_argument, NULL, 'c'},
|
||||
{"auto-path", no_argument, NULL, 'p'},
|
||||
{"type", a_argument, NULL, 't'},
|
||||
{"verbose", no_argument, NULL, 'v'},
|
||||
USAGE_COMMON_LONG_OPTS,
|
||||
};
|
||||
static const char * const usage_opts_help[] = {
|
||||
"Create nodes if they don't already exist",
|
||||
"Automatically create nodes as needed for the node path",
|
||||
"Type of data",
|
||||
"Display each value decoded from command line",
|
||||
USAGE_COMMON_OPTS_HELP
|
||||
};
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
int opt;
|
||||
struct display_info disp;
|
||||
char *filename = NULL;
|
||||
|
||||
memset(&disp, '\0', sizeof(disp));
|
||||
disp.size = -1;
|
||||
disp.oper = OPER_WRITE_PROP;
|
||||
for (;;) {
|
||||
int c = getopt(argc, argv, "chpt:v");
|
||||
if (c == -1)
|
||||
break;
|
||||
|
||||
while ((opt = util_getopt_long()) != EOF) {
|
||||
/*
|
||||
* TODO: add options to:
|
||||
* - delete property
|
||||
@ -317,15 +358,13 @@ int main(int argc, char *argv[])
|
||||
* - rename node
|
||||
* - pack fdt before writing
|
||||
* - set amount of free space when writing
|
||||
* - expand fdt if value doesn't fit
|
||||
*/
|
||||
switch (c) {
|
||||
switch (opt) {
|
||||
case_USAGE_COMMON_FLAGS
|
||||
|
||||
case 'c':
|
||||
disp.oper = OPER_CREATE_NODE;
|
||||
break;
|
||||
case 'h':
|
||||
case '?':
|
||||
usage(NULL);
|
||||
case 'p':
|
||||
disp.auto_path = 1;
|
||||
break;
|
||||
@ -344,16 +383,16 @@ int main(int argc, char *argv[])
|
||||
if (optind < argc)
|
||||
filename = argv[optind++];
|
||||
if (!filename)
|
||||
usage("Missing filename");
|
||||
usage("missing filename");
|
||||
|
||||
argv += optind;
|
||||
argc -= optind;
|
||||
|
||||
if (disp.oper == OPER_WRITE_PROP) {
|
||||
if (argc < 1)
|
||||
usage("Missing node");
|
||||
usage("missing node");
|
||||
if (argc < 2)
|
||||
usage("Missing property");
|
||||
usage("missing property");
|
||||
}
|
||||
|
||||
if (do_fdtput(&disp, filename, argv, argc))
|
||||
|
@ -261,7 +261,10 @@ static void flatten_tree(struct node *tree, struct emitter *emit,
|
||||
{
|
||||
struct property *prop;
|
||||
struct node *child;
|
||||
int seen_name_prop = 0;
|
||||
bool seen_name_prop = false;
|
||||
|
||||
if (tree->deleted)
|
||||
return;
|
||||
|
||||
emit->beginnode(etarget, tree->labels);
|
||||
|
||||
@ -276,7 +279,7 @@ static void flatten_tree(struct node *tree, struct emitter *emit,
|
||||
int nameoff;
|
||||
|
||||
if (streq(prop->name, "name"))
|
||||
seen_name_prop = 1;
|
||||
seen_name_prop = true;
|
||||
|
||||
nameoff = stringtable_insert(strbuf, prop->name);
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
# be easily embeddable into other systems of Makefiles.
|
||||
#
|
||||
LIBFDT_soname = libfdt.$(SHAREDLIB_EXT).1
|
||||
LIBFDT_INCLUDES = fdt.h libfdt.h
|
||||
LIBFDT_INCLUDES = fdt.h libfdt.h libfdt_env.h
|
||||
LIBFDT_VERSION = version.lds
|
||||
LIBFDT_SRCS = fdt.c fdt_ro.c fdt_wip.c fdt_sw.c fdt_rw.c fdt_strerror.c fdt_empty_tree.c
|
||||
LIBFDT_OBJS = $(LIBFDT_SRCS:%.c=%.o)
|
||||
|
@ -92,7 +92,7 @@ const void *fdt_offset_ptr(const void *fdt, int offset, unsigned int len)
|
||||
|
||||
uint32_t fdt_next_tag(const void *fdt, int startoffset, int *nextoffset)
|
||||
{
|
||||
const uint32_t *tagp, *lenp;
|
||||
const fdt32_t *tagp, *lenp;
|
||||
uint32_t tag;
|
||||
int offset = startoffset;
|
||||
const char *p;
|
||||
@ -198,6 +198,34 @@ int fdt_next_node(const void *fdt, int offset, int *depth)
|
||||
return offset;
|
||||
}
|
||||
|
||||
int fdt_first_subnode(const void *fdt, int offset)
|
||||
{
|
||||
int depth = 0;
|
||||
|
||||
offset = fdt_next_node(fdt, offset, &depth);
|
||||
if (offset < 0 || depth != 1)
|
||||
return -FDT_ERR_NOTFOUND;
|
||||
|
||||
return offset;
|
||||
}
|
||||
|
||||
int fdt_next_subnode(const void *fdt, int offset)
|
||||
{
|
||||
int depth = 1;
|
||||
|
||||
/*
|
||||
* With respect to the parent, the depth of the next subnode will be
|
||||
* the same as the last.
|
||||
*/
|
||||
do {
|
||||
offset = fdt_next_node(fdt, offset, &depth);
|
||||
if (offset < 0 || depth < 1)
|
||||
return -FDT_ERR_NOTFOUND;
|
||||
} while (depth > 1);
|
||||
|
||||
return offset;
|
||||
}
|
||||
|
||||
const char *_fdt_find_string(const char *strtab, int tabsize, const char *s)
|
||||
{
|
||||
int len = strlen(s) + 1;
|
||||
|
@ -1,48 +1,99 @@
|
||||
#ifndef _FDT_H
|
||||
#define _FDT_H
|
||||
/*
|
||||
* libfdt - Flat Device Tree manipulation
|
||||
* Copyright (C) 2006 David Gibson, IBM Corporation.
|
||||
* Copyright 2012 Kim Phillips, Freescale Semiconductor.
|
||||
*
|
||||
* libfdt is dual licensed: you can use it either under the terms of
|
||||
* the GPL, or the BSD license, at your option.
|
||||
*
|
||||
* a) This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public
|
||||
* License along with this library; if not, write to the Free
|
||||
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
|
||||
* MA 02110-1301 USA
|
||||
*
|
||||
* Alternatively,
|
||||
*
|
||||
* b) Redistribution and use in source and binary forms, with or
|
||||
* without modification, are permitted provided that the following
|
||||
* conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer in the documentation and/or other materials
|
||||
* provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
||||
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
struct fdt_header {
|
||||
uint32_t magic; /* magic word FDT_MAGIC */
|
||||
uint32_t totalsize; /* total size of DT block */
|
||||
uint32_t off_dt_struct; /* offset to structure */
|
||||
uint32_t off_dt_strings; /* offset to strings */
|
||||
uint32_t off_mem_rsvmap; /* offset to memory reserve map */
|
||||
uint32_t version; /* format version */
|
||||
uint32_t last_comp_version; /* last compatible version */
|
||||
fdt32_t magic; /* magic word FDT_MAGIC */
|
||||
fdt32_t totalsize; /* total size of DT block */
|
||||
fdt32_t off_dt_struct; /* offset to structure */
|
||||
fdt32_t off_dt_strings; /* offset to strings */
|
||||
fdt32_t off_mem_rsvmap; /* offset to memory reserve map */
|
||||
fdt32_t version; /* format version */
|
||||
fdt32_t last_comp_version; /* last compatible version */
|
||||
|
||||
/* version 2 fields below */
|
||||
uint32_t boot_cpuid_phys; /* Which physical CPU id we're
|
||||
fdt32_t boot_cpuid_phys; /* Which physical CPU id we're
|
||||
booting on */
|
||||
/* version 3 fields below */
|
||||
uint32_t size_dt_strings; /* size of the strings block */
|
||||
fdt32_t size_dt_strings; /* size of the strings block */
|
||||
|
||||
/* version 17 fields below */
|
||||
uint32_t size_dt_struct; /* size of the structure block */
|
||||
fdt32_t size_dt_struct; /* size of the structure block */
|
||||
};
|
||||
|
||||
struct fdt_reserve_entry {
|
||||
uint64_t address;
|
||||
uint64_t size;
|
||||
fdt64_t address;
|
||||
fdt64_t size;
|
||||
};
|
||||
|
||||
struct fdt_node_header {
|
||||
uint32_t tag;
|
||||
fdt32_t tag;
|
||||
char name[0];
|
||||
};
|
||||
|
||||
struct fdt_property {
|
||||
uint32_t tag;
|
||||
uint32_t len;
|
||||
uint32_t nameoff;
|
||||
fdt32_t tag;
|
||||
fdt32_t len;
|
||||
fdt32_t nameoff;
|
||||
char data[0];
|
||||
};
|
||||
|
||||
#endif /* !__ASSEMBLY */
|
||||
|
||||
#define FDT_MAGIC 0xd00dfeed /* 4: version, 4: total size */
|
||||
#define FDT_TAGSIZE sizeof(uint32_t)
|
||||
#define FDT_TAGSIZE sizeof(fdt32_t)
|
||||
|
||||
#define FDT_BEGIN_NODE 0x1 /* Start node: full name */
|
||||
#define FDT_END_NODE 0x2 /* End node */
|
||||
@ -51,10 +102,10 @@ struct fdt_property {
|
||||
#define FDT_NOP 0x4 /* nop */
|
||||
#define FDT_END 0x9
|
||||
|
||||
#define FDT_V1_SIZE (7*sizeof(uint32_t))
|
||||
#define FDT_V2_SIZE (FDT_V1_SIZE + sizeof(uint32_t))
|
||||
#define FDT_V3_SIZE (FDT_V2_SIZE + sizeof(uint32_t))
|
||||
#define FDT_V1_SIZE (7*sizeof(fdt32_t))
|
||||
#define FDT_V2_SIZE (FDT_V1_SIZE + sizeof(fdt32_t))
|
||||
#define FDT_V3_SIZE (FDT_V2_SIZE + sizeof(fdt32_t))
|
||||
#define FDT_V16_SIZE FDT_V3_SIZE
|
||||
#define FDT_V17_SIZE (FDT_V16_SIZE + sizeof(uint32_t))
|
||||
#define FDT_V17_SIZE (FDT_V16_SIZE + sizeof(fdt32_t))
|
||||
|
||||
#endif /* _FDT_H */
|
||||
|
@ -322,7 +322,7 @@ const void *fdt_getprop(const void *fdt, int nodeoffset,
|
||||
|
||||
uint32_t fdt_get_phandle(const void *fdt, int nodeoffset)
|
||||
{
|
||||
const uint32_t *php;
|
||||
const fdt32_t *php;
|
||||
int len;
|
||||
|
||||
/* FIXME: This is a bit sub-optimal, since we potentially scan
|
||||
@ -515,8 +515,7 @@ int fdt_node_offset_by_phandle(const void *fdt, uint32_t phandle)
|
||||
return offset; /* error from fdt_next_node() */
|
||||
}
|
||||
|
||||
static int _fdt_stringlist_contains(const char *strlist, int listlen,
|
||||
const char *str)
|
||||
int fdt_stringlist_contains(const char *strlist, int listlen, const char *str)
|
||||
{
|
||||
int len = strlen(str);
|
||||
const char *p;
|
||||
@ -542,7 +541,7 @@ int fdt_node_check_compatible(const void *fdt, int nodeoffset,
|
||||
prop = fdt_getprop(fdt, nodeoffset, "compatible", &len);
|
||||
if (!prop)
|
||||
return len;
|
||||
if (_fdt_stringlist_contains(prop, len, compatible))
|
||||
if (fdt_stringlist_contains(prop, len, compatible))
|
||||
return 0;
|
||||
else
|
||||
return 1;
|
||||
|
@ -339,7 +339,7 @@ int fdt_add_subnode_namelen(void *fdt, int parentoffset,
|
||||
int nodelen;
|
||||
int err;
|
||||
uint32_t tag;
|
||||
uint32_t *endtag;
|
||||
fdt32_t *endtag;
|
||||
|
||||
FDT_RW_CHECK_HEADER(fdt);
|
||||
|
||||
@ -366,7 +366,7 @@ int fdt_add_subnode_namelen(void *fdt, int parentoffset,
|
||||
nh->tag = cpu_to_fdt32(FDT_BEGIN_NODE);
|
||||
memset(nh->name, 0, FDT_TAGALIGN(namelen+1));
|
||||
memcpy(nh->name, name, namelen);
|
||||
endtag = (uint32_t *)((char *)nh + nodelen - FDT_TAGSIZE);
|
||||
endtag = (fdt32_t *)((char *)nh + nodelen - FDT_TAGSIZE);
|
||||
*endtag = cpu_to_fdt32(FDT_END_NODE);
|
||||
|
||||
return offset;
|
||||
|
@ -107,6 +107,38 @@ int fdt_create(void *buf, int bufsize)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int fdt_resize(void *fdt, void *buf, int bufsize)
|
||||
{
|
||||
size_t headsize, tailsize;
|
||||
char *oldtail, *newtail;
|
||||
|
||||
FDT_SW_CHECK_HEADER(fdt);
|
||||
|
||||
headsize = fdt_off_dt_struct(fdt);
|
||||
tailsize = fdt_size_dt_strings(fdt);
|
||||
|
||||
if ((headsize + tailsize) > bufsize)
|
||||
return -FDT_ERR_NOSPACE;
|
||||
|
||||
oldtail = (char *)fdt + fdt_totalsize(fdt) - tailsize;
|
||||
newtail = (char *)buf + bufsize - tailsize;
|
||||
|
||||
/* Two cases to avoid clobbering data if the old and new
|
||||
* buffers partially overlap */
|
||||
if (buf <= fdt) {
|
||||
memmove(buf, fdt, headsize);
|
||||
memmove(newtail, oldtail, tailsize);
|
||||
} else {
|
||||
memmove(newtail, oldtail, tailsize);
|
||||
memmove(buf, fdt, headsize);
|
||||
}
|
||||
|
||||
fdt_set_off_dt_strings(buf, bufsize);
|
||||
fdt_set_totalsize(buf, bufsize);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int fdt_add_reservemap_entry(void *fdt, uint64_t addr, uint64_t size)
|
||||
{
|
||||
struct fdt_reserve_entry *re;
|
||||
@ -153,7 +185,7 @@ int fdt_begin_node(void *fdt, const char *name)
|
||||
|
||||
int fdt_end_node(void *fdt)
|
||||
{
|
||||
uint32_t *en;
|
||||
fdt32_t *en;
|
||||
|
||||
FDT_SW_CHECK_HEADER(fdt);
|
||||
|
||||
@ -213,7 +245,7 @@ int fdt_property(void *fdt, const char *name, const void *val, int len)
|
||||
int fdt_finish(void *fdt)
|
||||
{
|
||||
char *p = (char *)fdt;
|
||||
uint32_t *end;
|
||||
fdt32_t *end;
|
||||
int oldstroffset, newstroffset;
|
||||
uint32_t tag;
|
||||
int offset, nextoffset;
|
||||
|
@ -74,7 +74,7 @@ int fdt_setprop_inplace(void *fdt, int nodeoffset, const char *name,
|
||||
|
||||
static void _fdt_nop_region(void *start, int len)
|
||||
{
|
||||
uint32_t *p;
|
||||
fdt32_t *p;
|
||||
|
||||
for (p = start; (char *)p < ((char *)start + len); p++)
|
||||
*p = cpu_to_fdt32(FDT_NOP);
|
||||
|
@ -136,6 +136,28 @@ uint32_t fdt_next_tag(const void *fdt, int offset, int *nextoffset);
|
||||
|
||||
int fdt_next_node(const void *fdt, int offset, int *depth);
|
||||
|
||||
/**
|
||||
* fdt_first_subnode() - get offset of first direct subnode
|
||||
*
|
||||
* @fdt: FDT blob
|
||||
* @offset: Offset of node to check
|
||||
* @return offset of first subnode, or -FDT_ERR_NOTFOUND if there is none
|
||||
*/
|
||||
int fdt_first_subnode(const void *fdt, int offset);
|
||||
|
||||
/**
|
||||
* fdt_next_subnode() - get offset of next direct subnode
|
||||
*
|
||||
* After first calling fdt_first_subnode(), call this function repeatedly to
|
||||
* get direct subnodes of a parent node.
|
||||
*
|
||||
* @fdt: FDT blob
|
||||
* @offset: Offset of previous subnode
|
||||
* @return offset of next subnode, or -FDT_ERR_NOTFOUND if there are no more
|
||||
* subnodes
|
||||
*/
|
||||
int fdt_next_subnode(const void *fdt, int offset);
|
||||
|
||||
/**********************************************************************/
|
||||
/* General functions */
|
||||
/**********************************************************************/
|
||||
@ -582,7 +604,7 @@ const char *fdt_get_alias_namelen(const void *fdt,
|
||||
* value of the property named 'name' in the node /aliases.
|
||||
*
|
||||
* returns:
|
||||
* a pointer to the expansion of the alias named 'name', of it exists
|
||||
* a pointer to the expansion of the alias named 'name', if it exists
|
||||
* NULL, if the given alias or the /aliases node does not exist
|
||||
*/
|
||||
const char *fdt_get_alias(const void *fdt, const char *name);
|
||||
@ -816,6 +838,20 @@ int fdt_node_check_compatible(const void *fdt, int nodeoffset,
|
||||
int fdt_node_offset_by_compatible(const void *fdt, int startoffset,
|
||||
const char *compatible);
|
||||
|
||||
/**
|
||||
* fdt_stringlist_contains - check a string list property for a string
|
||||
* @strlist: Property containing a list of strings to check
|
||||
* @listlen: Length of property
|
||||
* @str: String to search for
|
||||
*
|
||||
* This is a utility function provided for convenience. The list contains
|
||||
* one or more strings, each terminated by \0, as is found in a device tree
|
||||
* "compatible" property.
|
||||
*
|
||||
* @return: 1 if the string is found in the list, 0 not found, or invalid list
|
||||
*/
|
||||
int fdt_stringlist_contains(const char *strlist, int listlen, const char *str);
|
||||
|
||||
/**********************************************************************/
|
||||
/* Write-in-place functions */
|
||||
/**********************************************************************/
|
||||
@ -882,8 +918,8 @@ int fdt_setprop_inplace(void *fdt, int nodeoffset, const char *name,
|
||||
static inline int fdt_setprop_inplace_u32(void *fdt, int nodeoffset,
|
||||
const char *name, uint32_t val)
|
||||
{
|
||||
val = cpu_to_fdt32(val);
|
||||
return fdt_setprop_inplace(fdt, nodeoffset, name, &val, sizeof(val));
|
||||
fdt32_t tmp = cpu_to_fdt32(val);
|
||||
return fdt_setprop_inplace(fdt, nodeoffset, name, &tmp, sizeof(tmp));
|
||||
}
|
||||
|
||||
/**
|
||||
@ -917,8 +953,8 @@ static inline int fdt_setprop_inplace_u32(void *fdt, int nodeoffset,
|
||||
static inline int fdt_setprop_inplace_u64(void *fdt, int nodeoffset,
|
||||
const char *name, uint64_t val)
|
||||
{
|
||||
val = cpu_to_fdt64(val);
|
||||
return fdt_setprop_inplace(fdt, nodeoffset, name, &val, sizeof(val));
|
||||
fdt64_t tmp = cpu_to_fdt64(val);
|
||||
return fdt_setprop_inplace(fdt, nodeoffset, name, &tmp, sizeof(tmp));
|
||||
}
|
||||
|
||||
/**
|
||||
@ -987,19 +1023,20 @@ int fdt_nop_node(void *fdt, int nodeoffset);
|
||||
/**********************************************************************/
|
||||
|
||||
int fdt_create(void *buf, int bufsize);
|
||||
int fdt_resize(void *fdt, void *buf, int bufsize);
|
||||
int fdt_add_reservemap_entry(void *fdt, uint64_t addr, uint64_t size);
|
||||
int fdt_finish_reservemap(void *fdt);
|
||||
int fdt_begin_node(void *fdt, const char *name);
|
||||
int fdt_property(void *fdt, const char *name, const void *val, int len);
|
||||
static inline int fdt_property_u32(void *fdt, const char *name, uint32_t val)
|
||||
{
|
||||
val = cpu_to_fdt32(val);
|
||||
return fdt_property(fdt, name, &val, sizeof(val));
|
||||
fdt32_t tmp = cpu_to_fdt32(val);
|
||||
return fdt_property(fdt, name, &tmp, sizeof(tmp));
|
||||
}
|
||||
static inline int fdt_property_u64(void *fdt, const char *name, uint64_t val)
|
||||
{
|
||||
val = cpu_to_fdt64(val);
|
||||
return fdt_property(fdt, name, &val, sizeof(val));
|
||||
fdt64_t tmp = cpu_to_fdt64(val);
|
||||
return fdt_property(fdt, name, &tmp, sizeof(tmp));
|
||||
}
|
||||
static inline int fdt_property_cell(void *fdt, const char *name, uint32_t val)
|
||||
{
|
||||
@ -1154,8 +1191,8 @@ int fdt_setprop(void *fdt, int nodeoffset, const char *name,
|
||||
static inline int fdt_setprop_u32(void *fdt, int nodeoffset, const char *name,
|
||||
uint32_t val)
|
||||
{
|
||||
val = cpu_to_fdt32(val);
|
||||
return fdt_setprop(fdt, nodeoffset, name, &val, sizeof(val));
|
||||
fdt32_t tmp = cpu_to_fdt32(val);
|
||||
return fdt_setprop(fdt, nodeoffset, name, &tmp, sizeof(tmp));
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1189,8 +1226,8 @@ static inline int fdt_setprop_u32(void *fdt, int nodeoffset, const char *name,
|
||||
static inline int fdt_setprop_u64(void *fdt, int nodeoffset, const char *name,
|
||||
uint64_t val)
|
||||
{
|
||||
val = cpu_to_fdt64(val);
|
||||
return fdt_setprop(fdt, nodeoffset, name, &val, sizeof(val));
|
||||
fdt64_t tmp = cpu_to_fdt64(val);
|
||||
return fdt_setprop(fdt, nodeoffset, name, &tmp, sizeof(tmp));
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1296,8 +1333,8 @@ int fdt_appendprop(void *fdt, int nodeoffset, const char *name,
|
||||
static inline int fdt_appendprop_u32(void *fdt, int nodeoffset,
|
||||
const char *name, uint32_t val)
|
||||
{
|
||||
val = cpu_to_fdt32(val);
|
||||
return fdt_appendprop(fdt, nodeoffset, name, &val, sizeof(val));
|
||||
fdt32_t tmp = cpu_to_fdt32(val);
|
||||
return fdt_appendprop(fdt, nodeoffset, name, &tmp, sizeof(tmp));
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1331,8 +1368,8 @@ static inline int fdt_appendprop_u32(void *fdt, int nodeoffset,
|
||||
static inline int fdt_appendprop_u64(void *fdt, int nodeoffset,
|
||||
const char *name, uint64_t val)
|
||||
{
|
||||
val = cpu_to_fdt64(val);
|
||||
return fdt_appendprop(fdt, nodeoffset, name, &val, sizeof(val));
|
||||
fdt64_t tmp = cpu_to_fdt64(val);
|
||||
return fdt_appendprop(fdt, nodeoffset, name, &tmp, sizeof(tmp));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1,29 +1,111 @@
|
||||
#ifndef _LIBFDT_ENV_H
|
||||
#define _LIBFDT_ENV_H
|
||||
/*
|
||||
* libfdt - Flat Device Tree manipulation
|
||||
* Copyright (C) 2006 David Gibson, IBM Corporation.
|
||||
* Copyright 2012 Kim Phillips, Freescale Semiconductor.
|
||||
*
|
||||
* libfdt is dual licensed: you can use it either under the terms of
|
||||
* the GPL, or the BSD license, at your option.
|
||||
*
|
||||
* a) This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public
|
||||
* License along with this library; if not, write to the Free
|
||||
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
|
||||
* MA 02110-1301 USA
|
||||
*
|
||||
* Alternatively,
|
||||
*
|
||||
* b) Redistribution and use in source and binary forms, with or
|
||||
* without modification, are permitted provided that the following
|
||||
* conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer in the documentation and/or other materials
|
||||
* provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
||||
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
#include <string.h>
|
||||
|
||||
#define EXTRACT_BYTE(n) ((unsigned long long)((uint8_t *)&x)[n])
|
||||
static inline uint16_t fdt16_to_cpu(uint16_t x)
|
||||
{
|
||||
return (EXTRACT_BYTE(0) << 8) | EXTRACT_BYTE(1);
|
||||
}
|
||||
#define cpu_to_fdt16(x) fdt16_to_cpu(x)
|
||||
#ifdef __CHECKER__
|
||||
#define __force __attribute__((force))
|
||||
#define __bitwise __attribute__((bitwise))
|
||||
#else
|
||||
#define __force
|
||||
#define __bitwise
|
||||
#endif
|
||||
|
||||
static inline uint32_t fdt32_to_cpu(uint32_t x)
|
||||
{
|
||||
return (EXTRACT_BYTE(0) << 24) | (EXTRACT_BYTE(1) << 16) | (EXTRACT_BYTE(2) << 8) | EXTRACT_BYTE(3);
|
||||
}
|
||||
#define cpu_to_fdt32(x) fdt32_to_cpu(x)
|
||||
typedef uint16_t __bitwise fdt16_t;
|
||||
typedef uint32_t __bitwise fdt32_t;
|
||||
typedef uint64_t __bitwise fdt64_t;
|
||||
|
||||
static inline uint64_t fdt64_to_cpu(uint64_t x)
|
||||
#define EXTRACT_BYTE(x, n) ((unsigned long long)((uint8_t *)&x)[n])
|
||||
#define CPU_TO_FDT16(x) ((EXTRACT_BYTE(x, 0) << 8) | EXTRACT_BYTE(x, 1))
|
||||
#define CPU_TO_FDT32(x) ((EXTRACT_BYTE(x, 0) << 24) | (EXTRACT_BYTE(x, 1) << 16) | \
|
||||
(EXTRACT_BYTE(x, 2) << 8) | EXTRACT_BYTE(x, 3))
|
||||
#define CPU_TO_FDT64(x) ((EXTRACT_BYTE(x, 0) << 56) | (EXTRACT_BYTE(x, 1) << 48) | \
|
||||
(EXTRACT_BYTE(x, 2) << 40) | (EXTRACT_BYTE(x, 3) << 32) | \
|
||||
(EXTRACT_BYTE(x, 4) << 24) | (EXTRACT_BYTE(x, 5) << 16) | \
|
||||
(EXTRACT_BYTE(x, 6) << 8) | EXTRACT_BYTE(x, 7))
|
||||
|
||||
static inline uint16_t fdt16_to_cpu(fdt16_t x)
|
||||
{
|
||||
return (EXTRACT_BYTE(0) << 56) | (EXTRACT_BYTE(1) << 48) | (EXTRACT_BYTE(2) << 40) | (EXTRACT_BYTE(3) << 32)
|
||||
| (EXTRACT_BYTE(4) << 24) | (EXTRACT_BYTE(5) << 16) | (EXTRACT_BYTE(6) << 8) | EXTRACT_BYTE(7);
|
||||
return (__force uint16_t)CPU_TO_FDT16(x);
|
||||
}
|
||||
#define cpu_to_fdt64(x) fdt64_to_cpu(x)
|
||||
static inline fdt16_t cpu_to_fdt16(uint16_t x)
|
||||
{
|
||||
return (__force fdt16_t)CPU_TO_FDT16(x);
|
||||
}
|
||||
|
||||
static inline uint32_t fdt32_to_cpu(fdt32_t x)
|
||||
{
|
||||
return (__force uint32_t)CPU_TO_FDT32(x);
|
||||
}
|
||||
static inline fdt32_t cpu_to_fdt32(uint32_t x)
|
||||
{
|
||||
return (__force fdt32_t)CPU_TO_FDT32(x);
|
||||
}
|
||||
|
||||
static inline uint64_t fdt64_to_cpu(fdt64_t x)
|
||||
{
|
||||
return (__force uint64_t)CPU_TO_FDT64(x);
|
||||
}
|
||||
static inline fdt64_t cpu_to_fdt64(uint64_t x)
|
||||
{
|
||||
return (__force fdt64_t)CPU_TO_FDT64(x);
|
||||
}
|
||||
#undef CPU_TO_FDT64
|
||||
#undef CPU_TO_FDT32
|
||||
#undef CPU_TO_FDT16
|
||||
#undef EXTRACT_BYTE
|
||||
|
||||
#endif /* _LIBFDT_ENV_H */
|
||||
|
@ -48,6 +48,12 @@ LIBFDT_1.2 {
|
||||
fdt_strerror;
|
||||
fdt_offset_ptr;
|
||||
fdt_next_tag;
|
||||
fdt_appendprop;
|
||||
fdt_create_empty_tree;
|
||||
fdt_first_property_offset;
|
||||
fdt_get_property_by_offset;
|
||||
fdt_getprop_by_offset;
|
||||
fdt_next_property_offset;
|
||||
|
||||
local:
|
||||
*;
|
||||
|
@ -29,16 +29,27 @@ void add_label(struct label **labels, char *label)
|
||||
struct label *new;
|
||||
|
||||
/* Make sure the label isn't already there */
|
||||
for_each_label(*labels, new)
|
||||
if (streq(new->label, label))
|
||||
for_each_label_withdel(*labels, new)
|
||||
if (streq(new->label, label)) {
|
||||
new->deleted = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
new = xmalloc(sizeof(*new));
|
||||
memset(new, 0, sizeof(*new));
|
||||
new->label = label;
|
||||
new->next = *labels;
|
||||
*labels = new;
|
||||
}
|
||||
|
||||
void delete_labels(struct label **labels)
|
||||
{
|
||||
struct label *label;
|
||||
|
||||
for_each_label(*labels, label)
|
||||
label->deleted = 1;
|
||||
}
|
||||
|
||||
struct property *build_property(char *name, struct data val)
|
||||
{
|
||||
struct property *new = xmalloc(sizeof(*new));
|
||||
@ -51,6 +62,18 @@ struct property *build_property(char *name, struct data val)
|
||||
return new;
|
||||
}
|
||||
|
||||
struct property *build_property_delete(char *name)
|
||||
{
|
||||
struct property *new = xmalloc(sizeof(*new));
|
||||
|
||||
memset(new, 0, sizeof(*new));
|
||||
|
||||
new->name = name;
|
||||
new->deleted = 1;
|
||||
|
||||
return new;
|
||||
}
|
||||
|
||||
struct property *chain_property(struct property *first, struct property *list)
|
||||
{
|
||||
assert(first->next == NULL);
|
||||
@ -91,6 +114,17 @@ struct node *build_node(struct property *proplist, struct node *children)
|
||||
return new;
|
||||
}
|
||||
|
||||
struct node *build_node_delete(void)
|
||||
{
|
||||
struct node *new = xmalloc(sizeof(*new));
|
||||
|
||||
memset(new, 0, sizeof(*new));
|
||||
|
||||
new->deleted = 1;
|
||||
|
||||
return new;
|
||||
}
|
||||
|
||||
struct node *name_node(struct node *node, char *name)
|
||||
{
|
||||
assert(node->name == NULL);
|
||||
@ -106,8 +140,10 @@ struct node *merge_nodes(struct node *old_node, struct node *new_node)
|
||||
struct node *new_child, *old_child;
|
||||
struct label *l;
|
||||
|
||||
old_node->deleted = 0;
|
||||
|
||||
/* Add new node labels to old node */
|
||||
for_each_label(new_node->labels, l)
|
||||
for_each_label_withdel(new_node->labels, l)
|
||||
add_label(&old_node->labels, l->label);
|
||||
|
||||
/* Move properties from the new node to the old node. If there
|
||||
@ -118,14 +154,21 @@ struct node *merge_nodes(struct node *old_node, struct node *new_node)
|
||||
new_node->proplist = new_prop->next;
|
||||
new_prop->next = NULL;
|
||||
|
||||
if (new_prop->deleted) {
|
||||
delete_property_by_name(old_node, new_prop->name);
|
||||
free(new_prop);
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Look for a collision, set new value if there is */
|
||||
for_each_property(old_node, old_prop) {
|
||||
for_each_property_withdel(old_node, old_prop) {
|
||||
if (streq(old_prop->name, new_prop->name)) {
|
||||
/* Add new labels to old property */
|
||||
for_each_label(new_prop->labels, l)
|
||||
for_each_label_withdel(new_prop->labels, l)
|
||||
add_label(&old_prop->labels, l->label);
|
||||
|
||||
old_prop->val = new_prop->val;
|
||||
old_prop->deleted = 0;
|
||||
free(new_prop);
|
||||
new_prop = NULL;
|
||||
break;
|
||||
@ -146,8 +189,14 @@ struct node *merge_nodes(struct node *old_node, struct node *new_node)
|
||||
new_child->parent = NULL;
|
||||
new_child->next_sibling = NULL;
|
||||
|
||||
if (new_child->deleted) {
|
||||
delete_node_by_name(old_node, new_child->name);
|
||||
free(new_child);
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Search for a collision. Merge if there is */
|
||||
for_each_child(old_node, old_child) {
|
||||
for_each_child_withdel(old_node, old_child) {
|
||||
if (streq(old_child->name, new_child->name)) {
|
||||
merge_nodes(old_child, new_child);
|
||||
new_child = NULL;
|
||||
@ -188,6 +237,25 @@ void add_property(struct node *node, struct property *prop)
|
||||
*p = prop;
|
||||
}
|
||||
|
||||
void delete_property_by_name(struct node *node, char *name)
|
||||
{
|
||||
struct property *prop = node->proplist;
|
||||
|
||||
while (prop) {
|
||||
if (!strcmp(prop->name, name)) {
|
||||
delete_property(prop);
|
||||
return;
|
||||
}
|
||||
prop = prop->next;
|
||||
}
|
||||
}
|
||||
|
||||
void delete_property(struct property *prop)
|
||||
{
|
||||
prop->deleted = 1;
|
||||
delete_labels(&prop->labels);
|
||||
}
|
||||
|
||||
void add_child(struct node *parent, struct node *child)
|
||||
{
|
||||
struct node **p;
|
||||
@ -202,6 +270,32 @@ void add_child(struct node *parent, struct node *child)
|
||||
*p = child;
|
||||
}
|
||||
|
||||
void delete_node_by_name(struct node *parent, char *name)
|
||||
{
|
||||
struct node *node = parent->children;
|
||||
|
||||
while (node) {
|
||||
if (!strcmp(node->name, name)) {
|
||||
delete_node(node);
|
||||
return;
|
||||
}
|
||||
node = node->next_sibling;
|
||||
}
|
||||
}
|
||||
|
||||
void delete_node(struct node *node)
|
||||
{
|
||||
struct property *prop;
|
||||
struct node *child;
|
||||
|
||||
node->deleted = 1;
|
||||
for_each_child(node, child)
|
||||
delete_node(child);
|
||||
for_each_property(node, prop)
|
||||
delete_property(prop);
|
||||
delete_labels(&node->labels);
|
||||
}
|
||||
|
||||
struct reserve_info *build_reserve_entry(uint64_t address, uint64_t size)
|
||||
{
|
||||
struct reserve_info *new = xmalloc(sizeof(*new));
|
||||
@ -353,8 +447,11 @@ struct node *get_node_by_path(struct node *tree, const char *path)
|
||||
const char *p;
|
||||
struct node *child;
|
||||
|
||||
if (!path || ! (*path))
|
||||
if (!path || ! (*path)) {
|
||||
if (tree->deleted)
|
||||
return NULL;
|
||||
return tree;
|
||||
}
|
||||
|
||||
while (path[0] == '/')
|
||||
path++;
|
||||
@ -397,8 +494,11 @@ struct node *get_node_by_phandle(struct node *tree, cell_t phandle)
|
||||
|
||||
assert((phandle != 0) && (phandle != -1));
|
||||
|
||||
if (tree->phandle == phandle)
|
||||
if (tree->phandle == phandle) {
|
||||
if (tree->deleted)
|
||||
return NULL;
|
||||
return tree;
|
||||
}
|
||||
|
||||
for_each_child(tree, child) {
|
||||
node = get_node_by_phandle(child, phandle);
|
||||
@ -535,7 +635,7 @@ static void sort_properties(struct node *node)
|
||||
int n = 0, i = 0;
|
||||
struct property *prop, **tbl;
|
||||
|
||||
for_each_property(node, prop)
|
||||
for_each_property_withdel(node, prop)
|
||||
n++;
|
||||
|
||||
if (n == 0)
|
||||
@ -543,7 +643,7 @@ static void sort_properties(struct node *node)
|
||||
|
||||
tbl = xmalloc(n * sizeof(*tbl));
|
||||
|
||||
for_each_property(node, prop)
|
||||
for_each_property_withdel(node, prop)
|
||||
tbl[i++] = prop;
|
||||
|
||||
qsort(tbl, n, sizeof(*tbl), cmp_prop);
|
||||
@ -571,7 +671,7 @@ static void sort_subnodes(struct node *node)
|
||||
int n = 0, i = 0;
|
||||
struct node *subnode, **tbl;
|
||||
|
||||
for_each_child(node, subnode)
|
||||
for_each_child_withdel(node, subnode)
|
||||
n++;
|
||||
|
||||
if (n == 0)
|
||||
@ -579,7 +679,7 @@ static void sort_subnodes(struct node *node)
|
||||
|
||||
tbl = xmalloc(n * sizeof(*tbl));
|
||||
|
||||
for_each_child(node, subnode)
|
||||
for_each_child_withdel(node, subnode)
|
||||
tbl[i++] = subnode;
|
||||
|
||||
qsort(tbl, n, sizeof(*tbl), cmp_subnode);
|
||||
@ -598,7 +698,7 @@ static void sort_node(struct node *node)
|
||||
|
||||
sort_properties(node);
|
||||
sort_subnodes(node);
|
||||
for_each_child(node, c)
|
||||
for_each_child_withdel(node, c)
|
||||
sort_node(c);
|
||||
}
|
||||
|
||||
|
@ -159,7 +159,7 @@ void srcfile_push(const char *fname)
|
||||
current_srcfile = srcfile;
|
||||
}
|
||||
|
||||
int srcfile_pop(void)
|
||||
bool srcfile_pop(void)
|
||||
{
|
||||
struct srcfile_state *srcfile = current_srcfile;
|
||||
|
||||
@ -177,7 +177,7 @@ int srcfile_pop(void)
|
||||
* fix this we could either allocate all the files from a
|
||||
* table, or use a pool allocator. */
|
||||
|
||||
return current_srcfile ? 1 : 0;
|
||||
return current_srcfile ? true : false;
|
||||
}
|
||||
|
||||
void srcfile_add_search_path(const char *dirname)
|
||||
@ -290,41 +290,32 @@ srcpos_string(struct srcpos *pos)
|
||||
return pos_str;
|
||||
}
|
||||
|
||||
void
|
||||
srcpos_verror(struct srcpos *pos, char const *fmt, va_list va)
|
||||
void srcpos_verror(struct srcpos *pos, const char *prefix,
|
||||
const char *fmt, va_list va)
|
||||
{
|
||||
const char *srcstr;
|
||||
|
||||
srcstr = srcpos_string(pos);
|
||||
|
||||
fprintf(stdout, "Error: %s ", srcstr);
|
||||
vfprintf(stdout, fmt, va);
|
||||
fprintf(stdout, "\n");
|
||||
}
|
||||
|
||||
void
|
||||
srcpos_error(struct srcpos *pos, char const *fmt, ...)
|
||||
{
|
||||
va_list va;
|
||||
|
||||
va_start(va, fmt);
|
||||
srcpos_verror(pos, fmt, va);
|
||||
va_end(va);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
srcpos_warn(struct srcpos *pos, char const *fmt, ...)
|
||||
{
|
||||
const char *srcstr;
|
||||
va_list va;
|
||||
va_start(va, fmt);
|
||||
char *srcstr;
|
||||
|
||||
srcstr = srcpos_string(pos);
|
||||
|
||||
fprintf(stderr, "Warning: %s ", srcstr);
|
||||
fprintf(stderr, "%s: %s ", prefix, srcstr);
|
||||
vfprintf(stderr, fmt, va);
|
||||
fprintf(stderr, "\n");
|
||||
|
||||
free(srcstr);
|
||||
}
|
||||
|
||||
void srcpos_error(struct srcpos *pos, const char *prefix,
|
||||
const char *fmt, ...)
|
||||
{
|
||||
va_list va;
|
||||
|
||||
va_start(va, fmt);
|
||||
srcpos_verror(pos, prefix, fmt, va);
|
||||
va_end(va);
|
||||
}
|
||||
|
||||
void srcpos_set_line(char *f, int l)
|
||||
{
|
||||
current_srcfile->name = f;
|
||||
current_srcfile->lineno = l;
|
||||
}
|
||||
|
@ -21,6 +21,7 @@
|
||||
#define _SRCPOS_H_
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
struct srcfile_state {
|
||||
FILE *f;
|
||||
@ -55,7 +56,7 @@ extern struct srcfile_state *current_srcfile; /* = NULL */
|
||||
FILE *srcfile_relative_open(const char *fname, char **fullnamep);
|
||||
|
||||
void srcfile_push(const char *fname);
|
||||
int srcfile_pop(void);
|
||||
bool srcfile_pop(void);
|
||||
|
||||
/**
|
||||
* Add a new directory to the search path for input files
|
||||
@ -106,11 +107,13 @@ extern struct srcpos *srcpos_copy(struct srcpos *pos);
|
||||
extern char *srcpos_string(struct srcpos *pos);
|
||||
extern void srcpos_dump(struct srcpos *pos);
|
||||
|
||||
extern void srcpos_verror(struct srcpos *pos, char const *, va_list va)
|
||||
__attribute__((format(printf, 2, 0)));
|
||||
extern void srcpos_error(struct srcpos *pos, char const *, ...)
|
||||
__attribute__((format(printf, 2, 3)));
|
||||
extern void srcpos_warn(struct srcpos *pos, char const *, ...)
|
||||
__attribute__((format(printf, 2, 3)));
|
||||
extern void srcpos_verror(struct srcpos *pos, const char *prefix,
|
||||
const char *fmt, va_list va)
|
||||
__attribute__((format(printf, 3, 0)));
|
||||
extern void srcpos_error(struct srcpos *pos, const char *prefix,
|
||||
const char *fmt, ...)
|
||||
__attribute__((format(printf, 3, 4)));
|
||||
|
||||
extern void srcpos_set_line(char *f, int l);
|
||||
|
||||
#endif /* _SRCPOS_H_ */
|
||||
|
@ -26,12 +26,12 @@ extern int yyparse(void);
|
||||
extern YYLTYPE yylloc;
|
||||
|
||||
struct boot_info *the_boot_info;
|
||||
int treesource_error;
|
||||
bool treesource_error;
|
||||
|
||||
struct boot_info *dt_from_source(const char *fname)
|
||||
{
|
||||
the_boot_info = NULL;
|
||||
treesource_error = 0;
|
||||
treesource_error = false;
|
||||
|
||||
srcfile_push(fname);
|
||||
yyin = current_srcfile->f;
|
||||
@ -54,9 +54,9 @@ static void write_prefix(FILE *f, int level)
|
||||
fputc('\t', f);
|
||||
}
|
||||
|
||||
static int isstring(char c)
|
||||
static bool isstring(char c)
|
||||
{
|
||||
return (isprint(c)
|
||||
return (isprint((unsigned char)c)
|
||||
|| (c == '\0')
|
||||
|| strchr("\a\b\t\n\v\f\r", c));
|
||||
}
|
||||
@ -119,7 +119,7 @@ static void write_propval_string(FILE *f, struct data val)
|
||||
fprintf(f, "\"");
|
||||
break;
|
||||
default:
|
||||
if (isprint(c))
|
||||
if (isprint((unsigned char)c))
|
||||
fprintf(f, "%c", c);
|
||||
else
|
||||
fprintf(f, "\\x%02hhx", c);
|
||||
|
@ -34,6 +34,7 @@
|
||||
|
||||
#include "libfdt.h"
|
||||
#include "util.h"
|
||||
#include "version_gen.h"
|
||||
|
||||
char *xstrdup(const char *s)
|
||||
{
|
||||
@ -69,10 +70,10 @@ char *join_path(const char *path, const char *name)
|
||||
return str;
|
||||
}
|
||||
|
||||
int util_is_printable_string(const void *data, int len)
|
||||
bool util_is_printable_string(const void *data, int len)
|
||||
{
|
||||
const char *s = data;
|
||||
const char *ss;
|
||||
const char *ss, *se;
|
||||
|
||||
/* zero length is not */
|
||||
if (len == 0)
|
||||
@ -82,13 +83,19 @@ int util_is_printable_string(const void *data, int len)
|
||||
if (s[len - 1] != '\0')
|
||||
return 0;
|
||||
|
||||
ss = s;
|
||||
while (*s && isprint(*s))
|
||||
s++;
|
||||
se = s + len;
|
||||
|
||||
/* not zero, or not done yet */
|
||||
if (*s != '\0' || (s + 1 - ss) < len)
|
||||
return 0;
|
||||
while (s < se) {
|
||||
ss = s;
|
||||
while (s < se && *s && isprint((unsigned char)*s))
|
||||
s++;
|
||||
|
||||
/* not zero, or not done yet */
|
||||
if (*s != '\0' || s == ss)
|
||||
return 0;
|
||||
|
||||
s++;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
@ -191,7 +198,7 @@ char get_escape_char(const char *s, int *i)
|
||||
return val;
|
||||
}
|
||||
|
||||
int utilfdt_read_err(const char *filename, char **buffp)
|
||||
int utilfdt_read_err_len(const char *filename, char **buffp, off_t *len)
|
||||
{
|
||||
int fd = 0; /* assume stdin */
|
||||
char *buf = NULL;
|
||||
@ -206,12 +213,12 @@ int utilfdt_read_err(const char *filename, char **buffp)
|
||||
}
|
||||
|
||||
/* Loop until we have read everything */
|
||||
buf = malloc(bufsize);
|
||||
buf = xmalloc(bufsize);
|
||||
do {
|
||||
/* Expand the buffer to hold the next chunk */
|
||||
if (offset == bufsize) {
|
||||
bufsize *= 2;
|
||||
buf = realloc(buf, bufsize);
|
||||
buf = xrealloc(buf, bufsize);
|
||||
if (!buf) {
|
||||
ret = ENOMEM;
|
||||
break;
|
||||
@ -232,13 +239,20 @@ int utilfdt_read_err(const char *filename, char **buffp)
|
||||
free(buf);
|
||||
else
|
||||
*buffp = buf;
|
||||
*len = bufsize;
|
||||
return ret;
|
||||
}
|
||||
|
||||
char *utilfdt_read(const char *filename)
|
||||
int utilfdt_read_err(const char *filename, char **buffp)
|
||||
{
|
||||
off_t len;
|
||||
return utilfdt_read_err_len(filename, buffp, &len);
|
||||
}
|
||||
|
||||
char *utilfdt_read_len(const char *filename, off_t *len)
|
||||
{
|
||||
char *buff;
|
||||
int ret = utilfdt_read_err(filename, &buff);
|
||||
int ret = utilfdt_read_err_len(filename, &buff, len);
|
||||
|
||||
if (ret) {
|
||||
fprintf(stderr, "Couldn't open blob from '%s': %s\n", filename,
|
||||
@ -249,6 +263,12 @@ char *utilfdt_read(const char *filename)
|
||||
return buff;
|
||||
}
|
||||
|
||||
char *utilfdt_read(const char *filename)
|
||||
{
|
||||
off_t len;
|
||||
return utilfdt_read_len(filename, &len);
|
||||
}
|
||||
|
||||
int utilfdt_write_err(const char *filename, const void *blob)
|
||||
{
|
||||
int fd = 1; /* assume stdout */
|
||||
@ -329,3 +349,100 @@ int utilfdt_decode_type(const char *fmt, int *type, int *size)
|
||||
return -1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void utilfdt_print_data(const char *data, int len)
|
||||
{
|
||||
int i;
|
||||
const char *p = data;
|
||||
const char *s;
|
||||
|
||||
/* no data, don't print */
|
||||
if (len == 0)
|
||||
return;
|
||||
|
||||
if (util_is_printable_string(data, len)) {
|
||||
printf(" = ");
|
||||
|
||||
s = data;
|
||||
do {
|
||||
printf("\"%s\"", s);
|
||||
s += strlen(s) + 1;
|
||||
if (s < data + len)
|
||||
printf(", ");
|
||||
} while (s < data + len);
|
||||
|
||||
} else if ((len % 4) == 0) {
|
||||
const uint32_t *cell = (const uint32_t *)data;
|
||||
|
||||
printf(" = <");
|
||||
for (i = 0; i < len; i += 4)
|
||||
printf("0x%08x%s", fdt32_to_cpu(cell[i / 4]),
|
||||
i < (len - 4) ? " " : "");
|
||||
printf(">");
|
||||
} else {
|
||||
printf(" = [");
|
||||
for (i = 0; i < len; i++)
|
||||
printf("%02x%s", *p++, i < len - 1 ? " " : "");
|
||||
printf("]");
|
||||
}
|
||||
}
|
||||
|
||||
void util_version(void)
|
||||
{
|
||||
printf("Version: %s\n", DTC_VERSION);
|
||||
exit(0);
|
||||
}
|
||||
|
||||
void util_usage(const char *errmsg, const char *synopsis,
|
||||
const char *short_opts, struct option const long_opts[],
|
||||
const char * const opts_help[])
|
||||
{
|
||||
FILE *fp = errmsg ? stderr : stdout;
|
||||
const char a_arg[] = "<arg>";
|
||||
size_t a_arg_len = strlen(a_arg) + 1;
|
||||
size_t i;
|
||||
int optlen;
|
||||
|
||||
fprintf(fp,
|
||||
"Usage: %s\n"
|
||||
"\n"
|
||||
"Options: -[%s]\n", synopsis, short_opts);
|
||||
|
||||
/* prescan the --long opt length to auto-align */
|
||||
optlen = 0;
|
||||
for (i = 0; long_opts[i].name; ++i) {
|
||||
/* +1 is for space between --opt and help text */
|
||||
int l = strlen(long_opts[i].name) + 1;
|
||||
if (long_opts[i].has_arg == a_argument)
|
||||
l += a_arg_len;
|
||||
if (optlen < l)
|
||||
optlen = l;
|
||||
}
|
||||
|
||||
for (i = 0; long_opts[i].name; ++i) {
|
||||
/* helps when adding new applets or options */
|
||||
assert(opts_help[i] != NULL);
|
||||
|
||||
/* first output the short flag if it has one */
|
||||
if (long_opts[i].val > '~')
|
||||
fprintf(fp, " ");
|
||||
else
|
||||
fprintf(fp, " -%c, ", long_opts[i].val);
|
||||
|
||||
/* then the long flag */
|
||||
if (long_opts[i].has_arg == no_argument)
|
||||
fprintf(fp, "--%-*s", optlen, long_opts[i].name);
|
||||
else
|
||||
fprintf(fp, "--%s %s%*s", long_opts[i].name, a_arg,
|
||||
(int)(optlen - strlen(long_opts[i].name) - a_arg_len), "");
|
||||
|
||||
/* finally the help text */
|
||||
fprintf(fp, "%s\n", opts_help[i]);
|
||||
}
|
||||
|
||||
if (errmsg) {
|
||||
fprintf(fp, "\nError: %s\n", errmsg);
|
||||
exit(EXIT_FAILURE);
|
||||
} else
|
||||
exit(EXIT_SUCCESS);
|
||||
}
|
||||
|
@ -2,6 +2,8 @@
|
||||
#define _UTIL_H
|
||||
|
||||
#include <stdarg.h>
|
||||
#include <stdbool.h>
|
||||
#include <getopt.h>
|
||||
|
||||
/*
|
||||
* Copyright 2011 The Chromium Authors, All Rights Reserved.
|
||||
@ -23,7 +25,9 @@
|
||||
* USA
|
||||
*/
|
||||
|
||||
static inline void __attribute__((noreturn)) die(char * str, ...)
|
||||
#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
|
||||
|
||||
static inline void __attribute__((noreturn)) die(const char *str, ...)
|
||||
{
|
||||
va_list ap;
|
||||
|
||||
@ -57,13 +61,15 @@ extern char *xstrdup(const char *s);
|
||||
extern char *join_path(const char *path, const char *name);
|
||||
|
||||
/**
|
||||
* Check a string of a given length to see if it is all printable and
|
||||
* has a valid terminator.
|
||||
* Check a property of a given length to see if it is all printable and
|
||||
* has a valid terminator. The property can contain either a single string,
|
||||
* or multiple strings each of non-zero length.
|
||||
*
|
||||
* @param data The string to check
|
||||
* @param len The string length including terminator
|
||||
* @return 1 if a valid printable string, 0 if not */
|
||||
int util_is_printable_string(const void *data, int len);
|
||||
* @return 1 if a valid printable string, 0 if not
|
||||
*/
|
||||
bool util_is_printable_string(const void *data, int len);
|
||||
|
||||
/*
|
||||
* Parse an escaped character starting at index i in string s. The resulting
|
||||
@ -82,6 +88,13 @@ char get_escape_char(const char *s, int *i);
|
||||
*/
|
||||
char *utilfdt_read(const char *filename);
|
||||
|
||||
/**
|
||||
* Like utilfdt_read(), but also passes back the size of the file read.
|
||||
*
|
||||
* @param len If non-NULL, the amount of data we managed to read
|
||||
*/
|
||||
char *utilfdt_read_len(const char *filename, off_t *len);
|
||||
|
||||
/**
|
||||
* Read a device tree file into a buffer. Does not report errors, but only
|
||||
* returns them. The value returned can be passed to strerror() to obtain
|
||||
@ -93,6 +106,12 @@ char *utilfdt_read(const char *filename);
|
||||
*/
|
||||
int utilfdt_read_err(const char *filename, char **buffp);
|
||||
|
||||
/**
|
||||
* Like utilfdt_read_err(), but also passes back the size of the file read.
|
||||
*
|
||||
* @param len If non-NULL, the amount of data we managed to read
|
||||
*/
|
||||
int utilfdt_read_err_len(const char *filename, char **buffp, off_t *len);
|
||||
|
||||
/**
|
||||
* Write a device tree buffer to a file. This will report any errors on
|
||||
@ -148,6 +167,85 @@ int utilfdt_decode_type(const char *fmt, int *type, int *size);
|
||||
#define USAGE_TYPE_MSG \
|
||||
"<type>\ts=string, i=int, u=unsigned, x=hex\n" \
|
||||
"\tOptional modifier prefix:\n" \
|
||||
"\t\thh or b=byte, h=2 byte, l=4 byte (default)\n";
|
||||
"\t\thh or b=byte, h=2 byte, l=4 byte (default)";
|
||||
|
||||
/**
|
||||
* Print property data in a readable format to stdout
|
||||
*
|
||||
* Properties that look like strings will be printed as strings. Otherwise
|
||||
* the data will be displayed either as cells (if len is a multiple of 4
|
||||
* bytes) or bytes.
|
||||
*
|
||||
* If len is 0 then this function does nothing.
|
||||
*
|
||||
* @param data Pointers to property data
|
||||
* @param len Length of property data
|
||||
*/
|
||||
void utilfdt_print_data(const char *data, int len);
|
||||
|
||||
/**
|
||||
* Show source version and exit
|
||||
*/
|
||||
void util_version(void) __attribute__((noreturn));
|
||||
|
||||
/**
|
||||
* Show usage and exit
|
||||
*
|
||||
* This helps standardize the output of various utils. You most likely want
|
||||
* to use the usage() helper below rather than call this.
|
||||
*
|
||||
* @param errmsg If non-NULL, an error message to display
|
||||
* @param synopsis The initial example usage text (and possible examples)
|
||||
* @param short_opts The string of short options
|
||||
* @param long_opts The structure of long options
|
||||
* @param opts_help An array of help strings (should align with long_opts)
|
||||
*/
|
||||
void util_usage(const char *errmsg, const char *synopsis,
|
||||
const char *short_opts, struct option const long_opts[],
|
||||
const char * const opts_help[]) __attribute__((noreturn));
|
||||
|
||||
/**
|
||||
* Show usage and exit
|
||||
*
|
||||
* If you name all your usage variables with usage_xxx, then you can call this
|
||||
* help macro rather than expanding all arguments yourself.
|
||||
*
|
||||
* @param errmsg If non-NULL, an error message to display
|
||||
*/
|
||||
#define usage(errmsg) \
|
||||
util_usage(errmsg, usage_synopsis, usage_short_opts, \
|
||||
usage_long_opts, usage_opts_help)
|
||||
|
||||
/**
|
||||
* Call getopt_long() with standard options
|
||||
*
|
||||
* Since all util code runs getopt in the same way, provide a helper.
|
||||
*/
|
||||
#define util_getopt_long() getopt_long(argc, argv, usage_short_opts, \
|
||||
usage_long_opts, NULL)
|
||||
|
||||
/* Helper for aligning long_opts array */
|
||||
#define a_argument required_argument
|
||||
|
||||
/* Helper for usage_short_opts string constant */
|
||||
#define USAGE_COMMON_SHORT_OPTS "hV"
|
||||
|
||||
/* Helper for usage_long_opts option array */
|
||||
#define USAGE_COMMON_LONG_OPTS \
|
||||
{"help", no_argument, NULL, 'h'}, \
|
||||
{"version", no_argument, NULL, 'V'}, \
|
||||
{NULL, no_argument, NULL, 0x0}
|
||||
|
||||
/* Helper for usage_opts_help array */
|
||||
#define USAGE_COMMON_OPTS_HELP \
|
||||
"Print this help and exit", \
|
||||
"Print version and exit", \
|
||||
NULL
|
||||
|
||||
/* Helper for getopt case statements */
|
||||
#define case_USAGE_COMMON_FLAGS \
|
||||
case 'h': usage(NULL); \
|
||||
case 'V': util_version(); \
|
||||
case '?': usage("unknown option");
|
||||
|
||||
#endif /* _UTIL_H */
|
||||
|
@ -280,9 +280,11 @@ Wmissing-include-dirs
|
||||
C ObjC C++ ObjC++
|
||||
Warn about user-specified include directories that do not exist
|
||||
|
||||
; APPLE LOCAL begin warn missing prototype 6261539
|
||||
Wmissing-prototypes
|
||||
C ObjC Var(warn_missing_prototypes)
|
||||
C ObjC C++ ObjC++ Var(warn_missing_prototypes)
|
||||
Warn about global functions without prototypes
|
||||
; APPLE LOCAL end warn missing prototype 6261539
|
||||
|
||||
; APPLE LOCAL begin -Wmost
|
||||
Wmost
|
||||
|
@ -11486,6 +11486,10 @@ start_function (cp_decl_specifier_seq *declspecs,
|
||||
gcc_assert (same_type_p (TREE_TYPE (TREE_TYPE (decl1)),
|
||||
integer_type_node));
|
||||
|
||||
/* APPLE LOCAL begin warn missing prototype 6261539 */
|
||||
check_missing_prototype (decl1);
|
||||
/* APPLE LOCAL end warn missing prototype 6261539 */
|
||||
|
||||
start_preparsed_function (decl1, attrs, /*flags=*/SF_DEFAULT);
|
||||
|
||||
return 1;
|
||||
|
@ -225,6 +225,8 @@ in the following sections.
|
||||
-Wmain -Wmissing-braces -Wmissing-field-initializers @gol
|
||||
-Wmissing-format-attribute -Wmissing-include-dirs @gol
|
||||
-Wmissing-noreturn @gol
|
||||
@c APPLE LOCAL warn missing prototype 6261539
|
||||
-Wmissing-prototypes @gol
|
||||
@c APPLE LOCAL -Wmost
|
||||
-Wmost (APPLE ONLY) @gol
|
||||
-Wno-multichar -Wnonnull -Wno-overflow @gol
|
||||
@ -245,7 +247,8 @@ in the following sections.
|
||||
|
||||
@item C-only Warning Options
|
||||
@gccoptlist{-Wbad-function-cast -Wmissing-declarations @gol
|
||||
-Wmissing-prototypes -Wnested-externs -Wold-style-definition @gol
|
||||
@c APPLE LOCAL warn missing prototype 6261539
|
||||
-Wnested-externs -Wold-style-definition @gol
|
||||
-Wstrict-prototypes -Wtraditional @gol
|
||||
-Wdeclaration-after-statement -Wpointer-sign}
|
||||
|
||||
@ -3052,7 +3055,8 @@ types.)
|
||||
Warn if an old-style function definition is used. A warning is given
|
||||
even if there is a previous prototype.
|
||||
|
||||
@item -Wmissing-prototypes @r{(C only)}
|
||||
@c APPLE LOCAL warn missing prototype 6261539
|
||||
@item -Wmissing-prototypes
|
||||
@opindex Wmissing-prototypes
|
||||
Warn if a global function is defined without a previous prototype
|
||||
declaration. This warning is issued even if the definition itself
|
||||
|
@ -308,8 +308,12 @@ bool X86AsmBackend::writeNopData(uint64_t Count, MCObjectWriter *OW) const {
|
||||
|
||||
// This CPU doesnt support long nops. If needed add more.
|
||||
// FIXME: Can we get this from the subtarget somehow?
|
||||
// FIXME: We could generated something better than plain 0x90.
|
||||
if (CPU == "generic" || CPU == "i386" || CPU == "i486" || CPU == "i586" ||
|
||||
CPU == "pentium" || CPU == "pentium-mmx" || CPU == "geode") {
|
||||
CPU == "pentium" || CPU == "pentium-mmx" || CPU == "i686" ||
|
||||
CPU == "k6" || CPU == "k6-2" || CPU == "k6-3" || CPU == "geode" ||
|
||||
CPU == "winchip-c6" || CPU == "winchip2" || CPU == "c3" ||
|
||||
CPU == "c3-2") {
|
||||
for (uint64_t i = 0; i < Count; ++i)
|
||||
OW->Write8(0x90);
|
||||
return true;
|
||||
|
@ -1,6 +1,6 @@
|
||||
$FreeBSD$
|
||||
|
||||
sendmail 8.14.7
|
||||
sendmail 8.14.8
|
||||
originals can be found at: ftp://ftp.sendmail.org/pub/sendmail/
|
||||
|
||||
For the import of sendmail, the following directories were renamed:
|
||||
@ -9,7 +9,7 @@ For the import of sendmail, the following directories were renamed:
|
||||
|
||||
Imported using the instructions at:
|
||||
|
||||
http://wiki.freebsd.org/SubversionPrimer/VendorImports
|
||||
http://www.freebsd.org/doc/en_US.ISO8859-1/articles/committers-guide/subversion-primer.html
|
||||
|
||||
Then merged using:
|
||||
|
||||
@ -97,4 +97,4 @@ infrastructure in FreeBSD:
|
||||
usr.sbin/mailwrapper/Makefile
|
||||
|
||||
gshapiro@FreeBSD.org
|
||||
21-April-2013
|
||||
26-January-2014
|
||||
|
@ -1,9 +1,9 @@
|
||||
SENDMAIL LICENSE
|
||||
|
||||
The following license terms and conditions apply, unless a redistribution
|
||||
agreement or other license is obtained from Sendmail, Inc., 6475 Christie
|
||||
Ave, Third Floor, Emeryville, CA 94608, USA, or by electronic mail at
|
||||
license@sendmail.com.
|
||||
The following license terms and conditions apply, unless a redistribution
|
||||
agreement or other license is obtained from Proofpoint, Inc., 892
|
||||
Ross Street, Sunnyvale, CA, 94089, USA, or by electronic mail at
|
||||
sendmail-license@proofpoint.com.
|
||||
|
||||
License Terms:
|
||||
|
||||
@ -35,12 +35,12 @@ each of the following conditions is met:
|
||||
forth as paragraph 6 below, in the documentation and/or other materials
|
||||
provided with the distribution. For the purposes of binary distribution
|
||||
the "Copyright Notice" refers to the following language:
|
||||
"Copyright (c) 1998-2012 Sendmail, Inc. All rights reserved."
|
||||
"Copyright (c) 1998-2013 Proofpoint, Inc. All rights reserved."
|
||||
|
||||
4. Neither the name of Sendmail, Inc. nor the University of California nor
|
||||
4. Neither the name of Proofpoint, Inc. nor the University of California nor
|
||||
names of their contributors may be used to endorse or promote
|
||||
products derived from this software without specific prior written
|
||||
permission. The name "sendmail" is a trademark of Sendmail, Inc.
|
||||
permission. The name "sendmail" is a trademark of Proofpoint, Inc.
|
||||
|
||||
5. All redistributions must comply with the conditions imposed by the
|
||||
University of California on certain embedded code, which copyright
|
||||
@ -78,4 +78,4 @@ each of the following conditions is met:
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||
|
||||
$Revision: 8.18 $, Last updated $Date: 2012/05/15 21:49:03 $, Document 139848.1
|
||||
$Revision: 8.22 $, Last updated $Date: 2013/11/23 04:37:36 $, Document 139848.1
|
||||
|
@ -141,6 +141,184 @@ gpExpdV7qPrw9k01j5rod5PjZlG8zV0=
|
||||
=SR28
|
||||
-----END PGP PUBLIC KEY BLOCK-----
|
||||
|
||||
Type Bits KeyID Created Expires Algorithm Use
|
||||
pub 2048 E2763A73 2014-01-02 ------- RSA Sign & Encrypt
|
||||
fingerprint: 49F6 A8BE 8473 3949 5191 6F3B 61DE 11EC E276 3A73
|
||||
uid Sendmail Signing Key/2014 <sendmail@Sendmail.ORG>
|
||||
|
||||
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
||||
Version: GnuPG v1
|
||||
|
||||
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
|
||||
XvRQkAGPLcqS1D4k+kW3MLWpxjbSwGi8FCdsfg==
|
||||
=d3FT
|
||||
-----END PGP PUBLIC KEY BLOCK-----
|
||||
|
||||
Type Bits KeyID Created Expires Algorithm Use
|
||||
pub 2048 5207CAD3 2013-01-02 ------- RSA Sign & Encrypt
|
||||
fingerprint: B87D 4569 86F1 9484 07E5 CCB4 3D68 B25D 5207 CAD3
|
||||
@ -2435,4 +2613,4 @@ DnF3FZZEzV7oqPwC2jzv/1dD6GFhtgy0cnyoPGUJCyc=
|
||||
=nES8
|
||||
-----END PGP PUBLIC KEY BLOCK-----
|
||||
|
||||
$Revision: 8.43 $, Last updated $Date: 2013/01/18 17:40:21 $
|
||||
$Revision: 8.46 $, Last updated $Date: 2014/01/18 00:20:24 $
|
||||
|
@ -1,7 +1,7 @@
|
||||
|
||||
SENDMAIL RELEASE 8
|
||||
|
||||
This directory has the latest sendmail(TM) software from Sendmail, Inc.
|
||||
This directory has the latest sendmail(TM) software from Proofpoint, Inc.
|
||||
|
||||
Report any bugs to sendmail-bugs-YYYY@support.sendmail.org
|
||||
where YYYY is the current year, e.g., 2005.
|
||||
@ -37,7 +37,7 @@ the latest updates.
|
||||
|
||||
4. Read cf/README.
|
||||
|
||||
Sendmail is a trademark of Sendmail, Inc.
|
||||
Sendmail is a trademark of Proofpoint, Inc.
|
||||
US Patent Numbers 6865671, 6986037.
|
||||
|
||||
+-----------------------+
|
||||
@ -465,4 +465,4 @@ sendmail Source for the sendmail program itself.
|
||||
test Some test scripts (currently only for compilation aids).
|
||||
vacation Source for the vacation program. NOT PART OF SENDMAIL!
|
||||
|
||||
$Revision: 8.95 $, Last updated $Date: 2009/04/10 17:49:18 $
|
||||
$Revision: 8.96 $, Last updated $Date: 2013/11/22 20:51:01 $
|
||||
|
@ -1,11 +1,58 @@
|
||||
SENDMAIL RELEASE NOTES
|
||||
$Id: RELEASE_NOTES,v 8.2024 2013/04/19 15:01:58 ca Exp $
|
||||
$Id: RELEASE_NOTES,v 8.2043 2014/01/23 20:27:19 ca Exp $
|
||||
|
||||
|
||||
This listing shows the version of the sendmail binary, the version
|
||||
of the sendmail configuration files, the date of release, and a
|
||||
summary of the changes in that release.
|
||||
|
||||
8.14.8/8.14.8 2014/01/26
|
||||
Properly initialize all OpenSSL algorithms for versions before
|
||||
OpenSSL 0.9.8o. Without this SHA2 algorithms may not
|
||||
work properly, causing for example failures for certs
|
||||
that use sha256WithRSAEncryption as signature algorithm.
|
||||
When looking up hostnames, ensure only to return those records
|
||||
for the requested family (AF_INET or AF_INET6).
|
||||
On system that have NEEDSGETIPNODE and NETINET6
|
||||
this may have failed and cause delivery problems.
|
||||
Problem noted by Kees Cook.
|
||||
A new mailer flag '!' is available to suppress an MH hack
|
||||
that drops an explicit From: header if it is the
|
||||
same as what sendmail would generate.
|
||||
Add an FFR (for future release) to use uncompressed IPv6 addresses,
|
||||
i.e., they will not contain "::". For example, instead
|
||||
of ::1 it will be 0:0:0:0:0:0:0:1. This means that
|
||||
configuration data (including maps, files, classes,
|
||||
custom ruleset, etc) have to use the same format.
|
||||
This will be turned on in 8.15. It can be enabled in 8.14
|
||||
by compiling with:
|
||||
APPENDDEF(`conf_sendmail_ENVDEF', `-D_FFR_IPV6_FULL')
|
||||
in your devtools/Site/site.config.m4 file.
|
||||
Add an additional case for the WorkAroundBrokenAAAA check when
|
||||
dealing with broken nameservers by ignoring SERVFAIL
|
||||
errors returned on T_AAAA (IPv6) lookups at delivery time.
|
||||
Problem noted by Pavel Timofeev of OCS.
|
||||
If available, pass LOGIN_SETCPUMASK and LOGIN_SETLOGINCLASS to
|
||||
setusercontext() on deliveries as a different user.
|
||||
Patch from Edward Tomasz Napierala from FreeBSD.
|
||||
Avoid compiler warnings from a change in Cyrus-SASL 2.1.25.
|
||||
Patch from Hajimu UMEMOTO from FreeBSD.
|
||||
Add support for DHParameters 2048-bit primes.
|
||||
CONFIG: Accept IPv6 literals when evaluating the HELO/EHLO argument
|
||||
in FEATURE(`block_bad_helo'). Suggested by Andrey Chernov.
|
||||
LIBSMDB: Add a missing check for malloc() in libsmdb/smndbm.c.
|
||||
Patch from Bill Parker.
|
||||
LIBSMDB: Fix minor memory leaks in libsmdb/ if allocations
|
||||
fail. Patch from John Beck of Oracle.
|
||||
Portability:
|
||||
Add support for Darwin 12.x and 13.x (Mac OS X 10.8 and 10.9).
|
||||
On Linux use socklen_t as the type for the 3rd argument
|
||||
for getsockname/getpeername if the glibc version is at
|
||||
least 2.1.
|
||||
Added Files:
|
||||
devtools/OS/Darwin.12.x
|
||||
devtools/OS/Darwin.13.x
|
||||
|
||||
8.14.7/8.14.7 2013/04/21
|
||||
Drop support for IPv4-mapped IPv6 addresses to prevent the MTA
|
||||
from using a mapped address over a legitimate IPv6 address
|
||||
@ -80,9 +127,12 @@ summary of the changes in that release.
|
||||
the reason for the failure in a single log line. Suggested
|
||||
by James Carey of Boeing.
|
||||
Portability:
|
||||
Add support for Darwin 11.x and 12.x (Mac OS X 10.7 and 10.8).
|
||||
Add support for Darwin 11.x (Mac OS X 10.7).
|
||||
Add support for SunOS 5.12 (aka Solaris 12). Patch from
|
||||
John Beck of Oracle.
|
||||
Added Files:
|
||||
devtools/OS/Darwin.11.x
|
||||
devtools/OS/SunOS.5.12
|
||||
|
||||
8.14.5/8.14.5 2011/05/17
|
||||
Do not cache SMTP extensions across connections as the cache
|
||||
|
@ -77,7 +77,7 @@ Let's examine a typical .mc file:
|
||||
|
||||
divert(-1)
|
||||
#
|
||||
# Copyright (c) 1998-2005 Sendmail, Inc. and its suppliers.
|
||||
# Copyright (c) 1998-2005 Proofpoint, Inc. and its suppliers.
|
||||
# All rights reserved.
|
||||
# Copyright (c) 1983 Eric P. Allman. All rights reserved.
|
||||
# Copyright (c) 1988, 1993
|
||||
@ -1402,6 +1402,9 @@ preserve_local_plus_detail
|
||||
that address will be looked up in the alias file; user+* and
|
||||
user will not be looked up). Only use if the local
|
||||
delivery agent in use supports +detail addressing.
|
||||
Moreover, this will most likely not work if the 'w' flag
|
||||
for the local mailer is set as the entire local address
|
||||
including +detail is passed to the user lookup function.
|
||||
|
||||
compat_check Enable ruleset check_compat to look up pairs of addresses
|
||||
with the Compat: tag -- Compat:sender<@>recipient -- in the
|
||||
@ -4701,4 +4704,4 @@ M4 DIVERSIONS
|
||||
8 DNS based blacklists
|
||||
9 special local rulesets (1 and 2)
|
||||
|
||||
$Revision: 8.728 $, Last updated $Date: 2012/09/07 16:29:13 $
|
||||
$Revision: 8.730 $, Last updated $Date: 2014/01/16 15:55:51 $
|
||||
|
@ -1,6 +1,6 @@
|
||||
divert(-1)
|
||||
#
|
||||
# Copyright (c) 1998, 1999 Sendmail, Inc. and its suppliers.
|
||||
# Copyright (c) 1998, 1999 Proofpoint, Inc. and its suppliers.
|
||||
# All rights reserved.
|
||||
# Copyright (c) 1983 Eric P. Allman. All rights reserved.
|
||||
# Copyright (c) 1988, 1993
|
||||
@ -24,7 +24,7 @@ divert(-1)
|
||||
#
|
||||
|
||||
divert(0)dnl
|
||||
VERSIONID(`$Id: chez.cs.mc,v 8.14 1999/02/07 07:25:59 gshapiro Exp $')
|
||||
VERSIONID(`$Id: chez.cs.mc,v 8.15 2013/11/22 20:51:08 ca Exp $')
|
||||
OSTYPE(bsd4.4)dnl
|
||||
DOMAIN(CS.Berkeley.EDU)dnl
|
||||
define(`LOCAL_RELAY', vangogh.CS.Berkeley.EDU)dnl
|
||||
|
@ -1,6 +1,6 @@
|
||||
divert(-1)
|
||||
#
|
||||
# Copyright (c) 1998-2000 Sendmail, Inc. and its suppliers.
|
||||
# Copyright (c) 1998-2000 Proofpoint, Inc. and its suppliers.
|
||||
# All rights reserved.
|
||||
# Copyright (c) 1983 Eric P. Allman. All rights reserved.
|
||||
# Copyright (c) 1988, 1993
|
||||
@ -23,7 +23,7 @@ divert(-1)
|
||||
#
|
||||
|
||||
divert(0)dnl
|
||||
VERSIONID(`$Id: clientproto.mc,v 8.16 2000/03/21 21:05:26 ca Exp $')
|
||||
VERSIONID(`$Id: clientproto.mc,v 8.17 2013/11/22 20:51:08 ca Exp $')
|
||||
|
||||
OSTYPE(unknown)
|
||||
FEATURE(nullclient, mailhost.$m)
|
||||
|
@ -1,6 +1,6 @@
|
||||
divert(-1)
|
||||
#
|
||||
# Copyright (c) 1998, 1999 Sendmail, Inc. and its suppliers.
|
||||
# Copyright (c) 1998, 1999 Proofpoint, Inc. and its suppliers.
|
||||
# All rights reserved.
|
||||
# Copyright (c) 1983 Eric P. Allman. All rights reserved.
|
||||
# Copyright (c) 1988, 1993
|
||||
@ -23,7 +23,7 @@ divert(-1)
|
||||
#
|
||||
|
||||
divert(0)dnl
|
||||
VERSIONID(`$Id: cs-hpux10.mc,v 8.13 1999/02/07 07:26:00 gshapiro Exp $')
|
||||
VERSIONID(`$Id: cs-hpux10.mc,v 8.14 2013/11/22 20:51:08 ca Exp $')
|
||||
OSTYPE(hpux10)dnl
|
||||
DOMAIN(CS.Berkeley.EDU)dnl
|
||||
define(`MAIL_HUB', mailspool.CS.Berkeley.EDU)dnl
|
||||
|
@ -1,6 +1,6 @@
|
||||
divert(-1)
|
||||
#
|
||||
# Copyright (c) 1998, 1999 Sendmail, Inc. and its suppliers.
|
||||
# Copyright (c) 1998, 1999 Proofpoint, Inc. and its suppliers.
|
||||
# All rights reserved.
|
||||
# Copyright (c) 1983 Eric P. Allman. All rights reserved.
|
||||
# Copyright (c) 1988, 1993
|
||||
@ -23,7 +23,7 @@ divert(-1)
|
||||
#
|
||||
|
||||
divert(0)dnl
|
||||
VERSIONID(`$Id: cs-hpux9.mc,v 8.14 1999/02/07 07:26:00 gshapiro Exp $')
|
||||
VERSIONID(`$Id: cs-hpux9.mc,v 8.15 2013/11/22 20:51:08 ca Exp $')
|
||||
OSTYPE(hpux9)dnl
|
||||
DOMAIN(CS.Berkeley.EDU)dnl
|
||||
define(`MAIL_HUB', mailspool.CS.Berkeley.EDU)dnl
|
||||
|
@ -1,6 +1,6 @@
|
||||
divert(-1)
|
||||
#
|
||||
# Copyright (c) 1998, 1999 Sendmail, Inc. and its suppliers.
|
||||
# Copyright (c) 1998, 1999 Proofpoint, Inc. and its suppliers.
|
||||
# All rights reserved.
|
||||
# Copyright (c) 1983 Eric P. Allman. All rights reserved.
|
||||
# Copyright (c) 1988, 1993
|
||||
@ -23,7 +23,7 @@ divert(-1)
|
||||
#
|
||||
|
||||
divert(0)dnl
|
||||
VERSIONID(`$Id: cs-osf1.mc,v 8.13 1999/02/07 07:26:00 gshapiro Exp $')
|
||||
VERSIONID(`$Id: cs-osf1.mc,v 8.14 2013/11/22 20:51:08 ca Exp $')
|
||||
OSTYPE(osf1)dnl
|
||||
DOMAIN(CS.Berkeley.EDU)dnl
|
||||
MAILER(local)dnl
|
||||
|
@ -1,6 +1,6 @@
|
||||
divert(-1)
|
||||
#
|
||||
# Copyright (c) 1998, 1999 Sendmail, Inc. and its suppliers.
|
||||
# Copyright (c) 1998, 1999 Proofpoint, Inc. and its suppliers.
|
||||
# All rights reserved.
|
||||
# Copyright (c) 1983 Eric P. Allman. All rights reserved.
|
||||
# Copyright (c) 1988, 1993
|
||||
@ -23,7 +23,7 @@ divert(-1)
|
||||
#
|
||||
|
||||
divert(0)dnl
|
||||
VERSIONID(`$Id: cs-solaris2.mc,v 8.12 1999/02/07 07:26:00 gshapiro Exp $')
|
||||
VERSIONID(`$Id: cs-solaris2.mc,v 8.13 2013/11/22 20:51:08 ca Exp $')
|
||||
OSTYPE(solaris2)dnl
|
||||
DOMAIN(CS.Berkeley.EDU)dnl
|
||||
MAILER(local)dnl
|
||||
|
@ -1,6 +1,6 @@
|
||||
divert(-1)
|
||||
#
|
||||
# Copyright (c) 1998, 1999 Sendmail, Inc. and its suppliers.
|
||||
# Copyright (c) 1998, 1999 Proofpoint, Inc. and its suppliers.
|
||||
# All rights reserved.
|
||||
# Copyright (c) 1983 Eric P. Allman. All rights reserved.
|
||||
# Copyright (c) 1988, 1993
|
||||
@ -23,7 +23,7 @@ divert(-1)
|
||||
#
|
||||
|
||||
divert(0)dnl
|
||||
VERSIONID(`$Id: cs-sunos4.1.mc,v 8.13 1999/02/07 07:26:01 gshapiro Exp $')
|
||||
VERSIONID(`$Id: cs-sunos4.1.mc,v 8.14 2013/11/22 20:51:08 ca Exp $')
|
||||
OSTYPE(sunos4.1)dnl
|
||||
DOMAIN(CS.Berkeley.EDU)dnl
|
||||
MAILER(local)dnl
|
||||
|
@ -1,6 +1,6 @@
|
||||
divert(-1)
|
||||
#
|
||||
# Copyright (c) 1998, 1999 Sendmail, Inc. and its suppliers.
|
||||
# Copyright (c) 1998, 1999 Proofpoint, Inc. and its suppliers.
|
||||
# All rights reserved.
|
||||
# Copyright (c) 1983 Eric P. Allman. All rights reserved.
|
||||
# Copyright (c) 1988, 1993
|
||||
@ -23,7 +23,7 @@ divert(-1)
|
||||
#
|
||||
|
||||
divert(0)dnl
|
||||
VERSIONID(`$Id: cs-ultrix4.mc,v 8.13 1999/02/07 07:26:02 gshapiro Exp $')
|
||||
VERSIONID(`$Id: cs-ultrix4.mc,v 8.14 2013/11/22 20:51:08 ca Exp $')
|
||||
OSTYPE(ultrix4)dnl
|
||||
DOMAIN(CS.Berkeley.EDU)dnl
|
||||
MAILER(local)dnl
|
||||
|
@ -1,6 +1,6 @@
|
||||
divert(-1)
|
||||
#
|
||||
# Copyright (c) 1998, 1999 Sendmail, Inc. and its suppliers.
|
||||
# Copyright (c) 1998, 1999 Proofpoint, Inc. and its suppliers.
|
||||
# All rights reserved.
|
||||
# Copyright (c) 1983 Eric P. Allman. All rights reserved.
|
||||
# Copyright (c) 1988, 1993
|
||||
@ -21,7 +21,7 @@ divert(-1)
|
||||
#
|
||||
|
||||
divert(0)dnl
|
||||
VERSIONID(`$Id: generic-bsd4.4.mc,v 8.10 1999/02/07 07:26:02 gshapiro Exp $')
|
||||
VERSIONID(`$Id: generic-bsd4.4.mc,v 8.11 2013/11/22 20:51:08 ca Exp $')
|
||||
OSTYPE(bsd4.4)dnl
|
||||
DOMAIN(generic)dnl
|
||||
MAILER(local)dnl
|
||||
|
@ -1,6 +1,6 @@
|
||||
divert(-1)
|
||||
#
|
||||
# Copyright (c) 1998, 1999, 2001 Sendmail, Inc. and its suppliers.
|
||||
# Copyright (c) 1998, 1999, 2001 Proofpoint, Inc. and its suppliers.
|
||||
# All rights reserved.
|
||||
# Copyright (c) 1983 Eric P. Allman. All rights reserved.
|
||||
# Copyright (c) 1988, 1993
|
||||
@ -20,7 +20,7 @@ divert(-1)
|
||||
#
|
||||
|
||||
divert(0)dnl
|
||||
VERSIONID(`$Id: generic-hpux10.mc,v 8.13 2001/05/29 17:29:52 ca Exp $')
|
||||
VERSIONID(`$Id: generic-hpux10.mc,v 8.14 2013/11/22 20:51:08 ca Exp $')
|
||||
OSTYPE(hpux10)dnl
|
||||
DOMAIN(generic)dnl
|
||||
MAILER(local)dnl
|
||||
|
@ -1,6 +1,6 @@
|
||||
divert(-1)
|
||||
#
|
||||
# Copyright (c) 1998, 1999 Sendmail, Inc. and its suppliers.
|
||||
# Copyright (c) 1998, 1999 Proofpoint, Inc. and its suppliers.
|
||||
# All rights reserved.
|
||||
# Copyright (c) 1983 Eric P. Allman. All rights reserved.
|
||||
# Copyright (c) 1988, 1993
|
||||
@ -20,7 +20,7 @@ divert(-1)
|
||||
#
|
||||
|
||||
divert(0)dnl
|
||||
VERSIONID(`$Id: generic-hpux9.mc,v 8.11 1999/02/07 07:26:02 gshapiro Exp $')
|
||||
VERSIONID(`$Id: generic-hpux9.mc,v 8.12 2013/11/22 20:51:08 ca Exp $')
|
||||
OSTYPE(hpux9)dnl
|
||||
DOMAIN(generic)dnl
|
||||
MAILER(local)dnl
|
||||
|
@ -1,6 +1,6 @@
|
||||
divert(-1)
|
||||
#
|
||||
# Copyright (c) 1998, 1999 Sendmail, Inc. and its suppliers.
|
||||
# Copyright (c) 1998, 1999 Proofpoint, Inc. and its suppliers.
|
||||
# All rights reserved.
|
||||
# Copyright (c) 1983 Eric P. Allman. All rights reserved.
|
||||
# Copyright (c) 1988, 1993
|
||||
@ -20,7 +20,7 @@ divert(-1)
|
||||
#
|
||||
|
||||
divert(0)dnl
|
||||
VERSIONID(`$Id: generic-linux.mc,v 8.1 1999/09/24 22:48:05 gshapiro Exp $')
|
||||
VERSIONID(`$Id: generic-linux.mc,v 8.2 2013/11/22 20:51:08 ca Exp $')
|
||||
OSTYPE(linux)dnl
|
||||
DOMAIN(generic)dnl
|
||||
MAILER(local)dnl
|
||||
|
@ -1,6 +1,6 @@
|
||||
divert(-1)
|
||||
#
|
||||
# Copyright (c) 2001 Sendmail, Inc. and its suppliers.
|
||||
# Copyright (c) 2001 Proofpoint, Inc. and its suppliers.
|
||||
# All rights reserved.
|
||||
#
|
||||
# By using this file, you agree to the terms and conditions set
|
||||
@ -17,7 +17,7 @@ divert(-1)
|
||||
#
|
||||
|
||||
divert(0)dnl
|
||||
VERSIONID(`$Id: generic-mpeix.mc,v 8.1 2001/12/13 23:56:37 gshapiro Exp $')
|
||||
VERSIONID(`$Id: generic-mpeix.mc,v 8.2 2013/11/22 20:51:08 ca Exp $')
|
||||
OSTYPE(mpeix)dnl
|
||||
DOMAIN(generic)dnl
|
||||
define(`confFORWARD_PATH', `$z/.forward')dnl
|
||||
|
@ -1,6 +1,6 @@
|
||||
divert(-1)
|
||||
#
|
||||
# Copyright (c) 1998, 1999 Sendmail, Inc. and its suppliers.
|
||||
# Copyright (c) 1998, 1999 Proofpoint, Inc. and its suppliers.
|
||||
# All rights reserved.
|
||||
# Copyright (c) 1983 Eric P. Allman. All rights reserved.
|
||||
# Copyright (c) 1988, 1993
|
||||
@ -20,7 +20,7 @@ divert(-1)
|
||||
#
|
||||
|
||||
divert(0)dnl
|
||||
VERSIONID(`$Id: generic-nextstep3.3.mc,v 8.10 1999/02/07 07:26:02 gshapiro Exp $')
|
||||
VERSIONID(`$Id: generic-nextstep3.3.mc,v 8.11 2013/11/22 20:51:08 ca Exp $')
|
||||
OSTYPE(nextstep)dnl
|
||||
DOMAIN(generic)dnl
|
||||
MAILER(local)dnl
|
||||
|
@ -1,6 +1,6 @@
|
||||
divert(-1)
|
||||
#
|
||||
# Copyright (c) 1998, 1999 Sendmail, Inc. and its suppliers.
|
||||
# Copyright (c) 1998, 1999 Proofpoint, Inc. and its suppliers.
|
||||
# All rights reserved.
|
||||
# Copyright (c) 1983 Eric P. Allman. All rights reserved.
|
||||
# Copyright (c) 1988, 1993
|
||||
@ -20,7 +20,7 @@ divert(-1)
|
||||
#
|
||||
|
||||
divert(0)dnl
|
||||
VERSIONID(`$Id: generic-osf1.mc,v 8.11 1999/02/07 07:26:02 gshapiro Exp $')
|
||||
VERSIONID(`$Id: generic-osf1.mc,v 8.12 2013/11/22 20:51:08 ca Exp $')
|
||||
OSTYPE(osf1)dnl
|
||||
DOMAIN(generic)dnl
|
||||
MAILER(local)dnl
|
||||
|
@ -1,6 +1,6 @@
|
||||
divert(-1)
|
||||
#
|
||||
# Copyright (c) 1998, 1999, 2001 Sendmail, Inc. and its suppliers.
|
||||
# Copyright (c) 1998, 1999, 2001 Proofpoint, Inc. and its suppliers.
|
||||
# All rights reserved.
|
||||
# Copyright (c) 1983 Eric P. Allman. All rights reserved.
|
||||
# Copyright (c) 1988, 1993
|
||||
@ -22,7 +22,7 @@ divert(-1)
|
||||
#
|
||||
|
||||
divert(0)dnl
|
||||
VERSIONID(`$Id: generic-solaris.mc,v 8.13 2001/06/27 21:46:30 gshapiro Exp $')
|
||||
VERSIONID(`$Id: generic-solaris.mc,v 8.14 2013/11/22 20:51:08 ca Exp $')
|
||||
OSTYPE(solaris2)dnl
|
||||
DOMAIN(generic)dnl
|
||||
MAILER(local)dnl
|
||||
|
@ -1,6 +1,6 @@
|
||||
divert(-1)
|
||||
#
|
||||
# Copyright (c) 1998, 1999 Sendmail, Inc. and its suppliers.
|
||||
# Copyright (c) 1998, 1999 Proofpoint, Inc. and its suppliers.
|
||||
# All rights reserved.
|
||||
# Copyright (c) 1983 Eric P. Allman. All rights reserved.
|
||||
# Copyright (c) 1988, 1993
|
||||
@ -20,7 +20,7 @@ divert(-1)
|
||||
#
|
||||
|
||||
divert(0)dnl
|
||||
VERSIONID(`$Id: generic-sunos4.1.mc,v 8.11 1999/02/07 07:26:03 gshapiro Exp $')
|
||||
VERSIONID(`$Id: generic-sunos4.1.mc,v 8.12 2013/11/22 20:51:08 ca Exp $')
|
||||
OSTYPE(sunos4.1)dnl
|
||||
DOMAIN(generic)dnl
|
||||
MAILER(local)dnl
|
||||
|
@ -1,6 +1,6 @@
|
||||
divert(-1)
|
||||
#
|
||||
# Copyright (c) 1998, 1999 Sendmail, Inc. and its suppliers.
|
||||
# Copyright (c) 1998, 1999 Proofpoint, Inc. and its suppliers.
|
||||
# All rights reserved.
|
||||
# Copyright (c) 1983 Eric P. Allman. All rights reserved.
|
||||
# Copyright (c) 1988, 1993
|
||||
@ -20,7 +20,7 @@ divert(-1)
|
||||
#
|
||||
|
||||
divert(0)dnl
|
||||
VERSIONID(`$Id: generic-ultrix4.mc,v 8.11 1999/02/07 07:26:03 gshapiro Exp $')
|
||||
VERSIONID(`$Id: generic-ultrix4.mc,v 8.12 2013/11/22 20:51:08 ca Exp $')
|
||||
OSTYPE(ultrix4)dnl
|
||||
DOMAIN(generic)dnl
|
||||
MAILER(local)dnl
|
||||
|
@ -1,6 +1,6 @@
|
||||
divert(-1)
|
||||
#
|
||||
# Copyright (c) 1998, 1999 Sendmail, Inc. and its suppliers.
|
||||
# Copyright (c) 1998, 1999 Proofpoint, Inc. and its suppliers.
|
||||
# All rights reserved.
|
||||
# Copyright (c) 1983 Eric P. Allman. All rights reserved.
|
||||
# Copyright (c) 1988, 1993
|
||||
@ -22,7 +22,7 @@ divert(-1)
|
||||
#
|
||||
|
||||
divert(0)dnl
|
||||
VERSIONID(`$Id: huginn.cs.mc,v 8.15 1999/02/07 07:26:03 gshapiro Exp $')
|
||||
VERSIONID(`$Id: huginn.cs.mc,v 8.16 2013/11/22 20:51:08 ca Exp $')
|
||||
OSTYPE(hpux9)dnl
|
||||
DOMAIN(CS.Berkeley.EDU)dnl
|
||||
MASQUERADE_AS(CS.Berkeley.EDU)dnl
|
||||
|
@ -1,6 +1,6 @@
|
||||
divert(-1)
|
||||
#
|
||||
# Copyright (c) 1998-2001, 2004, 2005 Sendmail, Inc. and its suppliers.
|
||||
# Copyright (c) 1998-2001, 2004, 2005 Proofpoint, Inc. and its suppliers.
|
||||
# All rights reserved.
|
||||
# Copyright (c) 1983 Eric P. Allman. All rights reserved.
|
||||
# Copyright (c) 1988, 1993
|
||||
@ -19,7 +19,7 @@ divert(-1)
|
||||
#
|
||||
|
||||
divert(0)
|
||||
VERSIONID(`$Id: knecht.mc,v 8.62 2006/09/27 19:48:59 eric Exp $')
|
||||
VERSIONID(`$Id: knecht.mc,v 8.63 2013/11/22 20:51:08 ca Exp $')
|
||||
OSTYPE(bsd4.4)
|
||||
DOMAIN(generic)
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
divert(-1)
|
||||
#
|
||||
# Copyright (c) 1998, 1999 Sendmail, Inc. and its suppliers.
|
||||
# Copyright (c) 1998, 1999 Proofpoint, Inc. and its suppliers.
|
||||
# All rights reserved.
|
||||
# Copyright (c) 1983 Eric P. Allman. All rights reserved.
|
||||
# Copyright (c) 1988, 1993
|
||||
@ -22,7 +22,7 @@ divert(-1)
|
||||
#
|
||||
|
||||
divert(0)dnl
|
||||
VERSIONID(`$Id: mail.cs.mc,v 8.18 1999/02/07 07:26:04 gshapiro Exp $')
|
||||
VERSIONID(`$Id: mail.cs.mc,v 8.19 2013/11/22 20:51:08 ca Exp $')
|
||||
OSTYPE(ultrix4)dnl
|
||||
DOMAIN(Berkeley.EDU)dnl
|
||||
MASQUERADE_AS(CS.Berkeley.EDU)dnl
|
||||
|
@ -1,6 +1,6 @@
|
||||
divert(-1)
|
||||
#
|
||||
# Copyright (c) 1998, 1999 Sendmail, Inc. and its suppliers.
|
||||
# Copyright (c) 1998, 1999 Proofpoint, Inc. and its suppliers.
|
||||
# All rights reserved.
|
||||
# Copyright (c) 1983 Eric P. Allman. All rights reserved.
|
||||
# Copyright (c) 1988, 1993
|
||||
@ -22,7 +22,7 @@ divert(-1)
|
||||
#
|
||||
|
||||
divert(0)dnl
|
||||
VERSIONID(`$Id: mail.eecs.mc,v 8.18 1999/02/07 07:26:04 gshapiro Exp $')
|
||||
VERSIONID(`$Id: mail.eecs.mc,v 8.19 2013/11/22 20:51:08 ca Exp $')
|
||||
OSTYPE(ultrix4)dnl
|
||||
DOMAIN(EECS.Berkeley.EDU)dnl
|
||||
MASQUERADE_AS(EECS.Berkeley.EDU)dnl
|
||||
|
@ -1,6 +1,6 @@
|
||||
divert(-1)
|
||||
#
|
||||
# Copyright (c) 1998, 1999 Sendmail, Inc. and its suppliers.
|
||||
# Copyright (c) 1998, 1999 Proofpoint, Inc. and its suppliers.
|
||||
# All rights reserved.
|
||||
# Copyright (c) 1983 Eric P. Allman. All rights reserved.
|
||||
# Copyright (c) 1988, 1993
|
||||
@ -24,7 +24,7 @@ divert(-1)
|
||||
#
|
||||
|
||||
divert(0)dnl
|
||||
VERSIONID(`$Id: mailspool.cs.mc,v 8.12 1999/02/07 07:26:04 gshapiro Exp $')
|
||||
VERSIONID(`$Id: mailspool.cs.mc,v 8.13 2013/11/22 20:51:08 ca Exp $')
|
||||
OSTYPE(sunos4.1)dnl
|
||||
DOMAIN(CS.Berkeley.EDU)dnl
|
||||
MAILER(local)dnl
|
||||
|
@ -1,6 +1,6 @@
|
||||
divert(-1)
|
||||
#
|
||||
# Copyright (c) 1998, 1999 Sendmail, Inc. and its suppliers.
|
||||
# Copyright (c) 1998, 1999 Proofpoint, Inc. and its suppliers.
|
||||
# All rights reserved.
|
||||
# Copyright (c) 1983 Eric P. Allman. All rights reserved.
|
||||
# Copyright (c) 1988, 1993
|
||||
@ -24,7 +24,7 @@ divert(-1)
|
||||
#
|
||||
|
||||
divert(0)dnl
|
||||
VERSIONID(`$Id: python.cs.mc,v 8.12 1999/02/07 07:26:04 gshapiro Exp $')
|
||||
VERSIONID(`$Id: python.cs.mc,v 8.13 2013/11/22 20:51:08 ca Exp $')
|
||||
OSTYPE(bsd4.4)dnl
|
||||
DOMAIN(CS.Berkeley.EDU)dnl
|
||||
define(`LOCAL_RELAY', vangogh.CS.Berkeley.EDU)dnl
|
||||
|
@ -1,6 +1,6 @@
|
||||
divert(-1)
|
||||
#
|
||||
# Copyright (c) 1998, 1999 Sendmail, Inc. and its suppliers.
|
||||
# Copyright (c) 1998, 1999 Proofpoint, Inc. and its suppliers.
|
||||
# All rights reserved.
|
||||
# Copyright (c) 1983 Eric P. Allman. All rights reserved.
|
||||
# Copyright (c) 1988, 1993
|
||||
@ -23,7 +23,7 @@ divert(-1)
|
||||
#
|
||||
|
||||
divert(0)dnl
|
||||
VERSIONID(`$Id: s2k-osf1.mc,v 8.13 1999/02/07 07:26:04 gshapiro Exp $')
|
||||
VERSIONID(`$Id: s2k-osf1.mc,v 8.14 2013/11/22 20:51:08 ca Exp $')
|
||||
OSTYPE(osf1)dnl
|
||||
DOMAIN(S2K.Berkeley.EDU)dnl
|
||||
MAILER(local)dnl
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user