MFH
Sponsored by: The FreeBSD Foundation
This commit is contained in:
commit
538354481e
@ -102,3 +102,6 @@ usr.sbin/dpv dteske Pre-commit review requested. Keep in sync with libdpv.
|
||||
usr.sbin/pkg pkg@ Please coordinate behavior or flag changes with pkg team.
|
||||
usr.sbin/sysrc dteske Pre-commit phabricator review requested. Keep in sync with bsdconfig(8) sysrc.subr.
|
||||
vmm(4) neel,grehan Pre-commit review requested.
|
||||
autofs(5) trasz Pre-commit review recommended.
|
||||
iscsi(4) trasz Pre-commit review recommended.
|
||||
rctl(8) trasz Pre-commit review recommended.
|
||||
|
11
Makefile
11
Makefile
@ -125,7 +125,8 @@ TGTS= all all-man buildenv buildenvvars buildkernel buildworld \
|
||||
obj objlink rerelease showconfig tags toolchain update \
|
||||
_worldtmp _legacy _bootstrap-tools _cleanobj _obj \
|
||||
_build-tools _cross-tools _includes _libraries _depend \
|
||||
build32 builddtb distribute32 install32 xdev xdev-build xdev-install \
|
||||
build32 distribute32 install32 build32 distribute32 install32 \
|
||||
builddtb xdev xdev-build xdev-install \
|
||||
xdev-links native-xtools stageworld stagekernel stage-packages \
|
||||
create-world-packages create-kernel-packages create-packages \
|
||||
packages installconfig real-packages sign-packages package-pkg
|
||||
@ -161,6 +162,8 @@ _MAKEOBJDIRPREFIX!= /usr/bin/env -i PATH=${PATH} MK_AUTO_OBJ=no ${MAKE} \
|
||||
# We cannot blindly use a make which may not be the one we want
|
||||
# so be exlicit - until all choice is removed.
|
||||
WANT_MAKE= bmake
|
||||
# 20160220 - support .dinclude for FAST_DEPEND.
|
||||
WANT_MAKE_VERSION= 20160220
|
||||
MYMAKE= ${MAKEOBJDIRPREFIX}${.CURDIR}/make.${MACHINE}/${WANT_MAKE}
|
||||
.if defined(.PARSEDIR)
|
||||
HAVE_MAKE= bmake
|
||||
@ -303,7 +306,7 @@ kernel: buildkernel installkernel
|
||||
upgrade_checks:
|
||||
.if ${HAVE_MAKE} != ${WANT_MAKE} || \
|
||||
(defined(WANT_MAKE_VERSION) && ${MAKE_VERSION} < ${WANT_MAKE_VERSION})
|
||||
@(cd ${.CURDIR} && ${MAKE} ${WANT_MAKE:S,^f,,})
|
||||
@${_+_}(cd ${.CURDIR} && ${MAKE} ${WANT_MAKE:S,^f,,})
|
||||
.endif
|
||||
|
||||
#
|
||||
@ -315,9 +318,9 @@ MMAKEENV= MAKEOBJDIRPREFIX=${MYMAKE:H} \
|
||||
DESTDIR= \
|
||||
INSTALL="sh ${.CURDIR}/tools/install.sh"
|
||||
MMAKE= ${MMAKEENV} ${MAKE} \
|
||||
-DNO_MAN -DNO_SHARED \
|
||||
MAN= -DNO_SHARED \
|
||||
-DNO_CPU_CFLAGS -DNO_WERROR \
|
||||
MK_TESTS=no \
|
||||
-DNO_SUBDIR \
|
||||
DESTDIR= PROGNAME=${MYMAKE:T}
|
||||
|
||||
bmake: .PHONY
|
||||
|
199
Makefile.inc1
199
Makefile.inc1
@ -474,71 +474,17 @@ XCXXFLAGS+= ${BFLAGS}
|
||||
.endif
|
||||
.endif # ${XCC:M/*}
|
||||
|
||||
.if ${MK_LIB32} != "no" && (${TARGET_ARCH} == "amd64" || \
|
||||
${TARGET_ARCH} == "powerpc64")
|
||||
LIBCOMPAT= 32
|
||||
.include "Makefile.libcompat"
|
||||
.elif ${MK_LIBSOFT} != "no" && ${TARGET_ARCH} == "armv6"
|
||||
LIBCOMPAT= SOFT
|
||||
.include "Makefile.libcompat"
|
||||
.endif
|
||||
|
||||
WMAKE= ${WMAKEENV} ${MAKE} ${WORLD_FLAGS} -f Makefile.inc1 DESTDIR=${WORLDTMP}
|
||||
|
||||
.if ${TARGET_ARCH} == "amd64" || ${TARGET_ARCH} == "powerpc64"
|
||||
# 32 bit world
|
||||
LIB32_OBJTREE= ${OBJTREE}${.CURDIR}/world32
|
||||
LIB32TMP= ${OBJTREE}${.CURDIR}/lib32
|
||||
|
||||
.if ${TARGET_ARCH} == "amd64"
|
||||
.if empty(TARGET_CPUTYPE)
|
||||
LIB32CPUFLAGS= -march=i686 -mmmx -msse -msse2
|
||||
.else
|
||||
LIB32CPUFLAGS= -march=${TARGET_CPUTYPE}
|
||||
.endif
|
||||
LIB32WMAKEENV= MACHINE=i386 MACHINE_ARCH=i386 \
|
||||
MACHINE_CPU="i686 mmx sse sse2"
|
||||
LIB32WMAKEFLAGS= \
|
||||
AS="${XAS} --32" \
|
||||
LD="${XLD} -m elf_i386_fbsd -Y P,${LIB32TMP}/usr/lib32" \
|
||||
OBJCOPY="${XOBJCOPY}"
|
||||
|
||||
.elif ${TARGET_ARCH} == "powerpc64"
|
||||
.if empty(TARGET_CPUTYPE)
|
||||
LIB32CPUFLAGS= -mcpu=powerpc
|
||||
.else
|
||||
LIB32CPUFLAGS= -mcpu=${TARGET_CPUTYPE}
|
||||
.endif
|
||||
LIB32WMAKEENV= MACHINE=powerpc MACHINE_ARCH=powerpc
|
||||
LIB32WMAKEFLAGS= \
|
||||
LD="${XLD} -m elf32ppc_fbsd" \
|
||||
OBJCOPY="${XOBJCOPY}"
|
||||
.endif
|
||||
|
||||
|
||||
LIB32FLAGS= -m32 ${LIB32CPUFLAGS} -DCOMPAT_32BIT \
|
||||
-isystem ${LIB32TMP}/usr/include/ \
|
||||
-L${LIB32TMP}/usr/lib32 \
|
||||
-B${LIB32TMP}/usr/lib32
|
||||
.if ${XCC:N${CCACHE_BIN}:M/*}
|
||||
LIB32FLAGS+= --sysroot=${WORLDTMP}
|
||||
.endif
|
||||
|
||||
# Yes, the flags are redundant.
|
||||
LIB32WMAKEENV+= MAKEOBJDIRPREFIX=${LIB32_OBJTREE} \
|
||||
_LDSCRIPTROOT=${LIB32TMP} \
|
||||
INSTALL="sh ${.CURDIR}/tools/install.sh" \
|
||||
PATH=${TMPPATH} \
|
||||
LIBDIR=/usr/lib32 \
|
||||
SHLIBDIR=/usr/lib32 \
|
||||
DTRACE="${DTRACE} -32"
|
||||
LIB32WMAKEFLAGS+= CC="${XCC} ${LIB32FLAGS}" \
|
||||
CXX="${XCXX} ${LIB32FLAGS}" \
|
||||
DESTDIR=${LIB32TMP} \
|
||||
-DCOMPAT_32BIT \
|
||||
-DLIBRARIES_ONLY \
|
||||
-DNO_CPU_CFLAGS \
|
||||
MK_CTF=no \
|
||||
-DNO_LINT \
|
||||
MK_TESTS=no
|
||||
|
||||
LIB32WMAKE= ${LIB32WMAKEENV} ${MAKE} ${LIB32WMAKEFLAGS} \
|
||||
MK_MAN=no MK_HTML=no
|
||||
LIB32IMAKE= ${LIB32WMAKE:NINSTALL=*:NDESTDIR=*:N_LDSCRIPTROOT=*} \
|
||||
MK_TOOLCHAIN=no ${IMAKE_INSTALL}
|
||||
.endif
|
||||
|
||||
IMAKEENV= ${CROSSENV:N_LDSCRIPTROOT=*}
|
||||
IMAKE= ${IMAKEENV} ${MAKE} -f Makefile.inc1 \
|
||||
${IMAKE_INSTALL} ${IMAKE_MTREE}
|
||||
@ -595,8 +541,8 @@ _worldtmp: .PHONY
|
||||
@echo "--------------------------------------------------------------"
|
||||
.if !defined(NO_CLEAN)
|
||||
rm -rf ${WORLDTMP}
|
||||
.if defined(LIB32TMP)
|
||||
rm -rf ${LIB32TMP}
|
||||
.if defined(LIBCOMPAT)
|
||||
rm -rf ${LIBCOMPATTMP}
|
||||
.endif
|
||||
.else
|
||||
rm -rf ${WORLDTMP}/legacy/usr/include
|
||||
@ -626,13 +572,13 @@ _worldtmp: .PHONY
|
||||
mtree -deU -f ${.CURDIR}/etc/mtree/BSD.debug.dist \
|
||||
-p ${WORLDTMP}/usr/lib >/dev/null
|
||||
.endif
|
||||
.if ${MK_LIB32} != "no"
|
||||
mtree -deU -f ${.CURDIR}/etc/mtree/BSD.lib32.dist \
|
||||
.if defined(LIBCOMPAT)
|
||||
mtree -deU -f ${.CURDIR}/etc/mtree/BSD.lib${libcompat}.dist \
|
||||
-p ${WORLDTMP}/usr >/dev/null
|
||||
.if ${MK_DEBUG_FILES} != "no"
|
||||
mtree -deU -f ${.CURDIR}/etc/mtree/BSD.lib32.dist \
|
||||
mtree -deU -f ${.CURDIR}/etc/mtree/BSD.lib${libcompat}.dist \
|
||||
-p ${WORLDTMP}/legacy/usr/lib/debug/usr >/dev/null
|
||||
mtree -deU -f ${.CURDIR}/etc/mtree/BSD.lib32.dist \
|
||||
mtree -deU -f ${.CURDIR}/etc/mtree/BSD.lib${libcompat}.dist \
|
||||
-p ${WORLDTMP}/usr/lib/debug/usr >/dev/null
|
||||
.endif
|
||||
.endif
|
||||
@ -668,8 +614,8 @@ _cleanobj:
|
||||
@echo ">>> stage 2.1: cleaning up the object tree"
|
||||
@echo "--------------------------------------------------------------"
|
||||
${_+_}cd ${.CURDIR}; ${WMAKE} ${CLEANDIR}
|
||||
.if defined(LIB32TMP)
|
||||
${_+_}cd ${.CURDIR}; ${LIB32WMAKE} -f Makefile.inc1 ${CLEANDIR}
|
||||
.if defined(LIBCOMPAT)
|
||||
${_+_}cd ${.CURDIR}; ${LIBCOMPATWMAKE} -f Makefile.inc1 ${CLEANDIR}
|
||||
.endif
|
||||
.endif
|
||||
_obj:
|
||||
@ -723,78 +669,6 @@ everything:
|
||||
@echo ">>> stage 4.4: building everything"
|
||||
@echo "--------------------------------------------------------------"
|
||||
${_+_}cd ${.CURDIR}; _PARALLEL_SUBDIR_OK=1 ${WMAKE} all
|
||||
.if defined(LIB32TMP)
|
||||
build32: .PHONY
|
||||
@echo
|
||||
@echo "--------------------------------------------------------------"
|
||||
@echo ">>> stage 5.1: building 32 bit shim libraries"
|
||||
@echo "--------------------------------------------------------------"
|
||||
mkdir -p ${LIB32TMP}/usr/include
|
||||
mtree -deU -f ${.CURDIR}/etc/mtree/BSD.usr.dist \
|
||||
-p ${LIB32TMP}/usr >/dev/null
|
||||
mtree -deU -f ${.CURDIR}/etc/mtree/BSD.include.dist \
|
||||
-p ${LIB32TMP}/usr/include >/dev/null
|
||||
mtree -deU -f ${.CURDIR}/etc/mtree/BSD.lib32.dist \
|
||||
-p ${LIB32TMP}/usr >/dev/null
|
||||
.if ${MK_DEBUG_FILES} != "no"
|
||||
mtree -deU -f ${.CURDIR}/etc/mtree/BSD.debug.dist \
|
||||
-p ${LIB32TMP}/usr/lib >/dev/null
|
||||
mtree -deU -f ${.CURDIR}/etc/mtree/BSD.lib32.dist \
|
||||
-p ${LIB32TMP}/usr/lib/debug/usr >/dev/null
|
||||
.endif
|
||||
mkdir -p ${WORLDTMP}
|
||||
ln -sf ${.CURDIR}/sys ${WORLDTMP}
|
||||
.for _t in obj includes
|
||||
${_+_}cd ${.CURDIR}/include; ${LIB32WMAKE} DIRPRFX=include/ ${_t}
|
||||
${_+_}cd ${.CURDIR}/lib; ${LIB32WMAKE} DIRPRFX=lib/ ${_t}
|
||||
.if ${MK_CDDL} != "no"
|
||||
${_+_}cd ${.CURDIR}/cddl/lib; ${LIB32WMAKE} DIRPRFX=cddl/lib/ ${_t}
|
||||
.endif
|
||||
${_+_}cd ${.CURDIR}/gnu/lib; ${LIB32WMAKE} DIRPRFX=gnu/lib/ ${_t}
|
||||
.if ${MK_CRYPT} != "no"
|
||||
${_+_}cd ${.CURDIR}/secure/lib; ${LIB32WMAKE} DIRPRFX=secure/lib/ ${_t}
|
||||
.endif
|
||||
.if ${MK_KERBEROS} != "no"
|
||||
${_+_}cd ${.CURDIR}/kerberos5/lib; ${LIB32WMAKE} DIRPRFX=kerberos5/lib ${_t}
|
||||
.endif
|
||||
.endfor
|
||||
.for _dir in usr.bin/lex/lib
|
||||
${_+_}cd ${.CURDIR}/${_dir}; ${LIB32WMAKE} DIRPRFX=${_dir}/ obj
|
||||
.endfor
|
||||
.for _dir in lib/ncurses/ncurses lib/ncurses/ncursesw lib/libmagic
|
||||
${_+_}cd ${.CURDIR}/${_dir}; \
|
||||
WORLDTMP=${WORLDTMP} \
|
||||
MAKEFLAGS="-m ${.CURDIR}/tools/build/mk ${.MAKEFLAGS}" \
|
||||
MAKEOBJDIRPREFIX=${LIB32_OBJTREE} ${MAKE} SSP_CFLAGS= DESTDIR= \
|
||||
DIRPRFX=${_dir}/ -DNO_LINT -DNO_CPU_CFLAGS MK_WARNS=no MK_CTF=no \
|
||||
build-tools
|
||||
.endfor
|
||||
${_+_}cd ${.CURDIR}; \
|
||||
${LIB32WMAKE} -f Makefile.inc1 -DNO_FSCHG libraries
|
||||
.for _t in obj depend all
|
||||
${_+_}cd ${.CURDIR}/libexec/rtld-elf; PROG=ld-elf32.so.1 ${LIB32WMAKE} \
|
||||
-DNO_FSCHG DIRPRFX=libexec/rtld-elf/ ${_t}
|
||||
${_+_}cd ${.CURDIR}/usr.bin/ldd; PROG=ldd32 ${LIB32WMAKE} \
|
||||
DIRPRFX=usr.bin/ldd ${_t}
|
||||
.endfor
|
||||
|
||||
distribute32 install32: .MAKE .PHONY
|
||||
${_+_}cd ${.CURDIR}/lib; ${LIB32IMAKE} ${.TARGET:S/32$//}
|
||||
.if ${MK_CDDL} != "no"
|
||||
${_+_}cd ${.CURDIR}/cddl/lib; ${LIB32IMAKE} ${.TARGET:S/32$//}
|
||||
.endif
|
||||
${_+_}cd ${.CURDIR}/gnu/lib; ${LIB32IMAKE} ${.TARGET:S/32$//}
|
||||
.if ${MK_CRYPT} != "no"
|
||||
${_+_}cd ${.CURDIR}/secure/lib; ${LIB32IMAKE} ${.TARGET:S/32$//}
|
||||
.endif
|
||||
.if ${MK_KERBEROS} != "no"
|
||||
${_+_}cd ${.CURDIR}/kerberos5/lib; ${LIB32IMAKE} ${.TARGET:S/32$//}
|
||||
.endif
|
||||
${_+_}cd ${.CURDIR}/libexec/rtld-elf; \
|
||||
PROG=ld-elf32.so.1 ${LIB32IMAKE} ${.TARGET:S/32$//}
|
||||
${_+_}cd ${.CURDIR}/usr.bin/ldd; PROG=ldd32 ${LIB32IMAKE} \
|
||||
${.TARGET:S/32$//}
|
||||
.endif
|
||||
|
||||
WMAKE_TGTS=
|
||||
WMAKE_TGTS+= _worldtmp _legacy
|
||||
@ -807,8 +681,8 @@ WMAKE_TGTS+= _includes _libraries
|
||||
WMAKE_TGTS+= _depend
|
||||
.endif
|
||||
WMAKE_TGTS+= everything
|
||||
.if defined(LIB32TMP) && ${MK_LIB32} != "no" && empty(SUBDIR_OVERRIDE)
|
||||
WMAKE_TGTS+= build32
|
||||
.if defined(LIBCOMPAT) && empty(SUBDIR_OVERRIDE)
|
||||
WMAKE_TGTS+= build${libcompat}
|
||||
.endif
|
||||
|
||||
buildworld: buildworld_prologue ${WMAKE_TGTS} buildworld_epilogue
|
||||
@ -848,7 +722,7 @@ buildenv: .PHONY
|
||||
@cd ${BUILDENV_DIR} && env ${WMAKEENV} BUILDENV=1 ${BUILDENV_SHELL} \
|
||||
|| true
|
||||
|
||||
TOOLCHAIN_TGTS= ${WMAKE_TGTS:N_depend:Neverything:Nbuild32}
|
||||
TOOLCHAIN_TGTS= ${WMAKE_TGTS:N_depend:Neverything:Nbuild${libcompat}}
|
||||
toolchain: ${TOOLCHAIN_TGTS}
|
||||
kernel-toolchain: ${TOOLCHAIN_TGTS:N_includes:N_libraries}
|
||||
|
||||
@ -942,8 +816,8 @@ ITOOLS+=makewhatis
|
||||
|
||||
# Non-base distributions produced by the base system
|
||||
EXTRA_DISTRIBUTIONS= doc
|
||||
.if defined(LIB32TMP) && ${MK_LIB32} != "no"
|
||||
EXTRA_DISTRIBUTIONS+= lib32
|
||||
.if defined(LIBCOMPAT)
|
||||
EXTRA_DISTRIBUTIONS+= lib${libcompat}
|
||||
.endif
|
||||
.if ${MK_TESTS} != "no"
|
||||
EXTRA_DISTRIBUTIONS+= tests
|
||||
@ -995,11 +869,11 @@ distributeworld installworld stageworld: _installcheck_world
|
||||
mtree -deU -f ${.CURDIR}/etc/mtree/BSD.debug.dist \
|
||||
-p ${DESTDIR}/${DISTDIR}/${dist}/usr/lib >/dev/null
|
||||
.endif
|
||||
.if ${MK_LIB32} != "no"
|
||||
mtree -deU -f ${.CURDIR}/etc/mtree/BSD.lib32.dist \
|
||||
.if defined(LIBCOMPAT)
|
||||
mtree -deU -f ${.CURDIR}/etc/mtree/BSD.lib${libcompat}.dist \
|
||||
-p ${DESTDIR}/${DISTDIR}/${dist}/usr >/dev/null
|
||||
.if ${MK_DEBUG_FILES} != "no"
|
||||
mtree -deU -f ${.CURDIR}/etc/mtree/BSD.lib32.dist \
|
||||
mtree -deU -f ${.CURDIR}/etc/mtree/BSD.lib${libcompat}.dist \
|
||||
-p ${DESTDIR}/${DISTDIR}/${dist}/usr/lib/debug/usr >/dev/null
|
||||
.endif
|
||||
.endif
|
||||
@ -1019,8 +893,8 @@ distributeworld installworld stageworld: _installcheck_world
|
||||
sed -e 's#^\./#./${dist}/usr/#' >> ${METALOG}
|
||||
${IMAKEENV} mtree -C -f ${.CURDIR}/etc/mtree/BSD.include.dist | \
|
||||
sed -e 's#^\./#./${dist}/usr/include/#' >> ${METALOG}
|
||||
.if ${MK_LIB32} != "no"
|
||||
${IMAKEENV} mtree -C -f ${.CURDIR}/etc/mtree/BSD.lib32.dist | \
|
||||
.if defined(LIBCOMPAT)
|
||||
${IMAKEENV} mtree -C -f ${.CURDIR}/etc/mtree/BSD.lib${libcompat}.dist | \
|
||||
sed -e 's#^\./#./${dist}/usr/#' >> ${METALOG}
|
||||
.endif
|
||||
.endif
|
||||
@ -1105,8 +979,8 @@ reinstall: .MAKE .PHONY
|
||||
@echo ">>> Installing everything"
|
||||
@echo "--------------------------------------------------------------"
|
||||
${_+_}cd ${.CURDIR}; ${MAKE} -f Makefile.inc1 install
|
||||
.if defined(LIB32TMP) && ${MK_LIB32} != "no"
|
||||
${_+_}cd ${.CURDIR}; ${MAKE} -f Makefile.inc1 install32
|
||||
.if defined(LIBCOMPAT)
|
||||
${_+_}cd ${.CURDIR}; ${MAKE} -f Makefile.inc1 install${libcompat}
|
||||
.endif
|
||||
|
||||
restage: .MAKE .PHONY
|
||||
@ -1129,9 +1003,9 @@ redistribute: .MAKE .PHONY
|
||||
@echo ">>> Distributing everything"
|
||||
@echo "--------------------------------------------------------------"
|
||||
${_+_}cd ${.CURDIR}; ${MAKE} -f Makefile.inc1 distribute
|
||||
.if defined(LIB32TMP) && ${MK_LIB32} != "no"
|
||||
${_+_}cd ${.CURDIR}; ${MAKE} -f Makefile.inc1 distribute32 \
|
||||
DISTRIBUTION=lib32
|
||||
.if defined(LIBCOMPAT)
|
||||
${_+_}cd ${.CURDIR}; ${MAKE} -f Makefile.inc1 distribute${libcompat} \
|
||||
DISTRIBUTION=lib${libcompat}
|
||||
.endif
|
||||
|
||||
distrib-dirs distribution: .MAKE .PHONY
|
||||
@ -1194,7 +1068,7 @@ INSTALLKERNEL= ${_kernel}
|
||||
.endif
|
||||
.endfor
|
||||
|
||||
${WMAKE_TGTS:N_worldtmp:Nbuild32} ${.ALLTARGETS:M_*:N_worldtmp}: .MAKE .PHONY
|
||||
${WMAKE_TGTS:N_worldtmp:Nbuild${libcompat}} ${.ALLTARGETS:M_*:N_worldtmp}: .MAKE .PHONY
|
||||
|
||||
#
|
||||
# buildkernel
|
||||
@ -1574,7 +1448,8 @@ update:
|
||||
#
|
||||
|
||||
# ELF Tool Chain libraries are needed for ELF tools and dtrace tools.
|
||||
.if ${BOOTSTRAPPING} < 1100006
|
||||
# r296685 fix cross-endian objcopy
|
||||
.if ${BOOTSTRAPPING} < 1100102
|
||||
_elftoolchain_libs= lib/libelf lib/libdwarf
|
||||
.endif
|
||||
|
||||
@ -2578,8 +2453,8 @@ _xi-mtree: .PHONY
|
||||
-p ${XDDESTDIR}/usr >/dev/null
|
||||
mtree -deU -f ${.CURDIR}/etc/mtree/BSD.include.dist \
|
||||
-p ${XDDESTDIR}/usr/include >/dev/null
|
||||
.if ${MK_LIB32} != "no"
|
||||
mtree -deU -f ${.CURDIR}/etc/mtree/BSD.lib32.dist \
|
||||
.if defined(LIBCOMPAT)
|
||||
mtree -deU -f ${.CURDIR}/etc/mtree/BSD.lib${libcompat}.dist \
|
||||
-p ${XDDESTDIR}/usr >/dev/null
|
||||
.endif
|
||||
.if ${MK_TESTS} != "no"
|
||||
|
161
Makefile.libcompat
Normal file
161
Makefile.libcompat
Normal file
@ -0,0 +1,161 @@
|
||||
# $FreeBSD$
|
||||
|
||||
.if !targets(__<${_this:T}>__)
|
||||
__<${_this:T}>__:
|
||||
|
||||
# Makefile for the compatibility libraries.
|
||||
# - 32-bit compat libraries on PowerPC and AMD64.
|
||||
# could also be for mips, but that doesn't work today.
|
||||
|
||||
# -------------------------------------------------------------------
|
||||
# 32 bit world
|
||||
.if ${TARGET_ARCH} == "amd64"
|
||||
.if empty(TARGET_CPUTYPE)
|
||||
LIB32CPUFLAGS= -march=i686 -mmmx -msse -msse2
|
||||
.else
|
||||
LIB32CPUFLAGS= -march=${TARGET_CPUTYPE}
|
||||
.endif
|
||||
LIB32WMAKEENV= MACHINE=i386 MACHINE_ARCH=i386 \
|
||||
MACHINE_CPU="i686 mmx sse sse2"
|
||||
LIB32WMAKEFLAGS= \
|
||||
AS="${XAS} --32" \
|
||||
LD="${XLD} -m elf_i386_fbsd -Y P,${LIBCOMPATTMP}/usr/lib32" \
|
||||
OBJCOPY="${XOBJCOPY}"
|
||||
|
||||
.elif ${TARGET_ARCH} == "powerpc64"
|
||||
.if empty(TARGET_CPUTYPE)
|
||||
LIB32CPUFLAGS= -mcpu=powerpc
|
||||
.else
|
||||
LIB32CPUFLAGS= -mcpu=${TARGET_CPUTYPE}
|
||||
.endif
|
||||
LIB32WMAKEENV= MACHINE=powerpc MACHINE_ARCH=powerpc
|
||||
LIB32WMAKEFLAGS= \
|
||||
LD="${XLD} -m elf32ppc_fbsd" \
|
||||
OBJCOPY="${XOBJCOPY}"
|
||||
.endif
|
||||
|
||||
|
||||
LIB32CFLAGS= -m32 -DCOMPAT_32BIT
|
||||
LIB32DTRACE= ${DTRACE} -32
|
||||
LIB32WMAKEFLAGS+= -DCOMPAT_32BIT
|
||||
|
||||
# -------------------------------------------------------------------
|
||||
# soft-fp world
|
||||
.if ${TARGET_ARCH} == "armv6"
|
||||
LIBSOFTCFLAGS= -DCOMPAT_SOFTFP
|
||||
LIBSOFTCPUFLAGS= -mfloat-abi=softfp
|
||||
LIBSOFTWMAKEENV= CPUTYPE=soft MACHINE=arm MACHINE_ARCH=armv6
|
||||
LIBSOFTWMAKEFLAGS= -DCOMPAT_SOFTFP
|
||||
.endif
|
||||
|
||||
# -------------------------------------------------------------------
|
||||
# Generic code for each type.
|
||||
# Set defaults based on type.
|
||||
libcompat= ${LIBCOMPAT:tl}
|
||||
_LIBCOMPAT_MAKEVARS= _OBJTREE TMP CPUFLAGS CFLAGS WMAKEENV WMAKEFLAGS WMAKE
|
||||
.for _var in ${_LIBCOMPAT_MAKEVARS}
|
||||
.if !empty(LIB${LIBCOMPAT}${_var})
|
||||
LIBCOMPAT${_var}?= ${LIB${LIBCOMPAT}${_var}}
|
||||
.endif
|
||||
.endfor
|
||||
|
||||
# Shared flags
|
||||
LIBCOMPAT_OBJTREE?= ${OBJTREE}${.CURDIR}/world${libcompat}
|
||||
LIBCOMPATTMP?= ${OBJTREE}${.CURDIR}/lib${libcompat}
|
||||
|
||||
LIBCOMPATCFLAGS+= ${LIBCOMPATCPUFLAGS} \
|
||||
-isystem ${LIBCOMPATTMP}/usr/include/ \
|
||||
-L${LIBCOMPATTMP}/usr/lib${libcompat} \
|
||||
-B${LIBCOMPATTMP}/usr/lib${libcompat}
|
||||
|
||||
# Yes, the flags are redundant.
|
||||
LIBCOMPATWMAKEENV+= MAKEOBJDIRPREFIX=${LIBCOMPAT_OBJTREE} \
|
||||
_LDSCRIPTROOT=${LIBCOMPATTMP} \
|
||||
INSTALL="sh ${.CURDIR}/tools/install.sh" \
|
||||
PATH=${TMPPATH} \
|
||||
LIBDIR=/usr/lib${libcompat} \
|
||||
SHLIBDIR=/usr/lib${libcompat} \
|
||||
DTRACE="${LIB$COMPATDTRACE:U${DTRACE}}"
|
||||
LIBCOMPATWMAKEFLAGS+= CC="${XCC} ${LIBCOMPATCFLAGS}" \
|
||||
CXX="${XCXX} ${LIBCOMPATCFLAGS}" \
|
||||
DESTDIR=${LIBCOMPATTMP} \
|
||||
-DLIBRARIES_ONLY \
|
||||
-DNO_CPU_CFLAGS \
|
||||
MK_CTF=no \
|
||||
-DNO_LINT \
|
||||
MK_TESTS=no
|
||||
LIBCOMPATWMAKE+= ${LIBCOMPATWMAKEENV} ${MAKE} ${LIBCOMPATWMAKEFLAGS} \
|
||||
MK_MAN=no MK_HTML=no
|
||||
LIBCOMPATIMAKE+= ${LIBCOMPATWMAKE:NINSTALL=*:NDESTDIR=*:N_LDSCRIPTROOT=*} \
|
||||
MK_TOOLCHAIN=no ${IMAKE_INSTALL}
|
||||
|
||||
.if ${XCC:N${CCACHE_BIN}:M/*}
|
||||
LIBCOMPATCFLAGS+= --sysroot=${WORLDTMP}
|
||||
.endif
|
||||
|
||||
_LC_LIBDIRS.yes= lib gnu/lib
|
||||
_LC_LIBDIRS.${MK_CDDL:tl}+= cddl/lib
|
||||
_LC_LIBDIRS.${MK_CRYPT:tl}+= secure/lib
|
||||
_LC_LIBDIRS.${MK_KERBEROS:tl}+= kerberos5/lib
|
||||
|
||||
# Shared logic
|
||||
build${libcompat}: .PHONY
|
||||
@echo
|
||||
@echo "--------------------------------------------------------------"
|
||||
@echo ">>> stage 5.1: building lib${libcompat} shim libraries"
|
||||
@echo "--------------------------------------------------------------"
|
||||
mkdir -p ${LIBCOMPATTMP}/usr/include
|
||||
mtree -deU -f ${.CURDIR}/etc/mtree/BSD.usr.dist \
|
||||
-p ${LIBCOMPATTMP}/usr >/dev/null
|
||||
mtree -deU -f ${.CURDIR}/etc/mtree/BSD.include.dist \
|
||||
-p ${LIBCOMPATTMP}/usr/include >/dev/null
|
||||
mtree -deU -f ${.CURDIR}/etc/mtree/BSD.lib${libcompat}.dist \
|
||||
-p ${LIBCOMPATTMP}/usr >/dev/null
|
||||
.if ${MK_DEBUG_FILES} != "no"
|
||||
mtree -deU -f ${.CURDIR}/etc/mtree/BSD.debug.dist \
|
||||
-p ${LIBCOMPATTMP}/usr/lib >/dev/null
|
||||
mtree -deU -f ${.CURDIR}/etc/mtree/BSD.lib${libcompat}.dist \
|
||||
-p ${LIBCOMPATTMP}/usr/lib/debug/usr >/dev/null
|
||||
.endif
|
||||
mkdir -p ${WORLDTMP}
|
||||
ln -sf ${.CURDIR}/sys ${WORLDTMP}
|
||||
.for _t in obj includes
|
||||
${_+_}cd ${.CURDIR}/include; ${LIBCOMPATWMAKE} DIRPRFX=include/ ${_t}
|
||||
.for _dir in ${_LC_LIBDIRS.yes}
|
||||
${_+_}cd ${.CURDIR}/${_dir}; ${LIBCOMPATWMAKE} DIRPRFX=${_dir}/ ${_t}
|
||||
.endfor
|
||||
.endfor
|
||||
.for _dir in usr.bin/lex/lib
|
||||
${_+_}cd ${.CURDIR}/${_dir}; ${LIBCOMPATWMAKE} DIRPRFX=${_dir}/ obj
|
||||
.endfor
|
||||
.for _dir in lib/ncurses/ncurses lib/ncurses/ncursesw lib/libmagic
|
||||
${_+_}cd ${.CURDIR}/${_dir}; \
|
||||
WORLDTMP=${WORLDTMP} \
|
||||
MAKEFLAGS="-m ${.CURDIR}/tools/build/mk ${.MAKEFLAGS}" \
|
||||
MAKEOBJDIRPREFIX=${LIBCOMPAT_OBJTREE} ${MAKE} SSP_CFLAGS= DESTDIR= \
|
||||
DIRPRFX=${_dir}/ -DNO_LINT -DNO_CPU_CFLAGS MK_WARNS=no MK_CTF=no \
|
||||
build-tools
|
||||
.endfor
|
||||
${_+_}cd ${.CURDIR}; \
|
||||
${LIBCOMPATWMAKE} -f Makefile.inc1 -DNO_FSCHG libraries
|
||||
.if ${libcompat} == "32"
|
||||
.for _t in obj depend all
|
||||
${_+_}cd ${.CURDIR}/libexec/rtld-elf; PROG=ld-elf32.so.1 ${LIBCOMPATWMAKE} \
|
||||
-DNO_FSCHG DIRPRFX=libexec/rtld-elf/ ${_t}
|
||||
${_+_}cd ${.CURDIR}/usr.bin/ldd; PROG=ldd32 ${LIBCOMPATWMAKE} \
|
||||
DIRPRFX=usr.bin/ldd ${_t}
|
||||
.endfor
|
||||
.endif
|
||||
|
||||
distribute${libcompat} install${libcompat}: .PHONY
|
||||
.for _dir in ${_LC_LIBDIRS.yes}
|
||||
${_+_}cd ${.CURDIR}/${_dir}; ${LIBCOMPATIMAKE} ${.TARGET:S/${libcompat}$//}
|
||||
.endfor
|
||||
.if ${libcompat} == "32"
|
||||
${_+_}cd ${.CURDIR}/libexec/rtld-elf; \
|
||||
PROG=ld-elf32.so.1 ${LIBCOMPATIMAKE} ${.TARGET:S/32$//}
|
||||
${_+_}cd ${.CURDIR}/usr.bin/ldd; PROG=ldd32 ${LIBCOMPATIMAKE} \
|
||||
${.TARGET:S/32$//}
|
||||
.endif
|
||||
|
||||
.endif
|
@ -144,6 +144,12 @@ OLD_FILES+=libexec/casper/grp
|
||||
OLD_FILES+=libexec/casper/pwd
|
||||
OLD_FILES+=libexec/casper/random
|
||||
OLD_FILES+=libexec/casper/sysctl
|
||||
OLD_FILES+=libexec/casper/.debug/random.debug
|
||||
OLD_FILES+=libexec/casper/.debug/dns.debug
|
||||
OLD_FILES+=libexec/casper/.debug/sysctl.debug
|
||||
OLD_FILES+=libexec/casper/.debug/pwd.debug
|
||||
OLD_FILES+=libexec/casper/.debug/grp.debug
|
||||
OLD_DIRS+=libexec/casper/.debug
|
||||
OLD_DIRS+=libexec/casper
|
||||
OLD_FILES+=usr/lib/libcapsicum.a
|
||||
OLD_FILES+=usr/lib/libcapsicum.so
|
||||
|
10
UPDATING
10
UPDATING
@ -31,6 +31,16 @@ NOTE TO PEOPLE WHO THINK THAT FreeBSD 11.x IS SLOW:
|
||||
disable the most expensive debugging functionality run
|
||||
"ln -s 'abort:false,junk:false' /etc/malloc.conf".)
|
||||
|
||||
20160311:
|
||||
WITH_FAST_DEPEND is now enabled by default for in-tree and out-of-tree
|
||||
builds. It no longer runs mkdep(1) during 'make depend', and the
|
||||
'make depend' stage can safely be skipped now as it is auto ran
|
||||
when building 'make all' and will generate all SRCS and DPSRCS before
|
||||
building anything else. Dependencies are gathered at compile time with
|
||||
-MF flags kept in separate .depend files per object file. Users should
|
||||
run 'make cleandepend' once if using -DNO_CLEAN to clean out older
|
||||
stale .depend files.
|
||||
|
||||
20160306:
|
||||
On amd64, clang 3.8.0 can now insert sections of type AMD64_UNWIND into
|
||||
kernel modules. Therefore, if you load any kernel modules at boot time,
|
||||
|
@ -332,6 +332,7 @@ find_command(const char *name, struct cmdentry *entry, int act,
|
||||
if (strchr(name, '/') != NULL) {
|
||||
entry->cmdtype = CMDNORMAL;
|
||||
entry->u.index = 0;
|
||||
entry->special = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
@ -408,6 +409,7 @@ find_command(const char *name, struct cmdentry *entry, int act,
|
||||
cmdp = &loc_cmd;
|
||||
cmdp->cmdtype = CMDNORMAL;
|
||||
cmdp->param.index = idx;
|
||||
cmdp->special = 0;
|
||||
INTON;
|
||||
goto success;
|
||||
}
|
||||
@ -420,6 +422,7 @@ find_command(const char *name, struct cmdentry *entry, int act,
|
||||
}
|
||||
entry->cmdtype = CMDUNKNOWN;
|
||||
entry->u.index = 0;
|
||||
entry->special = 0;
|
||||
return;
|
||||
|
||||
success:
|
||||
@ -588,6 +591,7 @@ addcmdentry(const char *name, struct cmdentry *entry)
|
||||
}
|
||||
cmdp->cmdtype = entry->cmdtype;
|
||||
cmdp->param = entry->u;
|
||||
cmdp->special = entry->special;
|
||||
INTON;
|
||||
}
|
||||
|
||||
@ -604,6 +608,7 @@ defun(const char *name, union node *func)
|
||||
INTOFF;
|
||||
entry.cmdtype = CMDFUNCTION;
|
||||
entry.u.func = copyfunc(func);
|
||||
entry.special = 0;
|
||||
addcmdentry(name, &entry);
|
||||
INTON;
|
||||
}
|
||||
|
@ -452,7 +452,7 @@ ulimitcmd(int argc __unused, char **argv __unused)
|
||||
struct rlimit limit;
|
||||
|
||||
what = 'f';
|
||||
while ((optc = nextopt("HSatfdsmcnuvlbpwk")) != '\0')
|
||||
while ((optc = nextopt("HSatfdsmcnuvlbpwko")) != '\0')
|
||||
switch (optc) {
|
||||
case 'H':
|
||||
how = HARD;
|
||||
|
@ -2615,7 +2615,7 @@ and not found.
|
||||
For aliases the alias expansion is printed;
|
||||
for commands and tracked aliases
|
||||
the complete pathname of the command is printed.
|
||||
.It Ic ulimit Oo Fl HSabcdfklmnpstuvw Oc Op Ar limit
|
||||
.It Ic ulimit Oo Fl HSabcdfklmnopstuvw Oc Op Ar limit
|
||||
Set or display resource limits (see
|
||||
.Xr getrlimit 2 ) .
|
||||
If
|
||||
@ -2674,6 +2674,11 @@ kilobytes.
|
||||
The maximal resident set size of a process, in kilobytes.
|
||||
.It Fl n Ar nofiles
|
||||
The maximal number of descriptors that could be opened by a process.
|
||||
.It Fl o Ar umtxp
|
||||
The maximal number of process-shared locks
|
||||
(see
|
||||
.Xr pthread 3 )
|
||||
for this user ID.
|
||||
.It Fl p Ar pseudoterminals
|
||||
The maximal number of pseudo-terminals for this user ID.
|
||||
.It Fl s Ar stacksize
|
||||
|
@ -24,6 +24,7 @@
|
||||
*/
|
||||
/*
|
||||
* Copyright (c) 2013, Joyent, Inc. All rights reserved.
|
||||
* Copyright (c) 2016, Pedro Giffuni. All rights reserved.
|
||||
*/
|
||||
|
||||
#include <sys/types.h>
|
||||
@ -721,22 +722,20 @@ dt_module_load_proc(dtrace_hdl_t *dtp, dt_module_t *dmp)
|
||||
return (dt_set_errno(dtp, EDT_CANTLOAD));
|
||||
}
|
||||
|
||||
dmp->dm_libctfp = malloc(sizeof (ctf_file_t *) * arg.dpa_count);
|
||||
dmp->dm_libctfp = calloc(arg.dpa_count, sizeof (ctf_file_t *));
|
||||
if (dmp->dm_libctfp == NULL) {
|
||||
dt_proc_unlock(dtp, p);
|
||||
dt_proc_release(dtp, p);
|
||||
return (dt_set_errno(dtp, EDT_NOMEM));
|
||||
}
|
||||
bzero(dmp->dm_libctfp, sizeof (ctf_file_t *) * arg.dpa_count);
|
||||
|
||||
dmp->dm_libctfn = malloc(sizeof (char *) * arg.dpa_count);
|
||||
dmp->dm_libctfn = calloc(arg.dpa_count, sizeof (char *));
|
||||
if (dmp->dm_libctfn == NULL) {
|
||||
free(dmp->dm_libctfp);
|
||||
dt_proc_unlock(dtp, p);
|
||||
dt_proc_release(dtp, p);
|
||||
return (dt_set_errno(dtp, EDT_NOMEM));
|
||||
}
|
||||
bzero(dmp->dm_libctfn, sizeof (char *) * arg.dpa_count);
|
||||
|
||||
dmp->dm_nctflibs = arg.dpa_count;
|
||||
|
||||
@ -817,17 +816,14 @@ dt_module_load(dtrace_hdl_t *dtp, dt_module_t *dmp)
|
||||
dmp->dm_nsymbuckets = _dtrace_strbuckets;
|
||||
dmp->dm_symfree = 1; /* first free element is index 1 */
|
||||
|
||||
dmp->dm_symbuckets = malloc(sizeof (uint_t) * dmp->dm_nsymbuckets);
|
||||
dmp->dm_symchains = malloc(sizeof (dt_sym_t) * dmp->dm_nsymelems + 1);
|
||||
dmp->dm_symbuckets = calloc(dmp->dm_nsymbuckets, sizeof (uint_t));
|
||||
dmp->dm_symchains = calloc(dmp->dm_nsymelems + 1, sizeof (dt_sym_t));
|
||||
|
||||
if (dmp->dm_symbuckets == NULL || dmp->dm_symchains == NULL) {
|
||||
dt_module_unload(dtp, dmp);
|
||||
return (dt_set_errno(dtp, EDT_NOMEM));
|
||||
}
|
||||
|
||||
bzero(dmp->dm_symbuckets, sizeof (uint_t) * dmp->dm_nsymbuckets);
|
||||
bzero(dmp->dm_symchains, sizeof (dt_sym_t) * dmp->dm_nsymelems + 1);
|
||||
|
||||
/*
|
||||
* Iterate over the symbol table data buffer and insert each symbol
|
||||
* name into the name hash if the name and type are valid. Then
|
||||
|
@ -27,6 +27,7 @@
|
||||
|
||||
/*
|
||||
* Copyright (c) 2012 by Delphix. All rights reserved.
|
||||
* Copyright (c) 2016 Pedro Giffuni. All rights reserved.
|
||||
*/
|
||||
|
||||
#include <sys/types.h>
|
||||
@ -47,15 +48,15 @@ dt_regset_create(ulong_t nregs)
|
||||
if (drp == NULL)
|
||||
return (NULL);
|
||||
|
||||
drp->dr_bitmap = malloc(sizeof (ulong_t) * n);
|
||||
drp->dr_size = nregs;
|
||||
drp->dr_bitmap = calloc(n, sizeof (ulong_t));
|
||||
|
||||
if (drp->dr_bitmap == NULL) {
|
||||
dt_regset_destroy(drp);
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
bzero(drp->dr_bitmap, sizeof (ulong_t) * n);
|
||||
drp->dr_size = nregs;
|
||||
|
||||
return (drp);
|
||||
}
|
||||
|
||||
|
@ -24,6 +24,10 @@
|
||||
* Use is subject to license terms.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Portions Copyright 2016 Pedro Giffuni. All rights reserved.
|
||||
*/
|
||||
|
||||
#pragma ident "%Z%%M% %I% %E% SMI"
|
||||
|
||||
#include <sys/types.h>
|
||||
@ -70,12 +74,11 @@ dt_strtab_create(size_t bufsz)
|
||||
return (NULL);
|
||||
|
||||
bzero(sp, sizeof (dt_strtab_t));
|
||||
sp->str_hash = malloc(nbuckets * sizeof (dt_strhash_t *));
|
||||
sp->str_hash = calloc(nbuckets, sizeof (dt_strhash_t *));
|
||||
|
||||
if (sp->str_hash == NULL)
|
||||
goto err;
|
||||
|
||||
bzero(sp->str_hash, nbuckets * sizeof (dt_strhash_t *));
|
||||
sp->str_hashsz = nbuckets;
|
||||
sp->str_bufs = NULL;
|
||||
sp->str_ptr = NULL;
|
||||
|
@ -1,3 +1,41 @@
|
||||
2016-03-07 Simon J. Gerraty <sjg@bad.crufty.net>
|
||||
|
||||
* Makefile (MAKE_VERSION): 20160307
|
||||
Merge with NetBSD make, pick up
|
||||
o var.c: fix :ts\nnn to be octal by default.
|
||||
o meta.c: meta_finish() to cleanup memory.
|
||||
|
||||
2016-02-26 Simon J. Gerraty <sjg@bad.crufty.net>
|
||||
|
||||
* Makefile (MAKE_VERSION): 20160226
|
||||
Merge with NetBSD make, pick up
|
||||
o meta.c: allow meta file for makeDepend if makefiles want it.
|
||||
|
||||
2016-02-19 Simon J. Gerraty <sjg@bad.crufty.net>
|
||||
|
||||
* var.c: default .MAKE.SAVE_DOLLARS to FALSE
|
||||
for backwards compatability.
|
||||
|
||||
* Makefile (MAKE_VERSION): 20160220
|
||||
Merge with NetBSD make, pick up
|
||||
o var.c: add knob to control handling of '$$' in :=
|
||||
|
||||
2016-02-18 Simon J. Gerraty <sjg@bad.crufty.net>
|
||||
|
||||
* Makefile (MAKE_VERSION): 20160218
|
||||
Merge with NetBSD make, pick up
|
||||
o var.c: add .export-literal allows us to fix sys.clean-env.mk
|
||||
post the changes to Var_Subst.
|
||||
Var_Subst now takes flags, and does not consume '$$' in :=
|
||||
|
||||
2016-02-17 Simon J. Gerraty <sjg@bad.crufty.net>
|
||||
|
||||
* Makefile (MAKE_VERSION): 20160217
|
||||
Merge with NetBSD make, pick up
|
||||
o var.c: preserve '$$' in :=
|
||||
o parse.c: add .dinclude for handling included
|
||||
makefile like .depend
|
||||
|
||||
2015-12-20 Simon J. Gerraty <sjg@bad.crufty.net>
|
||||
|
||||
* Makefile (MAKE_VERSION): 20151220
|
||||
|
@ -1,7 +1,7 @@
|
||||
# $Id: Makefile,v 1.49 2015/12/20 22:54:40 sjg Exp $
|
||||
# $Id: Makefile,v 1.55 2016/03/07 22:02:47 sjg Exp $
|
||||
|
||||
# Base version on src date
|
||||
MAKE_VERSION= 20151220
|
||||
MAKE_VERSION= 20160307
|
||||
|
||||
PROG= bmake
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: arch.c,v 1.64 2015/10/11 04:51:24 sjg Exp $ */
|
||||
/* $NetBSD: arch.c,v 1.68 2016/02/18 18:29:14 christos Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1988, 1989, 1990, 1993
|
||||
@ -69,14 +69,14 @@
|
||||
*/
|
||||
|
||||
#ifndef MAKE_NATIVE
|
||||
static char rcsid[] = "$NetBSD: arch.c,v 1.64 2015/10/11 04:51:24 sjg Exp $";
|
||||
static char rcsid[] = "$NetBSD: arch.c,v 1.68 2016/02/18 18:29:14 christos Exp $";
|
||||
#else
|
||||
#include <sys/cdefs.h>
|
||||
#ifndef lint
|
||||
#if 0
|
||||
static char sccsid[] = "@(#)arch.c 8.2 (Berkeley) 1/2/94";
|
||||
#else
|
||||
__RCSID("$NetBSD: arch.c,v 1.64 2015/10/11 04:51:24 sjg Exp $");
|
||||
__RCSID("$NetBSD: arch.c,v 1.68 2016/02/18 18:29:14 christos Exp $");
|
||||
#endif
|
||||
#endif /* not lint */
|
||||
#endif
|
||||
@ -136,7 +136,6 @@ __RCSID("$NetBSD: arch.c,v 1.64 2015/10/11 04:51:24 sjg Exp $");
|
||||
#include <sys/stat.h>
|
||||
#include <sys/time.h>
|
||||
#include <sys/param.h>
|
||||
#include <ctype.h>
|
||||
#ifdef HAVE_AR_H
|
||||
#include <ar.h>
|
||||
#else
|
||||
@ -156,7 +155,6 @@ struct ar_hdr {
|
||||
#if defined(HAVE_RANLIB_H) && !(defined(__ELF__) || defined(NO_RANLIB))
|
||||
#include <ranlib.h>
|
||||
#endif
|
||||
#include <fcntl.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#ifdef HAVE_UTIME_H
|
||||
@ -254,8 +252,7 @@ ArchFree(void *ap)
|
||||
free(Hash_GetValue(entry));
|
||||
|
||||
free(a->name);
|
||||
if (a->fnametab)
|
||||
free(a->fnametab);
|
||||
free(a->fnametab);
|
||||
Hash_DeleteTable(&a->members);
|
||||
free(a);
|
||||
}
|
||||
@ -310,9 +307,10 @@ Arch_ParseArchive(char **linePtr, Lst nodeLst, GNode *ctxt)
|
||||
void *freeIt;
|
||||
char *result;
|
||||
|
||||
result = Var_Parse(cp, ctxt, TRUE, TRUE, &length, &freeIt);
|
||||
if (freeIt)
|
||||
free(freeIt);
|
||||
result = Var_Parse(cp, ctxt, VARF_UNDEFERR|VARF_WANTRES,
|
||||
&length, &freeIt);
|
||||
free(freeIt);
|
||||
|
||||
if (result == var_Error) {
|
||||
return(FAILURE);
|
||||
} else {
|
||||
@ -325,7 +323,7 @@ Arch_ParseArchive(char **linePtr, Lst nodeLst, GNode *ctxt)
|
||||
|
||||
*cp++ = '\0';
|
||||
if (subLibName) {
|
||||
libName = Var_Subst(NULL, libName, ctxt, TRUE, TRUE);
|
||||
libName = Var_Subst(NULL, libName, ctxt, VARF_UNDEFERR|VARF_WANTRES);
|
||||
}
|
||||
|
||||
|
||||
@ -351,9 +349,10 @@ Arch_ParseArchive(char **linePtr, Lst nodeLst, GNode *ctxt)
|
||||
void *freeIt;
|
||||
char *result;
|
||||
|
||||
result = Var_Parse(cp, ctxt, TRUE, TRUE, &length, &freeIt);
|
||||
if (freeIt)
|
||||
free(freeIt);
|
||||
result = Var_Parse(cp, ctxt, VARF_UNDEFERR|VARF_WANTRES,
|
||||
&length, &freeIt);
|
||||
free(freeIt);
|
||||
|
||||
if (result == var_Error) {
|
||||
return(FAILURE);
|
||||
} else {
|
||||
@ -404,7 +403,8 @@ Arch_ParseArchive(char **linePtr, Lst nodeLst, GNode *ctxt)
|
||||
char *oldMemName = memName;
|
||||
size_t sz;
|
||||
|
||||
memName = Var_Subst(NULL, memName, ctxt, TRUE, TRUE);
|
||||
memName = Var_Subst(NULL, memName, ctxt,
|
||||
VARF_UNDEFERR|VARF_WANTRES);
|
||||
|
||||
/*
|
||||
* Now form an archive spec and recurse to deal with nested
|
||||
@ -759,8 +759,7 @@ ArchStatMember(char *archive, char *member, Boolean hash)
|
||||
badarch:
|
||||
fclose(arch);
|
||||
Hash_DeleteTable(&ar->members);
|
||||
if (ar->fnametab)
|
||||
free(ar->fnametab);
|
||||
free(ar->fnametab);
|
||||
free(ar);
|
||||
return NULL;
|
||||
}
|
||||
@ -1045,10 +1044,10 @@ Arch_Touch(GNode *gn)
|
||||
arch = ArchFindMember(Var_Value(ARCHIVE, gn, &p1),
|
||||
Var_Value(MEMBER, gn, &p2),
|
||||
&arh, "r+");
|
||||
if (p1)
|
||||
free(p1);
|
||||
if (p2)
|
||||
free(p2);
|
||||
|
||||
free(p1);
|
||||
free(p2);
|
||||
|
||||
snprintf(arh.AR_DATE, sizeof(arh.AR_DATE), "%-12ld", (long) now);
|
||||
|
||||
if (arch != NULL) {
|
||||
@ -1127,10 +1126,9 @@ Arch_MTime(GNode *gn)
|
||||
arhPtr = ArchStatMember(Var_Value(ARCHIVE, gn, &p1),
|
||||
Var_Value(MEMBER, gn, &p2),
|
||||
TRUE);
|
||||
if (p1)
|
||||
free(p1);
|
||||
if (p2)
|
||||
free(p2);
|
||||
|
||||
free(p1);
|
||||
free(p2);
|
||||
|
||||
if (arhPtr != NULL) {
|
||||
modTime = (time_t)strtol(arhPtr->AR_DATE, NULL, 10);
|
||||
|
@ -1,4 +1,4 @@
|
||||
.\" $NetBSD: make.1,v 1.249 2015/06/05 07:33:40 wiz Exp $
|
||||
.\" $NetBSD: make.1,v 1.254 2016/02/20 01:43:28 wiz 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 June 4, 2015
|
||||
.Dd February 19, 2016
|
||||
.Dt MAKE 1
|
||||
.Os
|
||||
.Sh NAME
|
||||
@ -293,7 +293,7 @@ then
|
||||
will search for the specified file or directory named in the remaining part
|
||||
of the argument string.
|
||||
The search starts with the current directory of
|
||||
the Makefile and then works upward towards the root of the filesystem.
|
||||
the Makefile and then works upward towards the root of the file system.
|
||||
If the search is successful, then the resulting directory replaces the
|
||||
.Qq \&.../
|
||||
specification in the
|
||||
@ -868,7 +868,7 @@ This can be overridden by setting
|
||||
.Va bf
|
||||
to a value which represents True.
|
||||
.It Pa env
|
||||
For debugging, it can be useful to inlcude the environment
|
||||
For debugging, it can be useful to include the environment
|
||||
in the .meta file.
|
||||
.It Pa verbose
|
||||
If in "meta" mode, print a clue about the target being built.
|
||||
@ -918,7 +918,7 @@ The default value is:
|
||||
This variable is used to record the names of variables assigned to
|
||||
on the command line, so that they may be exported as part of
|
||||
.Ql Ev MAKEFLAGS .
|
||||
This behaviour can be disabled by assigning an empty value to
|
||||
This behavior can be disabled by assigning an empty value to
|
||||
.Ql Va .MAKEOVERRIDES
|
||||
within a makefile.
|
||||
Extra variables can be exported from a makefile
|
||||
@ -941,6 +941,19 @@ The process-id of
|
||||
.It Va .MAKE.PPID
|
||||
The parent process-id of
|
||||
.Nm .
|
||||
.It Va .MAKE.SAVE_DOLLARS
|
||||
value should be a boolean that controls whether
|
||||
.Ql $$
|
||||
are preserved when doing
|
||||
.Ql :=
|
||||
assignments.
|
||||
The default is false, for backwards compatibility.
|
||||
Set to true for compatability with other makes.
|
||||
If set to false,
|
||||
.Ql $$
|
||||
becomes
|
||||
.Ql $
|
||||
per normal evaluation rules.
|
||||
.It Va MAKE_PRINT_VAR_ON_ERROR
|
||||
When
|
||||
.Nm
|
||||
@ -1044,7 +1057,7 @@ sets
|
||||
to the value of
|
||||
.Ql Ev PWD
|
||||
instead.
|
||||
This behaviour is disabled if
|
||||
This behavior is disabled if
|
||||
.Ql Ev MAKEOBJDIRPREFIX
|
||||
is set or
|
||||
.Ql Ev MAKEOBJDIR
|
||||
@ -1114,7 +1127,7 @@ The wildcard 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
|
||||
.Dl ${VAR:M*}
|
||||
will normalise the inter-word spacing, removing all leading and
|
||||
will normalize the inter-word spacing, removing all leading and
|
||||
trailing space, and converting multiple consecutive spaces
|
||||
to single spaces.
|
||||
.
|
||||
@ -1134,7 +1147,7 @@ Randomize words in variable.
|
||||
The results will be different each time you are referring to the
|
||||
modified variable; use the assignment with expansion
|
||||
.Pq Ql Cm \&:=
|
||||
to prevent such behaviour.
|
||||
to prevent such behavior.
|
||||
For example,
|
||||
.Bd -literal -offset indent
|
||||
LIST= uno due tre quattro
|
||||
@ -1166,7 +1179,7 @@ The value is a format string for
|
||||
using the current
|
||||
.Xr gmtime 3 .
|
||||
.It Cm \&:hash
|
||||
Compute a 32bit hash of the value and encode it as hex digits.
|
||||
Compute a 32-bit hash of the value and encode it as hex digits.
|
||||
.It Cm \&:localtime
|
||||
The value is a format string for
|
||||
.Xr strftime 3 ,
|
||||
@ -1444,7 +1457,7 @@ value is divided into words.
|
||||
.Pp
|
||||
Ordinarily, a value is treated as a sequence of words
|
||||
delimited by white space.
|
||||
Some modifiers suppress this behaviour,
|
||||
Some modifiers suppress this behavior,
|
||||
causing a value to be treated as a single word
|
||||
(possibly containing embedded white space).
|
||||
An empty value, or a value that consists entirely of white-space,
|
||||
@ -1530,12 +1543,20 @@ For compatibility with other versions of
|
||||
.Nm
|
||||
.Ql include file ...
|
||||
is also accepted.
|
||||
.Pp
|
||||
If the include statement is written as
|
||||
.Cm .-include
|
||||
or as
|
||||
.Cm .sinclude
|
||||
then errors locating and/or opening include files are ignored.
|
||||
.Pp
|
||||
If the include statement is written as
|
||||
.Cm .dinclude
|
||||
not only are errors locating and/or opening include files ignored,
|
||||
but stale dependencies within the included file will be ignored
|
||||
just like
|
||||
.Va .MAKE.DEPENDFILE .
|
||||
.Pp
|
||||
Conditional expressions are also preceded by a single dot as the first
|
||||
character of a line.
|
||||
The possible conditionals are as follows:
|
||||
@ -1571,6 +1592,10 @@ This allows exporting a value to the environment which is different from that
|
||||
used by
|
||||
.Nm
|
||||
internally.
|
||||
.It Ic .export-literal Ar variable ...
|
||||
The same as
|
||||
.Ql .export-env ,
|
||||
except that variables in the value are not expanded.
|
||||
.It Ic .info Ar message
|
||||
The message is printed along with the name of the makefile and line number.
|
||||
.It Ic .undef Ar variable
|
||||
@ -2068,7 +2093,7 @@ The sources are a set of
|
||||
pairs.
|
||||
.Bl -tag -width hasErrCtls
|
||||
.It Ar name
|
||||
This is the minimal specification, used to select one of the builtin
|
||||
This is the minimal specification, used to select one of the built-in
|
||||
shell specs;
|
||||
.Ar sh ,
|
||||
.Ar ksh ,
|
||||
|
@ -178,11 +178,11 @@ DDEESSCCRRIIPPTTIIOONN
|
||||
then bbmmaakkee will search for the specified file or directory named
|
||||
in the remaining part of the argument string. The search starts
|
||||
with the current directory of the Makefile and then works upward
|
||||
towards the root of the filesystem. If the search is successful,
|
||||
then the resulting directory replaces the ".../" specification in
|
||||
the --mm argument. If used, this feature allows bbmmaakkee to easily
|
||||
search in the current source tree for customized sys.mk files
|
||||
(e.g., by using ".../mk/sys.mk" as an argument).
|
||||
towards the root of the file system. If the search is success-
|
||||
ful, then the resulting directory replaces the ".../" specifica-
|
||||
tion in the --mm argument. If used, this feature allows bbmmaakkee to
|
||||
easily search in the current source tree for customized sys.mk
|
||||
files (e.g., by using ".../mk/sys.mk" as an argument).
|
||||
|
||||
--nn Display the commands that would have been executed, but do not
|
||||
actually execute them unless the target depends on the .MAKE spe-
|
||||
@ -543,7 +543,7 @@ VVAARRIIAABBLLEE AASSSSIIGGNNMMEENNTTSS
|
||||
in `_._C_U_R_D_I_R'. This can be overridden by set-
|
||||
ting _b_f to a value which represents True.
|
||||
|
||||
_e_n_v For debugging, it can be useful to inlcude
|
||||
_e_n_v For debugging, it can be useful to include
|
||||
the environment in the .meta file.
|
||||
|
||||
_v_e_r_b_o_s_e If in "meta" mode, print a clue about the
|
||||
@ -591,7 +591,7 @@ VVAARRIIAABBLLEE AASSSSIIGGNNMMEENNTTSS
|
||||
|
||||
_._M_A_K_E_O_V_E_R_R_I_D_E_S This variable is used to record the names of variables
|
||||
assigned to on the command line, so that they may be
|
||||
exported as part of `MAKEFLAGS'. This behaviour can be
|
||||
exported as part of `MAKEFLAGS'. This behavior can be
|
||||
disabled by assigning an empty value to `_._M_A_K_E_O_V_E_R_R_I_D_E_S'
|
||||
within a makefile. Extra variables can be exported from
|
||||
a makefile by appending their names to `_._M_A_K_E_O_V_E_R_R_I_D_E_S'.
|
||||
@ -607,6 +607,13 @@ VVAARRIIAABBLLEE AASSSSIIGGNNMMEENNTTSS
|
||||
|
||||
_._M_A_K_E_._P_P_I_D The parent process-id of bbmmaakkee.
|
||||
|
||||
_._M_A_K_E_._S_A_V_E___D_O_L_L_A_R_S
|
||||
value should be a boolean that controls whether `$$' are
|
||||
preserved when doing `:=' assignments. The default is
|
||||
false, for backwards compatibility. Set to true for com-
|
||||
patability with other makes. If set to false, `$$'
|
||||
becomes `$' per normal evaluation rules.
|
||||
|
||||
_M_A_K_E___P_R_I_N_T___V_A_R___O_N___E_R_R_O_R
|
||||
When bbmmaakkee stops due to an error, it prints its name and
|
||||
the value of `_._C_U_R_D_I_R' as well as the value of any vari-
|
||||
@ -670,7 +677,7 @@ VVAARRIIAABBLLEE AASSSSIIGGNNMMEENNTTSS
|
||||
sets `_._C_U_R_D_I_R' to the canonical path given by getcwd(3).
|
||||
However, if the environment variable `PWD' is set and
|
||||
gives a path to the current directory, then bbmmaakkee sets
|
||||
`_._C_U_R_D_I_R' to the value of `PWD' instead. This behaviour
|
||||
`_._C_U_R_D_I_R' to the value of `PWD' instead. This behavior
|
||||
is disabled if `MAKEOBJDIRPREFIX' is set or `MAKEOBJDIR'
|
||||
contains a variable transform. `PWD' is set to the value
|
||||
of `_._O_B_J_D_I_R' for all programs which bbmmaakkee executes.
|
||||
@ -717,7 +724,7 @@ VVAARRIIAABBLLEE AASSSSIIGGNNMMEENNTTSS
|
||||
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
|
||||
will normalize the inter-word spacing, removing all leading and
|
||||
trailing space, and converting multiple consecutive spaces to single
|
||||
spaces.
|
||||
|
||||
@ -730,7 +737,7 @@ VVAARRIIAABBLLEE AASSSSIIGGNNMMEENNTTSS
|
||||
|
||||
::OOxx Randomize words in variable. The results will be different each
|
||||
time you are referring to the modified variable; use the assignment
|
||||
with expansion (`::==') to prevent such behaviour. For example,
|
||||
with expansion (`::==') to prevent such behavior. For example,
|
||||
|
||||
LIST= uno due tre quattro
|
||||
RANDOM_LIST= ${LIST:Ox}
|
||||
@ -758,7 +765,7 @@ VVAARRIIAABBLLEE AASSSSIIGGNNMMEENNTTSS
|
||||
gmtime(3).
|
||||
|
||||
::hhaasshh
|
||||
Compute a 32bit hash of the value and encode it as hex digits.
|
||||
Compute a 32-bit hash of the value and encode it as hex digits.
|
||||
|
||||
::llooccaallttiimmee
|
||||
The value is a format string for strftime(3), using the current
|
||||
@ -914,13 +921,13 @@ VVAARRIIAABBLLEE AASSSSIIGGNNMMEENNTTSS
|
||||
tions related to the way in which the value is divided into words.
|
||||
|
||||
Ordinarily, a value is treated as a sequence of words delimited by
|
||||
white space. Some modifiers suppress this behaviour, causing a
|
||||
value to be treated as a single word (possibly containing embedded
|
||||
white space). An empty value, or a value that consists entirely of
|
||||
white-space, is treated as a single word. For the purposes of the
|
||||
`::[[]]' modifier, the words are indexed both forwards using positive
|
||||
integers (where index 1 represents the first word), and backwards
|
||||
using negative integers (where index -1 represents the last word).
|
||||
white space. Some modifiers suppress this behavior, causing a value
|
||||
to be treated as a single word (possibly containing embedded white
|
||||
space). An empty value, or a value that consists entirely of white-
|
||||
space, is treated as a single word. For the purposes of the `::[[]]'
|
||||
modifier, the words are indexed both forwards using positive inte-
|
||||
gers (where index 1 represents the first word), and backwards using
|
||||
negative integers (where index -1 represents the last word).
|
||||
|
||||
The _r_a_n_g_e is subjected to variable expansion, and the expanded
|
||||
result is then interpreted as follows:
|
||||
@ -957,8 +964,14 @@ IINNCCLLUUDDEE SSTTAATTEEMMEENNTTSS,, CCOONNDDIITTIIOO
|
||||
used, the including makefile's directory and any directories specified
|
||||
using the --II option are searched before the system makefile directory.
|
||||
For compatibility with other versions of bbmmaakkee `include file ...' is also
|
||||
accepted. If the include statement is written as ..--iinncclluuddee or as
|
||||
..ssiinncclluuddee then errors locating and/or opening include files are ignored.
|
||||
accepted.
|
||||
|
||||
If the include statement is written as ..--iinncclluuddee or as ..ssiinncclluuddee then
|
||||
errors locating and/or opening include files are ignored.
|
||||
|
||||
If the include statement is written as ..ddiinncclluuddee not only are errors
|
||||
locating and/or opening include files ignored, but stale dependencies
|
||||
within the included file will be ignored just like _._M_A_K_E_._D_E_P_E_N_D_F_I_L_E.
|
||||
|
||||
Conditional expressions are also preceded by a single dot as the first
|
||||
character of a line. The possible conditionals are as follows:
|
||||
@ -982,6 +995,10 @@ IINNCCLLUUDDEE SSTTAATTEEMMEENNTTSS,, CCOONNDDIITTIIOO
|
||||
to _._M_A_K_E_._E_X_P_O_R_T_E_D. This allows exporting a value to the environ-
|
||||
ment which is different from that used by bbmmaakkee internally.
|
||||
|
||||
..eexxppoorrtt--lliitteerraall _v_a_r_i_a_b_l_e _._._.
|
||||
The same as `.export-env', except that variables in the value are
|
||||
not expanded.
|
||||
|
||||
..iinnffoo _m_e_s_s_a_g_e
|
||||
The message is printed along with the name of the makefile and
|
||||
line number.
|
||||
@ -1307,7 +1324,7 @@ SSPPEECCIIAALL TTAARRGGEETTSS
|
||||
sources are a set of _f_i_e_l_d_=_v_a_l_u_e pairs.
|
||||
|
||||
_n_a_m_e This is the minimal specification, used to select
|
||||
one of the builtin shell specs; _s_h, _k_s_h, and _c_s_h.
|
||||
one of the built-in shell specs; _s_h, _k_s_h, and _c_s_h.
|
||||
|
||||
_p_a_t_h Specifies the path to the shell.
|
||||
|
||||
@ -1452,4 +1469,4 @@ BBUUGGSS
|
||||
|
||||
There is no way of escaping a space character in a filename.
|
||||
|
||||
NetBSD 5.1 June 4, 2015 NetBSD 5.1
|
||||
NetBSD 5.1 February 19, 2016 NetBSD 5.1
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: compat.c,v 1.101 2015/10/11 04:51:24 sjg Exp $ */
|
||||
/* $NetBSD: compat.c,v 1.104 2016/02/18 18:29:14 christos 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.101 2015/10/11 04:51:24 sjg Exp $";
|
||||
static char rcsid[] = "$NetBSD: compat.c,v 1.104 2016/02/18 18:29:14 christos 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.101 2015/10/11 04:51:24 sjg Exp $");
|
||||
__RCSID("$NetBSD: compat.c,v 1.104 2016/02/18 18:29:14 christos Exp $");
|
||||
#endif
|
||||
#endif /* not lint */
|
||||
#endif
|
||||
@ -146,8 +146,8 @@ CompatInterrupt(int signo)
|
||||
if (!noExecute && eunlink(file) != -1) {
|
||||
Error("*** %s removed", file);
|
||||
}
|
||||
if (p1)
|
||||
free(p1);
|
||||
|
||||
free(p1);
|
||||
|
||||
/*
|
||||
* Run .INTERRUPT only if hit with interrupt signal
|
||||
@ -213,7 +213,7 @@ CompatRunCommand(void *cmdp, void *gnp)
|
||||
doIt = FALSE;
|
||||
|
||||
cmdNode = Lst_Member(gn->commands, cmd);
|
||||
cmdStart = Var_Subst(NULL, cmd, gn, FALSE, TRUE);
|
||||
cmdStart = Var_Subst(NULL, cmd, gn, VARF_WANTRES);
|
||||
|
||||
/*
|
||||
* brk_string will return an argv with a NULL in av[0], thus causing
|
||||
@ -374,10 +374,10 @@ CompatRunCommand(void *cmdp, void *gnp)
|
||||
execError("exec", av[0]);
|
||||
_exit(1);
|
||||
}
|
||||
if (mav)
|
||||
free(mav);
|
||||
if (bp)
|
||||
free(bp);
|
||||
|
||||
free(mav);
|
||||
free(bp);
|
||||
|
||||
Lst_Replace(cmdNode, NULL);
|
||||
|
||||
#ifdef USE_META
|
||||
@ -516,8 +516,7 @@ Compat_Make(void *gnp, void *pgnp)
|
||||
if (Lst_Member(gn->iParents, pgn) != NULL) {
|
||||
char *p1;
|
||||
Var_Set(IMPSRC, Var_Value(TARGET, gn, &p1), pgn, 0);
|
||||
if (p1)
|
||||
free(p1);
|
||||
free(p1);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -620,8 +619,7 @@ Compat_Make(void *gnp, void *pgnp)
|
||||
if (Lst_Member(gn->iParents, pgn) != NULL) {
|
||||
char *p1;
|
||||
Var_Set(IMPSRC, Var_Value(TARGET, gn, &p1), pgn, 0);
|
||||
if (p1)
|
||||
free(p1);
|
||||
free(p1);
|
||||
}
|
||||
switch(gn->made) {
|
||||
case BEINGMADE:
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: cond.c,v 1.71 2015/12/02 00:28:24 sjg Exp $ */
|
||||
/* $NetBSD: cond.c,v 1.74 2016/02/18 18:29:14 christos Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1988, 1989, 1990 The Regents of the University of California.
|
||||
@ -70,14 +70,14 @@
|
||||
*/
|
||||
|
||||
#ifndef MAKE_NATIVE
|
||||
static char rcsid[] = "$NetBSD: cond.c,v 1.71 2015/12/02 00:28:24 sjg Exp $";
|
||||
static char rcsid[] = "$NetBSD: cond.c,v 1.74 2016/02/18 18:29:14 christos Exp $";
|
||||
#else
|
||||
#include <sys/cdefs.h>
|
||||
#ifndef lint
|
||||
#if 0
|
||||
static char sccsid[] = "@(#)cond.c 8.2 (Berkeley) 1/2/94";
|
||||
#else
|
||||
__RCSID("$NetBSD: cond.c,v 1.71 2015/12/02 00:28:24 sjg Exp $");
|
||||
__RCSID("$NetBSD: cond.c,v 1.74 2016/02/18 18:29:14 christos Exp $");
|
||||
#endif
|
||||
#endif /* not lint */
|
||||
#endif
|
||||
@ -289,10 +289,10 @@ CondGetArg(char **linePtr, char **argPtr, const char *func)
|
||||
int len;
|
||||
void *freeIt;
|
||||
|
||||
cp2 = Var_Parse(cp, VAR_CMD, TRUE, TRUE, &len, &freeIt);
|
||||
cp2 = Var_Parse(cp, VAR_CMD, VARF_UNDEFERR|VARF_WANTRES,
|
||||
&len, &freeIt);
|
||||
Buf_AddBytes(&buf, strlen(cp2), cp2);
|
||||
if (freeIt)
|
||||
free(freeIt);
|
||||
free(freeIt);
|
||||
cp += len;
|
||||
continue;
|
||||
}
|
||||
@ -346,8 +346,8 @@ CondDoDefined(int argLen MAKE_ATTR_UNUSED, const char *arg)
|
||||
} else {
|
||||
result = FALSE;
|
||||
}
|
||||
if (p1)
|
||||
free(p1);
|
||||
|
||||
free(p1);
|
||||
return (result);
|
||||
}
|
||||
|
||||
@ -574,8 +574,9 @@ CondGetString(Boolean doEval, Boolean *quoted, void **freeIt, Boolean strictLHS)
|
||||
break;
|
||||
case '$':
|
||||
/* if we are in quotes, then an undefined variable is ok */
|
||||
str = Var_Parse(condExpr, VAR_CMD, (qt ? 0 : doEval),
|
||||
TRUE, &len, freeIt);
|
||||
str = Var_Parse(condExpr, VAR_CMD,
|
||||
((!qt && doEval) ? VARF_UNDEFERR : 0) |
|
||||
VARF_WANTRES, &len, freeIt);
|
||||
if (str == var_Error) {
|
||||
if (*freeIt) {
|
||||
free(*freeIt);
|
||||
@ -805,10 +806,8 @@ compare_expression(Boolean doEval)
|
||||
}
|
||||
|
||||
done:
|
||||
if (lhsFree)
|
||||
free(lhsFree);
|
||||
if (rhsFree)
|
||||
free(rhsFree);
|
||||
free(lhsFree);
|
||||
free(rhsFree);
|
||||
return t;
|
||||
}
|
||||
|
||||
@ -827,7 +826,7 @@ get_mpt_arg(char **linePtr, char **argPtr, const char *func MAKE_ATTR_UNUSED)
|
||||
/* We do all the work here and return the result as the length */
|
||||
*argPtr = NULL;
|
||||
|
||||
val = Var_Parse(cp - 1, VAR_CMD, FALSE, TRUE, &length, &freeIt);
|
||||
val = Var_Parse(cp - 1, VAR_CMD, VARF_WANTRES, &length, &freeIt);
|
||||
/*
|
||||
* Advance *linePtr to beyond the closing ). Note that
|
||||
* we subtract one because 'length' is calculated from 'cp - 1'.
|
||||
@ -848,8 +847,7 @@ get_mpt_arg(char **linePtr, char **argPtr, const char *func MAKE_ATTR_UNUSED)
|
||||
* true/false here.
|
||||
*/
|
||||
length = *val ? 2 : 1;
|
||||
if (freeIt)
|
||||
free(freeIt);
|
||||
free(freeIt);
|
||||
return length;
|
||||
}
|
||||
|
||||
@ -900,8 +898,7 @@ compare_function(Boolean doEval)
|
||||
}
|
||||
/* Evaluate the argument using the required function. */
|
||||
t = !doEval || fn_def->fn_proc(arglen, arg);
|
||||
if (arg)
|
||||
free(arg);
|
||||
free(arg);
|
||||
condExpr = cp;
|
||||
return t;
|
||||
}
|
||||
@ -933,8 +930,7 @@ compare_function(Boolean doEval)
|
||||
* be empty - even if it contained a variable expansion.
|
||||
*/
|
||||
t = !doEval || if_info->defProc(arglen, arg) != if_info->doNot;
|
||||
if (arg)
|
||||
free(arg);
|
||||
free(arg);
|
||||
return t;
|
||||
}
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: dirname.c,v 1.11 2009/11/24 13:34:20 tnozaki Exp $ */
|
||||
/* $NetBSD: dirname.c,v 1.13 2014/07/16 10:52:26 christos Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 1997, 2002 The NetBSD Foundation, Inc.
|
||||
@ -35,7 +35,10 @@
|
||||
#ifndef HAVE_DIRNAME
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
|
||||
#include <sys/param.h>
|
||||
#ifdef HAVE_LIBGEN_H
|
||||
#include <libgen.h>
|
||||
#endif
|
||||
#ifdef HAVE_LIMITS_H
|
||||
#include <limits.h>
|
||||
#endif
|
||||
@ -45,51 +48,73 @@
|
||||
#ifndef PATH_MAX
|
||||
# define PATH_MAX 1024
|
||||
#endif
|
||||
#ifndef MIN
|
||||
# define MIN(a, b) ((a < b) ? a : b)
|
||||
#endif
|
||||
|
||||
char *
|
||||
dirname(char *path)
|
||||
|
||||
static size_t
|
||||
xdirname_r(const char *path, char *buf, size_t buflen)
|
||||
{
|
||||
static char result[PATH_MAX];
|
||||
const char *lastp;
|
||||
const char *endp;
|
||||
size_t len;
|
||||
|
||||
/*
|
||||
* If `path' is a null pointer or points to an empty string,
|
||||
* return a pointer to the string ".".
|
||||
*/
|
||||
if ((path == NULL) || (*path == '\0'))
|
||||
goto singledot;
|
||||
|
||||
if (path == NULL || *path == '\0') {
|
||||
path = ".";
|
||||
len = 1;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* Strip trailing slashes, if any. */
|
||||
lastp = path + strlen(path) - 1;
|
||||
while (lastp != path && *lastp == '/')
|
||||
lastp--;
|
||||
endp = path + strlen(path) - 1;
|
||||
while (endp != path && *endp == '/')
|
||||
endp--;
|
||||
|
||||
/* Terminate path at the last occurence of '/'. */
|
||||
do {
|
||||
if (*lastp == '/') {
|
||||
/* Strip trailing slashes, if any. */
|
||||
while (lastp != path && *lastp == '/')
|
||||
lastp--;
|
||||
/* Find the start of the dir */
|
||||
while (endp > path && *endp != '/')
|
||||
endp--;
|
||||
|
||||
/* ...and copy the result into the result buffer. */
|
||||
len = (lastp - path) + 1 /* last char */;
|
||||
if (len > (PATH_MAX - 1))
|
||||
len = PATH_MAX - 1;
|
||||
if (endp == path) {
|
||||
path = *endp == '/' ? "/" : ".";
|
||||
len = 1;
|
||||
goto out;
|
||||
}
|
||||
|
||||
memcpy(result, path, len);
|
||||
result[len] = '\0';
|
||||
do
|
||||
endp--;
|
||||
while (endp > path && *endp == '/');
|
||||
|
||||
return (result);
|
||||
}
|
||||
} while (--lastp >= path);
|
||||
len = endp - path + 1;
|
||||
out:
|
||||
if (buf != NULL && buflen != 0) {
|
||||
buflen = MIN(len, buflen - 1);
|
||||
memcpy(buf, path, buflen);
|
||||
buf[buflen] = '\0';
|
||||
}
|
||||
return len;
|
||||
}
|
||||
|
||||
/* No /'s found, return a pointer to the string ".". */
|
||||
singledot:
|
||||
result[0] = '.';
|
||||
result[1] = '\0';
|
||||
char *
|
||||
dirname(char *path)
|
||||
{
|
||||
static char result[PATH_MAX];
|
||||
(void)xdirname_r(path, result, sizeof(result));
|
||||
return result;
|
||||
}
|
||||
|
||||
return (result);
|
||||
#ifdef MAIN
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
|
||||
int
|
||||
main(int argc, char *argv[])
|
||||
{
|
||||
printf("%s\n", dirname(argv[1]));
|
||||
exit(0);
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: for.c,v 1.50 2015/10/11 04:51:24 sjg Exp $ */
|
||||
/* $NetBSD: for.c,v 1.52 2016/02/18 18:29:14 christos Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1992, The Regents of the University of California.
|
||||
@ -30,14 +30,14 @@
|
||||
*/
|
||||
|
||||
#ifndef MAKE_NATIVE
|
||||
static char rcsid[] = "$NetBSD: for.c,v 1.50 2015/10/11 04:51:24 sjg Exp $";
|
||||
static char rcsid[] = "$NetBSD: for.c,v 1.52 2016/02/18 18:29:14 christos Exp $";
|
||||
#else
|
||||
#include <sys/cdefs.h>
|
||||
#ifndef lint
|
||||
#if 0
|
||||
static char sccsid[] = "@(#)for.c 8.1 (Berkeley) 6/6/93";
|
||||
#else
|
||||
__RCSID("$NetBSD: for.c,v 1.50 2015/10/11 04:51:24 sjg Exp $");
|
||||
__RCSID("$NetBSD: for.c,v 1.52 2016/02/18 18:29:14 christos Exp $");
|
||||
#endif
|
||||
#endif /* not lint */
|
||||
#endif
|
||||
@ -216,7 +216,7 @@ For_Eval(char *line)
|
||||
* We can't do the escapes here - because we don't know whether
|
||||
* we are substuting into ${...} or $(...).
|
||||
*/
|
||||
sub = Var_Subst(NULL, ptr, VAR_GLOBAL, FALSE, TRUE);
|
||||
sub = Var_Subst(NULL, ptr, VAR_GLOBAL, VARF_WANTRES);
|
||||
|
||||
/*
|
||||
* Split into words allowing for quoted strings.
|
||||
|
@ -1,3 +1,5 @@
|
||||
/* $NetBSD: getopt.c,v 1.29 2014/06/05 22:00:22 christos Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1987, 1993, 1994
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
@ -10,11 +12,7 @@
|
||||
* 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.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by the University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* 3. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
@ -35,11 +33,7 @@
|
||||
# include "config.h"
|
||||
#endif
|
||||
#if !defined(HAVE_GETOPT) || defined(WANT_GETOPT_LONG) || defined(BROKEN_GETOPT)
|
||||
|
||||
#if defined(LIBC_SCCS) && !defined(lint)
|
||||
/* static char sccsid[] = "from: @(#)getopt.c 8.2 (Berkeley) 4/2/94"; */
|
||||
static char *rcsid = "$Id: getopt.c,v 1.3 1999/01/08 02:14:18 sjg Exp $";
|
||||
#endif /* LIBC_SCCS and not lint */
|
||||
#include <sys/cdefs.h>
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
@ -61,13 +55,10 @@ char *optarg; /* argument associated with option */
|
||||
* Parse argc/argv argument vector.
|
||||
*/
|
||||
int
|
||||
getopt(nargc, nargv, ostr)
|
||||
int nargc;
|
||||
char * const *nargv;
|
||||
const char *ostr;
|
||||
getopt(int nargc, char * const nargv[], const char *ostr)
|
||||
{
|
||||
extern char *__progname;
|
||||
static char *place = EMSG; /* option letter processing */
|
||||
static const char *place = EMSG; /* option letter processing */
|
||||
char *oli; /* option letter list index */
|
||||
|
||||
#ifndef BSD4_4
|
||||
@ -79,43 +70,63 @@ getopt(nargc, nargv, ostr)
|
||||
}
|
||||
#endif
|
||||
|
||||
if (optreset || !*place) { /* update scanning pointer */
|
||||
if (optreset || *place == 0) { /* update scanning pointer */
|
||||
optreset = 0;
|
||||
if (optind >= nargc || *(place = nargv[optind]) != '-') {
|
||||
place = nargv[optind];
|
||||
if (optind >= nargc || *place++ != '-') {
|
||||
/* Argument is absent or is not an option */
|
||||
place = EMSG;
|
||||
return (-1);
|
||||
}
|
||||
if (place[1] && *++place == '-' /* found "--" */
|
||||
&& !place[1]) { /* and not "--foo" */
|
||||
optopt = *place++;
|
||||
if (optopt == '-' && *place == 0) {
|
||||
/* "--" => end of options */
|
||||
++optind;
|
||||
place = EMSG;
|
||||
return (-1);
|
||||
}
|
||||
} /* option letter okay? */
|
||||
if ((optopt = (int)*place++) == (int)':' ||
|
||||
!(oli = strchr(ostr, optopt))) {
|
||||
/*
|
||||
* if the user didn't specify '-' as an option,
|
||||
* assume it means -1.
|
||||
*/
|
||||
if (optopt == (int)'-')
|
||||
return (-1);
|
||||
if (!*place)
|
||||
if (optopt == 0) {
|
||||
/* Solitary '-', treat as a '-' option
|
||||
if the program (eg su) is looking for it. */
|
||||
place = EMSG;
|
||||
if (strchr(ostr, '-') == NULL)
|
||||
return -1;
|
||||
optopt = '-';
|
||||
}
|
||||
} else
|
||||
optopt = *place++;
|
||||
|
||||
/* See if option letter is one the caller wanted... */
|
||||
if (optopt == ':' || (oli = strchr(ostr, optopt)) == NULL) {
|
||||
if (*place == 0)
|
||||
++optind;
|
||||
if (opterr && *ostr != ':')
|
||||
(void)fprintf(stderr,
|
||||
"%s: illegal option -- %c\n", __progname, optopt);
|
||||
"%s: unknown option -- %c\n", __progname, optopt);
|
||||
return (BADCH);
|
||||
}
|
||||
if (*++oli != ':') { /* don't need argument */
|
||||
|
||||
/* Does this option need an argument? */
|
||||
if (oli[1] != ':') {
|
||||
/* don't need argument */
|
||||
optarg = NULL;
|
||||
if (!*place)
|
||||
if (*place == 0)
|
||||
++optind;
|
||||
}
|
||||
else { /* need an argument */
|
||||
if (*place) /* no white space */
|
||||
optarg = place;
|
||||
else if (nargc <= ++optind) { /* no arg */
|
||||
} else {
|
||||
/* Option-argument is either the rest of this argument or the
|
||||
entire next argument. */
|
||||
if (*place)
|
||||
optarg = __UNCONST(place);
|
||||
else if (oli[2] == ':')
|
||||
/*
|
||||
* GNU Extension, for optional arguments if the rest of
|
||||
* the argument is empty, we return NULL
|
||||
*/
|
||||
optarg = NULL;
|
||||
else if (nargc > ++optind)
|
||||
optarg = nargv[optind];
|
||||
else {
|
||||
/* option-argument absent */
|
||||
place = EMSG;
|
||||
if (*ostr == ':')
|
||||
return (BADARG);
|
||||
@ -125,12 +136,10 @@ getopt(nargc, nargv, ostr)
|
||||
__progname, optopt);
|
||||
return (BADCH);
|
||||
}
|
||||
else /* white space */
|
||||
optarg = nargv[optind];
|
||||
place = EMSG;
|
||||
++optind;
|
||||
}
|
||||
return (optopt); /* dump back option letter */
|
||||
return (optopt); /* return option letter */
|
||||
}
|
||||
#endif
|
||||
#ifdef MAIN
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: job.c,v 1.181 2015/10/11 04:51:24 sjg Exp $ */
|
||||
/* $NetBSD: job.c,v 1.186 2016/02/18 18:29:14 christos Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1988, 1989, 1990 The Regents of the University of California.
|
||||
@ -70,14 +70,14 @@
|
||||
*/
|
||||
|
||||
#ifndef MAKE_NATIVE
|
||||
static char rcsid[] = "$NetBSD: job.c,v 1.181 2015/10/11 04:51:24 sjg Exp $";
|
||||
static char rcsid[] = "$NetBSD: job.c,v 1.186 2016/02/18 18:29:14 christos Exp $";
|
||||
#else
|
||||
#include <sys/cdefs.h>
|
||||
#ifndef lint
|
||||
#if 0
|
||||
static char sccsid[] = "@(#)job.c 8.2 (Berkeley) 3/19/94";
|
||||
#else
|
||||
__RCSID("$NetBSD: job.c,v 1.181 2015/10/11 04:51:24 sjg Exp $");
|
||||
__RCSID("$NetBSD: job.c,v 1.186 2016/02/18 18:29:14 christos Exp $");
|
||||
#endif
|
||||
#endif /* not lint */
|
||||
#endif
|
||||
@ -144,7 +144,6 @@ __RCSID("$NetBSD: job.c,v 1.181 2015/10/11 04:51:24 sjg Exp $");
|
||||
|
||||
#include <assert.h>
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#if !defined(USE_SELECT) && defined(HAVE_POLL_H)
|
||||
#include <poll.h>
|
||||
#else
|
||||
@ -441,8 +440,8 @@ JobCreatePipe(Job *job, int minfd)
|
||||
}
|
||||
|
||||
/* Set close-on-exec flag for both */
|
||||
(void)fcntl(job->jobPipe[0], F_SETFD, 1);
|
||||
(void)fcntl(job->jobPipe[1], F_SETFD, 1);
|
||||
(void)fcntl(job->jobPipe[0], F_SETFD, FD_CLOEXEC);
|
||||
(void)fcntl(job->jobPipe[1], F_SETFD, FD_CLOEXEC);
|
||||
|
||||
/*
|
||||
* We mark the input side of the pipe non-blocking; we poll(2) the
|
||||
@ -731,7 +730,7 @@ JobPrintCommand(void *cmdp, void *jobp)
|
||||
|
||||
numCommands += 1;
|
||||
|
||||
cmdStart = cmd = Var_Subst(NULL, cmd, job->node, FALSE, TRUE);
|
||||
cmdStart = cmd = Var_Subst(NULL, cmd, job->node, VARF_WANTRES);
|
||||
|
||||
cmdTemplate = "%s\n";
|
||||
|
||||
@ -882,8 +881,7 @@ JobPrintCommand(void *cmdp, void *jobp)
|
||||
|
||||
DBPRINTF(cmdTemplate, cmd);
|
||||
free(cmdStart);
|
||||
if (escCmd)
|
||||
free(escCmd);
|
||||
free(escCmd);
|
||||
if (errOff) {
|
||||
/*
|
||||
* If echoing is already off, there's no point in issuing the
|
||||
@ -919,7 +917,7 @@ JobPrintCommand(void *cmdp, void *jobp)
|
||||
static int
|
||||
JobSaveCommand(void *cmd, void *gn)
|
||||
{
|
||||
cmd = Var_Subst(NULL, (char *)cmd, (GNode *)gn, FALSE, TRUE);
|
||||
cmd = Var_Subst(NULL, (char *)cmd, (GNode *)gn, VARF_WANTRES);
|
||||
(void)Lst_AtEnd(postCommands->commands, cmd);
|
||||
return(0);
|
||||
}
|
||||
@ -1250,8 +1248,7 @@ Job_CheckCommands(GNode *gn, void (*abortProc)(const char *, ...))
|
||||
*/
|
||||
Make_HandleUse(DEFAULT, gn);
|
||||
Var_Set(IMPSRC, Var_Value(TARGET, gn, &p1), gn, 0);
|
||||
if (p1)
|
||||
free(p1);
|
||||
free(p1);
|
||||
} else if (Dir_MTime(gn, 0) == 0 && (gn->type & OP_SPECIAL) == 0) {
|
||||
/*
|
||||
* The node wasn't the target of an operator we have no .DEFAULT
|
||||
@ -1615,7 +1612,7 @@ JobStart(GNode *gn, int flags)
|
||||
if (job->cmdFILE == NULL) {
|
||||
Punt("Could not fdopen %s", tfile);
|
||||
}
|
||||
(void)fcntl(FILENO(job->cmdFILE), F_SETFD, 1);
|
||||
(void)fcntl(FILENO(job->cmdFILE), F_SETFD, FD_CLOEXEC);
|
||||
/*
|
||||
* Send the commands to the command file, flush all its buffers then
|
||||
* rewind and remove the thing.
|
||||
@ -2212,7 +2209,7 @@ Job_SetPrefix(void)
|
||||
}
|
||||
|
||||
targPrefix = Var_Subst(NULL, "${" MAKE_JOB_PREFIX "}",
|
||||
VAR_GLOBAL, FALSE, TRUE);
|
||||
VAR_GLOBAL, VARF_WANTRES);
|
||||
}
|
||||
|
||||
/*-
|
||||
@ -2425,8 +2422,7 @@ Job_ParseShell(char *line)
|
||||
line++;
|
||||
}
|
||||
|
||||
if (shellArgv)
|
||||
free(UNCONST(shellArgv));
|
||||
free(UNCONST(shellArgv));
|
||||
|
||||
memset(&newShell, 0, sizeof(newShell));
|
||||
|
||||
@ -2674,8 +2670,7 @@ void
|
||||
Job_End(void)
|
||||
{
|
||||
#ifdef CLEANUP
|
||||
if (shellArgv)
|
||||
free(shellArgv);
|
||||
free(shellArgv);
|
||||
#endif
|
||||
}
|
||||
|
||||
@ -2880,8 +2875,8 @@ Job_ServerStart(int max_tokens, int jp_0, int jp_1)
|
||||
/* Pipe passed in from parent */
|
||||
tokenWaitJob.inPipe = jp_0;
|
||||
tokenWaitJob.outPipe = jp_1;
|
||||
(void)fcntl(jp_0, F_SETFD, 1);
|
||||
(void)fcntl(jp_1, F_SETFD, 1);
|
||||
(void)fcntl(jp_0, F_SETFD, FD_CLOEXEC);
|
||||
(void)fcntl(jp_1, F_SETFD, FD_CLOEXEC);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: main.c,v 1.235 2015/10/25 05:24:44 sjg Exp $ */
|
||||
/* $NetBSD: main.c,v 1.242 2016/03/07 21:45:43 christos Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1988, 1989, 1990, 1993
|
||||
@ -69,7 +69,7 @@
|
||||
*/
|
||||
|
||||
#ifndef MAKE_NATIVE
|
||||
static char rcsid[] = "$NetBSD: main.c,v 1.235 2015/10/25 05:24:44 sjg Exp $";
|
||||
static char rcsid[] = "$NetBSD: main.c,v 1.242 2016/03/07 21:45:43 christos 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.235 2015/10/25 05:24:44 sjg Exp $");
|
||||
__RCSID("$NetBSD: main.c,v 1.242 2016/03/07 21:45:43 christos Exp $");
|
||||
#endif
|
||||
#endif /* not lint */
|
||||
#endif
|
||||
@ -125,7 +125,6 @@ __RCSID("$NetBSD: main.c,v 1.235 2015/10/25 05:24:44 sjg Exp $");
|
||||
#include "wait.h"
|
||||
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <signal.h>
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
@ -696,8 +695,7 @@ Main_ParseArgLine(const char *line)
|
||||
#endif
|
||||
buf = bmake_malloc(len = strlen(line) + strlen(argv0) + 2);
|
||||
(void)snprintf(buf, len, "%s %s", argv0, line);
|
||||
if (p1)
|
||||
free(p1);
|
||||
free(p1);
|
||||
|
||||
argv = brk_string(buf, &argc, TRUE, &args);
|
||||
if (argv == NULL) {
|
||||
@ -723,7 +721,7 @@ Main_SetObjdir(const char *path)
|
||||
/* expand variable substitutions */
|
||||
if (strchr(path, '$') != 0) {
|
||||
snprintf(buf, MAXPATHLEN, "%s", path);
|
||||
path = p = Var_Subst(NULL, buf, VAR_GLOBAL, FALSE, TRUE);
|
||||
path = p = Var_Subst(NULL, buf, VAR_GLOBAL, VARF_WANTRES);
|
||||
}
|
||||
|
||||
if (path[0] != '/') {
|
||||
@ -747,8 +745,7 @@ Main_SetObjdir(const char *path)
|
||||
}
|
||||
}
|
||||
|
||||
if (p)
|
||||
free(p);
|
||||
free(p);
|
||||
return rc;
|
||||
}
|
||||
|
||||
@ -807,7 +804,7 @@ MakeMode(const char *mode)
|
||||
|
||||
if (!mode)
|
||||
mode = mp = Var_Subst(NULL, "${" MAKE_MODE ":tl}",
|
||||
VAR_GLOBAL, FALSE, TRUE);
|
||||
VAR_GLOBAL, VARF_WANTRES);
|
||||
|
||||
if (mode && *mode) {
|
||||
if (strstr(mode, "compat")) {
|
||||
@ -819,8 +816,8 @@ MakeMode(const char *mode)
|
||||
meta_mode_init(mode);
|
||||
#endif
|
||||
}
|
||||
if (mp)
|
||||
free(mp);
|
||||
|
||||
free(mp);
|
||||
}
|
||||
|
||||
/*-
|
||||
@ -1253,7 +1250,7 @@ main(int argc, char **argv)
|
||||
(char *)Lst_Datum(ln));
|
||||
} else {
|
||||
p1 = Var_Subst(NULL, "${" MAKEFILE_PREFERENCE "}",
|
||||
VAR_CMD, FALSE, TRUE);
|
||||
VAR_CMD, VARF_WANTRES);
|
||||
if (p1) {
|
||||
(void)str2Lst_Append(makefiles, p1, NULL);
|
||||
(void)Lst_Find(makefiles, NULL, ReadMakefile);
|
||||
@ -1264,7 +1261,7 @@ main(int argc, char **argv)
|
||||
/* In particular suppress .depend for '-r -V .OBJDIR -f /dev/null' */
|
||||
if (!noBuiltins || !printVars) {
|
||||
makeDependfile = Var_Subst(NULL, "${.MAKE.DEPENDFILE:T}",
|
||||
VAR_CMD, FALSE, TRUE);
|
||||
VAR_CMD, VARF_WANTRES);
|
||||
doing_depend = TRUE;
|
||||
(void)ReadMakefile(makeDependfile, NULL);
|
||||
doing_depend = FALSE;
|
||||
@ -1276,8 +1273,7 @@ main(int argc, char **argv)
|
||||
MakeMode(NULL);
|
||||
|
||||
Var_Append("MFLAGS", Var_Value(MAKEFLAGS, VAR_GLOBAL, &p1), VAR_GLOBAL);
|
||||
if (p1)
|
||||
free(p1);
|
||||
free(p1);
|
||||
|
||||
if (!compatMake)
|
||||
Job_ServerStart(maxJobTokens, jp_0, jp_1);
|
||||
@ -1302,7 +1298,7 @@ main(int argc, char **argv)
|
||||
*/
|
||||
static char VPATH[] = "${VPATH}";
|
||||
|
||||
vpath = Var_Subst(NULL, VPATH, VAR_CMD, FALSE, TRUE);
|
||||
vpath = Var_Subst(NULL, VPATH, VAR_CMD, VARF_WANTRES);
|
||||
path = vpath;
|
||||
do {
|
||||
/* skip to end of directory */
|
||||
@ -1350,7 +1346,7 @@ main(int argc, char **argv)
|
||||
|
||||
if (strchr(var, '$')) {
|
||||
value = p1 = Var_Subst(NULL, var, VAR_GLOBAL,
|
||||
FALSE, TRUE);
|
||||
VARF_WANTRES);
|
||||
} else if (expandVars) {
|
||||
char tmp[128];
|
||||
|
||||
@ -1358,13 +1354,12 @@ main(int argc, char **argv)
|
||||
Fatal("%s: variable name too big: %s",
|
||||
progname, var);
|
||||
value = p1 = Var_Subst(NULL, tmp, VAR_GLOBAL,
|
||||
FALSE, TRUE);
|
||||
VARF_WANTRES);
|
||||
} else {
|
||||
value = Var_Value(var, VAR_GLOBAL, &p1);
|
||||
}
|
||||
printf("%s\n", value ? value : "");
|
||||
if (p1)
|
||||
free(p1);
|
||||
free(p1);
|
||||
}
|
||||
} else {
|
||||
/*
|
||||
@ -1420,6 +1415,9 @@ main(int argc, char **argv)
|
||||
if (enterFlag)
|
||||
printf("%s: Leaving directory `%s'\n", progname, curdir);
|
||||
|
||||
#ifdef USE_META
|
||||
meta_finish();
|
||||
#endif
|
||||
Suff_End();
|
||||
Targ_End();
|
||||
Arch_End();
|
||||
@ -1488,8 +1486,7 @@ ReadMakefile(const void *p, const void *q MAKE_ATTR_UNUSED)
|
||||
name = Dir_FindFile(fname,
|
||||
Lst_IsEmpty(sysIncPath) ? defIncPath : sysIncPath);
|
||||
if (!name || (fd = open(name, O_RDONLY)) == -1) {
|
||||
if (name)
|
||||
free(name);
|
||||
free(name);
|
||||
free(path);
|
||||
return(-1);
|
||||
}
|
||||
@ -1896,7 +1893,7 @@ PrintOnError(GNode *gn, const char *s)
|
||||
}
|
||||
strncpy(tmp, "${MAKE_PRINT_VAR_ON_ERROR:@v@$v='${$v}'\n@}",
|
||||
sizeof(tmp) - 1);
|
||||
cp = Var_Subst(NULL, tmp, VAR_GLOBAL, FALSE, TRUE);
|
||||
cp = Var_Subst(NULL, tmp, VAR_GLOBAL, VARF_WANTRES);
|
||||
if (cp) {
|
||||
if (*cp)
|
||||
printf("%s", cp);
|
||||
@ -1927,7 +1924,7 @@ Main_ExportMAKEFLAGS(Boolean first)
|
||||
|
||||
strncpy(tmp, "${.MAKEFLAGS} ${.MAKEOVERRIDES:O:u:@v@$v=${$v:Q}@}",
|
||||
sizeof(tmp));
|
||||
s = Var_Subst(NULL, tmp, VAR_CMD, FALSE, TRUE);
|
||||
s = Var_Subst(NULL, tmp, VAR_CMD, VARF_WANTRES);
|
||||
if (s && *s) {
|
||||
#ifdef POSIX
|
||||
setenv("MAKEFLAGS", s, 1);
|
||||
@ -1950,7 +1947,7 @@ getTmpdir(void)
|
||||
* Ensure it ends with /.
|
||||
*/
|
||||
tmpdir = Var_Subst(NULL, "${TMPDIR:tA:U" _PATH_TMP "}/", VAR_GLOBAL,
|
||||
FALSE, TRUE);
|
||||
VARF_WANTRES);
|
||||
if (stat(tmpdir, &st) < 0 || !S_ISDIR(st.st_mode)) {
|
||||
free(tmpdir);
|
||||
tmpdir = bmake_strdup(_PATH_TMP);
|
||||
@ -1990,6 +1987,44 @@ mkTempFile(const char *pattern, char **fnamep)
|
||||
return fd;
|
||||
}
|
||||
|
||||
/*
|
||||
* Convert a string representation of a boolean.
|
||||
* Anything that looks like "No", "False", "Off", "0" etc,
|
||||
* is FALSE, otherwise TRUE.
|
||||
*/
|
||||
Boolean
|
||||
s2Boolean(const char *s, Boolean bf)
|
||||
{
|
||||
if (s) {
|
||||
switch(*s) {
|
||||
case '\0': /* not set - the default wins */
|
||||
break;
|
||||
case '0':
|
||||
case 'F':
|
||||
case 'f':
|
||||
case 'N':
|
||||
case 'n':
|
||||
bf = FALSE;
|
||||
break;
|
||||
case 'O':
|
||||
case 'o':
|
||||
switch (s[1]) {
|
||||
case 'F':
|
||||
case 'f':
|
||||
bf = FALSE;
|
||||
break;
|
||||
default:
|
||||
bf = TRUE;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
bf = TRUE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return (bf);
|
||||
}
|
||||
|
||||
/*
|
||||
* Return a Boolean based on setting of a knob.
|
||||
@ -2004,32 +2039,11 @@ getBoolean(const char *name, Boolean bf)
|
||||
char tmp[64];
|
||||
char *cp;
|
||||
|
||||
if (snprintf(tmp, sizeof(tmp), "${%s:tl}", name) < (int)(sizeof(tmp))) {
|
||||
cp = Var_Subst(NULL, tmp, VAR_GLOBAL, FALSE, TRUE);
|
||||
if (snprintf(tmp, sizeof(tmp), "${%s:U:tl}", name) < (int)(sizeof(tmp))) {
|
||||
cp = Var_Subst(NULL, tmp, VAR_GLOBAL, VARF_WANTRES);
|
||||
|
||||
if (cp) {
|
||||
switch(*cp) {
|
||||
case '\0': /* not set - the default wins */
|
||||
break;
|
||||
case '0':
|
||||
case 'f':
|
||||
case 'n':
|
||||
bf = FALSE;
|
||||
break;
|
||||
case 'o':
|
||||
switch (cp[1]) {
|
||||
case 'f':
|
||||
bf = FALSE;
|
||||
break;
|
||||
default:
|
||||
bf = TRUE;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
bf = TRUE;
|
||||
break;
|
||||
}
|
||||
bf = s2Boolean(cp, bf);
|
||||
free(cp);
|
||||
}
|
||||
}
|
||||
|
@ -1,4 +1,4 @@
|
||||
.\" $NetBSD: make.1,v 1.249 2015/06/05 07:33:40 wiz Exp $
|
||||
.\" $NetBSD: make.1,v 1.254 2016/02/20 01:43:28 wiz 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 June 4, 2015
|
||||
.Dd February 19, 2016
|
||||
.Dt MAKE 1
|
||||
.Os
|
||||
.Sh NAME
|
||||
@ -293,7 +293,7 @@ then
|
||||
will search for the specified file or directory named in the remaining part
|
||||
of the argument string.
|
||||
The search starts with the current directory of
|
||||
the Makefile and then works upward towards the root of the filesystem.
|
||||
the Makefile and then works upward towards the root of the file system.
|
||||
If the search is successful, then the resulting directory replaces the
|
||||
.Qq \&.../
|
||||
specification in the
|
||||
@ -879,7 +879,7 @@ This can be overridden by setting
|
||||
.Va bf
|
||||
to a value which represents True.
|
||||
.It Pa env
|
||||
For debugging, it can be useful to inlcude the environment
|
||||
For debugging, it can be useful to include the environment
|
||||
in the .meta file.
|
||||
.It Pa verbose
|
||||
If in "meta" mode, print a clue about the target being built.
|
||||
@ -929,7 +929,7 @@ The default value is:
|
||||
This variable is used to record the names of variables assigned to
|
||||
on the command line, so that they may be exported as part of
|
||||
.Ql Ev MAKEFLAGS .
|
||||
This behaviour can be disabled by assigning an empty value to
|
||||
This behavior can be disabled by assigning an empty value to
|
||||
.Ql Va .MAKEOVERRIDES
|
||||
within a makefile.
|
||||
Extra variables can be exported from a makefile
|
||||
@ -952,6 +952,19 @@ The process-id of
|
||||
.It Va .MAKE.PPID
|
||||
The parent process-id of
|
||||
.Nm .
|
||||
.It Va .MAKE.SAVE_DOLLARS
|
||||
value should be a boolean that controls whether
|
||||
.Ql $$
|
||||
are preserved when doing
|
||||
.Ql :=
|
||||
assignments.
|
||||
The default is false, for backwards compatibility.
|
||||
Set to true for compatability with other makes.
|
||||
If set to false,
|
||||
.Ql $$
|
||||
becomes
|
||||
.Ql $
|
||||
per normal evaluation rules.
|
||||
.It Va MAKE_PRINT_VAR_ON_ERROR
|
||||
When
|
||||
.Nm
|
||||
@ -1055,7 +1068,7 @@ sets
|
||||
to the value of
|
||||
.Ql Ev PWD
|
||||
instead.
|
||||
This behaviour is disabled if
|
||||
This behavior is disabled if
|
||||
.Ql Ev MAKEOBJDIRPREFIX
|
||||
is set or
|
||||
.Ql Ev MAKEOBJDIR
|
||||
@ -1125,7 +1138,7 @@ The wildcard 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
|
||||
.Dl ${VAR:M*}
|
||||
will normalise the inter-word spacing, removing all leading and
|
||||
will normalize the inter-word spacing, removing all leading and
|
||||
trailing space, and converting multiple consecutive spaces
|
||||
to single spaces.
|
||||
.
|
||||
@ -1145,7 +1158,7 @@ Randomize words in variable.
|
||||
The results will be different each time you are referring to the
|
||||
modified variable; use the assignment with expansion
|
||||
.Pq Ql Cm \&:=
|
||||
to prevent such behaviour.
|
||||
to prevent such behavior.
|
||||
For example,
|
||||
.Bd -literal -offset indent
|
||||
LIST= uno due tre quattro
|
||||
@ -1177,7 +1190,7 @@ The value is a format string for
|
||||
using the current
|
||||
.Xr gmtime 3 .
|
||||
.It Cm \&:hash
|
||||
Compute a 32bit hash of the value and encode it as hex digits.
|
||||
Compute a 32-bit hash of the value and encode it as hex digits.
|
||||
.It Cm \&:localtime
|
||||
The value is a format string for
|
||||
.Xr strftime 3 ,
|
||||
@ -1455,7 +1468,7 @@ value is divided into words.
|
||||
.Pp
|
||||
Ordinarily, a value is treated as a sequence of words
|
||||
delimited by white space.
|
||||
Some modifiers suppress this behaviour,
|
||||
Some modifiers suppress this behavior,
|
||||
causing a value to be treated as a single word
|
||||
(possibly containing embedded white space).
|
||||
An empty value, or a value that consists entirely of white-space,
|
||||
@ -1541,12 +1554,20 @@ For compatibility with other versions of
|
||||
.Nm
|
||||
.Ql include file ...
|
||||
is also accepted.
|
||||
.Pp
|
||||
If the include statement is written as
|
||||
.Cm .-include
|
||||
or as
|
||||
.Cm .sinclude
|
||||
then errors locating and/or opening include files are ignored.
|
||||
.Pp
|
||||
If the include statement is written as
|
||||
.Cm .dinclude
|
||||
not only are errors locating and/or opening include files ignored,
|
||||
but stale dependencies within the included file will be ignored
|
||||
just like
|
||||
.Va .MAKE.DEPENDFILE .
|
||||
.Pp
|
||||
Conditional expressions are also preceded by a single dot as the first
|
||||
character of a line.
|
||||
The possible conditionals are as follows:
|
||||
@ -1582,6 +1603,10 @@ This allows exporting a value to the environment which is different from that
|
||||
used by
|
||||
.Nm
|
||||
internally.
|
||||
.It Ic .export-literal Ar variable ...
|
||||
The same as
|
||||
.Ql .export-env ,
|
||||
except that variables in the value are not expanded.
|
||||
.It Ic .info Ar message
|
||||
The message is printed along with the name of the makefile and line number.
|
||||
.It Ic .undef Ar variable
|
||||
@ -2079,7 +2104,7 @@ The sources are a set of
|
||||
pairs.
|
||||
.Bl -tag -width hasErrCtls
|
||||
.It Ar name
|
||||
This is the minimal specification, used to select one of the builtin
|
||||
This is the minimal specification, used to select one of the built-in
|
||||
shell specs;
|
||||
.Ar sh ,
|
||||
.Ar ksh ,
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: make.c,v 1.92 2015/10/11 04:51:24 sjg Exp $ */
|
||||
/* $NetBSD: make.c,v 1.95 2016/02/18 18:29:14 christos Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1988, 1989, 1990, 1993
|
||||
@ -69,14 +69,14 @@
|
||||
*/
|
||||
|
||||
#ifndef MAKE_NATIVE
|
||||
static char rcsid[] = "$NetBSD: make.c,v 1.92 2015/10/11 04:51:24 sjg Exp $";
|
||||
static char rcsid[] = "$NetBSD: make.c,v 1.95 2016/02/18 18:29:14 christos Exp $";
|
||||
#else
|
||||
#include <sys/cdefs.h>
|
||||
#ifndef lint
|
||||
#if 0
|
||||
static char sccsid[] = "@(#)make.c 8.1 (Berkeley) 6/6/93";
|
||||
#else
|
||||
__RCSID("$NetBSD: make.c,v 1.92 2015/10/11 04:51:24 sjg Exp $");
|
||||
__RCSID("$NetBSD: make.c,v 1.95 2016/02/18 18:29:14 christos Exp $");
|
||||
#endif
|
||||
#endif /* not lint */
|
||||
#endif
|
||||
@ -482,10 +482,9 @@ Make_HandleUse(GNode *cgn, GNode *pgn)
|
||||
if (gn->uname == NULL) {
|
||||
gn->uname = gn->name;
|
||||
} else {
|
||||
if (gn->name)
|
||||
free(gn->name);
|
||||
free(gn->name);
|
||||
}
|
||||
gn->name = Var_Subst(NULL, gn->uname, pgn, FALSE, TRUE);
|
||||
gn->name = Var_Subst(NULL, gn->uname, pgn, VARF_WANTRES);
|
||||
if (gn->name && gn->uname && strcmp(gn->name, gn->uname) != 0) {
|
||||
/* See if we have a target for this node. */
|
||||
tgn = Targ_FindNode(gn->name, TARG_NOCREATE);
|
||||
@ -692,8 +691,7 @@ Make_Update(GNode *cgn)
|
||||
checked++;
|
||||
|
||||
cname = Var_Value(TARGET, cgn, &p1);
|
||||
if (p1)
|
||||
free(p1);
|
||||
free(p1);
|
||||
|
||||
if (DEBUG(MAKE))
|
||||
fprintf(debug_file, "Make_Update: %s%s\n", cgn->name, cgn->cohort_num);
|
||||
@ -838,8 +836,7 @@ Make_Update(GNode *cgn)
|
||||
Var_Set(PREFIX, cpref, pgn, 0);
|
||||
}
|
||||
}
|
||||
if (p1)
|
||||
free(p1);
|
||||
free(p1);
|
||||
Lst_Close(cgn->iParents);
|
||||
}
|
||||
}
|
||||
@ -907,8 +904,7 @@ MakeAddAllSrc(void *cgnp, void *pgnp)
|
||||
}
|
||||
if (allsrc != NULL)
|
||||
Var_Append(ALLSRC, allsrc, pgn);
|
||||
if (p2)
|
||||
free(p2);
|
||||
free(p2);
|
||||
if (pgn->type & OP_JOIN) {
|
||||
if (cgn->made == MADE) {
|
||||
Var_Append(OODATE, child, pgn);
|
||||
@ -934,8 +930,7 @@ MakeAddAllSrc(void *cgnp, void *pgnp)
|
||||
*/
|
||||
Var_Append(OODATE, child, pgn);
|
||||
}
|
||||
if (p1)
|
||||
free(p1);
|
||||
free(p1);
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
@ -981,8 +976,7 @@ Make_DoAllVar(GNode *gn)
|
||||
if (gn->type & OP_JOIN) {
|
||||
char *p1;
|
||||
Var_Set(TARGET, Var_Value(ALLSRC, gn, &p1), gn, 0);
|
||||
if (p1)
|
||||
free(p1);
|
||||
free(p1);
|
||||
}
|
||||
gn->flags |= DONE_ALLSRC;
|
||||
}
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: make.h,v 1.96 2015/09/21 21:50:16 pooka Exp $ */
|
||||
/* $NetBSD: make.h,v 1.98 2016/02/18 18:29:14 christos Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1988, 1989, 1990, 1993
|
||||
@ -88,6 +88,7 @@
|
||||
#include <sys/param.h>
|
||||
|
||||
#include <ctype.h>
|
||||
#include <fcntl.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#ifdef HAVE_STRING_H
|
||||
@ -98,6 +99,10 @@
|
||||
#include <unistd.h>
|
||||
#include <sys/cdefs.h>
|
||||
|
||||
#ifndef FD_CLOEXEC
|
||||
#define FD_CLOEXEC 1
|
||||
#endif
|
||||
|
||||
#if defined(__GNUC__)
|
||||
#define MAKE_GNUC_PREREQ(x, y) \
|
||||
((__GNUC__ == (x) && __GNUC_MINOR__ >= (y)) || \
|
||||
@ -501,6 +506,10 @@ Boolean Main_SetObjdir(const char *);
|
||||
int mkTempFile(const char *, char **);
|
||||
int str2Lst_Append(Lst, char *, const char *);
|
||||
|
||||
#define VARF_UNDEFERR 1
|
||||
#define VARF_WANTRES 2
|
||||
#define VARF_ASSIGN 4
|
||||
|
||||
#ifdef __GNUC__
|
||||
#define UNCONST(ptr) ({ \
|
||||
union __unconst { \
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: meta.c,v 1.41 2015/11/30 23:37:56 sjg Exp $ */
|
||||
/* $NetBSD: meta.c,v 1.53 2016/03/07 21:45:43 christos Exp $ */
|
||||
|
||||
/*
|
||||
* Implement 'meta' mode.
|
||||
@ -6,7 +6,7 @@
|
||||
* --sjg
|
||||
*/
|
||||
/*
|
||||
* Copyright (c) 2009-2010, Juniper Networks, Inc.
|
||||
* Copyright (c) 2009-2016, Juniper Networks, Inc.
|
||||
* Portions Copyright (c) 2009, John Birrell.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@ -37,7 +37,6 @@
|
||||
#endif
|
||||
#include <sys/stat.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <fcntl.h>
|
||||
#ifdef HAVE_LIBGEN_H
|
||||
#include <libgen.h>
|
||||
#elif !defined(HAVE_DIRNAME)
|
||||
@ -60,7 +59,9 @@ char * dirname(char *);
|
||||
|
||||
static BuildMon Mybm; /* for compat */
|
||||
static Lst metaBailiwick; /* our scope of control */
|
||||
static char *metaBailiwickStr; /* string storage for the list */
|
||||
static Lst metaIgnorePaths; /* paths we deliberately ignore */
|
||||
static char *metaIgnorePathsStr; /* string storage for the list */
|
||||
|
||||
#ifndef MAKE_META_IGNORE_PATHS
|
||||
#define MAKE_META_IGNORE_PATHS ".MAKE.META.IGNORE_PATHS"
|
||||
@ -148,8 +149,8 @@ filemon_open(BuildMon *pbm)
|
||||
err(1, "Could not set filemon file descriptor!");
|
||||
}
|
||||
/* we don't need these once we exec */
|
||||
(void)fcntl(pbm->mon_fd, F_SETFD, 1);
|
||||
(void)fcntl(pbm->filemon_fd, F_SETFD, 1);
|
||||
(void)fcntl(pbm->mon_fd, F_SETFD, FD_CLOEXEC);
|
||||
(void)fcntl(pbm->filemon_fd, F_SETFD, FD_CLOEXEC);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -300,8 +301,7 @@ meta_name(struct GNode *gn, char *mname, size_t mnamelen,
|
||||
}
|
||||
free(tp);
|
||||
for (i--; i >= 0; i--) {
|
||||
if (p[i])
|
||||
free(p[i]);
|
||||
free(p[i]);
|
||||
}
|
||||
return (mname);
|
||||
}
|
||||
@ -328,7 +328,7 @@ is_submake(void *cmdp, void *gnp)
|
||||
}
|
||||
cp = strchr(cmd, '$');
|
||||
if ((cp)) {
|
||||
mp = Var_Subst(NULL, cmd, gn, FALSE, TRUE);
|
||||
mp = Var_Subst(NULL, cmd, gn, VARF_WANTRES);
|
||||
cmd = mp;
|
||||
}
|
||||
cp2 = strstr(cmd, p_make);
|
||||
@ -353,8 +353,7 @@ is_submake(void *cmdp, void *gnp)
|
||||
}
|
||||
}
|
||||
}
|
||||
if (mp)
|
||||
free(mp);
|
||||
free(mp);
|
||||
return (rc);
|
||||
}
|
||||
|
||||
@ -371,11 +370,10 @@ printCMD(void *cmdp, void *mfpp)
|
||||
char *cp = NULL;
|
||||
|
||||
if (strchr(cmd, '$')) {
|
||||
cmd = cp = Var_Subst(NULL, cmd, mfp->gn, FALSE, TRUE);
|
||||
cmd = cp = Var_Subst(NULL, cmd, mfp->gn, VARF_WANTRES);
|
||||
}
|
||||
fprintf(mfp->fp, "CMD %s\n", cmd);
|
||||
if (cp)
|
||||
free(cp);
|
||||
free(cp);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -466,7 +464,7 @@ meta_create(BuildMon *pbm, GNode *gn)
|
||||
char *mp;
|
||||
|
||||
/* Describe the target we are building */
|
||||
mp = Var_Subst(NULL, "${" MAKE_META_PREFIX "}", gn, FALSE, TRUE);
|
||||
mp = Var_Subst(NULL, "${" MAKE_META_PREFIX "}", gn, VARF_WANTRES);
|
||||
if (*mp)
|
||||
fprintf(stdout, "%s\n", mp);
|
||||
free(mp);
|
||||
@ -480,9 +478,6 @@ meta_create(BuildMon *pbm, GNode *gn)
|
||||
|
||||
fflush(stdout);
|
||||
|
||||
if (strcmp(cp, makeDependfile) == 0)
|
||||
goto out;
|
||||
|
||||
if (!writeMeta)
|
||||
/* Don't create meta data. */
|
||||
goto out;
|
||||
@ -524,8 +519,7 @@ meta_create(BuildMon *pbm, GNode *gn)
|
||||
}
|
||||
out:
|
||||
for (i--; i >= 0; i--) {
|
||||
if (p[i])
|
||||
free(p[i]);
|
||||
free(p[i]);
|
||||
}
|
||||
|
||||
return (mf.fp);
|
||||
@ -609,10 +603,10 @@ meta_mode_init(const char *make_mode)
|
||||
* We consider ourselves master of all within ${.MAKE.META.BAILIWICK}
|
||||
*/
|
||||
metaBailiwick = Lst_Init(FALSE);
|
||||
cp = Var_Subst(NULL, "${.MAKE.META.BAILIWICK:O:u:tA}", VAR_GLOBAL,
|
||||
FALSE, TRUE);
|
||||
if (cp) {
|
||||
str2Lst_Append(metaBailiwick, cp, NULL);
|
||||
metaBailiwickStr = Var_Subst(NULL, "${.MAKE.META.BAILIWICK:O:u:tA}",
|
||||
VAR_GLOBAL, VARF_WANTRES);
|
||||
if (metaBailiwickStr) {
|
||||
str2Lst_Append(metaBailiwick, metaBailiwickStr, NULL);
|
||||
}
|
||||
/*
|
||||
* We ignore any paths that start with ${.MAKE.META.IGNORE_PATHS}
|
||||
@ -620,11 +614,11 @@ meta_mode_init(const char *make_mode)
|
||||
metaIgnorePaths = Lst_Init(FALSE);
|
||||
Var_Append(MAKE_META_IGNORE_PATHS,
|
||||
"/dev /etc /proc /tmp /var/run /var/tmp ${TMPDIR}", VAR_GLOBAL);
|
||||
cp = Var_Subst(NULL,
|
||||
metaIgnorePathsStr = Var_Subst(NULL,
|
||||
"${" MAKE_META_IGNORE_PATHS ":O:u:tA}", VAR_GLOBAL,
|
||||
FALSE, TRUE);
|
||||
if (cp) {
|
||||
str2Lst_Append(metaIgnorePaths, cp, NULL);
|
||||
VARF_WANTRES);
|
||||
if (metaIgnorePathsStr) {
|
||||
str2Lst_Append(metaIgnorePaths, metaIgnorePathsStr, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
@ -693,9 +687,9 @@ meta_job_error(Job *job, GNode *gn, int flags, int status)
|
||||
|
||||
if (job != NULL) {
|
||||
pbm = &job->bm;
|
||||
} else {
|
||||
if (!gn)
|
||||
gn = job->node;
|
||||
} else {
|
||||
pbm = &Mybm;
|
||||
}
|
||||
if (pbm->mfp != NULL) {
|
||||
@ -709,7 +703,7 @@ meta_job_error(Job *job, GNode *gn, int flags, int status)
|
||||
}
|
||||
getcwd(cwd, sizeof(cwd));
|
||||
Var_Set(".ERROR_CWD", cwd, VAR_GLOBAL, 0);
|
||||
if (pbm && pbm->meta_fname[0]) {
|
||||
if (pbm->meta_fname[0]) {
|
||||
Var_Set(".ERROR_META_FILE", pbm->meta_fname, VAR_GLOBAL, 0);
|
||||
}
|
||||
meta_job_finish(job);
|
||||
@ -734,7 +728,7 @@ meta_job_output(Job *job, char *cp, const char *nl)
|
||||
char *cp2;
|
||||
|
||||
meta_prefix = Var_Subst(NULL, "${" MAKE_META_PREFIX "}",
|
||||
VAR_GLOBAL, FALSE, TRUE);
|
||||
VAR_GLOBAL, VARF_WANTRES);
|
||||
if ((cp2 = strchr(meta_prefix, '$')))
|
||||
meta_prefix_len = cp2 - meta_prefix;
|
||||
else
|
||||
@ -785,6 +779,15 @@ meta_job_finish(Job *job)
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
meta_finish(void)
|
||||
{
|
||||
Lst_Destroy(metaBailiwick, NULL);
|
||||
free(metaBailiwickStr);
|
||||
Lst_Destroy(metaIgnorePaths, NULL);
|
||||
free(metaIgnorePathsStr);
|
||||
}
|
||||
|
||||
/*
|
||||
* Fetch a full line from fp - growing bufp if needed
|
||||
* Return length in bufp.
|
||||
@ -1035,14 +1038,12 @@ meta_oodate(GNode *gn, Boolean oodate)
|
||||
ldir = Var_Value(ldir_vname, VAR_GLOBAL, &tp);
|
||||
if (ldir) {
|
||||
strlcpy(latestdir, ldir, sizeof(latestdir));
|
||||
if (tp)
|
||||
free(tp);
|
||||
free(tp);
|
||||
}
|
||||
ldir = Var_Value(lcwd_vname, VAR_GLOBAL, &tp);
|
||||
if (ldir) {
|
||||
strlcpy(lcwd, ldir, sizeof(lcwd));
|
||||
if (tp)
|
||||
free(tp);
|
||||
free(tp);
|
||||
}
|
||||
}
|
||||
/* Skip past the pid. */
|
||||
@ -1320,7 +1321,7 @@ meta_oodate(GNode *gn, Boolean oodate)
|
||||
if (DEBUG(META))
|
||||
fprintf(debug_file, "%s: %d: cannot compare command using .OODATE\n", fname, lineno);
|
||||
}
|
||||
cmd = Var_Subst(NULL, cmd, gn, TRUE, TRUE);
|
||||
cmd = Var_Subst(NULL, cmd, gn, VARF_WANTRES|VARF_UNDEFERR);
|
||||
|
||||
if ((cp = strchr(cmd, '\n'))) {
|
||||
int n;
|
||||
@ -1382,7 +1383,6 @@ meta_oodate(GNode *gn, Boolean oodate)
|
||||
fprintf(debug_file, "%s: missing files: %s...\n",
|
||||
fname, (char *)Lst_Datum(Lst_First(missingFiles)));
|
||||
oodate = TRUE;
|
||||
Lst_Destroy(missingFiles, (FreeProc *)free);
|
||||
}
|
||||
} else {
|
||||
if ((gn->type & OP_META)) {
|
||||
@ -1391,6 +1391,9 @@ meta_oodate(GNode *gn, Boolean oodate)
|
||||
oodate = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
Lst_Destroy(missingFiles, (FreeProc *)free);
|
||||
|
||||
if (oodate && needOODATE) {
|
||||
/*
|
||||
* Target uses .OODATE which is empty; or we wouldn't be here.
|
||||
@ -1399,8 +1402,7 @@ meta_oodate(GNode *gn, Boolean oodate)
|
||||
*/
|
||||
Var_Delete(OODATE, gn);
|
||||
Var_Set(OODATE, Var_Value(ALLSRC, gn, &cp), gn, 0);
|
||||
if (cp)
|
||||
free(cp);
|
||||
free(cp);
|
||||
}
|
||||
return oodate;
|
||||
}
|
||||
@ -1427,8 +1429,8 @@ meta_compat_start(void)
|
||||
if (pipe(childPipe) < 0)
|
||||
Punt("Cannot create pipe: %s", strerror(errno));
|
||||
/* Set close-on-exec flag for both */
|
||||
(void)fcntl(childPipe[0], F_SETFD, 1);
|
||||
(void)fcntl(childPipe[1], F_SETFD, 1);
|
||||
(void)fcntl(childPipe[0], F_SETFD, FD_CLOEXEC);
|
||||
(void)fcntl(childPipe[1], F_SETFD, FD_CLOEXEC);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: meta.h,v 1.3 2013/03/23 05:31:29 sjg Exp $ */
|
||||
/* $NetBSD: meta.h,v 1.4 2016/03/07 21:45:43 christos Exp $ */
|
||||
|
||||
/*
|
||||
* Things needed for 'meta' mode.
|
||||
@ -42,6 +42,7 @@ extern Boolean useMeta;
|
||||
|
||||
struct Job; /* not defined yet */
|
||||
void meta_init(void);
|
||||
void meta_finish(void);
|
||||
void meta_mode_init(const char *);
|
||||
void meta_job_start(struct Job *, GNode *);
|
||||
void meta_job_child(struct Job *);
|
||||
|
@ -1,3 +1,42 @@
|
||||
2016-03-02 Simon J. Gerraty <sjg@bad.crufty.net>
|
||||
|
||||
* meta2deps.sh: don't ignore subdirs.
|
||||
patch from Bryan Drewery
|
||||
|
||||
2016-02-26 Simon J. Gerraty <sjg@bad.crufty.net>
|
||||
|
||||
* install-mk (MK_VERSION): 20160226
|
||||
|
||||
* gendirdeps.mk: mark _DEPENDFILE .NOMETA
|
||||
|
||||
2016-02-20 Simon J. Gerraty <sjg@bad.crufty.net>
|
||||
|
||||
* dirdeps.mk: we shouldn't normally include .depend but if we do
|
||||
use .dinclude if we can.
|
||||
|
||||
2016-02-18 Simon J. Gerraty <sjg@bad.crufty.net>
|
||||
|
||||
* install-mk (MK_VERSION): 20160218
|
||||
* sys.clean-env.mk: with recent change to Var_Subst()
|
||||
we cannot use the '$$' trick, but .export-literal does the job
|
||||
we need.
|
||||
* auto.dep.mk: make use .dinclude if we can.
|
||||
|
||||
|
||||
2016-02-05 Simon J. Gerraty <sjg@bad.crufty.net>
|
||||
|
||||
* dirdeps.mk:
|
||||
Add _build_all_dirs such that local.dirdeps.mk can
|
||||
add fully qualified dirs to it.
|
||||
These will be built normally but the current
|
||||
DEP_RELDIR will not depend on then (to avoid cycles).
|
||||
This makes it easy to hook things like unit-tests into build.
|
||||
|
||||
|
||||
2016-01-21 Simon J. Gerraty <sjg@bad.crufty.net>
|
||||
|
||||
* dirdeps.mk: add bootstrap-empty
|
||||
|
||||
2015-12-12 Simon J. Gerraty <sjg@bad.crufty.net>
|
||||
|
||||
* install-mk (MK_VERSION): 20151212
|
||||
|
@ -1,6 +1,6 @@
|
||||
#
|
||||
# RCSid:
|
||||
# $Id: auto.dep.mk,v 1.3 2014/08/04 05:19:10 sjg Exp $
|
||||
# $Id: auto.dep.mk,v 1.4 2016/02/18 21:16:39 sjg Exp $
|
||||
#
|
||||
# @(#) Copyright (c) 2010, Simon J. Gerraty
|
||||
#
|
||||
@ -45,6 +45,7 @@ CXXFLAGS += ${CFLAGS_MD} ${CFLAGS_MF}
|
||||
|
||||
CLEANFILES += .depend ${.MAKE.DEPENDFILE} *.d
|
||||
|
||||
.if ${MAKE_VERSION} < 20160218
|
||||
# skip generating dependfile for misc targets
|
||||
.if ${.TARGETS:Uall:M*all} != ""
|
||||
.END: ${.MAKE.DEPENDFILE}
|
||||
@ -60,5 +61,14 @@ ${.MAKE.DEPENDFILE}: ${OBJS} ${POBJS} ${SOBJS}
|
||||
-@for f in ${.ALLSRC:M*o:T:O:u:%=%.d}; do \
|
||||
echo ".-include \"$$f\""; \
|
||||
done > $@
|
||||
.else
|
||||
# we have .dinclude
|
||||
.if empty(_SKIP_BUILD)
|
||||
_all_objs = ${OBJS} ${POBJS} ${SOBJS}
|
||||
.for d in ${_all_objs:M*o:T:O:u:%=%.d}
|
||||
.dinclude "$d"
|
||||
.endfor
|
||||
.endif
|
||||
|
||||
.endif
|
||||
.endif
|
||||
|
@ -1,4 +1,4 @@
|
||||
# $Id: dirdeps.mk,v 1.55 2015/10/20 22:04:53 sjg Exp $
|
||||
# $Id: dirdeps.mk,v 1.59 2016/02/26 23:32:29 sjg Exp $
|
||||
|
||||
# Copyright (c) 2010-2013, Juniper Networks, Inc.
|
||||
# All rights reserved.
|
||||
@ -121,6 +121,9 @@ _DIRDEP_USE_LEVEL?= 0
|
||||
# and non-specific Makefile.depend*
|
||||
|
||||
.if !target(_DIRDEP_USE)
|
||||
# make sure we get the behavior we expect
|
||||
.MAKE.SAVE_DOLLARS = no
|
||||
|
||||
# do some setup we only need once
|
||||
_CURDIR ?= ${.CURDIR}
|
||||
_OBJDIR ?= ${.OBJDIR}
|
||||
@ -256,11 +259,8 @@ DEP_RELDIR := ${DIRDEPS:R:[1]}
|
||||
MK_DIRDEPS_CACHE = no
|
||||
.endif
|
||||
|
||||
|
||||
# pickup customizations
|
||||
# as below you can use !target(_DIRDEP_USE) to protect things
|
||||
# which should only be done once.
|
||||
.-include "local.dirdeps.mk"
|
||||
# reset each time through
|
||||
_build_all_dirs =
|
||||
|
||||
# the first time we are included the _DIRDEP_USE target will not be defined
|
||||
# we can use this as a clue to do initialization and other one time things.
|
||||
@ -280,6 +280,14 @@ DEBUG_DIRDEPS ?= no
|
||||
# remember the initial value of DEP_RELDIR - we test for it below.
|
||||
_DEP_RELDIR := ${DEP_RELDIR}
|
||||
|
||||
.endif
|
||||
|
||||
# pickup customizations
|
||||
# as below you can use !target(_DIRDEP_USE) to protect things
|
||||
# which should only be done once.
|
||||
.-include "local.dirdeps.mk"
|
||||
|
||||
.if !target(_DIRDEP_USE)
|
||||
# things we skip for host tools
|
||||
SKIP_HOSTDIR ?=
|
||||
|
||||
@ -399,6 +407,7 @@ ${DIRDEPS_CACHE}: .META .NOMETA_CMP
|
||||
MAKEFLAGS= ${.MAKE} -C ${_CURDIR} -f ${BUILD_DIRDEPS_MAKEFILE} \
|
||||
${BUILD_DIRDEPS_TARGETS} BUILD_DIRDEPS_CACHE=yes \
|
||||
.MAKE.DEPENDFILE=.none \
|
||||
${.MAKEFLAGS:tW:S,-D ,-D,g:tw:M*WITH*} \
|
||||
3>&1 1>&2 | sed 's,${SRCTOP},$${SRCTOP},g' >> ${.TARGET}.new && \
|
||||
mv ${.TARGET}.new ${.TARGET}
|
||||
|
||||
@ -479,7 +488,11 @@ _build_dirs += ${_machines:@m@${_CURDIR}.$m@}
|
||||
_build_dirs += ${_machines:N${DEP_TARGET_SPEC}:@m@${_CURDIR}.$m@}
|
||||
.if ${DEP_TARGET_SPEC} == ${TARGET_SPEC}
|
||||
# pickup local dependencies now
|
||||
.if ${MAKE_VERSION} < 20160220
|
||||
.-include <.depend>
|
||||
.else
|
||||
.dinclude <.depend>
|
||||
.endif
|
||||
.endif
|
||||
.endif
|
||||
.endif
|
||||
@ -531,22 +544,25 @@ _build_dirs += \
|
||||
# qualify everything now
|
||||
_build_dirs := ${_build_dirs:${M_dep_qual_fixes:ts:}:O:u}
|
||||
|
||||
_build_all_dirs += ${_build_dirs}
|
||||
_build_all_dirs := ${_build_all_dirs:O:u}
|
||||
|
||||
.endif # empty DIRDEPS
|
||||
|
||||
# Normally if doing make -V something,
|
||||
# we do not want to waste time chasing DIRDEPS
|
||||
# but if we want to count the number of Makefile.depend* read, we do.
|
||||
.if ${.MAKEFLAGS:M-V${_V_READ_DIRDEPS}} == ""
|
||||
.if !empty(_build_dirs)
|
||||
.if !empty(_build_all_dirs)
|
||||
.if ${BUILD_DIRDEPS_CACHE} == "yes"
|
||||
x!= { echo; echo '\# ${DEP_RELDIR}.${DEP_TARGET_SPEC}'; \
|
||||
echo 'dirdeps: ${_build_dirs:${M_oneperline}}'; echo; } >&3; echo
|
||||
x!= { ${_build_dirs:@x@${target($x):?:echo '$x: _DIRDEP_USE';}@} echo; } >&3; echo
|
||||
echo 'dirdeps: ${_build_all_dirs:${M_oneperline}}'; echo; } >&3; echo
|
||||
x!= { ${_build_all_dirs:@x@${target($x):?:echo '$x: _DIRDEP_USE';}@} echo; } >&3; echo
|
||||
.else
|
||||
# this makes it all happen
|
||||
dirdeps: ${_build_dirs}
|
||||
dirdeps: ${_build_all_dirs}
|
||||
.endif
|
||||
${_build_dirs}: _DIRDEP_USE
|
||||
${_build_all_dirs}: _DIRDEP_USE
|
||||
|
||||
.if ${_debug_reldir}
|
||||
.info ${DEP_RELDIR}.${DEP_TARGET_SPEC}: needs: ${_build_dirs}
|
||||
@ -580,14 +596,14 @@ ${_this_dir}.$m: ${_build_dirs:M*.$m:N${_this_dir}.$m}
|
||||
.endif
|
||||
|
||||
# Now find more dependencies - and recurse.
|
||||
.for d in ${_build_dirs}
|
||||
.for d in ${_build_all_dirs}
|
||||
.if ${_DIRDEP_CHECKED:M$d} == ""
|
||||
# once only
|
||||
_DIRDEP_CHECKED += $d
|
||||
.if ${_debug_search}
|
||||
.info checking $d
|
||||
.endif
|
||||
# Note: _build_dirs is fully qualifed so d:R is always the directory
|
||||
# Note: _build_all_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
|
||||
# the first entry in TARGET_SPEC_VARS.
|
||||
@ -627,28 +643,37 @@ DIRDEPS =
|
||||
DEP_RELDIR := ${RELDIR}
|
||||
_DEP_RELDIR := ${RELDIR}
|
||||
# pickup local dependencies
|
||||
.if ${MAKE_VERSION} < 20160220
|
||||
.-include <.depend>
|
||||
.else
|
||||
.dinclude <.depend>
|
||||
.endif
|
||||
.endif
|
||||
|
||||
# bootstrapping new dependencies made easy?
|
||||
.if (make(bootstrap) || make(bootstrap-recurse)) && !target(bootstrap)
|
||||
.if !target(bootstrap) && (make(bootstrap) || \
|
||||
make(bootstrap-this) || \
|
||||
make(bootstrap-recurse) || \
|
||||
make(bootstrap-empty))
|
||||
|
||||
.if exists(${.CURDIR}/${.MAKE.DEPENDFILE:T})
|
||||
# stop here
|
||||
${.TARGETS:Mboot*}:
|
||||
.else
|
||||
.elif !make(bootstrap-empty)
|
||||
# find a Makefile.depend to use as _src
|
||||
_src != cd ${.CURDIR} && for m in ${.MAKE.DEPENDFILE_PREFERENCE:T:S,${MACHINE},*,}; do test -s $$m || continue; echo $$m; break; done; echo
|
||||
.if empty(_src)
|
||||
.error cannot find any of ${.MAKE.DEPENDFILE_PREFERENCE:T}
|
||||
.error cannot find any of ${.MAKE.DEPENDFILE_PREFERENCE:T}${.newline}Use: bootstrap-empty
|
||||
.endif
|
||||
|
||||
_src?= ${.MAKE.DEPENDFILE:T}
|
||||
|
||||
# just create Makefile.depend* for this dir
|
||||
bootstrap-this: .NOTMAIN
|
||||
@echo Bootstrapping ${RELDIR}/${.MAKE.DEPENDFILE:T} from ${_src:T}
|
||||
(cd ${.CURDIR} && sed 's,${_src:E},${MACHINE},g' ${_src} > ${.MAKE.DEPENDFILE:T})
|
||||
|
||||
# create Makefile.depend* for this dir and its dependencies
|
||||
bootstrap: bootstrap-recurse
|
||||
bootstrap-recurse: bootstrap-this
|
||||
|
||||
@ -663,4 +688,11 @@ bootstrap-recurse: .NOTMAIN .MAKE
|
||||
done
|
||||
|
||||
.endif
|
||||
|
||||
# create an empty Makefile.depend* to get the ball rolling.
|
||||
bootstrap-empty: .NOTMAIN .NOMETA
|
||||
@echo Creating empty ${RELDIR}/${.MAKE.DEPENDFILE:T}; \
|
||||
echo You need to build ${RELDIR} to correctly populate it.
|
||||
@{ echo DIRDEPS=; echo ".include <dirdeps.mk>"; } > ${.CURDIR}/${.MAKE.DEPENDFILE:T}
|
||||
|
||||
.endif
|
||||
|
@ -1,4 +1,4 @@
|
||||
# $Id: gendirdeps.mk,v 1.29 2015/10/03 05:00:46 sjg Exp $
|
||||
# $Id: gendirdeps.mk,v 1.30 2016/02/27 00:20:39 sjg Exp $
|
||||
|
||||
# Copyright (c) 2010-2013, Juniper Networks, Inc.
|
||||
# All rights reserved.
|
||||
@ -309,7 +309,7 @@ CAT_DEPEND ?= .depend
|
||||
# .depend may contain things we don't want.
|
||||
# The sed command at the end of the stream, allows for the filters
|
||||
# to output _{VAR} tokens which we will turn into proper ${VAR} references.
|
||||
${_DEPENDFILE}: ${CAT_DEPEND:M.depend} ${META_FILES:O:u:@m@${exists($m):?$m:}@} ${_this} ${META2DEPS}
|
||||
${_DEPENDFILE}: .NOMETA ${CAT_DEPEND:M.depend} ${META_FILES:O:u:@m@${exists($m):?$m:}@} ${_this} ${META2DEPS}
|
||||
@(${GENDIRDEPS_HEADER} echo '# Autogenerated - do NOT edit!'; echo; \
|
||||
echo 'DIRDEPS = \'; \
|
||||
echo '${DIRDEPS:@d@ $d \\${.newline}@}'; echo; \
|
||||
@ -329,7 +329,7 @@ DIRDEPS := ${SUBDIR:S,^,${RELDIR}/,:O:u}
|
||||
|
||||
all: ${_DEPENDFILE}
|
||||
|
||||
${_DEPENDFILE}: ${MAKEFILE} ${_this}
|
||||
${_DEPENDFILE}: .NOMETA ${MAKEFILE} ${_this}
|
||||
@(${GENDIRDEPS_HEADER} echo '# Autogenerated - do NOT edit!'; echo; \
|
||||
echo 'DIRDEPS = \'; \
|
||||
echo '${DIRDEPS:@d@ $d \\${.newline}@}'; echo; \
|
||||
|
@ -55,7 +55,7 @@
|
||||
# Simon J. Gerraty <sjg@crufty.net>
|
||||
|
||||
# RCSid:
|
||||
# $Id: install-mk,v 1.118 2015/12/16 01:57:06 sjg Exp $
|
||||
# $Id: install-mk,v 1.121 2016/02/27 00:23:02 sjg Exp $
|
||||
#
|
||||
# @(#) Copyright (c) 1994 Simon J. Gerraty
|
||||
#
|
||||
@ -70,7 +70,7 @@
|
||||
# sjg@crufty.net
|
||||
#
|
||||
|
||||
MK_VERSION=20151212
|
||||
MK_VERSION=20160226
|
||||
OWNER=
|
||||
GROUP=
|
||||
MODE=444
|
||||
|
@ -1,4 +1,4 @@
|
||||
# $Id: meta.autodep.mk,v 1.39 2015/12/07 04:35:32 sjg Exp $
|
||||
# $Id: meta.autodep.mk,v 1.40 2016/02/22 22:44:58 sjg Exp $
|
||||
|
||||
#
|
||||
# @(#) Copyright (c) 2010, Simon J. Gerraty
|
||||
@ -86,7 +86,7 @@ WANT_UPDATE_DEPENDFILE ?= yes
|
||||
.endif
|
||||
|
||||
.if ${WANT_UPDATE_DEPENDFILE:Uno:tl} != "no"
|
||||
.if ${.MAKE.MODE:Mmeta*} == "" || ${.MAKE.MODE:M*read*} != ""
|
||||
.if ${.MAKE.MODE:Uno:Mmeta*} == "" || ${.MAKE.MODE:Uno:M*read*} != ""
|
||||
UPDATE_DEPENDFILE = no
|
||||
.endif
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
# $Id: meta.stage.mk,v 1.41 2015/11/13 17:34:04 sjg Exp $
|
||||
# $Id: meta.stage.mk,v 1.43 2016/02/24 18:46:32 sjg Exp $
|
||||
#
|
||||
# @(#) Copyright (c) 2011, Simon J. Gerraty
|
||||
#
|
||||
@ -26,7 +26,7 @@ _dirdep = ${RELDIR}
|
||||
CLEANFILES+= .dirdep
|
||||
|
||||
# this allows us to trace dependencies back to their src dir
|
||||
.dirdep:
|
||||
.dirdep: .NOPATH
|
||||
@echo '${_dirdep}' > $@
|
||||
|
||||
.if defined(NO_POSIX_SHELL) || ${type printf:L:sh:Mbuiltin} == ""
|
||||
@ -241,7 +241,7 @@ CLEANFILES += ${STAGE_TARGETS} stage_incs stage_includes
|
||||
# for non-jobs mode the order here matters
|
||||
staging: ${STAGE_TARGETS:N*_links} ${STAGE_TARGETS:M*_links}
|
||||
|
||||
.if ${.MAKE.JOBS:U0} > 0 && ${STAGE_TARGETS:M*_links} != ""
|
||||
.if ${.MAKE.JOBS:U0} > 0 && ${STAGE_TARGETS:U:M*_links} != ""
|
||||
# the above isn't sufficient
|
||||
.for t in ${STAGE_TARGETS:N*links:O:u}
|
||||
.ORDER: $t stage_links
|
||||
|
@ -1,4 +1,4 @@
|
||||
# $Id: meta.sys.mk,v 1.26 2015/11/14 21:16:13 sjg Exp $
|
||||
# $Id: meta.sys.mk,v 1.27 2016/02/22 22:44:58 sjg Exp $
|
||||
|
||||
#
|
||||
# @(#) Copyright (c) 2010, Simon J. Gerraty
|
||||
@ -102,7 +102,7 @@ META_COOKIE_TOUCH=
|
||||
# some targets need to be .PHONY in non-meta mode
|
||||
META_NOPHONY= .PHONY
|
||||
# Are we, after all, in meta mode?
|
||||
.if ${.MAKE.MODE:Mmeta*} != ""
|
||||
.if ${.MAKE.MODE:Uno:Mmeta*} != ""
|
||||
MKDEP_MK = meta.autodep.mk
|
||||
|
||||
.if ${.MAKE.MAKEFILES:M*sys.dependfile.mk} == ""
|
||||
|
@ -77,7 +77,7 @@
|
||||
|
||||
|
||||
# RCSid:
|
||||
# $Id: meta2deps.sh,v 1.9 2015/04/03 18:23:25 sjg Exp $
|
||||
# $Id: meta2deps.sh,v 1.10 2016/03/02 18:53:36 sjg Exp $
|
||||
|
||||
# Copyright (c) 2010-2013, Juniper Networks, Inc.
|
||||
# All rights reserved.
|
||||
@ -309,7 +309,7 @@ meta2deps() {
|
||||
*) seen=$dir;;
|
||||
esac
|
||||
case "$dir" in
|
||||
${CURDIR:-.}|${CURDIR:-.}/*|"") continue;;
|
||||
${CURDIR:-.}|"") continue;;
|
||||
$src_re)
|
||||
# avoid repeating ourselves...
|
||||
case "$DPDEPS,$seensrc," in
|
||||
|
@ -1,4 +1,4 @@
|
||||
# $Id: sys.clean-env.mk,v 1.20 2012/11/12 06:56:04 sjg Exp $
|
||||
# $Id: sys.clean-env.mk,v 1.21 2016/02/18 21:16:40 sjg Exp $
|
||||
#
|
||||
# @(#) Copyright (c) 2009, Simon J. Gerraty
|
||||
#
|
||||
@ -94,6 +94,7 @@ _tricky_env_vars = MAKEOBJDIR OBJTOP
|
||||
# MAKEOBJDIR='${.CURDIR:S,${SRCTOP},${OBJTOP},}'
|
||||
_srctop := ${SRCTOP:U${SB_SRC:U${SB}/src}}
|
||||
_objroot := ${OBJROOT:U${SB_OBJROOT:U${SB}/${SB_OBJPREFIX}}}
|
||||
.if ${MAKE_VERSION} < 20160218
|
||||
_objtop := ${OBJTOP:U${_objroot}${MACHINE}}
|
||||
# Take care of ${MACHINE}
|
||||
.if ${MACHINE} == "host" || ${OBJTOP} == ${HOST_OBJTOP:Uno}
|
||||
@ -113,7 +114,17 @@ MAKEOBJDIR = $${.CURDIR:S,${_srctop},$${OBJTOP},}
|
||||
.for v in ${_tricky_env_vars}
|
||||
$v := ${$v}
|
||||
.endfor
|
||||
.else
|
||||
# we cannot use the '$$' trick, anymore
|
||||
# but we can export a literal (unexpanded) value
|
||||
SRCTOP := ${_srctop}
|
||||
OBJROOT := ${_objroot}
|
||||
OBJTOP = ${OBJROOT}${MACHINE}
|
||||
MAKEOBJDIR = ${.CURDIR:S,${SRCTOP},${OBJTOP},}
|
||||
.export-literal SRCTOP OBJROOT ${_tricky_env_vars}
|
||||
.endif
|
||||
#.info ${_tricky_env_vars:@v@${.newline}$v=${$v}@}
|
||||
|
||||
#showenv:
|
||||
# @env | egrep 'OBJ|SRC'
|
||||
.endif # MAKEOBJDIR
|
||||
.endif # level 0
|
||||
|
@ -1,4 +1,4 @@
|
||||
# $Id: sys.dependfile.mk,v 1.6 2014/08/02 18:02:06 sjg Exp $
|
||||
# $Id: sys.dependfile.mk,v 1.7 2016/02/20 01:57:39 sjg Exp $
|
||||
#
|
||||
# @(#) Copyright (c) 2012, Simon J. Gerraty
|
||||
#
|
||||
@ -49,7 +49,9 @@ _e := ${.MAKE.DEPENDFILE_PREFERENCE:@m@${exists($m):?$m:}@}
|
||||
# If any already exist, we should follow suit.
|
||||
_aml = ${ALL_MACHINE_LIST:Uarm amd64 i386 powerpc:N${MACHINE}} ${MACHINE}
|
||||
# MACHINE must be the last entry in _aml ;-)
|
||||
_m := ${MACHINE}
|
||||
_e := ${_aml:@MACHINE@${.MAKE.DEPENDFILE_PREFERENCE:@m@${exists($m):?$m:}@}@}
|
||||
MACHINE := ${_m}
|
||||
.if !empty(_e)
|
||||
.MAKE.DEPENDFILE ?= ${.MAKE.DEPENDFILE_PREFERENCE:M*${MACHINE}:[1]}
|
||||
.endif
|
||||
|
@ -1,5 +1,5 @@
|
||||
# RCSid:
|
||||
# $Id: warnings.mk,v 1.8 2014/04/02 19:20:23 sjg Exp $
|
||||
# $Id: warnings.mk,v 1.9 2016/02/20 02:00:58 sjg Exp $
|
||||
#
|
||||
# @(#) Copyright (c) 2002, Simon J. Gerraty
|
||||
#
|
||||
@ -15,6 +15,8 @@
|
||||
#
|
||||
|
||||
.ifndef _w_cflags
|
||||
# make sure we get the behavior we expect
|
||||
.MAKE.SAVE_DOLLARS = no
|
||||
|
||||
# Any number of warnings sets can be added.
|
||||
.-include "warnings-sets.mk"
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: nonints.h,v 1.69 2015/10/11 04:51:24 sjg Exp $ */
|
||||
/* $NetBSD: nonints.h,v 1.72 2016/02/18 20:25:08 sjg Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 1988, 1989, 1990, 1993
|
||||
@ -120,6 +120,7 @@ void Finish(int) MAKE_ATTR_DEAD;
|
||||
int eunlink(const char *);
|
||||
void execError(const char *, const char *);
|
||||
char *getTmpdir(void);
|
||||
Boolean s2Boolean(const char *, Boolean);
|
||||
Boolean getBoolean(const char *, Boolean);
|
||||
|
||||
/* parse.c */
|
||||
@ -184,8 +185,8 @@ void Var_Set(const char *, const char *, GNode *, int);
|
||||
void Var_Append(const char *, const char *, GNode *);
|
||||
Boolean Var_Exists(const char *, GNode *);
|
||||
char *Var_Value(const char *, GNode *, char **);
|
||||
char *Var_Parse(const char *, GNode *, Boolean, Boolean, int *, void **);
|
||||
char *Var_Subst(const char *, const char *, GNode *, Boolean, Boolean);
|
||||
char *Var_Parse(const char *, GNode *, int, int *, void **);
|
||||
char *Var_Subst(const char *, const char *, GNode *, int);
|
||||
char *Var_GetTail(const char *);
|
||||
char *Var_GetHead(const char *);
|
||||
void Var_Init(void);
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: parse.c,v 1.206 2015/11/26 00:23:04 sjg Exp $ */
|
||||
/* $NetBSD: parse.c,v 1.212 2016/02/19 06:19:06 sjg Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1988, 1989, 1990, 1993
|
||||
@ -69,14 +69,14 @@
|
||||
*/
|
||||
|
||||
#ifndef MAKE_NATIVE
|
||||
static char rcsid[] = "$NetBSD: parse.c,v 1.206 2015/11/26 00:23:04 sjg Exp $";
|
||||
static char rcsid[] = "$NetBSD: parse.c,v 1.212 2016/02/19 06:19:06 sjg 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.206 2015/11/26 00:23:04 sjg Exp $");
|
||||
__RCSID("$NetBSD: parse.c,v 1.212 2016/02/19 06:19:06 sjg Exp $");
|
||||
#endif
|
||||
#endif /* not lint */
|
||||
#endif
|
||||
@ -128,7 +128,6 @@ __RCSID("$NetBSD: parse.c,v 1.206 2015/11/26 00:23:04 sjg Exp $");
|
||||
#include <assert.h>
|
||||
#include <ctype.h>
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
|
||||
@ -161,6 +160,7 @@ typedef struct IFile {
|
||||
int lineno; /* current line number in file */
|
||||
int first_lineno; /* line number of start of text */
|
||||
int cond_depth; /* 'if' nesting when file opened */
|
||||
Boolean depending; /* state of doing_depend on EOF */
|
||||
char *P_str; /* point to base of string buffer */
|
||||
char *P_ptr; /* point to next char of string buffer */
|
||||
char *P_end; /* point to the end of string buffer */
|
||||
@ -816,7 +816,7 @@ ParseMessage(char *line)
|
||||
while (isspace((u_char)*line))
|
||||
line++;
|
||||
|
||||
line = Var_Subst(NULL, line, VAR_CMD, FALSE, TRUE);
|
||||
line = Var_Subst(NULL, line, VAR_CMD, VARF_WANTRES);
|
||||
Parse_Error(mtype, "%s", line);
|
||||
free(line);
|
||||
|
||||
@ -1233,9 +1233,9 @@ ParseDoDependency(char *line)
|
||||
int length;
|
||||
void *freeIt;
|
||||
|
||||
(void)Var_Parse(cp, VAR_CMD, TRUE, TRUE, &length, &freeIt);
|
||||
if (freeIt)
|
||||
free(freeIt);
|
||||
(void)Var_Parse(cp, VAR_CMD, VARF_UNDEFERR|VARF_WANTRES,
|
||||
&length, &freeIt);
|
||||
free(freeIt);
|
||||
cp += length-1;
|
||||
}
|
||||
}
|
||||
@ -1948,7 +1948,7 @@ Parse_DoVar(char *line, GNode *ctxt)
|
||||
if (!Var_Exists(line, ctxt))
|
||||
Var_Set(line, "", ctxt, 0);
|
||||
|
||||
cp = Var_Subst(NULL, cp, ctxt, FALSE, TRUE);
|
||||
cp = Var_Subst(NULL, cp, ctxt, VARF_WANTRES|VARF_ASSIGN);
|
||||
oldVars = oldOldVars;
|
||||
freeCp = TRUE;
|
||||
|
||||
@ -1963,7 +1963,7 @@ Parse_DoVar(char *line, GNode *ctxt)
|
||||
* expansion on the whole thing. The resulting string will need
|
||||
* freeing when we're done, so set freeCmd to TRUE.
|
||||
*/
|
||||
cp = Var_Subst(NULL, cp, VAR_CMD, TRUE, TRUE);
|
||||
cp = Var_Subst(NULL, cp, VAR_CMD, VARF_UNDEFERR|VARF_WANTRES);
|
||||
freeCp = TRUE;
|
||||
}
|
||||
|
||||
@ -2155,7 +2155,7 @@ Parse_AddIncludeDir(char *dir)
|
||||
*/
|
||||
|
||||
static void
|
||||
Parse_include_file(char *file, Boolean isSystem, int silent)
|
||||
Parse_include_file(char *file, Boolean isSystem, Boolean depinc, int silent)
|
||||
{
|
||||
struct loadedfile *lf;
|
||||
char *fullname; /* full pathname of file */
|
||||
@ -2255,6 +2255,8 @@ Parse_include_file(char *file, Boolean isSystem, int silent)
|
||||
/* Start reading from this file next */
|
||||
Parse_SetInput(fullname, 0, -1, loadedfile_nextbuf, lf);
|
||||
curFile->lf = lf;
|
||||
if (depinc)
|
||||
doing_depend = depinc; /* only turn it on */
|
||||
}
|
||||
|
||||
static void
|
||||
@ -2302,9 +2304,9 @@ ParseDoInclude(char *line)
|
||||
* Substitute for any variables in the file name before trying to
|
||||
* find the thing.
|
||||
*/
|
||||
file = Var_Subst(NULL, file, VAR_CMD, FALSE, TRUE);
|
||||
file = Var_Subst(NULL, file, VAR_CMD, VARF_WANTRES);
|
||||
|
||||
Parse_include_file(file, endc == '>', silent);
|
||||
Parse_include_file(file, endc == '>', (*line == 'd'), silent);
|
||||
free(file);
|
||||
}
|
||||
|
||||
@ -2339,10 +2341,8 @@ ParseSetIncludedFile(void)
|
||||
fprintf(debug_file, "%s: ${.INCLUDEDFROMDIR} = `%s' "
|
||||
"${.INCLUDEDFROMFILE} = `%s'\n", __func__, pd, pf);
|
||||
|
||||
if (fp)
|
||||
free(fp);
|
||||
if (dp)
|
||||
free(dp);
|
||||
free(fp);
|
||||
free(dp);
|
||||
}
|
||||
/*-
|
||||
*---------------------------------------------------------------------
|
||||
@ -2472,6 +2472,7 @@ Parse_SetInput(const char *name, int line, int fd,
|
||||
curFile->nextbuf = nextbuf;
|
||||
curFile->nextbuf_arg = arg;
|
||||
curFile->lf = NULL;
|
||||
curFile->depending = doing_depend; /* restore this on EOF */
|
||||
|
||||
assert(nextbuf != NULL);
|
||||
|
||||
@ -2532,7 +2533,7 @@ ParseTraditionalInclude(char *line)
|
||||
* Substitute for any variables in the file name before trying to
|
||||
* find the thing.
|
||||
*/
|
||||
all_files = Var_Subst(NULL, file, VAR_CMD, FALSE, TRUE);
|
||||
all_files = Var_Subst(NULL, file, VAR_CMD, VARF_WANTRES);
|
||||
|
||||
if (*file == '\0') {
|
||||
Parse_Error(PARSE_FATAL,
|
||||
@ -2550,7 +2551,7 @@ ParseTraditionalInclude(char *line)
|
||||
else
|
||||
done = 1;
|
||||
|
||||
Parse_include_file(file, FALSE, silent);
|
||||
Parse_include_file(file, FALSE, FALSE, silent);
|
||||
}
|
||||
free(all_files);
|
||||
}
|
||||
@ -2600,7 +2601,7 @@ ParseGmakeExport(char *line)
|
||||
/*
|
||||
* Expand the value before putting it in the environment.
|
||||
*/
|
||||
value = Var_Subst(NULL, value, VAR_CMD, FALSE, TRUE);
|
||||
value = Var_Subst(NULL, value, VAR_CMD, VARF_WANTRES);
|
||||
setenv(variable, value, 1);
|
||||
}
|
||||
#endif
|
||||
@ -2628,6 +2629,7 @@ ParseEOF(void)
|
||||
|
||||
assert(curFile->nextbuf != NULL);
|
||||
|
||||
doing_depend = curFile->depending; /* restore this */
|
||||
/* get next input buffer, if any */
|
||||
ptr = curFile->nextbuf(curFile->nextbuf_arg, &len);
|
||||
curFile->P_ptr = ptr;
|
||||
@ -2990,7 +2992,7 @@ Parse_File(const char *name, int fd)
|
||||
continue;
|
||||
}
|
||||
if (strncmp(cp, "include", 7) == 0 ||
|
||||
((cp[0] == 's' || cp[0] == '-') &&
|
||||
((cp[0] == 'd' || cp[0] == 's' || cp[0] == '-') &&
|
||||
strncmp(&cp[1], "include", 7) == 0)) {
|
||||
ParseDoInclude(cp);
|
||||
continue;
|
||||
@ -3149,7 +3151,7 @@ Parse_File(const char *name, int fd)
|
||||
* variables expanded before being parsed. Tell the variable
|
||||
* module to complain if some variable is undefined...
|
||||
*/
|
||||
line = Var_Subst(NULL, line, VAR_CMD, TRUE, TRUE);
|
||||
line = Var_Subst(NULL, line, VAR_CMD, VARF_UNDEFERR|VARF_WANTRES);
|
||||
|
||||
/*
|
||||
* Need a non-circular list for the target nodes
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: suff.c,v 1.75 2015/12/20 22:44:10 sjg Exp $ */
|
||||
/* $NetBSD: suff.c,v 1.78 2016/02/18 18:29:14 christos Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1988, 1989, 1990, 1993
|
||||
@ -69,14 +69,14 @@
|
||||
*/
|
||||
|
||||
#ifndef MAKE_NATIVE
|
||||
static char rcsid[] = "$NetBSD: suff.c,v 1.75 2015/12/20 22:44:10 sjg Exp $";
|
||||
static char rcsid[] = "$NetBSD: suff.c,v 1.78 2016/02/18 18:29:14 christos Exp $";
|
||||
#else
|
||||
#include <sys/cdefs.h>
|
||||
#ifndef lint
|
||||
#if 0
|
||||
static char sccsid[] = "@(#)suff.c 8.4 (Berkeley) 3/21/94";
|
||||
#else
|
||||
__RCSID("$NetBSD: suff.c,v 1.75 2015/12/20 22:44:10 sjg Exp $");
|
||||
__RCSID("$NetBSD: suff.c,v 1.78 2016/02/18 18:29:14 christos Exp $");
|
||||
#endif
|
||||
#endif /* not lint */
|
||||
#endif
|
||||
@ -1556,7 +1556,7 @@ SuffExpandChildren(LstNode cln, GNode *pgn)
|
||||
if (DEBUG(SUFF)) {
|
||||
fprintf(debug_file, "Expanding \"%s\"...", cgn->name);
|
||||
}
|
||||
cp = Var_Subst(NULL, cgn->name, pgn, TRUE, TRUE);
|
||||
cp = Var_Subst(NULL, cgn->name, pgn, VARF_UNDEFERR|VARF_WANTRES);
|
||||
|
||||
if (cp != NULL) {
|
||||
Lst members = Lst_Init(FALSE);
|
||||
@ -1609,13 +1609,13 @@ SuffExpandChildren(LstNode cln, GNode *pgn)
|
||||
int len;
|
||||
void *freeIt;
|
||||
|
||||
junk = Var_Parse(cp, pgn, TRUE, TRUE, &len, &freeIt);
|
||||
junk = Var_Parse(cp, pgn, VARF_UNDEFERR|VARF_WANTRES,
|
||||
&len, &freeIt);
|
||||
if (junk != var_Error) {
|
||||
cp += len - 1;
|
||||
}
|
||||
|
||||
if (freeIt)
|
||||
free(freeIt);
|
||||
free(freeIt);
|
||||
} else if (*cp == '\\' && *cp != '\0') {
|
||||
/*
|
||||
* Escaped something -- skip over it
|
||||
@ -1933,8 +1933,7 @@ SuffFindArchiveDeps(GNode *gn, Lst slst)
|
||||
for (i = (sizeof(copy)/sizeof(copy[0]))-1; i >= 0; i--) {
|
||||
char *p1;
|
||||
Var_Set(copy[i], Var_Value(copy[i], mem, &p1), gn, 0);
|
||||
if (p1)
|
||||
free(p1);
|
||||
free(p1);
|
||||
|
||||
}
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: targ.c,v 1.60 2015/05/25 09:01:06 manu Exp $ */
|
||||
/* $NetBSD: targ.c,v 1.61 2016/01/17 17:45:21 christos Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1988, 1989, 1990, 1993
|
||||
@ -69,14 +69,14 @@
|
||||
*/
|
||||
|
||||
#ifndef MAKE_NATIVE
|
||||
static char rcsid[] = "$NetBSD: targ.c,v 1.60 2015/05/25 09:01:06 manu Exp $";
|
||||
static char rcsid[] = "$NetBSD: targ.c,v 1.61 2016/01/17 17:45:21 christos Exp $";
|
||||
#else
|
||||
#include <sys/cdefs.h>
|
||||
#ifndef lint
|
||||
#if 0
|
||||
static char sccsid[] = "@(#)targ.c 8.2 (Berkeley) 3/19/94";
|
||||
#else
|
||||
__RCSID("$NetBSD: targ.c,v 1.60 2015/05/25 09:01:06 manu Exp $");
|
||||
__RCSID("$NetBSD: targ.c,v 1.61 2016/01/17 17:45:21 christos Exp $");
|
||||
#endif
|
||||
#endif /* not lint */
|
||||
#endif
|
||||
@ -292,10 +292,8 @@ TargFreeGN(void *gnp)
|
||||
|
||||
|
||||
free(gn->name);
|
||||
if (gn->uname)
|
||||
free(gn->uname);
|
||||
if (gn->path)
|
||||
free(gn->path);
|
||||
free(gn->uname);
|
||||
free(gn->path);
|
||||
/* gn->fname points to name allocated when file was opened, don't free */
|
||||
|
||||
Lst_Destroy(gn->iParents, NULL);
|
||||
|
@ -2,8 +2,10 @@ make:
|
||||
UT_TEST=export-env.mk
|
||||
UT_ENV=not-exported
|
||||
UT_EXP=not-exported
|
||||
UT_LIT=literal export-env.mk
|
||||
env:
|
||||
UT_TEST=export-env.mk
|
||||
UT_ENV=exported
|
||||
UT_EXP=exported
|
||||
UT_LIT=literal ${UT_TEST}
|
||||
exit status 0
|
||||
|
@ -1,4 +1,4 @@
|
||||
# $Id: export-env.mk,v 1.1.1.1 2014/08/30 18:57:18 sjg Exp $
|
||||
# $Id: export-env.mk,v 1.1.1.2 2016/02/18 20:35:24 sjg Exp $
|
||||
|
||||
# our normal .export, subsequent changes affect the environment
|
||||
UT_TEST=this
|
||||
@ -15,9 +15,12 @@ UT_EXP=before-export
|
||||
export UT_EXP=exported
|
||||
UT_EXP=not-exported
|
||||
|
||||
UT_LIT= literal ${UT_TEST}
|
||||
.export-literal UT_LIT
|
||||
|
||||
all:
|
||||
@echo make:; ${UT_TEST UT_ENV UT_EXP:L:@v@echo $v=${$v};@}
|
||||
@echo env:; ${UT_TEST UT_ENV UT_EXP:L:@v@echo $v=$${$v};@}
|
||||
@echo make:; ${UT_TEST UT_ENV UT_EXP UT_LIT:L:@v@echo $v=${$v};@}
|
||||
@echo env:; ${UT_TEST UT_ENV UT_EXP UT_LIT:L:@v@echo $v=$${$v};@}
|
||||
|
||||
|
||||
|
||||
|
@ -23,10 +23,16 @@ THREE
|
||||
FOUR
|
||||
FIVE
|
||||
SIX"
|
||||
LIST:ts/xa:tu="ONE
|
||||
TWO
|
||||
THREE
|
||||
FOUR
|
||||
FIVE
|
||||
SIX"
|
||||
make: Bad modifier `:tx' for LIST
|
||||
LIST:tx="}"
|
||||
make: Bad modifier `:ts\x' for LIST
|
||||
LIST:ts/x:tu="\x:tu}"
|
||||
make: Bad modifier `:ts\X' for LIST
|
||||
LIST:ts/x:tu="\X:tu}"
|
||||
FU_mod-ts="a/b/cool"
|
||||
FU_mod-ts:ts:T="cool" == cool?
|
||||
B.${AAA:ts}="Baaa" == Baaa?
|
||||
|
@ -36,8 +36,9 @@ mod-ts:
|
||||
@${PRINT} 'LIST:ts/n="${LIST:ts\n}"'
|
||||
@${PRINT} 'LIST:ts/t="${LIST:ts\t}"'
|
||||
@${PRINT} 'LIST:ts/012:tu="${LIST:ts\012:tu}"'
|
||||
@${PRINT} 'LIST:ts/xa:tu="${LIST:ts\xa:tu}"'
|
||||
@${PRINT} 'LIST:tx="${LIST:tx}"'
|
||||
@${PRINT} 'LIST:ts/x:tu="${LIST:ts\x:tu}"'
|
||||
@${PRINT} 'LIST:ts/x:tu="${LIST:ts\X:tu}"'
|
||||
@${PRINT} 'FU_$@="${FU_${@:ts}:ts}"'
|
||||
@${PRINT} 'FU_$@:ts:T="${FU_${@:ts}:ts:T}" == cool?'
|
||||
@${PRINT} 'B.$${AAA:ts}="${B.${AAA:ts}}" == Baaa?'
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: var.c,v 1.200 2015/12/01 07:26:08 sjg Exp $ */
|
||||
/* $NetBSD: var.c,v 1.206 2016/03/07 20:20:35 sjg Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1988, 1989, 1990, 1993
|
||||
@ -69,14 +69,14 @@
|
||||
*/
|
||||
|
||||
#ifndef MAKE_NATIVE
|
||||
static char rcsid[] = "$NetBSD: var.c,v 1.200 2015/12/01 07:26:08 sjg Exp $";
|
||||
static char rcsid[] = "$NetBSD: var.c,v 1.206 2016/03/07 20:20:35 sjg Exp $";
|
||||
#else
|
||||
#include <sys/cdefs.h>
|
||||
#ifndef lint
|
||||
#if 0
|
||||
static char sccsid[] = "@(#)var.c 8.3 (Berkeley) 3/19/94";
|
||||
#else
|
||||
__RCSID("$NetBSD: var.c,v 1.200 2015/12/01 07:26:08 sjg Exp $");
|
||||
__RCSID("$NetBSD: var.c,v 1.206 2016/03/07 20:20:35 sjg Exp $");
|
||||
#endif
|
||||
#endif /* not lint */
|
||||
#endif
|
||||
@ -154,12 +154,22 @@ char **savedEnv = NULL;
|
||||
char var_Error[] = "";
|
||||
|
||||
/*
|
||||
* Similar to var_Error, but returned when the 'errnum' flag for Var_Parse is
|
||||
* set false. Why not just use a constant? Well, gcc likes to condense
|
||||
* identical string instances...
|
||||
* Similar to var_Error, but returned when the 'VARF_UNDEFERR' flag for
|
||||
* Var_Parse is not set. Why not just use a constant? Well, gcc likes
|
||||
* to condense identical string instances...
|
||||
*/
|
||||
static char varNoError[] = "";
|
||||
|
||||
/*
|
||||
* Traditionally we consume $$ during := like any other expansion.
|
||||
* Other make's do not.
|
||||
* This knob allows controlling the behavior.
|
||||
* FALSE for old behavior.
|
||||
* TRUE for new compatible.
|
||||
*/
|
||||
#define SAVE_DOLLARS ".MAKE.SAVE_DOLLARS"
|
||||
static Boolean save_dollars = FALSE;
|
||||
|
||||
/*
|
||||
* Internally, variables are contained in four different contexts.
|
||||
* 1) the environment. They may not be changed. If an environment
|
||||
@ -216,7 +226,11 @@ static int var_exportedVars = VAR_EXPORTED_NONE;
|
||||
* We pass this to Var_Export when doing the initial export
|
||||
* or after updating an exported var.
|
||||
*/
|
||||
#define VAR_EXPORT_PARENT 1
|
||||
#define VAR_EXPORT_PARENT 1
|
||||
/*
|
||||
* We pass this to Var_Export1 to tell it to leave the value alone.
|
||||
*/
|
||||
#define VAR_EXPORT_LITERAL 2
|
||||
|
||||
/* Var*Pattern flags */
|
||||
#define VAR_SUB_GLOBAL 0x01 /* Apply substitution globally */
|
||||
@ -541,7 +555,7 @@ Var_Delete(const char *name, GNode *ctxt)
|
||||
char *cp;
|
||||
|
||||
if (strchr(name, '$')) {
|
||||
cp = Var_Subst(NULL, name, VAR_GLOBAL, FALSE, TRUE);
|
||||
cp = Var_Subst(NULL, name, VAR_GLOBAL, VARF_WANTRES);
|
||||
} else {
|
||||
cp = (char *)name;
|
||||
}
|
||||
@ -580,12 +594,13 @@ Var_Delete(const char *name, GNode *ctxt)
|
||||
* We only manipulate flags of vars if 'parent' is set.
|
||||
*/
|
||||
static int
|
||||
Var_Export1(const char *name, int parent)
|
||||
Var_Export1(const char *name, int flags)
|
||||
{
|
||||
char tmp[BUFSIZ];
|
||||
Var *v;
|
||||
char *val = NULL;
|
||||
int n;
|
||||
int parent = (flags & VAR_EXPORT_PARENT);
|
||||
|
||||
if (*name == '.')
|
||||
return 0; /* skip internals */
|
||||
@ -613,7 +628,7 @@ Var_Export1(const char *name, int parent)
|
||||
return 0; /* nothing to do */
|
||||
}
|
||||
val = Buf_GetAll(&v->val, NULL);
|
||||
if (strchr(val, '$')) {
|
||||
if ((flags & VAR_EXPORT_LITERAL) == 0 && strchr(val, '$')) {
|
||||
if (parent) {
|
||||
/*
|
||||
* Flag this as something we need to re-export.
|
||||
@ -632,7 +647,7 @@ Var_Export1(const char *name, int parent)
|
||||
}
|
||||
n = snprintf(tmp, sizeof(tmp), "${%s}", name);
|
||||
if (n < (int)sizeof(tmp)) {
|
||||
val = Var_Subst(NULL, tmp, VAR_GLOBAL, FALSE, TRUE);
|
||||
val = Var_Subst(NULL, tmp, VAR_GLOBAL, VARF_WANTRES);
|
||||
setenv(name, val, 1);
|
||||
free(val);
|
||||
}
|
||||
@ -700,7 +715,7 @@ Var_ExportVars(void)
|
||||
int ac;
|
||||
int i;
|
||||
|
||||
val = Var_Subst(NULL, tmp, VAR_GLOBAL, FALSE, TRUE);
|
||||
val = Var_Subst(NULL, tmp, VAR_GLOBAL, VARF_WANTRES);
|
||||
if (*val) {
|
||||
av = brk_string(val, &ac, FALSE, &as);
|
||||
for (i = 0; i < ac; i++) {
|
||||
@ -725,7 +740,7 @@ Var_Export(char *str, int isExport)
|
||||
char *val;
|
||||
char **av;
|
||||
char *as;
|
||||
int track;
|
||||
int flags;
|
||||
int ac;
|
||||
int i;
|
||||
|
||||
@ -734,13 +749,16 @@ Var_Export(char *str, int isExport)
|
||||
return;
|
||||
}
|
||||
|
||||
flags = 0;
|
||||
if (strncmp(str, "-env", 4) == 0) {
|
||||
track = 0;
|
||||
str += 4;
|
||||
} else if (strncmp(str, "-literal", 8) == 0) {
|
||||
str += 8;
|
||||
flags |= VAR_EXPORT_LITERAL;
|
||||
} else {
|
||||
track = VAR_EXPORT_PARENT;
|
||||
flags |= VAR_EXPORT_PARENT;
|
||||
}
|
||||
val = Var_Subst(NULL, str, VAR_GLOBAL, FALSE, TRUE);
|
||||
val = Var_Subst(NULL, str, VAR_GLOBAL, VARF_WANTRES);
|
||||
if (*val) {
|
||||
av = brk_string(val, &ac, FALSE, &as);
|
||||
for (i = 0; i < ac; i++) {
|
||||
@ -760,10 +778,10 @@ Var_Export(char *str, int isExport)
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if (Var_Export1(name, track)) {
|
||||
if (Var_Export1(name, flags)) {
|
||||
if (VAR_EXPORTED_ALL != var_exportedVars)
|
||||
var_exportedVars = VAR_EXPORTED_YES;
|
||||
if (isExport && track) {
|
||||
if (isExport && (flags & VAR_EXPORT_PARENT)) {
|
||||
Var_Append(MAKE_EXPORTED, name, VAR_GLOBAL);
|
||||
}
|
||||
}
|
||||
@ -830,7 +848,7 @@ Var_UnExport(char *str)
|
||||
/* Using .MAKE.EXPORTED */
|
||||
n = snprintf(tmp, sizeof(tmp), "${" MAKE_EXPORTED ":O:u}");
|
||||
if (n < (int)sizeof(tmp)) {
|
||||
vlist = Var_Subst(NULL, tmp, VAR_GLOBAL, FALSE, TRUE);
|
||||
vlist = Var_Subst(NULL, tmp, VAR_GLOBAL, VARF_WANTRES);
|
||||
}
|
||||
}
|
||||
if (vlist) {
|
||||
@ -860,7 +878,7 @@ Var_UnExport(char *str)
|
||||
n = snprintf(tmp, sizeof(tmp),
|
||||
"${" MAKE_EXPORTED ":N%s}", v->name);
|
||||
if (n < (int)sizeof(tmp)) {
|
||||
cp = Var_Subst(NULL, tmp, VAR_GLOBAL, FALSE, TRUE);
|
||||
cp = Var_Subst(NULL, tmp, VAR_GLOBAL, VARF_WANTRES);
|
||||
Var_Set(MAKE_EXPORTED, cp, VAR_GLOBAL, 0);
|
||||
free(cp);
|
||||
}
|
||||
@ -915,7 +933,7 @@ Var_Set(const char *name, const char *val, GNode *ctxt, int flags)
|
||||
* point in searching them all just to save a bit of memory...
|
||||
*/
|
||||
if (strchr(name, '$') != NULL) {
|
||||
expanded_name = Var_Subst(NULL, name, ctxt, FALSE, TRUE);
|
||||
expanded_name = Var_Subst(NULL, name, ctxt, VARF_WANTRES);
|
||||
if (expanded_name[0] == 0) {
|
||||
if (DEBUG(VAR)) {
|
||||
fprintf(debug_file, "Var_Set(\"%s\", \"%s\", ...) "
|
||||
@ -983,7 +1001,10 @@ Var_Set(const char *name, const char *val, GNode *ctxt, int flags)
|
||||
|
||||
Var_Append(MAKEOVERRIDES, name, VAR_GLOBAL);
|
||||
}
|
||||
|
||||
if (*name == '.') {
|
||||
if (strcmp(name, SAVE_DOLLARS) == 0)
|
||||
save_dollars = s2Boolean(val, save_dollars);
|
||||
}
|
||||
|
||||
out:
|
||||
free(expanded_name);
|
||||
@ -1026,7 +1047,7 @@ Var_Append(const char *name, const char *val, GNode *ctxt)
|
||||
char *expanded_name = NULL;
|
||||
|
||||
if (strchr(name, '$') != NULL) {
|
||||
expanded_name = Var_Subst(NULL, name, ctxt, FALSE, TRUE);
|
||||
expanded_name = Var_Subst(NULL, name, ctxt, VARF_WANTRES);
|
||||
if (expanded_name[0] == 0) {
|
||||
if (DEBUG(VAR)) {
|
||||
fprintf(debug_file, "Var_Append(\"%s\", \"%s\", ...) "
|
||||
@ -1091,7 +1112,7 @@ Var_Exists(const char *name, GNode *ctxt)
|
||||
char *cp;
|
||||
|
||||
if ((cp = strchr(name, '$')) != NULL) {
|
||||
cp = Var_Subst(NULL, name, ctxt, FALSE, TRUE);
|
||||
cp = Var_Subst(NULL, name, ctxt, VARF_WANTRES);
|
||||
}
|
||||
v = VarFind(cp ? cp : name, ctxt, FIND_CMD|FIND_GLOBAL|FIND_ENV);
|
||||
free(cp);
|
||||
@ -1389,7 +1410,7 @@ VarSYSVMatch(GNode *ctx, Var_Parse_State *vpstate,
|
||||
addSpace = TRUE;
|
||||
|
||||
if ((ptr = Str_SYSVMatch(word, pat->lhs, &len)) != NULL) {
|
||||
varexp = Var_Subst(NULL, pat->rhs, ctx, FALSE, TRUE);
|
||||
varexp = Var_Subst(NULL, pat->rhs, ctx, VARF_WANTRES);
|
||||
Str_SYSVSubst(buf, varexp, ptr, len);
|
||||
free(varexp);
|
||||
} else {
|
||||
@ -1629,14 +1650,14 @@ VarSubstitute(GNode *ctx MAKE_ATTR_UNUSED, Var_Parse_State *vpstate,
|
||||
*-----------------------------------------------------------------------
|
||||
*/
|
||||
static void
|
||||
VarREError(int errnum, regex_t *pat, const char *str)
|
||||
VarREError(int reerr, regex_t *pat, const char *str)
|
||||
{
|
||||
char *errbuf;
|
||||
int errlen;
|
||||
|
||||
errlen = regerror(errnum, pat, 0, 0);
|
||||
errlen = regerror(reerr, pat, 0, 0);
|
||||
errbuf = bmake_malloc(errlen);
|
||||
regerror(errnum, pat, errbuf, errlen);
|
||||
regerror(reerr, pat, errbuf, errlen);
|
||||
Error("%s: %s", str, errbuf);
|
||||
free(errbuf);
|
||||
}
|
||||
@ -1809,7 +1830,7 @@ VarLoopExpand(GNode *ctx MAKE_ATTR_UNUSED,
|
||||
|
||||
if (word && *word) {
|
||||
Var_Set(loop->tvar, word, loop->ctxt, VAR_NO_EXPORT);
|
||||
s = Var_Subst(NULL, loop->str, loop->ctxt, loop->errnum, TRUE);
|
||||
s = Var_Subst(NULL, loop->str, loop->ctxt, loop->errnum | VARF_WANTRES);
|
||||
if (s != NULL && *s != '\0') {
|
||||
if (addSpace && *s != '\n')
|
||||
Buf_AddByte(buf, ' ');
|
||||
@ -2143,13 +2164,14 @@ VarUniq(const char *str)
|
||||
*/
|
||||
static char *
|
||||
VarGetPattern(GNode *ctxt, Var_Parse_State *vpstate MAKE_ATTR_UNUSED,
|
||||
int errnum, const char **tstr, int delim, int *flags,
|
||||
int flags, const char **tstr, int delim, int *vflags,
|
||||
int *length, VarPattern *pattern)
|
||||
{
|
||||
const char *cp;
|
||||
char *rstr;
|
||||
Buffer buf;
|
||||
int junk;
|
||||
int errnum = flags & VARF_UNDEFERR;
|
||||
|
||||
Buf_Init(&buf, 0);
|
||||
if (length == NULL)
|
||||
@ -2171,16 +2193,16 @@ VarGetPattern(GNode *ctxt, Var_Parse_State *vpstate MAKE_ATTR_UNUSED,
|
||||
cp++;
|
||||
} else if (*cp == '$') {
|
||||
if (cp[1] == delim) {
|
||||
if (flags == NULL)
|
||||
if (vflags == NULL)
|
||||
Buf_AddByte(&buf, *cp);
|
||||
else
|
||||
/*
|
||||
* Unescaped $ at end of pattern => anchor
|
||||
* pattern at end.
|
||||
*/
|
||||
*flags |= VAR_MATCH_END;
|
||||
*vflags |= VAR_MATCH_END;
|
||||
} else {
|
||||
if (flags == NULL || (*flags & VAR_NOSUBST) == 0) {
|
||||
if (vflags == NULL || (*vflags & VAR_NOSUBST) == 0) {
|
||||
char *cp2;
|
||||
int len;
|
||||
void *freeIt;
|
||||
@ -2190,7 +2212,8 @@ VarGetPattern(GNode *ctxt, Var_Parse_State *vpstate MAKE_ATTR_UNUSED,
|
||||
* delimiter, assume it's a variable
|
||||
* substitution and recurse.
|
||||
*/
|
||||
cp2 = Var_Parse(cp, ctxt, errnum, TRUE, &len, &freeIt);
|
||||
cp2 = Var_Parse(cp, ctxt, errnum | VARF_WANTRES, &len,
|
||||
&freeIt);
|
||||
Buf_AddBytes(&buf, strlen(cp2), cp2);
|
||||
free(freeIt);
|
||||
cp += len - 1;
|
||||
@ -2463,7 +2486,7 @@ VarStrftime(const char *fmt, int zulu)
|
||||
static char *
|
||||
ApplyModifiers(char *nstr, const char *tstr,
|
||||
int startc, int endc,
|
||||
Var *v, GNode *ctxt, Boolean errnum, Boolean wantit,
|
||||
Var *v, GNode *ctxt, int flags,
|
||||
int *lengthPtr, void **freePtr)
|
||||
{
|
||||
const char *start;
|
||||
@ -2494,7 +2517,7 @@ ApplyModifiers(char *nstr, const char *tstr,
|
||||
int rlen;
|
||||
int c;
|
||||
|
||||
rval = Var_Parse(tstr, ctxt, errnum, wantit, &rlen, &freeIt);
|
||||
rval = Var_Parse(tstr, ctxt, flags, &rlen, &freeIt);
|
||||
|
||||
/*
|
||||
* If we have not parsed up to endc or ':',
|
||||
@ -2519,10 +2542,9 @@ ApplyModifiers(char *nstr, const char *tstr,
|
||||
int used;
|
||||
|
||||
nstr = ApplyModifiers(nstr, rval,
|
||||
0, 0,
|
||||
v, ctxt, errnum, wantit, &used, freePtr);
|
||||
0, 0, v, ctxt, flags, &used, freePtr);
|
||||
if (nstr == var_Error
|
||||
|| (nstr == varNoError && errnum == 0)
|
||||
|| (nstr == varNoError && (flags & VARF_UNDEFERR) == 0)
|
||||
|| strlen(rval) != (size_t) used) {
|
||||
free(freeIt);
|
||||
goto out; /* error already reported */
|
||||
@ -2557,7 +2579,7 @@ ApplyModifiers(char *nstr, const char *tstr,
|
||||
char *sv_name;
|
||||
VarPattern pattern;
|
||||
int how;
|
||||
int flags;
|
||||
int vflags;
|
||||
|
||||
if (v->name[0] == 0)
|
||||
goto bad_modifier;
|
||||
@ -2593,9 +2615,9 @@ ApplyModifiers(char *nstr, const char *tstr,
|
||||
delim = startc == PROPEN ? PRCLOSE : BRCLOSE;
|
||||
pattern.flags = 0;
|
||||
|
||||
flags = (wantit) ? 0 : VAR_NOSUBST;
|
||||
pattern.rhs = VarGetPattern(ctxt, &parsestate, errnum,
|
||||
&cp, delim, &flags,
|
||||
vflags = (flags & VARF_WANTRES) ? 0 : VAR_NOSUBST;
|
||||
pattern.rhs = VarGetPattern(ctxt, &parsestate, flags,
|
||||
&cp, delim, &vflags,
|
||||
&pattern.rightLen,
|
||||
NULL);
|
||||
if (v->flags & VAR_JUNK) {
|
||||
@ -2609,7 +2631,7 @@ ApplyModifiers(char *nstr, const char *tstr,
|
||||
termc = *--cp;
|
||||
delim = '\0';
|
||||
|
||||
if (wantit) {
|
||||
if (flags & VARF_WANTRES) {
|
||||
switch (how) {
|
||||
case '+':
|
||||
Var_Append(v->name, pattern.rhs, v_ctxt);
|
||||
@ -2640,29 +2662,30 @@ ApplyModifiers(char *nstr, const char *tstr,
|
||||
case '@':
|
||||
{
|
||||
VarLoop_t loop;
|
||||
int flags = VAR_NOSUBST;
|
||||
int vflags = VAR_NOSUBST;
|
||||
|
||||
cp = ++tstr;
|
||||
delim = '@';
|
||||
if ((loop.tvar = VarGetPattern(ctxt, &parsestate, errnum,
|
||||
if ((loop.tvar = VarGetPattern(ctxt, &parsestate, flags,
|
||||
&cp, delim,
|
||||
&flags, &loop.tvarLen,
|
||||
&vflags, &loop.tvarLen,
|
||||
NULL)) == NULL)
|
||||
goto cleanup;
|
||||
|
||||
if ((loop.str = VarGetPattern(ctxt, &parsestate, errnum,
|
||||
if ((loop.str = VarGetPattern(ctxt, &parsestate, flags,
|
||||
&cp, delim,
|
||||
&flags, &loop.strLen,
|
||||
&vflags, &loop.strLen,
|
||||
NULL)) == NULL)
|
||||
goto cleanup;
|
||||
|
||||
termc = *cp;
|
||||
delim = '\0';
|
||||
|
||||
loop.errnum = errnum;
|
||||
loop.errnum = flags & VARF_UNDEFERR;
|
||||
loop.ctxt = ctxt;
|
||||
newStr = VarModify(ctxt, &parsestate, nstr, VarLoopExpand,
|
||||
&loop);
|
||||
Var_Delete(loop.tvar, ctxt);
|
||||
free(loop.tvar);
|
||||
free(loop.str);
|
||||
break;
|
||||
@ -2671,15 +2694,19 @@ ApplyModifiers(char *nstr, const char *tstr,
|
||||
case 'U':
|
||||
{
|
||||
Buffer buf; /* Buffer for patterns */
|
||||
int wantit_; /* want data in buffer */
|
||||
int nflags;
|
||||
|
||||
if (wantit) {
|
||||
if (flags & VARF_WANTRES) {
|
||||
int wantres;
|
||||
if (*tstr == 'U')
|
||||
wantit_ = ((v->flags & VAR_JUNK) != 0);
|
||||
wantres = ((v->flags & VAR_JUNK) != 0);
|
||||
else
|
||||
wantit_ = ((v->flags & VAR_JUNK) == 0);
|
||||
wantres = ((v->flags & VAR_JUNK) == 0);
|
||||
nflags = flags & ~VARF_WANTRES;
|
||||
if (wantres)
|
||||
nflags |= VARF_WANTRES;
|
||||
} else
|
||||
wantit_ = wantit;
|
||||
nflags = flags;
|
||||
/*
|
||||
* Pass through tstr looking for 1) escaped delimiters,
|
||||
* '$'s and backslashes (place the escaped character in
|
||||
@ -2708,7 +2735,7 @@ ApplyModifiers(char *nstr, const char *tstr,
|
||||
int len;
|
||||
void *freeIt;
|
||||
|
||||
cp2 = Var_Parse(cp, ctxt, errnum, wantit_, &len, &freeIt);
|
||||
cp2 = Var_Parse(cp, ctxt, nflags, &len, &freeIt);
|
||||
Buf_AddBytes(&buf, strlen(cp2), cp2);
|
||||
free(freeIt);
|
||||
cp += len - 1;
|
||||
@ -2721,7 +2748,7 @@ ApplyModifiers(char *nstr, const char *tstr,
|
||||
|
||||
if ((v->flags & VAR_JUNK) != 0)
|
||||
v->flags |= VAR_KEEP;
|
||||
if (wantit_) {
|
||||
if (nflags & VARF_WANTRES) {
|
||||
newStr = Buf_Destroy(&buf, FALSE);
|
||||
} else {
|
||||
newStr = nstr;
|
||||
@ -2768,12 +2795,12 @@ ApplyModifiers(char *nstr, const char *tstr,
|
||||
delim = '!';
|
||||
emsg = NULL;
|
||||
cp = ++tstr;
|
||||
if ((pattern.rhs = VarGetPattern(ctxt, &parsestate, errnum,
|
||||
if ((pattern.rhs = VarGetPattern(ctxt, &parsestate, flags,
|
||||
&cp, delim,
|
||||
NULL, &pattern.rightLen,
|
||||
NULL)) == NULL)
|
||||
goto cleanup;
|
||||
if (wantit)
|
||||
if (flags & VARF_WANTRES)
|
||||
newStr = Cmd_Exec(pattern.rhs, &emsg);
|
||||
else
|
||||
newStr = varNoError;
|
||||
@ -2801,7 +2828,7 @@ ApplyModifiers(char *nstr, const char *tstr,
|
||||
cp = tstr+1; /* point to char after '[' */
|
||||
delim = ']'; /* look for closing ']' */
|
||||
estr = VarGetPattern(ctxt, &parsestate,
|
||||
errnum, &cp, delim,
|
||||
flags, &cp, delim,
|
||||
NULL, NULL, NULL);
|
||||
if (estr == NULL)
|
||||
goto cleanup; /* report missing ']' */
|
||||
@ -2978,6 +3005,9 @@ ApplyModifiers(char *nstr, const char *tstr,
|
||||
parsestate.varSpace = 0; /* no separator */
|
||||
cp = tstr + 2;
|
||||
} else if (tstr[2] == '\\') {
|
||||
const char *xp = &tstr[3];
|
||||
int base = 8; /* assume octal */
|
||||
|
||||
switch (tstr[3]) {
|
||||
case 'n':
|
||||
parsestate.varSpace = '\n';
|
||||
@ -2987,12 +3017,20 @@ ApplyModifiers(char *nstr, const char *tstr,
|
||||
parsestate.varSpace = '\t';
|
||||
cp = tstr + 4;
|
||||
break;
|
||||
case 'x':
|
||||
base = 16;
|
||||
xp++;
|
||||
goto get_numeric;
|
||||
case '0':
|
||||
base = 0;
|
||||
goto get_numeric;
|
||||
default:
|
||||
if (isdigit((unsigned char)tstr[3])) {
|
||||
char *ep;
|
||||
|
||||
get_numeric:
|
||||
parsestate.varSpace =
|
||||
strtoul(&tstr[3], &ep, 0);
|
||||
strtoul(xp, &ep, base);
|
||||
if (*ep != ':' && *ep != endc)
|
||||
goto bad_modifier;
|
||||
cp = ep;
|
||||
@ -3152,7 +3190,7 @@ ApplyModifiers(char *nstr, const char *tstr,
|
||||
* expand it.
|
||||
*/
|
||||
cp2 = pattern;
|
||||
pattern = Var_Subst(NULL, cp2, ctxt, errnum, TRUE);
|
||||
pattern = Var_Subst(NULL, cp2, ctxt, flags | VARF_WANTRES);
|
||||
free(cp2);
|
||||
}
|
||||
if (DEBUG(VAR))
|
||||
@ -3188,14 +3226,14 @@ ApplyModifiers(char *nstr, const char *tstr,
|
||||
}
|
||||
|
||||
cp = tstr;
|
||||
if ((pattern.lhs = VarGetPattern(ctxt, &parsestate, errnum,
|
||||
if ((pattern.lhs = VarGetPattern(ctxt, &parsestate, flags,
|
||||
&cp, delim,
|
||||
&pattern.flags,
|
||||
&pattern.leftLen,
|
||||
NULL)) == NULL)
|
||||
goto cleanup;
|
||||
|
||||
if ((pattern.rhs = VarGetPattern(ctxt, &parsestate, errnum,
|
||||
if ((pattern.rhs = VarGetPattern(ctxt, &parsestate, flags,
|
||||
&cp, delim, NULL,
|
||||
&pattern.rightLen,
|
||||
&pattern)) == NULL)
|
||||
@ -3242,7 +3280,7 @@ ApplyModifiers(char *nstr, const char *tstr,
|
||||
int lhs_flags, rhs_flags;
|
||||
|
||||
/* find ':', and then substitute accordingly */
|
||||
if (wantit) {
|
||||
if (flags & VARF_WANTRES) {
|
||||
cond_rc = Cond_EvalExpression(NULL, v->name, &value, 0, FALSE);
|
||||
if (cond_rc == COND_INVALID) {
|
||||
lhs_flags = rhs_flags = VAR_NOSUBST;
|
||||
@ -3262,7 +3300,7 @@ ApplyModifiers(char *nstr, const char *tstr,
|
||||
|
||||
cp = ++tstr;
|
||||
delim = ':';
|
||||
if ((pattern.lhs = VarGetPattern(ctxt, &parsestate, errnum,
|
||||
if ((pattern.lhs = VarGetPattern(ctxt, &parsestate, flags,
|
||||
&cp, delim, &lhs_flags,
|
||||
&pattern.leftLen,
|
||||
NULL)) == NULL)
|
||||
@ -3270,7 +3308,7 @@ ApplyModifiers(char *nstr, const char *tstr,
|
||||
|
||||
/* BROPEN or PROPEN */
|
||||
delim = endc;
|
||||
if ((pattern.rhs = VarGetPattern(ctxt, &parsestate, errnum,
|
||||
if ((pattern.rhs = VarGetPattern(ctxt, &parsestate, flags,
|
||||
&cp, delim, &rhs_flags,
|
||||
&pattern.rightLen,
|
||||
NULL)) == NULL)
|
||||
@ -3311,12 +3349,12 @@ ApplyModifiers(char *nstr, const char *tstr,
|
||||
|
||||
cp = tstr;
|
||||
|
||||
if ((re = VarGetPattern(ctxt, &parsestate, errnum, &cp, delim,
|
||||
if ((re = VarGetPattern(ctxt, &parsestate, flags, &cp, delim,
|
||||
NULL, NULL, NULL)) == NULL)
|
||||
goto cleanup;
|
||||
|
||||
if ((pattern.replace = VarGetPattern(ctxt, &parsestate,
|
||||
errnum, &cp, delim, NULL,
|
||||
flags, &cp, delim, NULL,
|
||||
NULL, NULL)) == NULL){
|
||||
free(re);
|
||||
goto cleanup;
|
||||
@ -3440,7 +3478,7 @@ ApplyModifiers(char *nstr, const char *tstr,
|
||||
case 's':
|
||||
if (tstr[1] == 'h' && (tstr[2] == endc || tstr[2] == ':')) {
|
||||
const char *emsg;
|
||||
if (wantit) {
|
||||
if (flags & VARF_WANTRES) {
|
||||
newStr = Cmd_Exec(nstr, &emsg);
|
||||
if (emsg)
|
||||
Error(emsg, nstr);
|
||||
@ -3493,12 +3531,12 @@ ApplyModifiers(char *nstr, const char *tstr,
|
||||
delim='=';
|
||||
cp = tstr;
|
||||
if ((pattern.lhs = VarGetPattern(ctxt, &parsestate,
|
||||
errnum, &cp, delim, &pattern.flags,
|
||||
flags, &cp, delim, &pattern.flags,
|
||||
&pattern.leftLen, NULL)) == NULL)
|
||||
goto cleanup;
|
||||
delim = endc;
|
||||
if ((pattern.rhs = VarGetPattern(ctxt, &parsestate,
|
||||
errnum, &cp, delim, NULL, &pattern.rightLen,
|
||||
flags, &cp, delim, NULL, &pattern.rightLen,
|
||||
&pattern)) == NULL)
|
||||
goto cleanup;
|
||||
|
||||
@ -3581,8 +3619,9 @@ ApplyModifiers(char *nstr, const char *tstr,
|
||||
* Input:
|
||||
* str The string to parse
|
||||
* ctxt The context for the variable
|
||||
* errnum TRUE if undefined variables are an error
|
||||
* wantit TRUE if we actually want the result
|
||||
* flags VARF_UNDEFERR if undefineds are an error
|
||||
* VARF_WANTRES if we actually want the result
|
||||
* VARF_ASSIGN if we are in a := assignment
|
||||
* lengthPtr OUT: The length of the specification
|
||||
* freePtr OUT: Non-NULL if caller should free *freePtr
|
||||
*
|
||||
@ -3601,9 +3640,8 @@ ApplyModifiers(char *nstr, const char *tstr,
|
||||
*/
|
||||
/* coverity[+alloc : arg-*4] */
|
||||
char *
|
||||
Var_Parse(const char *str, GNode *ctxt,
|
||||
Boolean errnum, Boolean wantit,
|
||||
int *lengthPtr, void **freePtr)
|
||||
Var_Parse(const char *str, GNode *ctxt, int flags,
|
||||
int *lengthPtr, void **freePtr)
|
||||
{
|
||||
const char *tstr; /* Pointer into str */
|
||||
Var *v; /* Variable in invocation */
|
||||
@ -3671,7 +3709,7 @@ Var_Parse(const char *str, GNode *ctxt,
|
||||
/*
|
||||
* Error
|
||||
*/
|
||||
return (errnum ? var_Error : varNoError);
|
||||
return (flags & VARF_UNDEFERR) ? var_Error : varNoError;
|
||||
} else {
|
||||
haveModifier = FALSE;
|
||||
tstr = &str[1];
|
||||
@ -3708,7 +3746,7 @@ Var_Parse(const char *str, GNode *ctxt,
|
||||
if (*tstr == '$') {
|
||||
int rlen;
|
||||
void *freeIt;
|
||||
char *rval = Var_Parse(tstr, ctxt, errnum, wantit, &rlen, &freeIt);
|
||||
char *rval = Var_Parse(tstr, ctxt, flags, &rlen, &freeIt);
|
||||
if (rval != NULL) {
|
||||
Buf_AddBytes(&buf, strlen(rval), rval);
|
||||
}
|
||||
@ -3821,7 +3859,7 @@ Var_Parse(const char *str, GNode *ctxt,
|
||||
return(pstr);
|
||||
} else {
|
||||
Buf_Destroy(&buf, TRUE);
|
||||
return (errnum ? var_Error : varNoError);
|
||||
return (flags & VARF_UNDEFERR) ? var_Error : varNoError;
|
||||
}
|
||||
} else {
|
||||
/*
|
||||
@ -3855,7 +3893,7 @@ Var_Parse(const char *str, GNode *ctxt,
|
||||
*/
|
||||
nstr = Buf_GetAll(&v->val, NULL);
|
||||
if (strchr(nstr, '$') != NULL) {
|
||||
nstr = Var_Subst(NULL, nstr, ctxt, errnum, wantit);
|
||||
nstr = Var_Subst(NULL, nstr, ctxt, flags);
|
||||
*freePtr = nstr;
|
||||
}
|
||||
|
||||
@ -3868,7 +3906,7 @@ Var_Parse(const char *str, GNode *ctxt,
|
||||
extraFree = NULL;
|
||||
if (extramodifiers != NULL) {
|
||||
nstr = ApplyModifiers(nstr, extramodifiers, '(', ')',
|
||||
v, ctxt, errnum, wantit, &used, &extraFree);
|
||||
v, ctxt, flags, &used, &extraFree);
|
||||
}
|
||||
|
||||
if (haveModifier) {
|
||||
@ -3876,7 +3914,7 @@ Var_Parse(const char *str, GNode *ctxt,
|
||||
tstr++;
|
||||
|
||||
nstr = ApplyModifiers(nstr, tstr, startc, endc,
|
||||
v, ctxt, errnum, wantit, &used, freePtr);
|
||||
v, ctxt, flags, &used, freePtr);
|
||||
tstr += used;
|
||||
free(extraFree);
|
||||
} else {
|
||||
@ -3917,7 +3955,7 @@ Var_Parse(const char *str, GNode *ctxt,
|
||||
nstr = bmake_strndup(start, *lengthPtr);
|
||||
*freePtr = nstr;
|
||||
} else {
|
||||
nstr = errnum ? var_Error : varNoError;
|
||||
nstr = (flags & VARF_UNDEFERR) ? var_Error : varNoError;
|
||||
}
|
||||
}
|
||||
if (nstr != Buf_GetAll(&v->val, NULL))
|
||||
@ -3932,15 +3970,16 @@ Var_Parse(const char *str, GNode *ctxt,
|
||||
*-----------------------------------------------------------------------
|
||||
* Var_Subst --
|
||||
* Substitute for all variables in the given string in the given context
|
||||
* If undefErr is TRUE, Parse_Error will be called when an undefined
|
||||
* If flags & VARF_UNDEFERR, Parse_Error will be called when an undefined
|
||||
* variable is encountered.
|
||||
*
|
||||
* Input:
|
||||
* var Named variable || NULL for all
|
||||
* str the string which to substitute
|
||||
* ctxt the context wherein to find variables
|
||||
* undefErr TRUE if undefineds are an error
|
||||
* wantit TRUE if we actually want the result
|
||||
* flags VARF_UNDEFERR if undefineds are an error
|
||||
* VARF_WANTRES if we actually want the result
|
||||
* VARF_ASSIGN if we are in a := assignment
|
||||
*
|
||||
* Results:
|
||||
* The resulting string.
|
||||
@ -3950,8 +3989,7 @@ Var_Parse(const char *str, GNode *ctxt,
|
||||
*-----------------------------------------------------------------------
|
||||
*/
|
||||
char *
|
||||
Var_Subst(const char *var, const char *str, GNode *ctxt,
|
||||
Boolean undefErr, Boolean wantit)
|
||||
Var_Subst(const char *var, const char *str, GNode *ctxt, int flags)
|
||||
{
|
||||
Buffer buf; /* Buffer for forming things */
|
||||
char *val; /* Value to substitute for a variable */
|
||||
@ -3975,6 +4013,8 @@ Var_Subst(const char *var, const char *str, GNode *ctxt,
|
||||
* In such a case, we skip over the escape character and store the
|
||||
* dollar sign into the buffer directly.
|
||||
*/
|
||||
if (save_dollars && (flags & VARF_ASSIGN))
|
||||
Buf_AddByte(&buf, *str);
|
||||
str++;
|
||||
Buf_AddByte(&buf, *str);
|
||||
str++;
|
||||
@ -4049,7 +4089,7 @@ Var_Subst(const char *var, const char *str, GNode *ctxt,
|
||||
continue;
|
||||
}
|
||||
|
||||
val = Var_Parse(str, ctxt, undefErr, wantit, &length, &freeIt);
|
||||
val = Var_Parse(str, ctxt, flags, &length, &freeIt);
|
||||
|
||||
/*
|
||||
* When we come down here, val should either point to the
|
||||
@ -4066,7 +4106,7 @@ Var_Subst(const char *var, const char *str, GNode *ctxt,
|
||||
*/
|
||||
if (oldVars) {
|
||||
str += length;
|
||||
} else if (undefErr || val == var_Error) {
|
||||
} else if ((flags & VARF_UNDEFERR) || val == var_Error) {
|
||||
/*
|
||||
* If variable is undefined, complain and skip the
|
||||
* variable. The complaint will stop us from doing anything
|
||||
|
@ -51,7 +51,8 @@ static const char *debug_name[] = {
|
||||
|
||||
static void
|
||||
_dwarf_elf_write_reloc(Dwarf_Debug dbg, Elf_Data *symtab_data, int endian,
|
||||
void *buf, uint64_t offset, GElf_Xword r_info, GElf_Sxword r_addend)
|
||||
void *buf, uint64_t offset, GElf_Xword r_info, GElf_Sxword r_addend,
|
||||
int is_rel)
|
||||
{
|
||||
GElf_Sym sym;
|
||||
int size;
|
||||
@ -60,6 +61,14 @@ _dwarf_elf_write_reloc(Dwarf_Debug dbg, Elf_Data *symtab_data, int endian,
|
||||
return;
|
||||
if ((size = _dwarf_get_reloc_size(dbg, GELF_R_TYPE(r_info))) == 0)
|
||||
return; /* Unknown or non-absolute relocation. */
|
||||
if (is_rel) {
|
||||
uint64_t roffset = offset;
|
||||
|
||||
if (endian == ELFDATA2MSB)
|
||||
r_addend = _dwarf_read_msb(buf, &roffset, size);
|
||||
else
|
||||
r_addend = _dwarf_read_lsb(buf, &roffset, size);
|
||||
}
|
||||
if (endian == ELFDATA2MSB)
|
||||
_dwarf_write_msb(buf, &offset, sym.st_value + r_addend, size);
|
||||
else
|
||||
@ -76,7 +85,7 @@ _dwarf_elf_apply_rel_reloc(Dwarf_Debug dbg, void *buf, Elf_Data *rel_data,
|
||||
j = 0;
|
||||
while (gelf_getrel(rel_data, j++, &rel) != NULL)
|
||||
_dwarf_elf_write_reloc(dbg, symtab_data, endian, buf,
|
||||
rel.r_offset, rel.r_info, 0);
|
||||
rel.r_offset, rel.r_info, 0, 1);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -89,7 +98,7 @@ _dwarf_elf_apply_rela_reloc(Dwarf_Debug dbg, void *buf, Elf_Data *rel_data,
|
||||
j = 0;
|
||||
while (gelf_getrela(rel_data, j++, &rela) != NULL)
|
||||
_dwarf_elf_write_reloc(dbg, symtab_data, endian, buf,
|
||||
rela.r_offset, rela.r_info, rela.r_addend);
|
||||
rela.r_offset, rela.r_info, rela.r_addend, 0);
|
||||
}
|
||||
|
||||
static int
|
||||
|
@ -1019,6 +1019,7 @@ _libelf_cvt_NOTE_tof(unsigned char *dst, size_t dsz, unsigned char *src,
|
||||
WRITE_WORD(dst, type);
|
||||
|
||||
src += sizeof(Elf_Note);
|
||||
count -= sizeof(Elf_Note);
|
||||
|
||||
if (count < sz)
|
||||
sz = count;
|
||||
|
@ -429,10 +429,15 @@ namespace std {
|
||||
#define _LIBCPP_HAS_NO_CONSTEXPR
|
||||
#endif
|
||||
|
||||
// No version of GCC supports relaxed constexpr rules
|
||||
// Determine if GCC supports relaxed constexpr
|
||||
#if !defined(__cpp_constexpr) || __cpp_constexpr < 201304L
|
||||
#define _LIBCPP_HAS_NO_CXX14_CONSTEXPR
|
||||
#endif
|
||||
|
||||
// GCC 5 will support variable templates
|
||||
#if !defined(__cpp_variable_templates) || __cpp_variable_templates < 201304L
|
||||
#define _LIBCPP_HAS_NO_VARIABLE_TEMPLATES
|
||||
#endif
|
||||
|
||||
#define _NOEXCEPT throw()
|
||||
#define _NOEXCEPT_(x)
|
||||
@ -454,7 +459,6 @@ namespace std {
|
||||
|
||||
#else // __GXX_EXPERIMENTAL_CXX0X__
|
||||
|
||||
#define _LIBCPP_HAS_NO_TRAILING_RETURN
|
||||
#define _LIBCPP_HAS_NO_ALWAYS_INLINE_VARIADICS
|
||||
|
||||
#if _GNUC_VER < 403
|
||||
@ -468,6 +472,7 @@ namespace std {
|
||||
#if _GNUC_VER < 404
|
||||
#define _LIBCPP_HAS_NO_DECLTYPE
|
||||
#define _LIBCPP_HAS_NO_DELETED_FUNCTIONS
|
||||
#define _LIBCPP_HAS_NO_TRAILING_RETURN
|
||||
#define _LIBCPP_HAS_NO_UNICODE_CHARS
|
||||
#define _LIBCPP_HAS_NO_VARIADICS
|
||||
#define _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
|
||||
|
@ -553,7 +553,18 @@ typedef enum memory_order
|
||||
namespace __gcc_atomic {
|
||||
template <typename _Tp>
|
||||
struct __gcc_atomic_t {
|
||||
__gcc_atomic_t() _NOEXCEPT {}
|
||||
|
||||
#if _GNUC_VER >= 501
|
||||
static_assert(is_trivially_copyable<_Tp>::value,
|
||||
"std::atomic<Tp> requires that 'Tp' be a trivially copyable type");
|
||||
#endif
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
#ifndef _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
|
||||
__gcc_atomic_t() _NOEXCEPT = default;
|
||||
#else
|
||||
__gcc_atomic_t() _NOEXCEPT : __a_value() {}
|
||||
#endif // _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
|
||||
_LIBCPP_CONSTEXPR explicit __gcc_atomic_t(_Tp value) _NOEXCEPT
|
||||
: __a_value(value) {}
|
||||
_Tp __a_value;
|
||||
@ -574,7 +585,7 @@ struct __can_assign {
|
||||
sizeof(__test_atomic_assignable<_Tp, _Td>(1)) == sizeof(char);
|
||||
};
|
||||
|
||||
static inline constexpr int __to_gcc_order(memory_order __order) {
|
||||
static inline _LIBCPP_CONSTEXPR int __to_gcc_order(memory_order __order) {
|
||||
// Avoid switch statement to make this a constexpr.
|
||||
return __order == memory_order_relaxed ? __ATOMIC_RELAXED:
|
||||
(__order == memory_order_acquire ? __ATOMIC_ACQUIRE:
|
||||
@ -584,7 +595,7 @@ static inline constexpr int __to_gcc_order(memory_order __order) {
|
||||
__ATOMIC_CONSUME))));
|
||||
}
|
||||
|
||||
static inline constexpr int __to_gcc_failure_order(memory_order __order) {
|
||||
static inline _LIBCPP_CONSTEXPR int __to_gcc_failure_order(memory_order __order) {
|
||||
// Avoid switch statement to make this a constexpr.
|
||||
return __order == memory_order_relaxed ? __ATOMIC_RELAXED:
|
||||
(__order == memory_order_acquire ? __ATOMIC_ACQUIRE:
|
||||
|
@ -1445,7 +1445,8 @@ public:
|
||||
_LIBCPP_INLINE_VISIBILITY size_type length() const _NOEXCEPT {return size();}
|
||||
_LIBCPP_INLINE_VISIBILITY size_type max_size() const _NOEXCEPT;
|
||||
_LIBCPP_INLINE_VISIBILITY size_type capacity() const _NOEXCEPT
|
||||
{return (__is_long() ? __get_long_cap() : __min_cap) - 1;}
|
||||
{return (__is_long() ? __get_long_cap()
|
||||
: static_cast<size_type>(__min_cap)) - 1;}
|
||||
|
||||
void resize(size_type __n, value_type __c);
|
||||
_LIBCPP_INLINE_VISIBILITY void resize(size_type __n) {resize(__n, value_type());}
|
||||
@ -1785,11 +1786,11 @@ private:
|
||||
template <size_type __a> static
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
size_type __align_it(size_type __s) _NOEXCEPT
|
||||
{return __s + (__a-1) & ~(__a-1);}
|
||||
{return (__s + (__a-1)) & ~(__a-1);}
|
||||
enum {__alignment = 16};
|
||||
static _LIBCPP_INLINE_VISIBILITY
|
||||
size_type __recommend(size_type __s) _NOEXCEPT
|
||||
{return (__s < __min_cap ? __min_cap :
|
||||
{return (__s < __min_cap ? static_cast<size_type>(__min_cap) :
|
||||
__align_it<sizeof(value_type) < __alignment ?
|
||||
__alignment/sizeof(value_type) : 1 > (__s+1)) - 1;}
|
||||
|
||||
|
@ -371,7 +371,7 @@ public:
|
||||
error_category() _NOEXCEPT;
|
||||
#else
|
||||
_LIBCPP_ALWAYS_INLINE
|
||||
_LIBCPP_CONSTEXPR_AFTER_CXX11 error_category() _NOEXCEPT _LIBCPP_DEFAULT;
|
||||
_LIBCPP_CONSTEXPR_AFTER_CXX11 error_category() _NOEXCEPT _LIBCPP_DEFAULT
|
||||
#endif
|
||||
private:
|
||||
error_category(const error_category&);// = delete;
|
||||
|
@ -8,6 +8,8 @@ dir=`dirname $0`
|
||||
|
||||
[ "${os}" = "FreeBSD" ] || quick_exit
|
||||
|
||||
requires_exec
|
||||
|
||||
echo "1..2"
|
||||
|
||||
n0=`namegen`
|
||||
|
@ -219,3 +219,37 @@ create_file() {
|
||||
expect 0 lchmod ${name} ${3}
|
||||
fi
|
||||
}
|
||||
|
||||
# Tests for whether or not a filesystem is mounted with a particular option
|
||||
# with -o, e.g. `mount -o noexec`.
|
||||
#
|
||||
# Parameters:
|
||||
# - mount_option - noatime, noexec, etc.
|
||||
#
|
||||
# Returns:
|
||||
# - 0 if mounted with the option.
|
||||
# - 1 otherwise.
|
||||
has_mount_option()
|
||||
{
|
||||
local IFS=,
|
||||
local mount_opt
|
||||
|
||||
local mount_option_search=$1
|
||||
|
||||
# XXX: mountpoint is defined in .../tests/sys/pjdfstest/tests/conf
|
||||
for mount_opt in $(mount -d -p | awk '$2 == "'$mountpoint'" { print $4 }'); do
|
||||
if [ "$mount_opt" = "$mount_option_search" ]; then
|
||||
return 0
|
||||
fi
|
||||
done
|
||||
return 1
|
||||
}
|
||||
|
||||
# Filesystem must be mounted with -o exec
|
||||
requires_exec()
|
||||
{
|
||||
if has_mount_option noexec; then
|
||||
echo "1..0 # SKIP filesystem mounted with -o noexec"
|
||||
exit 0
|
||||
fi
|
||||
}
|
||||
|
@ -8,6 +8,8 @@ dir=`dirname $0`
|
||||
|
||||
[ "${os}:${fs}" = "FreeBSD:UFS" ] || quick_exit
|
||||
|
||||
requires_exec
|
||||
|
||||
echo "1..4"
|
||||
|
||||
n0=`namegen`
|
||||
|
@ -8,6 +8,8 @@ dir=`dirname $0`
|
||||
|
||||
[ "${os}" = "FreeBSD" ] || quick_exit
|
||||
|
||||
requires_exec
|
||||
|
||||
echo "1..2"
|
||||
|
||||
n0=`namegen`
|
||||
|
@ -152,7 +152,7 @@ compile_time_root_prime(int do_ip4, int do_ip6)
|
||||
if(!ah(dp, "I.ROOT-SERVERS.NET.", "2001:7fe::53")) goto failed;
|
||||
if(!ah(dp, "J.ROOT-SERVERS.NET.", "2001:503:c27::2:30")) goto failed;
|
||||
if(!ah(dp, "K.ROOT-SERVERS.NET.", "2001:7fd::1")) goto failed;
|
||||
if(!ah(dp, "L.ROOT-SERVERS.NET.", "2001:500:3::42")) goto failed;
|
||||
if(!ah(dp, "L.ROOT-SERVERS.NET.", "2001:500:9f::42")) goto failed;
|
||||
if(!ah(dp, "M.ROOT-SERVERS.NET.", "2001:dc3::35")) goto failed;
|
||||
}
|
||||
return dp;
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,4 +1,3 @@
|
||||
|
||||
FreeBSD maintainer's guide to OpenSSH-portable
|
||||
==============================================
|
||||
|
||||
@ -166,6 +165,13 @@
|
||||
ignore HPN-related configuration options to avoid breaking existing
|
||||
configurations.
|
||||
|
||||
A) AES-CBC
|
||||
|
||||
The AES-CBC ciphers were removed from the server-side proposal list
|
||||
in 6.7p1 due to theoretical weaknesses and the availability of
|
||||
superior ciphers (including AES-CTR and AES-GCM). We have re-added
|
||||
them for compatibility with third-party clients.
|
||||
|
||||
|
||||
|
||||
This port was brought to you by (in no particular order) DARPA, NAI
|
||||
|
@ -91,11 +91,11 @@ LIBSSH_OBJS=${LIBOPENSSH_OBJS} \
|
||||
sc25519.o ge25519.o fe25519.o ed25519.o verify.o hash.o blocks.o \
|
||||
kex.o kexdh.o kexgex.o kexecdh.o kexc25519.o \
|
||||
kexdhc.o kexgexc.o kexecdhc.o kexc25519c.o \
|
||||
kexdhs.o kexgexs.o kexecdhs.o kexc25519s.o
|
||||
kexdhs.o kexgexs.o kexecdhs.o kexc25519s.o \
|
||||
platform-pledge.o
|
||||
|
||||
SSHOBJS= ssh.o readconf.o clientloop.o sshtty.o \
|
||||
sshconnect.o sshconnect1.o sshconnect2.o mux.o \
|
||||
roaming_common.o roaming_client.o
|
||||
sshconnect.o sshconnect1.o sshconnect2.o mux.o
|
||||
|
||||
SSHDOBJS=sshd.o auth-rhosts.o auth-passwd.o auth-rsa.o auth-rh-rsa.o \
|
||||
audit.o audit-bsm.o audit-linux.o platform.o \
|
||||
@ -108,9 +108,9 @@ SSHDOBJS=sshd.o auth-rhosts.o auth-passwd.o auth-rsa.o auth-rh-rsa.o \
|
||||
auth2-gss.o gss-serv.o gss-serv-krb5.o \
|
||||
loginrec.o auth-pam.o auth-shadow.o auth-sia.o md5crypt.o \
|
||||
sftp-server.o sftp-common.o \
|
||||
roaming_common.o roaming_serv.o \
|
||||
sandbox-null.o sandbox-rlimit.o sandbox-systrace.o sandbox-darwin.o \
|
||||
sandbox-seccomp-filter.o sandbox-capsicum.o
|
||||
sandbox-seccomp-filter.o sandbox-capsicum.o sandbox-pledge.o \
|
||||
sandbox-solaris.o
|
||||
|
||||
MANPAGES = moduli.5.out scp.1.out ssh-add.1.out ssh-agent.1.out ssh-keygen.1.out ssh-keyscan.1.out ssh.1.out sshd.8.out sftp-server.8.out sftp.1.out ssh-keysign.8.out ssh-pkcs11-helper.8.out sshd_config.5.out ssh_config.5.out
|
||||
MANPAGES_IN = moduli.5 scp.1 ssh-add.1 ssh-agent.1 ssh-keygen.1 ssh-keyscan.1 ssh.1 sshd.8 sftp-server.8 sftp.1 ssh-keysign.8 ssh-pkcs11-helper.8 sshd_config.5 ssh_config.5
|
||||
@ -178,14 +178,14 @@ ssh-agent$(EXEEXT): $(LIBCOMPAT) libssh.a ssh-agent.o ssh-pkcs11-client.o
|
||||
ssh-keygen$(EXEEXT): $(LIBCOMPAT) libssh.a ssh-keygen.o
|
||||
$(LD) -o $@ ssh-keygen.o $(LDFLAGS) -lssh -lopenbsd-compat $(LIBS)
|
||||
|
||||
ssh-keysign$(EXEEXT): $(LIBCOMPAT) libssh.a ssh-keysign.o roaming_dummy.o readconf.o
|
||||
$(LD) -o $@ ssh-keysign.o readconf.o roaming_dummy.o $(LDFLAGS) -lssh -lopenbsd-compat $(LIBS)
|
||||
ssh-keysign$(EXEEXT): $(LIBCOMPAT) libssh.a ssh-keysign.o readconf.o
|
||||
$(LD) -o $@ ssh-keysign.o readconf.o $(LDFLAGS) -lssh -lopenbsd-compat $(LIBS)
|
||||
|
||||
ssh-pkcs11-helper$(EXEEXT): $(LIBCOMPAT) libssh.a ssh-pkcs11-helper.o ssh-pkcs11.o
|
||||
$(LD) -o $@ ssh-pkcs11-helper.o ssh-pkcs11.o $(LDFLAGS) -lssh -lopenbsd-compat -lssh -lopenbsd-compat $(LIBS)
|
||||
|
||||
ssh-keyscan$(EXEEXT): $(LIBCOMPAT) libssh.a ssh-keyscan.o roaming_dummy.o
|
||||
$(LD) -o $@ ssh-keyscan.o roaming_dummy.o $(LDFLAGS) -lssh -lopenbsd-compat -lssh $(LIBS)
|
||||
ssh-keyscan$(EXEEXT): $(LIBCOMPAT) libssh.a ssh-keyscan.o
|
||||
$(LD) -o $@ ssh-keyscan.o $(LDFLAGS) -lssh -lopenbsd-compat -lssh $(LIBS)
|
||||
|
||||
sftp-server$(EXEEXT): $(LIBCOMPAT) libssh.a sftp.o sftp-common.o sftp-server.o sftp-server-main.o
|
||||
$(LD) -o $@ sftp-server.o sftp-common.o sftp-server-main.o $(LDFLAGS) -lssh -lopenbsd-compat $(LIBS)
|
||||
@ -327,10 +327,6 @@ install-files:
|
||||
$(INSTALL) -m 644 sftp-server.8.out $(DESTDIR)$(mandir)/$(mansubdir)8/sftp-server.8
|
||||
$(INSTALL) -m 644 ssh-keysign.8.out $(DESTDIR)$(mandir)/$(mansubdir)8/ssh-keysign.8
|
||||
$(INSTALL) -m 644 ssh-pkcs11-helper.8.out $(DESTDIR)$(mandir)/$(mansubdir)8/ssh-pkcs11-helper.8
|
||||
-rm -f $(DESTDIR)$(bindir)/slogin
|
||||
ln -s ./ssh$(EXEEXT) $(DESTDIR)$(bindir)/slogin
|
||||
-rm -f $(DESTDIR)$(mandir)/$(mansubdir)1/slogin.1
|
||||
ln -s ./ssh.1 $(DESTDIR)$(mandir)/$(mansubdir)1/slogin.1
|
||||
|
||||
install-sysconf:
|
||||
if [ ! -d $(DESTDIR)$(sysconfdir) ]; then \
|
||||
@ -359,41 +355,19 @@ install-sysconf:
|
||||
|
||||
host-key: ssh-keygen$(EXEEXT)
|
||||
@if [ -z "$(DESTDIR)" ] ; then \
|
||||
if [ -f "$(sysconfdir)/ssh_host_key" ] ; then \
|
||||
echo "$(sysconfdir)/ssh_host_key already exists, skipping." ; \
|
||||
else \
|
||||
./ssh-keygen -t rsa1 -f $(sysconfdir)/ssh_host_key -N "" ; \
|
||||
fi ; \
|
||||
if [ -f $(sysconfdir)/ssh_host_dsa_key ] ; then \
|
||||
echo "$(sysconfdir)/ssh_host_dsa_key already exists, skipping." ; \
|
||||
else \
|
||||
./ssh-keygen -t dsa -f $(sysconfdir)/ssh_host_dsa_key -N "" ; \
|
||||
fi ; \
|
||||
if [ -f $(sysconfdir)/ssh_host_rsa_key ] ; then \
|
||||
echo "$(sysconfdir)/ssh_host_rsa_key already exists, skipping." ; \
|
||||
else \
|
||||
./ssh-keygen -t rsa -f $(sysconfdir)/ssh_host_rsa_key -N "" ; \
|
||||
fi ; \
|
||||
if [ -f $(sysconfdir)/ssh_host_ed25519_key ] ; then \
|
||||
echo "$(sysconfdir)/ssh_host_ed25519_key already exists, skipping." ; \
|
||||
else \
|
||||
./ssh-keygen -t ed25519 -f $(sysconfdir)/ssh_host_ed25519_key -N "" ; \
|
||||
fi ; \
|
||||
if [ -z "@COMMENT_OUT_ECC@" ] ; then \
|
||||
if [ -f $(sysconfdir)/ssh_host_ecdsa_key ] ; then \
|
||||
echo "$(sysconfdir)/ssh_host_ecdsa_key already exists, skipping." ; \
|
||||
else \
|
||||
./ssh-keygen -t ecdsa -f $(sysconfdir)/ssh_host_ecdsa_key -N "" ; \
|
||||
fi ; \
|
||||
fi ; \
|
||||
fi ;
|
||||
./ssh-keygen -A; \
|
||||
fi
|
||||
|
||||
host-key-force: ssh-keygen$(EXEEXT)
|
||||
./ssh-keygen -t rsa1 -f $(DESTDIR)$(sysconfdir)/ssh_host_key -N ""
|
||||
host-key-force: ssh-keygen$(EXEEXT) ssh$(EXEEXT)
|
||||
if ./ssh -Q protocol-version | grep '^1$$' >/dev/null; then \
|
||||
./ssh-keygen -t rsa1 -f $(DESTDIR)$(sysconfdir)/ssh_host_key -N ""; \
|
||||
fi
|
||||
./ssh-keygen -t dsa -f $(DESTDIR)$(sysconfdir)/ssh_host_dsa_key -N ""
|
||||
./ssh-keygen -t rsa -f $(DESTDIR)$(sysconfdir)/ssh_host_rsa_key -N ""
|
||||
./ssh-keygen -t ed25519 -f $(DESTDIR)$(sysconfdir)/ssh_host_ed25519_key -N ""
|
||||
test -z "@COMMENT_OUT_ECC@" && ./ssh-keygen -t ecdsa -f $(DESTDIR)$(sysconfdir)/ssh_host_ecdsa_key -N ""
|
||||
if ./ssh -Q key | grep ecdsa >/dev/null ; then \
|
||||
./ssh-keygen -t ecdsa -f $(DESTDIR)$(sysconfdir)/ssh_host_ecdsa_key -N ""; \
|
||||
fi
|
||||
|
||||
uninstallall: uninstall
|
||||
-rm -f $(DESTDIR)$(sysconfdir)/ssh_config
|
||||
@ -407,7 +381,6 @@ uninstallall: uninstall
|
||||
-rmdir $(DESTDIR)$(libexecdir)
|
||||
|
||||
uninstall:
|
||||
-rm -f $(DESTDIR)$(bindir)/slogin
|
||||
-rm -f $(DESTDIR)$(bindir)/ssh$(EXEEXT)
|
||||
-rm -f $(DESTDIR)$(bindir)/scp$(EXEEXT)
|
||||
-rm -f $(DESTDIR)$(bindir)/ssh-add$(EXEEXT)
|
||||
@ -430,7 +403,6 @@ uninstall:
|
||||
-rm -f $(DESTDIR)$(mandir)/$(mansubdir)8/sftp-server.8
|
||||
-rm -f $(DESTDIR)$(mandir)/$(mansubdir)8/ssh-keysign.8
|
||||
-rm -f $(DESTDIR)$(mandir)/$(mansubdir)8/ssh-pkcs11-helper.8
|
||||
-rm -f $(DESTDIR)$(mandir)/$(mansubdir)1/slogin.1
|
||||
|
||||
regress-prep:
|
||||
[ -d `pwd`/regress ] || mkdir -p `pwd`/regress
|
||||
@ -462,6 +434,10 @@ regress/netcat$(EXEEXT): $(srcdir)/regress/netcat.c
|
||||
$(CC) $(CFLAGS) $(CPPFLAGS) -o $@ $? \
|
||||
$(LDFLAGS) -lssh -lopenbsd-compat -lssh -lopenbsd-compat $(LIBS)
|
||||
|
||||
regress/check-perm$(EXEEXT): $(srcdir)/regress/check-perm.c
|
||||
$(CC) $(CFLAGS) $(CPPFLAGS) -o $@ $? \
|
||||
$(LDFLAGS) -lssh -lopenbsd-compat -lssh -lopenbsd-compat $(LIBS)
|
||||
|
||||
UNITTESTS_TEST_HELPER_OBJS=\
|
||||
regress/unittests/test_helper/test_helper.o \
|
||||
regress/unittests/test_helper/fuzz.o
|
||||
@ -510,8 +486,7 @@ regress/unittests/bitmap/test_bitmap$(EXEEXT): ${UNITTESTS_TEST_BITMAP_OBJS} \
|
||||
|
||||
UNITTESTS_TEST_KEX_OBJS=\
|
||||
regress/unittests/kex/tests.o \
|
||||
regress/unittests/kex/test_kex.o \
|
||||
roaming_dummy.o
|
||||
regress/unittests/kex/test_kex.o
|
||||
|
||||
regress/unittests/kex/test_kex$(EXEEXT): ${UNITTESTS_TEST_KEX_OBJS} \
|
||||
regress/unittests/test_helper/libtest_helper.a libssh.a
|
||||
@ -534,6 +509,7 @@ REGRESS_BINARIES=\
|
||||
regress/modpipe$(EXEEXT) \
|
||||
regress/setuid-allowed$(EXEEXT) \
|
||||
regress/netcat$(EXEEXT) \
|
||||
regress/check-perm$(EXEEXT) \
|
||||
regress/unittests/sshbuf/test_sshbuf$(EXEEXT) \
|
||||
regress/unittests/sshkey/test_sshkey$(EXEEXT) \
|
||||
regress/unittests/bitmap/test_bitmap$(EXEEXT) \
|
||||
|
@ -1,4 +1,4 @@
|
||||
See http://www.openssh.com/txt/release-7.1p2 for the release notes.
|
||||
See http://www.openssh.com/txt/release-7.2p2 for the release notes.
|
||||
|
||||
Please read http://www.openssh.com/report.html for bug reporting
|
||||
instructions and note that we do not use Github for bug reporting or
|
||||
|
@ -36,6 +36,9 @@ loginrestrictions() function, in particular that the user has the
|
||||
"rlogin" attribute set. This check is not done for the root account,
|
||||
instead the PermitRootLogin setting in sshd_config is used.
|
||||
|
||||
If you are using the IBM compiler you probably want to use CC=xlc rather
|
||||
than the default of cc.
|
||||
|
||||
|
||||
Cygwin
|
||||
------
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $OpenBSD: auth-bsdauth.c,v 1.13 2014/06/24 01:13:21 djm Exp $ */
|
||||
/* $OpenBSD: auth-bsdauth.c,v 1.14 2015/10/20 23:24:25 mmcc Exp $ */
|
||||
/*
|
||||
* Copyright (c) 2001 Markus Friedl. All rights reserved.
|
||||
*
|
||||
@ -103,7 +103,7 @@ bsdauth_respond(void *ctx, u_int numresponses, char **responses)
|
||||
if (!authctxt->valid)
|
||||
return -1;
|
||||
|
||||
if (authctxt->as == 0)
|
||||
if (authctxt->as == NULL)
|
||||
error("bsdauth_respond: no bsd auth session");
|
||||
|
||||
if (numresponses != 1)
|
||||
|
@ -1,8 +1,8 @@
|
||||
/* $OpenBSD: auth-krb5.c,v 1.20 2013/07/20 01:55:13 djm Exp $ */
|
||||
/* $OpenBSD: auth-krb5.c,v 1.21 2016/01/27 06:44:58 djm Exp $ */
|
||||
/*
|
||||
* Kerberos v5 authentication and ticket-passing routines.
|
||||
*
|
||||
* $FreeBSD: src/crypto/openssh/auth-krb5.c,v 1.6 2001/02/13 16:58:04 assar Exp $
|
||||
* From: FreeBSD: src/crypto/openssh/auth-krb5.c,v 1.6 2001/02/13 16:58:04 assar
|
||||
*/
|
||||
/*
|
||||
* Copyright (c) 2002 Daniel Kouril. All rights reserved.
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $OpenBSD: auth-options.c,v 1.68 2015/07/03 03:43:18 djm Exp $ */
|
||||
/* $OpenBSD: auth-options.c,v 1.70 2015/12/10 17:08:40 mmcc Exp $ */
|
||||
/*
|
||||
* Author: Tatu Ylonen <ylo@cs.hut.fi>
|
||||
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
|
||||
@ -75,18 +75,44 @@ auth_clear_options(void)
|
||||
free(ce->s);
|
||||
free(ce);
|
||||
}
|
||||
if (forced_command) {
|
||||
free(forced_command);
|
||||
forced_command = NULL;
|
||||
}
|
||||
if (authorized_principals) {
|
||||
free(authorized_principals);
|
||||
authorized_principals = NULL;
|
||||
}
|
||||
free(forced_command);
|
||||
forced_command = NULL;
|
||||
free(authorized_principals);
|
||||
authorized_principals = NULL;
|
||||
forced_tun_device = -1;
|
||||
channel_clear_permitted_opens();
|
||||
}
|
||||
|
||||
/*
|
||||
* Match flag 'opt' in *optsp, and if allow_negate is set then also match
|
||||
* 'no-opt'. Returns -1 if option not matched, 1 if option matches or 0
|
||||
* if negated option matches.
|
||||
* If the option or negated option matches, then *optsp is updated to
|
||||
* point to the first character after the option and, if 'msg' is not NULL
|
||||
* then a message based on it added via auth_debug_add().
|
||||
*/
|
||||
static int
|
||||
match_flag(const char *opt, int allow_negate, char **optsp, const char *msg)
|
||||
{
|
||||
size_t opt_len = strlen(opt);
|
||||
char *opts = *optsp;
|
||||
int negate = 0;
|
||||
|
||||
if (allow_negate && strncasecmp(opts, "no-", 3) == 0) {
|
||||
opts += 3;
|
||||
negate = 1;
|
||||
}
|
||||
if (strncasecmp(opts, opt, opt_len) == 0) {
|
||||
*optsp = opts + opt_len;
|
||||
if (msg != NULL) {
|
||||
auth_debug_add("%s %s.", msg,
|
||||
negate ? "disabled" : "enabled");
|
||||
}
|
||||
return negate ? 0 : 1;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
/*
|
||||
* return 1 if access is granted, 0 if not.
|
||||
* side effect: sets key option flags
|
||||
@ -95,7 +121,7 @@ int
|
||||
auth_parse_options(struct passwd *pw, char *opts, char *file, u_long linenum)
|
||||
{
|
||||
const char *cp;
|
||||
int i;
|
||||
int i, r;
|
||||
|
||||
/* reset options */
|
||||
auth_clear_options();
|
||||
@ -104,52 +130,48 @@ auth_parse_options(struct passwd *pw, char *opts, char *file, u_long linenum)
|
||||
return 1;
|
||||
|
||||
while (*opts && *opts != ' ' && *opts != '\t') {
|
||||
cp = "cert-authority";
|
||||
if (strncasecmp(opts, cp, strlen(cp)) == 0) {
|
||||
key_is_cert_authority = 1;
|
||||
opts += strlen(cp);
|
||||
if ((r = match_flag("cert-authority", 0, &opts, NULL)) != -1) {
|
||||
key_is_cert_authority = r;
|
||||
goto next_option;
|
||||
}
|
||||
cp = "no-port-forwarding";
|
||||
if (strncasecmp(opts, cp, strlen(cp)) == 0) {
|
||||
auth_debug_add("Port forwarding disabled.");
|
||||
if ((r = match_flag("restrict", 0, &opts, NULL)) != -1) {
|
||||
auth_debug_add("Key is restricted.");
|
||||
no_port_forwarding_flag = 1;
|
||||
opts += strlen(cp);
|
||||
goto next_option;
|
||||
}
|
||||
cp = "no-agent-forwarding";
|
||||
if (strncasecmp(opts, cp, strlen(cp)) == 0) {
|
||||
auth_debug_add("Agent forwarding disabled.");
|
||||
no_agent_forwarding_flag = 1;
|
||||
opts += strlen(cp);
|
||||
goto next_option;
|
||||
}
|
||||
cp = "no-X11-forwarding";
|
||||
if (strncasecmp(opts, cp, strlen(cp)) == 0) {
|
||||
auth_debug_add("X11 forwarding disabled.");
|
||||
no_x11_forwarding_flag = 1;
|
||||
opts += strlen(cp);
|
||||
goto next_option;
|
||||
}
|
||||
cp = "no-pty";
|
||||
if (strncasecmp(opts, cp, strlen(cp)) == 0) {
|
||||
auth_debug_add("Pty allocation disabled.");
|
||||
no_pty_flag = 1;
|
||||
opts += strlen(cp);
|
||||
no_user_rc = 1;
|
||||
goto next_option;
|
||||
}
|
||||
cp = "no-user-rc";
|
||||
if (strncasecmp(opts, cp, strlen(cp)) == 0) {
|
||||
auth_debug_add("User rc file execution disabled.");
|
||||
no_user_rc = 1;
|
||||
opts += strlen(cp);
|
||||
if ((r = match_flag("port-forwarding", 1, &opts,
|
||||
"Port forwarding")) != -1) {
|
||||
no_port_forwarding_flag = r != 1;
|
||||
goto next_option;
|
||||
}
|
||||
if ((r = match_flag("agent-forwarding", 1, &opts,
|
||||
"Agent forwarding")) != -1) {
|
||||
no_agent_forwarding_flag = r != 1;
|
||||
goto next_option;
|
||||
}
|
||||
if ((r = match_flag("x11-forwarding", 1, &opts,
|
||||
"X11 forwarding")) != -1) {
|
||||
no_x11_forwarding_flag = r != 1;
|
||||
goto next_option;
|
||||
}
|
||||
if ((r = match_flag("pty", 1, &opts,
|
||||
"PTY allocation")) != -1) {
|
||||
no_pty_flag = r != 1;
|
||||
goto next_option;
|
||||
}
|
||||
if ((r = match_flag("user-rc", 1, &opts,
|
||||
"User rc execution")) != -1) {
|
||||
no_user_rc = r != 1;
|
||||
goto next_option;
|
||||
}
|
||||
cp = "command=\"";
|
||||
if (strncasecmp(opts, cp, strlen(cp)) == 0) {
|
||||
opts += strlen(cp);
|
||||
if (forced_command != NULL)
|
||||
free(forced_command);
|
||||
free(forced_command);
|
||||
forced_command = xmalloc(strlen(opts) + 1);
|
||||
i = 0;
|
||||
while (*opts) {
|
||||
@ -179,8 +201,7 @@ auth_parse_options(struct passwd *pw, char *opts, char *file, u_long linenum)
|
||||
cp = "principals=\"";
|
||||
if (strncasecmp(opts, cp, strlen(cp)) == 0) {
|
||||
opts += strlen(cp);
|
||||
if (authorized_principals != NULL)
|
||||
free(authorized_principals);
|
||||
free(authorized_principals);
|
||||
authorized_principals = xmalloc(strlen(opts) + 1);
|
||||
i = 0;
|
||||
while (*opts) {
|
||||
@ -566,8 +587,7 @@ parse_option_list(struct sshbuf *oblob, struct passwd *pw,
|
||||
free(*cert_forced_command);
|
||||
*cert_forced_command = NULL;
|
||||
}
|
||||
if (name != NULL)
|
||||
free(name);
|
||||
free(name);
|
||||
sshbuf_free(data);
|
||||
sshbuf_free(c);
|
||||
return ret;
|
||||
@ -611,8 +631,7 @@ auth_cert_options(struct sshkey *k, struct passwd *pw)
|
||||
no_user_rc |= cert_no_user_rc;
|
||||
/* CA-specified forced command supersedes key option */
|
||||
if (cert_forced_command != NULL) {
|
||||
if (forced_command != NULL)
|
||||
free(forced_command);
|
||||
free(forced_command);
|
||||
forced_command = cert_forced_command;
|
||||
}
|
||||
return 0;
|
||||
|
@ -45,7 +45,8 @@
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/* Based on $FreeBSD: src/crypto/openssh/auth2-pam-freebsd.c,v 1.11 2003/03/31 13:48:18 des Exp $ */
|
||||
/* Based on FreeBSD: src/crypto/openssh/auth2-pam-freebsd.c,v 1.11 2003/03/31 13:48:18 des */
|
||||
|
||||
#include "includes.h"
|
||||
|
||||
#include <sys/types.h>
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $OpenBSD: auth.h,v 1.84 2015/05/08 06:41:56 djm Exp $ */
|
||||
/* $OpenBSD: auth.h,v 1.86 2015/12/04 16:41:28 markus Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2000 Markus Friedl. All rights reserved.
|
||||
@ -209,7 +209,7 @@ Key *get_hostkey_private_by_type(int, int, struct ssh *);
|
||||
int get_hostkey_index(Key *, int, struct ssh *);
|
||||
int ssh1_session_key(BIGNUM *);
|
||||
int sshd_hostkey_sign(Key *, Key *, u_char **, size_t *,
|
||||
const u_char *, size_t, u_int);
|
||||
const u_char *, size_t, const char *, u_int);
|
||||
|
||||
/* debug messages during authentication */
|
||||
void auth_debug_add(const char *fmt,...) __attribute__((format(printf, 1, 2)));
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $OpenBSD: auth2-pubkey.c,v 1.53 2015/06/15 18:44:22 jsing Exp $ */
|
||||
/* $OpenBSD: auth2-pubkey.c,v 1.55 2016/01/27 00:53:12 djm Exp $ */
|
||||
/*
|
||||
* Copyright (c) 2000 Markus Friedl. All rights reserved.
|
||||
*
|
||||
@ -79,19 +79,19 @@ userauth_pubkey(Authctxt *authctxt)
|
||||
{
|
||||
Buffer b;
|
||||
Key *key = NULL;
|
||||
char *pkalg, *userstyle;
|
||||
char *pkalg, *userstyle, *fp = NULL;
|
||||
u_char *pkblob, *sig;
|
||||
u_int alen, blen, slen;
|
||||
int have_sig, pktype;
|
||||
int authenticated = 0;
|
||||
|
||||
if (!authctxt->valid) {
|
||||
debug2("userauth_pubkey: disabled because of invalid user");
|
||||
debug2("%s: disabled because of invalid user", __func__);
|
||||
return 0;
|
||||
}
|
||||
have_sig = packet_get_char();
|
||||
if (datafellows & SSH_BUG_PKAUTH) {
|
||||
debug2("userauth_pubkey: SSH_BUG_PKAUTH");
|
||||
debug2("%s: SSH_BUG_PKAUTH", __func__);
|
||||
/* no explicit pkalg given */
|
||||
pkblob = packet_get_string(&blen);
|
||||
buffer_init(&b);
|
||||
@ -106,18 +106,18 @@ userauth_pubkey(Authctxt *authctxt)
|
||||
pktype = key_type_from_name(pkalg);
|
||||
if (pktype == KEY_UNSPEC) {
|
||||
/* this is perfectly legal */
|
||||
logit("userauth_pubkey: unsupported public key algorithm: %s",
|
||||
pkalg);
|
||||
logit("%s: unsupported public key algorithm: %s",
|
||||
__func__, pkalg);
|
||||
goto done;
|
||||
}
|
||||
key = key_from_blob(pkblob, blen);
|
||||
if (key == NULL) {
|
||||
error("userauth_pubkey: cannot decode key: %s", pkalg);
|
||||
error("%s: cannot decode key: %s", __func__, pkalg);
|
||||
goto done;
|
||||
}
|
||||
if (key->type != pktype) {
|
||||
error("userauth_pubkey: type mismatch for decoded key "
|
||||
"(received %d, expected %d)", key->type, pktype);
|
||||
error("%s: type mismatch for decoded key "
|
||||
"(received %d, expected %d)", __func__, key->type, pktype);
|
||||
goto done;
|
||||
}
|
||||
if (key_type_plain(key->type) == KEY_RSA &&
|
||||
@ -126,6 +126,7 @@ userauth_pubkey(Authctxt *authctxt)
|
||||
"signature scheme");
|
||||
goto done;
|
||||
}
|
||||
fp = sshkey_fingerprint(key, options.fingerprint_hash, SSH_FP_DEFAULT);
|
||||
if (auth2_userkey_already_used(authctxt, key)) {
|
||||
logit("refusing previously-used %s key", key_type(key));
|
||||
goto done;
|
||||
@ -138,6 +139,8 @@ userauth_pubkey(Authctxt *authctxt)
|
||||
}
|
||||
|
||||
if (have_sig) {
|
||||
debug3("%s: have signature for %s %s",
|
||||
__func__, sshkey_type(key), fp);
|
||||
sig = packet_get_string(&slen);
|
||||
packet_check_eom();
|
||||
buffer_init(&b);
|
||||
@ -183,7 +186,8 @@ userauth_pubkey(Authctxt *authctxt)
|
||||
buffer_free(&b);
|
||||
free(sig);
|
||||
} else {
|
||||
debug("test whether pkalg/pkblob are acceptable");
|
||||
debug("%s: test whether pkalg/pkblob are acceptable for %s %s",
|
||||
__func__, sshkey_type(key), fp);
|
||||
packet_check_eom();
|
||||
|
||||
/* XXX fake reply and always send PK_OK ? */
|
||||
@ -206,11 +210,12 @@ userauth_pubkey(Authctxt *authctxt)
|
||||
if (authenticated != 1)
|
||||
auth_clear_options();
|
||||
done:
|
||||
debug2("userauth_pubkey: authenticated %d pkalg %s", authenticated, pkalg);
|
||||
debug2("%s: authenticated %d pkalg %s", __func__, authenticated, pkalg);
|
||||
if (key != NULL)
|
||||
key_free(key);
|
||||
free(pkalg);
|
||||
free(pkblob);
|
||||
free(fp);
|
||||
return authenticated;
|
||||
}
|
||||
|
||||
@ -796,8 +801,9 @@ check_authkeys_file(FILE *f, char *file, Key* key, struct passwd *pw)
|
||||
free(fp);
|
||||
continue;
|
||||
}
|
||||
verbose("Accepted certificate ID \"%s\" "
|
||||
verbose("Accepted certificate ID \"%s\" (serial %llu) "
|
||||
"signed by %s CA %s via %s", key->cert->key_id,
|
||||
(unsigned long long)key->cert->serial,
|
||||
key_type(found), fp, file);
|
||||
free(fp);
|
||||
found_key = 1;
|
||||
@ -875,8 +881,10 @@ user_cert_trusted_ca(struct passwd *pw, Key *key)
|
||||
if (auth_cert_options(key, pw) != 0)
|
||||
goto out;
|
||||
|
||||
verbose("Accepted certificate ID \"%s\" signed by %s CA %s via %s",
|
||||
key->cert->key_id, key_type(key->cert->signature_key), ca_fp,
|
||||
verbose("Accepted certificate ID \"%s\" (serial %llu) signed by "
|
||||
"%s CA %s via %s", key->cert->key_id,
|
||||
(unsigned long long)key->cert->serial,
|
||||
key_type(key->cert->signature_key), ca_fp,
|
||||
options.trusted_user_ca_keys);
|
||||
ret = 1;
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $OpenBSD: authfd.c,v 1.98 2015/07/03 03:43:18 djm Exp $ */
|
||||
/* $OpenBSD: authfd.c,v 1.100 2015/12/04 16:41:28 markus Exp $ */
|
||||
/*
|
||||
* Author: Tatu Ylonen <ylo@cs.hut.fi>
|
||||
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
|
||||
@ -426,11 +426,24 @@ ssh_decrypt_challenge(int sock, struct sshkey* key, BIGNUM *challenge,
|
||||
}
|
||||
#endif
|
||||
|
||||
/* encode signature algoritm in flag bits, so we can keep the msg format */
|
||||
static u_int
|
||||
agent_encode_alg(struct sshkey *key, const char *alg)
|
||||
{
|
||||
if (alg != NULL && key->type == KEY_RSA) {
|
||||
if (strcmp(alg, "rsa-sha2-256") == 0)
|
||||
return SSH_AGENT_RSA_SHA2_256;
|
||||
else if (strcmp(alg, "rsa-sha2-512") == 0)
|
||||
return SSH_AGENT_RSA_SHA2_512;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* ask agent to sign data, returns err.h code on error, 0 on success */
|
||||
int
|
||||
ssh_agent_sign(int sock, struct sshkey *key,
|
||||
u_char **sigp, size_t *lenp,
|
||||
const u_char *data, size_t datalen, u_int compat)
|
||||
const u_char *data, size_t datalen, const char *alg, u_int compat)
|
||||
{
|
||||
struct sshbuf *msg;
|
||||
u_char *blob = NULL, type;
|
||||
@ -449,12 +462,13 @@ ssh_agent_sign(int sock, struct sshkey *key,
|
||||
return SSH_ERR_ALLOC_FAIL;
|
||||
if ((r = sshkey_to_blob(key, &blob, &blen)) != 0)
|
||||
goto out;
|
||||
flags |= agent_encode_alg(key, alg);
|
||||
if ((r = sshbuf_put_u8(msg, SSH2_AGENTC_SIGN_REQUEST)) != 0 ||
|
||||
(r = sshbuf_put_string(msg, blob, blen)) != 0 ||
|
||||
(r = sshbuf_put_string(msg, data, datalen)) != 0 ||
|
||||
(r = sshbuf_put_u32(msg, flags)) != 0)
|
||||
goto out;
|
||||
if ((r = ssh_request_reply(sock, msg, msg) != 0))
|
||||
if ((r = ssh_request_reply(sock, msg, msg)) != 0)
|
||||
goto out;
|
||||
if ((r = sshbuf_get_u8(msg, &type)) != 0)
|
||||
goto out;
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $OpenBSD: authfd.h,v 1.38 2015/01/14 20:05:27 djm Exp $ */
|
||||
/* $OpenBSD: authfd.h,v 1.39 2015/12/04 16:41:28 markus Exp $ */
|
||||
|
||||
/*
|
||||
* Author: Tatu Ylonen <ylo@cs.hut.fi>
|
||||
@ -41,7 +41,7 @@ int ssh_decrypt_challenge(int sock, struct sshkey* key, BIGNUM *challenge,
|
||||
u_char session_id[16], u_char response[16]);
|
||||
int ssh_agent_sign(int sock, struct sshkey *key,
|
||||
u_char **sigp, size_t *lenp,
|
||||
const u_char *data, size_t datalen, u_int compat);
|
||||
const u_char *data, size_t datalen, const char *alg, u_int compat);
|
||||
|
||||
/* Messages for the authentication agent connection. */
|
||||
#define SSH_AGENTC_REQUEST_RSA_IDENTITIES 1
|
||||
@ -86,5 +86,7 @@ int ssh_agent_sign(int sock, struct sshkey *key,
|
||||
#define SSH_COM_AGENT2_FAILURE 102
|
||||
|
||||
#define SSH_AGENT_OLD_SIGNATURE 0x01
|
||||
#define SSH_AGENT_RSA_SHA2_256 0x02
|
||||
#define SSH_AGENT_RSA_SHA2_512 0x04
|
||||
|
||||
#endif /* AUTHFD_H */
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $OpenBSD: authfile.c,v 1.116 2015/07/09 09:49:46 markus Exp $ */
|
||||
/* $OpenBSD: authfile.c,v 1.120 2015/12/11 04:21:11 mmcc Exp $ */
|
||||
/*
|
||||
* Copyright (c) 2000, 2013 Markus Friedl. All rights reserved.
|
||||
*
|
||||
@ -243,8 +243,7 @@ sshkey_load_private_type_fd(int fd, int type, const char *passphrase,
|
||||
/* success */
|
||||
r = 0;
|
||||
out:
|
||||
if (buffer != NULL)
|
||||
sshbuf_free(buffer);
|
||||
sshbuf_free(buffer);
|
||||
return r;
|
||||
}
|
||||
|
||||
@ -272,14 +271,13 @@ sshkey_load_private(const char *filename, const char *passphrase,
|
||||
goto out;
|
||||
}
|
||||
if ((r = sshkey_load_file(fd, buffer)) != 0 ||
|
||||
(r = sshkey_parse_private_fileblob(buffer, passphrase, filename,
|
||||
keyp, commentp)) != 0)
|
||||
(r = sshkey_parse_private_fileblob(buffer, passphrase, keyp,
|
||||
commentp)) != 0)
|
||||
goto out;
|
||||
r = 0;
|
||||
out:
|
||||
close(fd);
|
||||
if (buffer != NULL)
|
||||
sshbuf_free(buffer);
|
||||
sshbuf_free(buffer);
|
||||
return r;
|
||||
}
|
||||
|
||||
@ -426,10 +424,8 @@ sshkey_load_cert(const char *filename, struct sshkey **keyp)
|
||||
r = 0;
|
||||
|
||||
out:
|
||||
if (file != NULL)
|
||||
free(file);
|
||||
if (pub != NULL)
|
||||
sshkey_free(pub);
|
||||
free(file);
|
||||
sshkey_free(pub);
|
||||
return r;
|
||||
}
|
||||
|
||||
@ -474,10 +470,8 @@ sshkey_load_private_cert(int type, const char *filename, const char *passphrase,
|
||||
*keyp = key;
|
||||
key = NULL;
|
||||
out:
|
||||
if (key != NULL)
|
||||
sshkey_free(key);
|
||||
if (cert != NULL)
|
||||
sshkey_free(cert);
|
||||
sshkey_free(key);
|
||||
sshkey_free(cert);
|
||||
return r;
|
||||
}
|
||||
|
||||
@ -538,8 +532,7 @@ sshkey_in_file(struct sshkey *key, const char *filename, int strict_type,
|
||||
}
|
||||
r = SSH_ERR_KEY_NOT_FOUND;
|
||||
out:
|
||||
if (pub != NULL)
|
||||
sshkey_free(pub);
|
||||
sshkey_free(pub);
|
||||
fclose(f);
|
||||
return r;
|
||||
}
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $OpenBSD: channels.c,v 1.347 2015/07/01 02:26:31 djm Exp $ */
|
||||
/* $OpenBSD: channels.c,v 1.349 2016/02/05 13:28:19 naddy Exp $ */
|
||||
/*
|
||||
* Author: Tatu Ylonen <ylo@cs.hut.fi>
|
||||
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
|
||||
@ -662,7 +662,7 @@ channel_open_message(void)
|
||||
case SSH_CHANNEL_INPUT_DRAINING:
|
||||
case SSH_CHANNEL_OUTPUT_DRAINING:
|
||||
snprintf(buf, sizeof buf,
|
||||
" #%d %.300s (t%d r%d i%d/%d o%d/%d fd %d/%d cc %d)\r\n",
|
||||
" #%d %.300s (t%d r%d i%u/%d o%u/%d fd %d/%d cc %d)\r\n",
|
||||
c->self, c->remote_name,
|
||||
c->type, c->remote_id,
|
||||
c->istate, buffer_len(&c->input),
|
||||
@ -1896,13 +1896,13 @@ read_mux(Channel *c, u_int need)
|
||||
if (buffer_len(&c->input) < need) {
|
||||
rlen = need - buffer_len(&c->input);
|
||||
len = read(c->rfd, buf, MIN(rlen, CHAN_RBUF));
|
||||
if (len < 0 && (errno == EINTR || errno == EAGAIN))
|
||||
return buffer_len(&c->input);
|
||||
if (len <= 0) {
|
||||
if (errno != EINTR && errno != EAGAIN) {
|
||||
debug2("channel %d: ctl read<=0 rfd %d len %d",
|
||||
c->self, c->rfd, len);
|
||||
chan_read_failed(c);
|
||||
return 0;
|
||||
}
|
||||
debug2("channel %d: ctl read<=0 rfd %d len %d",
|
||||
c->self, c->rfd, len);
|
||||
chan_read_failed(c);
|
||||
return 0;
|
||||
} else
|
||||
buffer_append(&c->input, buf, len);
|
||||
}
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $OpenBSD: cipher.c,v 1.100 2015/01/14 10:29:45 djm Exp $ */
|
||||
/* $OpenBSD: cipher.c,v 1.101 2015/12/10 17:08:40 mmcc Exp $ */
|
||||
/*
|
||||
* Author: Tatu Ylonen <ylo@cs.hut.fi>
|
||||
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
|
||||
@ -353,8 +353,7 @@ cipher_init(struct sshcipher_ctx *cc, const struct sshcipher *cipher,
|
||||
if (cipher->discard_len > 0) {
|
||||
if ((junk = malloc(cipher->discard_len)) == NULL ||
|
||||
(discard = malloc(cipher->discard_len)) == NULL) {
|
||||
if (junk != NULL)
|
||||
free(junk);
|
||||
free(junk);
|
||||
ret = SSH_ERR_ALLOC_FAIL;
|
||||
goto bad;
|
||||
}
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $OpenBSD: clientloop.c,v 1.275 2015/07/10 06:21:53 markus Exp $ */
|
||||
/* $OpenBSD: clientloop.c,v 1.284 2016/02/08 10:57:07 djm Exp $ */
|
||||
/*
|
||||
* Author: Tatu Ylonen <ylo@cs.hut.fi>
|
||||
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
|
||||
@ -111,7 +111,6 @@
|
||||
#include "sshpty.h"
|
||||
#include "match.h"
|
||||
#include "msg.h"
|
||||
#include "roaming.h"
|
||||
#include "ssherr.h"
|
||||
#include "hostfile.h"
|
||||
|
||||
@ -169,8 +168,6 @@ static u_int x11_refuse_time; /* If >0, refuse x11 opens after this time. */
|
||||
static void client_init_dispatch(void);
|
||||
int session_ident = -1;
|
||||
|
||||
int session_resumed = 0;
|
||||
|
||||
/* Track escape per proto2 channel */
|
||||
struct escape_filter_ctx {
|
||||
int escape_pending;
|
||||
@ -288,6 +285,9 @@ client_x11_display_valid(const char *display)
|
||||
{
|
||||
size_t i, dlen;
|
||||
|
||||
if (display == NULL)
|
||||
return 0;
|
||||
|
||||
dlen = strlen(display);
|
||||
for (i = 0; i < dlen; i++) {
|
||||
if (!isalnum((u_char)display[i]) &&
|
||||
@ -301,35 +301,34 @@ client_x11_display_valid(const char *display)
|
||||
|
||||
#define SSH_X11_PROTO "MIT-MAGIC-COOKIE-1"
|
||||
#define X11_TIMEOUT_SLACK 60
|
||||
void
|
||||
int
|
||||
client_x11_get_proto(const char *display, const char *xauth_path,
|
||||
u_int trusted, u_int timeout, char **_proto, char **_data)
|
||||
{
|
||||
char cmd[1024];
|
||||
char line[512];
|
||||
char xdisplay[512];
|
||||
char cmd[1024], line[512], xdisplay[512];
|
||||
char xauthfile[PATH_MAX], xauthdir[PATH_MAX];
|
||||
static char proto[512], data[512];
|
||||
FILE *f;
|
||||
int got_data = 0, generated = 0, do_unlink = 0, i;
|
||||
char *xauthdir, *xauthfile;
|
||||
int got_data = 0, generated = 0, do_unlink = 0, i, r;
|
||||
struct stat st;
|
||||
u_int now, x11_timeout_real;
|
||||
|
||||
xauthdir = xauthfile = NULL;
|
||||
*_proto = proto;
|
||||
*_data = data;
|
||||
proto[0] = data[0] = '\0';
|
||||
proto[0] = data[0] = xauthfile[0] = xauthdir[0] = '\0';
|
||||
|
||||
if (xauth_path == NULL ||(stat(xauth_path, &st) == -1)) {
|
||||
if (!client_x11_display_valid(display)) {
|
||||
if (display != NULL)
|
||||
logit("DISPLAY \"%s\" invalid; disabling X11 forwarding",
|
||||
display);
|
||||
return -1;
|
||||
}
|
||||
if (xauth_path != NULL && stat(xauth_path, &st) == -1) {
|
||||
debug("No xauth program.");
|
||||
} else if (!client_x11_display_valid(display)) {
|
||||
logit("DISPLAY '%s' invalid, falling back to fake xauth data",
|
||||
display);
|
||||
} else {
|
||||
if (display == NULL) {
|
||||
debug("x11_get_proto: DISPLAY not set");
|
||||
return;
|
||||
}
|
||||
xauth_path = NULL;
|
||||
}
|
||||
|
||||
if (xauth_path != NULL) {
|
||||
/*
|
||||
* Handle FamilyLocal case where $DISPLAY does
|
||||
* not match an authorization entry. For this we
|
||||
@ -338,45 +337,60 @@ client_x11_get_proto(const char *display, const char *xauth_path,
|
||||
* is not perfect.
|
||||
*/
|
||||
if (strncmp(display, "localhost:", 10) == 0) {
|
||||
snprintf(xdisplay, sizeof(xdisplay), "unix:%s",
|
||||
display + 10);
|
||||
if ((r = snprintf(xdisplay, sizeof(xdisplay), "unix:%s",
|
||||
display + 10)) < 0 ||
|
||||
(size_t)r >= sizeof(xdisplay)) {
|
||||
error("%s: display name too long", __func__);
|
||||
return -1;
|
||||
}
|
||||
display = xdisplay;
|
||||
}
|
||||
if (trusted == 0) {
|
||||
xauthdir = xmalloc(PATH_MAX);
|
||||
xauthfile = xmalloc(PATH_MAX);
|
||||
mktemp_proto(xauthdir, PATH_MAX);
|
||||
/*
|
||||
* Generate an untrusted X11 auth cookie.
|
||||
*
|
||||
* The authentication cookie should briefly outlive
|
||||
* ssh's willingness to forward X11 connections to
|
||||
* avoid nasty fail-open behaviour in the X server.
|
||||
*/
|
||||
mktemp_proto(xauthdir, sizeof(xauthdir));
|
||||
if (mkdtemp(xauthdir) == NULL) {
|
||||
error("%s: mkdtemp: %s",
|
||||
__func__, strerror(errno));
|
||||
return -1;
|
||||
}
|
||||
do_unlink = 1;
|
||||
if ((r = snprintf(xauthfile, sizeof(xauthfile),
|
||||
"%s/xauthfile", xauthdir)) < 0 ||
|
||||
(size_t)r >= sizeof(xauthfile)) {
|
||||
error("%s: xauthfile path too long", __func__);
|
||||
unlink(xauthfile);
|
||||
rmdir(xauthdir);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (timeout >= UINT_MAX - X11_TIMEOUT_SLACK)
|
||||
x11_timeout_real = UINT_MAX;
|
||||
else
|
||||
x11_timeout_real = timeout + X11_TIMEOUT_SLACK;
|
||||
if (mkdtemp(xauthdir) != NULL) {
|
||||
do_unlink = 1;
|
||||
snprintf(xauthfile, PATH_MAX, "%s/xauthfile",
|
||||
xauthdir);
|
||||
snprintf(cmd, sizeof(cmd),
|
||||
"%s -f %s generate %s " SSH_X11_PROTO
|
||||
" untrusted timeout %u 2>" _PATH_DEVNULL,
|
||||
xauth_path, xauthfile, display,
|
||||
x11_timeout_real);
|
||||
debug2("x11_get_proto: %s", cmd);
|
||||
if (x11_refuse_time == 0) {
|
||||
now = monotime() + 1;
|
||||
if (UINT_MAX - timeout < now)
|
||||
x11_refuse_time = UINT_MAX;
|
||||
else
|
||||
x11_refuse_time = now + timeout;
|
||||
channel_set_x11_refuse_time(
|
||||
x11_refuse_time);
|
||||
}
|
||||
if (system(cmd) == 0)
|
||||
generated = 1;
|
||||
if ((r = snprintf(cmd, sizeof(cmd),
|
||||
"%s -f %s generate %s " SSH_X11_PROTO
|
||||
" untrusted timeout %u 2>" _PATH_DEVNULL,
|
||||
xauth_path, xauthfile, display,
|
||||
x11_timeout_real)) < 0 ||
|
||||
(size_t)r >= sizeof(cmd))
|
||||
fatal("%s: cmd too long", __func__);
|
||||
debug2("%s: %s", __func__, cmd);
|
||||
if (x11_refuse_time == 0) {
|
||||
now = monotime() + 1;
|
||||
if (UINT_MAX - timeout < now)
|
||||
x11_refuse_time = UINT_MAX;
|
||||
else
|
||||
x11_refuse_time = now + timeout;
|
||||
channel_set_x11_refuse_time(x11_refuse_time);
|
||||
}
|
||||
if (system(cmd) == 0)
|
||||
generated = 1;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -398,17 +412,20 @@ client_x11_get_proto(const char *display, const char *xauth_path,
|
||||
got_data = 1;
|
||||
if (f)
|
||||
pclose(f);
|
||||
} else
|
||||
error("Warning: untrusted X11 forwarding setup failed: "
|
||||
"xauth key data not generated");
|
||||
}
|
||||
}
|
||||
|
||||
if (do_unlink) {
|
||||
unlink(xauthfile);
|
||||
rmdir(xauthdir);
|
||||
}
|
||||
free(xauthdir);
|
||||
free(xauthfile);
|
||||
|
||||
/* Don't fall back to fake X11 data for untrusted forwarding */
|
||||
if (!trusted && !got_data) {
|
||||
error("Warning: untrusted X11 forwarding setup failed: "
|
||||
"xauth key data not generated");
|
||||
return -1;
|
||||
}
|
||||
|
||||
/*
|
||||
* If we didn't get authentication data, just make up some
|
||||
@ -432,6 +449,8 @@ client_x11_get_proto(const char *display, const char *xauth_path,
|
||||
rnd >>= 8;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -735,7 +754,7 @@ client_suspend_self(Buffer *bin, Buffer *bout, Buffer *berr)
|
||||
static void
|
||||
client_process_net_input(fd_set *readset)
|
||||
{
|
||||
int len, cont = 0;
|
||||
int len;
|
||||
char buf[SSH_IOBUFSZ];
|
||||
|
||||
/*
|
||||
@ -744,8 +763,8 @@ client_process_net_input(fd_set *readset)
|
||||
*/
|
||||
if (FD_ISSET(connection_in, readset)) {
|
||||
/* Read as much as possible. */
|
||||
len = roaming_read(connection_in, buf, sizeof(buf), &cont);
|
||||
if (len == 0 && cont == 0) {
|
||||
len = read(connection_in, buf, sizeof(buf));
|
||||
if (len == 0) {
|
||||
/*
|
||||
* Received EOF. The remote host has closed the
|
||||
* connection.
|
||||
@ -1483,13 +1502,43 @@ client_loop(int have_pty, int escape_char_arg, int ssh2_chan_id)
|
||||
{
|
||||
fd_set *readset = NULL, *writeset = NULL;
|
||||
double start_time, total_time;
|
||||
int r, max_fd = 0, max_fd2 = 0, len, rekeying = 0;
|
||||
int r, max_fd = 0, max_fd2 = 0, len;
|
||||
u_int64_t ibytes, obytes;
|
||||
u_int nalloc = 0;
|
||||
char buf[100];
|
||||
|
||||
debug("Entering interactive session.");
|
||||
|
||||
if (options.control_master &&
|
||||
! option_clear_or_none(options.control_path)) {
|
||||
debug("pledge: id");
|
||||
if (pledge("stdio rpath wpath cpath unix inet dns proc exec id tty",
|
||||
NULL) == -1)
|
||||
fatal("%s pledge(): %s", __func__, strerror(errno));
|
||||
|
||||
} else if (options.forward_x11 || options.permit_local_command) {
|
||||
debug("pledge: exec");
|
||||
if (pledge("stdio rpath wpath cpath unix inet dns proc exec tty",
|
||||
NULL) == -1)
|
||||
fatal("%s pledge(): %s", __func__, strerror(errno));
|
||||
|
||||
} else if (options.update_hostkeys) {
|
||||
debug("pledge: filesystem full");
|
||||
if (pledge("stdio rpath wpath cpath unix inet dns proc tty",
|
||||
NULL) == -1)
|
||||
fatal("%s pledge(): %s", __func__, strerror(errno));
|
||||
|
||||
} else if (! option_clear_or_none(options.proxy_command)) {
|
||||
debug("pledge: proc");
|
||||
if (pledge("stdio cpath unix inet dns proc tty", NULL) == -1)
|
||||
fatal("%s pledge(): %s", __func__, strerror(errno));
|
||||
|
||||
} else {
|
||||
debug("pledge: network");
|
||||
if (pledge("stdio unix inet dns tty", NULL) == -1)
|
||||
fatal("%s pledge(): %s", __func__, strerror(errno));
|
||||
}
|
||||
|
||||
start_time = get_current_time();
|
||||
|
||||
/* Initialize variables. */
|
||||
@ -1568,10 +1617,15 @@ client_loop(int have_pty, int escape_char_arg, int ssh2_chan_id)
|
||||
if (compat20 && session_closed && !channel_still_open())
|
||||
break;
|
||||
|
||||
rekeying = (active_state->kex != NULL && !active_state->kex->done);
|
||||
|
||||
if (rekeying) {
|
||||
if (ssh_packet_is_rekeying(active_state)) {
|
||||
debug("rekeying in progress");
|
||||
} else if (need_rekeying) {
|
||||
/* manual rekey request */
|
||||
debug("need rekeying");
|
||||
if ((r = kex_start_rekex(active_state)) != 0)
|
||||
fatal("%s: kex_start_rekex: %s", __func__,
|
||||
ssh_err(r));
|
||||
need_rekeying = 0;
|
||||
} else {
|
||||
/*
|
||||
* Make packets of buffered stdin data, and buffer
|
||||
@ -1602,23 +1656,14 @@ client_loop(int have_pty, int escape_char_arg, int ssh2_chan_id)
|
||||
*/
|
||||
max_fd2 = max_fd;
|
||||
client_wait_until_can_do_something(&readset, &writeset,
|
||||
&max_fd2, &nalloc, rekeying);
|
||||
&max_fd2, &nalloc, ssh_packet_is_rekeying(active_state));
|
||||
|
||||
if (quit_pending)
|
||||
break;
|
||||
|
||||
/* Do channel operations unless rekeying in progress. */
|
||||
if (!rekeying) {
|
||||
if (!ssh_packet_is_rekeying(active_state))
|
||||
channel_after_select(readset, writeset);
|
||||
if (need_rekeying || packet_need_rekeying()) {
|
||||
debug("need rekeying");
|
||||
active_state->kex->done = 0;
|
||||
if ((r = kex_send_kexinit(active_state)) != 0)
|
||||
fatal("%s: kex_send_kexinit: %s",
|
||||
__func__, ssh_err(r));
|
||||
need_rekeying = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* Buffer input from the connection. */
|
||||
client_process_net_input(readset);
|
||||
@ -1636,14 +1681,6 @@ client_loop(int have_pty, int escape_char_arg, int ssh2_chan_id)
|
||||
client_process_output(writeset);
|
||||
}
|
||||
|
||||
if (session_resumed) {
|
||||
connection_in = packet_get_connection_in();
|
||||
connection_out = packet_get_connection_out();
|
||||
max_fd = MAX(max_fd, connection_out);
|
||||
max_fd = MAX(max_fd, connection_in);
|
||||
session_resumed = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Send as much buffered packet data as possible to the
|
||||
* sender.
|
||||
@ -1737,7 +1774,7 @@ client_loop(int have_pty, int escape_char_arg, int ssh2_chan_id)
|
||||
}
|
||||
|
||||
/* Clear and free any buffers. */
|
||||
memset(buf, 0, sizeof(buf));
|
||||
explicit_bzero(buf, sizeof(buf));
|
||||
buffer_free(&stdin_buffer);
|
||||
buffer_free(&stdout_buffer);
|
||||
buffer_free(&stderr_buffer);
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $OpenBSD: clientloop.h,v 1.31 2013/06/02 23:36:29 dtucker Exp $ */
|
||||
/* $OpenBSD: clientloop.h,v 1.32 2016/01/13 23:04:47 djm Exp $ */
|
||||
|
||||
/*
|
||||
* Author: Tatu Ylonen <ylo@cs.hut.fi>
|
||||
@ -39,7 +39,7 @@
|
||||
|
||||
/* Client side main loop for the interactive session. */
|
||||
int client_loop(int, int, int);
|
||||
void client_x11_get_proto(const char *, const char *, u_int, u_int,
|
||||
int client_x11_get_proto(const char *, const char *, u_int, u_int,
|
||||
char **, char **);
|
||||
void client_global_request_reply_fwd(int, u_int32_t, void *);
|
||||
void client_session2_setup(int, int, int, const char *, struct termios *,
|
||||
|
@ -698,9 +698,6 @@
|
||||
/* Define to 1 if you have the `network' library (-lnetwork). */
|
||||
/* #undef HAVE_LIBNETWORK */
|
||||
|
||||
/* Define to 1 if you have the `nsl' library (-lnsl). */
|
||||
/* #undef HAVE_LIBNSL */
|
||||
|
||||
/* Define to 1 if you have the `pam' library (-lpam). */
|
||||
#define HAVE_LIBPAM 1
|
||||
|
||||
@ -849,6 +846,9 @@
|
||||
/* define if you have pid_t data type */
|
||||
#define HAVE_PID_T 1
|
||||
|
||||
/* Define to 1 if you have the `pledge' function. */
|
||||
/* #undef HAVE_PLEDGE */
|
||||
|
||||
/* Define to 1 if you have the `poll' function. */
|
||||
#define HAVE_POLL 1
|
||||
|
||||
@ -858,6 +858,12 @@
|
||||
/* Define to 1 if you have the `prctl' function. */
|
||||
/* #undef HAVE_PRCTL */
|
||||
|
||||
/* Define to 1 if you have the `priv_basicset' function. */
|
||||
/* #undef HAVE_PRIV_BASICSET */
|
||||
|
||||
/* Define to 1 if you have the <priv.h> header file. */
|
||||
/* #undef HAVE_PRIV_H */
|
||||
|
||||
/* Define if you have /proc/$pid/fd */
|
||||
/* #undef HAVE_PROC_PID */
|
||||
|
||||
@ -960,6 +966,9 @@
|
||||
/* Define to 1 if you have the `setpcred' function. */
|
||||
/* #undef HAVE_SETPCRED */
|
||||
|
||||
/* Define to 1 if you have the `setppriv' function. */
|
||||
/* #undef HAVE_SETPPRIV */
|
||||
|
||||
/* Define to 1 if you have the `setproctitle' function. */
|
||||
#define HAVE_SETPROCTITLE 1
|
||||
|
||||
@ -1451,6 +1460,9 @@
|
||||
/* Define if you don't want to use lastlog in session.c */
|
||||
/* #undef NO_SSH_LASTLOG */
|
||||
|
||||
/* Define to disable UID restoration test */
|
||||
/* #undef NO_UID_RESTORATION_TEST */
|
||||
|
||||
/* Define if X11 doesn't support AF_UNIX sockets on that system */
|
||||
/* #undef NO_X11_UNIX_SOCKETS */
|
||||
|
||||
@ -1530,6 +1542,9 @@
|
||||
/* no privsep sandboxing */
|
||||
/* #undef SANDBOX_NULL */
|
||||
|
||||
/* Sandbox using pledge(2) */
|
||||
/* #undef SANDBOX_PLEDGE */
|
||||
|
||||
/* Sandbox using setrlimit(2) */
|
||||
/* #undef SANDBOX_RLIMIT */
|
||||
|
||||
@ -1542,6 +1557,9 @@
|
||||
/* define if setrlimit RLIMIT_NOFILE breaks things */
|
||||
#define SANDBOX_SKIP_RLIMIT_NOFILE 1
|
||||
|
||||
/* Sandbox using Solaris/Illumos privileges */
|
||||
/* #undef SANDBOX_SOLARIS */
|
||||
|
||||
/* Sandbox using systrace(4) */
|
||||
/* #undef SANDBOX_SYSTRACE */
|
||||
|
||||
@ -1648,6 +1666,9 @@
|
||||
/* Use PIPES instead of a socketpair() */
|
||||
/* #undef USE_PIPES */
|
||||
|
||||
/* Define if you have Solaris privileges */
|
||||
/* #undef USE_SOLARIS_PRIVS */
|
||||
|
||||
/* Define if you have Solaris process contracts */
|
||||
/* #undef USE_SOLARIS_PROCESS_CONTRACTS */
|
||||
|
||||
|
@ -141,7 +141,7 @@ else
|
||||
fi
|
||||
|
||||
AC_ARG_WITH([ssh1],
|
||||
[ --without-ssh1 Enable support for SSH protocol 1],
|
||||
[ --with-ssh1 Enable support for SSH protocol 1],
|
||||
[
|
||||
if test "x$withval" = "xyes" ; then
|
||||
if test "x$openssl" = "xno" ; then
|
||||
@ -476,6 +476,11 @@ AC_CHECK_HEADERS([sys/un.h], [], [], [
|
||||
SIA_MSG="no"
|
||||
SPC_MSG="no"
|
||||
SP_MSG="no"
|
||||
SPP_MSG="no"
|
||||
|
||||
# Support for Solaris/Illumos privileges (this test is used by both
|
||||
# the --with-solaris-privs option and --with-sandbox=solaris).
|
||||
SOLARIS_PRIVS="no"
|
||||
|
||||
# Check for some target-specific stuff
|
||||
case "$host" in
|
||||
@ -582,6 +587,8 @@ case "$host" in
|
||||
LIBS="$LIBS /usr/lib/textreadmode.o"
|
||||
AC_DEFINE([HAVE_CYGWIN], [1], [Define if you are on Cygwin])
|
||||
AC_DEFINE([USE_PIPES], [1], [Use PIPES instead of a socketpair()])
|
||||
AC_DEFINE([NO_UID_RESTORATION_TEST], [1],
|
||||
[Define to disable UID restoration test])
|
||||
AC_DEFINE([DISABLE_SHADOW], [1],
|
||||
[Define if you want to disable shadow passwords])
|
||||
AC_DEFINE([NO_X11_UNIX_SOCKETS], [1],
|
||||
@ -644,6 +651,9 @@ main() { if (NSVersionOfRunTimeLibrary("System") >= (60 << 16))
|
||||
supported by bsd-setproctitle.c])
|
||||
AC_CHECK_FUNCS([sandbox_init])
|
||||
AC_CHECK_HEADERS([sandbox.h])
|
||||
AC_CHECK_LIB([sandbox], [sandbox_apply], [
|
||||
SSHDLIBS="$SSHDLIBS -lsandbox"
|
||||
])
|
||||
;;
|
||||
*-*-dragonfly*)
|
||||
SSHDLIBS="$SSHDLIBS -lcrypt"
|
||||
@ -896,13 +906,16 @@ mips-sony-bsd|mips-sony-newsos4)
|
||||
else
|
||||
AC_MSG_RESULT([no])
|
||||
fi
|
||||
AC_CHECK_FUNCS([setppriv])
|
||||
AC_CHECK_FUNCS([priv_basicset])
|
||||
AC_CHECK_HEADERS([priv.h])
|
||||
AC_ARG_WITH([solaris-contracts],
|
||||
[ --with-solaris-contracts Enable Solaris process contracts (experimental)],
|
||||
[
|
||||
AC_CHECK_LIB([contract], [ct_tmpl_activate],
|
||||
[ AC_DEFINE([USE_SOLARIS_PROCESS_CONTRACTS], [1],
|
||||
[Define if you have Solaris process contracts])
|
||||
SSHDLIBS="$SSHDLIBS -lcontract"
|
||||
LIBS="$LIBS -lcontract"
|
||||
SPC_MSG="yes" ], )
|
||||
],
|
||||
)
|
||||
@ -912,10 +925,29 @@ mips-sony-bsd|mips-sony-newsos4)
|
||||
AC_CHECK_LIB([project], [setproject],
|
||||
[ AC_DEFINE([USE_SOLARIS_PROJECTS], [1],
|
||||
[Define if you have Solaris projects])
|
||||
SSHDLIBS="$SSHDLIBS -lproject"
|
||||
LIBS="$LIBS -lproject"
|
||||
SP_MSG="yes" ], )
|
||||
],
|
||||
)
|
||||
AC_ARG_WITH([solaris-privs],
|
||||
[ --with-solaris-privs Enable Solaris/Illumos privileges (experimental)],
|
||||
[
|
||||
AC_MSG_CHECKING([for Solaris/Illumos privilege support])
|
||||
if test "x$ac_cv_func_setppriv" = "xyes" -a \
|
||||
"x$ac_cv_header_priv_h" = "xyes" ; then
|
||||
SOLARIS_PRIVS=yes
|
||||
AC_MSG_RESULT([found])
|
||||
AC_DEFINE([NO_UID_RESTORATION_TEST], [1],
|
||||
[Define to disable UID restoration test])
|
||||
AC_DEFINE([USE_SOLARIS_PRIVS], [1],
|
||||
[Define if you have Solaris privileges])
|
||||
SPP_MSG="yes"
|
||||
else
|
||||
AC_MSG_RESULT([not found])
|
||||
AC_MSG_ERROR([*** must have support for Solaris privileges to use --with-solaris-privs])
|
||||
fi
|
||||
],
|
||||
)
|
||||
TEST_SHELL=$SHELL # let configure find us a capable shell
|
||||
;;
|
||||
*-*-sunos4*)
|
||||
@ -1129,7 +1161,6 @@ AC_RUN_IFELSE([AC_LANG_PROGRAM([[ #include <stdio.h> ]], [[ exit(0); ]])],
|
||||
|
||||
dnl Checks for header files.
|
||||
# Checks for libraries.
|
||||
AC_CHECK_FUNC([yp_match], , [AC_CHECK_LIB([nsl], [yp_match])])
|
||||
AC_CHECK_FUNC([setsockopt], , [AC_CHECK_LIB([socket], [setsockopt])])
|
||||
|
||||
dnl IRIX and Solaris 2.5.1 have dirname() in libgen
|
||||
@ -1293,8 +1324,10 @@ AC_SEARCH_LIBS([openpty], [util bsd])
|
||||
AC_SEARCH_LIBS([updwtmp], [util bsd])
|
||||
AC_CHECK_FUNCS([fmt_scaled scan_scaled login logout openpty updwtmp logwtmp])
|
||||
|
||||
# On some platforms, inet_ntop may be found in libresolv or libnsl.
|
||||
# On some platforms, inet_ntop and gethostbyname may be found in libresolv
|
||||
# or libnsl.
|
||||
AC_SEARCH_LIBS([inet_ntop], [resolv nsl])
|
||||
AC_SEARCH_LIBS([gethostbyname], [resolv nsl])
|
||||
|
||||
AC_FUNC_STRFTIME
|
||||
|
||||
@ -1732,6 +1765,7 @@ AC_CHECK_FUNCS([ \
|
||||
nsleep \
|
||||
ogetaddrinfo \
|
||||
openlog_r \
|
||||
pledge \
|
||||
poll \
|
||||
prctl \
|
||||
pstat \
|
||||
@ -2372,10 +2406,10 @@ openssl_engine=no
|
||||
AC_ARG_WITH([ssl-engine],
|
||||
[ --with-ssl-engine Enable OpenSSL (hardware) ENGINE support ],
|
||||
[
|
||||
if test "x$openssl" = "xno" ; then
|
||||
AC_MSG_ERROR([cannot use --with-ssl-engine when OpenSSL disabled])
|
||||
fi
|
||||
if test "x$withval" != "xno" ; then
|
||||
if test "x$openssl" = "xno" ; then
|
||||
AC_MSG_ERROR([cannot use --with-ssl-engine when OpenSSL disabled])
|
||||
fi
|
||||
openssl_engine=yes
|
||||
fi
|
||||
]
|
||||
@ -2408,6 +2442,7 @@ if test "x$openssl" = "xyes" ; then
|
||||
AC_MSG_CHECKING([OpenSSL header version])
|
||||
AC_RUN_IFELSE(
|
||||
[AC_LANG_PROGRAM([[
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <openssl/opensslv.h>
|
||||
@ -2420,7 +2455,8 @@ if test "x$openssl" = "xyes" ; then
|
||||
if(fd == NULL)
|
||||
exit(1);
|
||||
|
||||
if ((rc = fprintf(fd ,"%08x (%s)\n", OPENSSL_VERSION_NUMBER, OPENSSL_VERSION_TEXT)) <0)
|
||||
if ((rc = fprintf(fd ,"%08lx (%s)\n",
|
||||
(unsigned long)OPENSSL_VERSION_NUMBER, OPENSSL_VERSION_TEXT)) <0)
|
||||
exit(1);
|
||||
|
||||
exit(0);
|
||||
@ -2487,6 +2523,7 @@ if test "x$openssl" = "xyes" ; then
|
||||
[AC_LANG_PROGRAM([[
|
||||
#include <string.h>
|
||||
#include <openssl/opensslv.h>
|
||||
#include <openssl/crypto.h>
|
||||
]], [[
|
||||
exit(SSLeay() == OPENSSL_VERSION_NUMBER ? 0 : 1);
|
||||
]])],
|
||||
@ -3061,7 +3098,7 @@ fi
|
||||
# Decide which sandbox style to use
|
||||
sandbox_arg=""
|
||||
AC_ARG_WITH([sandbox],
|
||||
[ --with-sandbox=style Specify privilege separation sandbox (no, darwin, rlimit, systrace, seccomp_filter, capsicum)],
|
||||
[ --with-sandbox=style Specify privilege separation sandbox (no, capsicum, darwin, rlimit, seccomp_filter, systrace, pledge)],
|
||||
[
|
||||
if test "x$withval" = "xyes" ; then
|
||||
sandbox_arg=""
|
||||
@ -3157,7 +3194,13 @@ AC_RUN_IFELSE(
|
||||
[AC_MSG_WARN([cross compiling: assuming yes])]
|
||||
)
|
||||
|
||||
if test "x$sandbox_arg" = "xsystrace" || \
|
||||
if test "x$sandbox_arg" = "xpledge" || \
|
||||
( test -z "$sandbox_arg" && test "x$ac_cv_func_pledge" = "xyes" ) ; then
|
||||
test "x$ac_cv_func_pledge" != "xyes" && \
|
||||
AC_MSG_ERROR([pledge sandbox requires pledge(2) support])
|
||||
SANDBOX_STYLE="pledge"
|
||||
AC_DEFINE([SANDBOX_PLEDGE], [1], [Sandbox using pledge(2)])
|
||||
elif test "x$sandbox_arg" = "xsystrace" || \
|
||||
( test -z "$sandbox_arg" && test "x$have_systr_policy_kill" = "x1" ) ; then
|
||||
test "x$have_systr_policy_kill" != "x1" && \
|
||||
AC_MSG_ERROR([systrace sandbox requires systrace headers and SYSTR_POLICY_KILL support])
|
||||
@ -3210,6 +3253,10 @@ elif test "x$sandbox_arg" = "xrlimit" || \
|
||||
AC_MSG_ERROR([rlimit sandbox requires select to work with rlimit])
|
||||
SANDBOX_STYLE="rlimit"
|
||||
AC_DEFINE([SANDBOX_RLIMIT], [1], [Sandbox using setrlimit(2)])
|
||||
elif test "x$sandbox_arg" = "xsolaris" || \
|
||||
( test -z "$sandbox_arg" && test "x$SOLARIS_PRIVS" = "xyes" ) ; then
|
||||
SANDBOX_STYLE="solaris"
|
||||
AC_DEFINE([SANDBOX_SOLARIS], [1], [Sandbox using Solaris/Illumos privileges])
|
||||
elif test -z "$sandbox_arg" || test "x$sandbox_arg" = "xno" || \
|
||||
test "x$sandbox_arg" = "xnone" || test "x$sandbox_arg" = "xnull" ; then
|
||||
SANDBOX_STYLE="none"
|
||||
@ -4033,7 +4080,10 @@ AC_LINK_IFELSE([AC_LANG_PROGRAM([[
|
||||
#include <arpa/nameser.h>
|
||||
#include <resolv.h>
|
||||
extern struct __res_state _res;
|
||||
]], [[ ]])],
|
||||
]], [[
|
||||
struct __res_state *volatile p = &_res; /* force resolution of _res */
|
||||
return 0;
|
||||
]],)],
|
||||
[AC_MSG_RESULT([yes])
|
||||
AC_DEFINE([HAVE__RES_EXTERN], [1],
|
||||
[Define if you have struct __res_state _res as an extern])
|
||||
@ -4997,6 +5047,7 @@ echo " MD5 password support: $MD5_MSG"
|
||||
echo " libedit support: $LIBEDIT_MSG"
|
||||
echo " Solaris process contract support: $SPC_MSG"
|
||||
echo " Solaris project support: $SP_MSG"
|
||||
echo " Solaris privilege support: $SPP_MSG"
|
||||
echo " IP address in \$DISPLAY hack: $DISPLAY_HACK_MSG"
|
||||
echo " Translate v4 in v6 hack: $IPV4_IN6_HACK_MSG"
|
||||
echo " BSD Auth support: $BSD_AUTH_MSG"
|
||||
|
@ -1,4 +1,4 @@
|
||||
%define ver 7.1p2
|
||||
%define ver 7.2p2
|
||||
%define rel 1
|
||||
|
||||
# OpenSSH privilege separation requires a user & group ID
|
||||
@ -89,7 +89,7 @@ Requires: initscripts >= 5.20
|
||||
BuildRequires: perl, openssl-devel
|
||||
BuildRequires: /bin/login
|
||||
%if ! %{build6x}
|
||||
BuildPreReq: glibc-devel, pam
|
||||
BuildRequires: glibc-devel, pam
|
||||
%else
|
||||
BuildRequires: /usr/include/security/pam_appl.h
|
||||
%endif
|
||||
@ -184,7 +184,7 @@ CFLAGS="$RPM_OPT_FLAGS -Os"; export CFLAGS
|
||||
%endif
|
||||
|
||||
%if %{kerberos5}
|
||||
K5DIR=`rpm -ql krb5-devel | grep include/krb5.h | sed 's,\/include\/krb5.h,,'`
|
||||
K5DIR=`rpm -ql krb5-devel | grep 'include/krb5\.h' | sed 's,\/include\/krb5.h,,'`
|
||||
echo K5DIR=$K5DIR
|
||||
%endif
|
||||
|
||||
@ -192,7 +192,6 @@ echo K5DIR=$K5DIR
|
||||
--sysconfdir=%{_sysconfdir}/ssh \
|
||||
--libexecdir=%{_libexecdir}/openssh \
|
||||
--datadir=%{_datadir}/openssh \
|
||||
--with-rsh=%{_bindir}/rsh \
|
||||
--with-default-path=/usr/local/bin:/bin:/usr/bin \
|
||||
--with-superuser-path=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin \
|
||||
--with-privsep-path=%{_var}/empty/sshd \
|
||||
|
@ -56,10 +56,13 @@ then
|
||||
fi
|
||||
fi
|
||||
|
||||
DEFAULT_PUB_ID_FILE=$(ls -t ${HOME}/.ssh/id*.pub 2>/dev/null | grep -v -- '-cert.pub$' | head -n 1)
|
||||
DEFAULT_PUB_ID_FILE="$HOME/$(cd "$HOME" ; ls -t .ssh/id*.pub 2>/dev/null | grep -v -- '-cert.pub$' | head -n 1)"
|
||||
|
||||
usage () {
|
||||
printf 'Usage: %s [-h|-?|-n] [-i [identity_file]] [-p port] [[-o <ssh -o options>] ...] [user@]hostname\n' "$0" >&2
|
||||
printf 'Usage: %s [-h|-?|-f|-n] [-i [identity_file]] [-p port] [[-o <ssh -o options>] ...] [user@]hostname\n' "$0" >&2
|
||||
printf '\t-f: force mode -- copy keys without trying to check if they are already installed\n' >&2
|
||||
printf '\t-n: dry run -- no keys are actually copied\n' >&2
|
||||
printf '\t-h|-?: print this help\n' >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
@ -77,15 +80,18 @@ use_id_file() {
|
||||
PUB_ID_FILE="$L_ID_FILE.pub"
|
||||
fi
|
||||
|
||||
PRIV_ID_FILE=$(dirname "$PUB_ID_FILE")/$(basename "$PUB_ID_FILE" .pub)
|
||||
[ "$FORCED" ] || PRIV_ID_FILE=$(dirname "$PUB_ID_FILE")/$(basename "$PUB_ID_FILE" .pub)
|
||||
|
||||
# check that the files are readable
|
||||
for f in $PUB_ID_FILE $PRIV_ID_FILE ; do
|
||||
ErrMSG=$( { : < $f ; } 2>&1 ) || {
|
||||
printf "\n%s: ERROR: failed to open ID file '%s': %s\n\n" "$0" "$f" "$(printf "%s\n" "$ErrMSG" | sed -e 's/.*: *//')"
|
||||
for f in "$PUB_ID_FILE" ${PRIV_ID_FILE:+"$PRIV_ID_FILE"} ; do
|
||||
ErrMSG=$( { : < "$f" ; } 2>&1 ) || {
|
||||
local L_PRIVMSG=""
|
||||
[ "$f" = "$PRIV_ID_FILE" ] && L_PRIVMSG=" (to install the contents of '$PUB_ID_FILE' anyway, look at the -f option)"
|
||||
printf "\n%s: ERROR: failed to open ID file '%s': %s\n" "$0" "$f" "$(printf "%s\n%s\n" "$ErrMSG" "$L_PRIVMSG" | sed -e 's/.*: *//')"
|
||||
exit 1
|
||||
}
|
||||
done
|
||||
printf '%s: INFO: Source of key(s) to be installed: "%s"\n' "$0" "$PUB_ID_FILE" >&2
|
||||
GET_ID="cat \"$PUB_ID_FILE\""
|
||||
}
|
||||
|
||||
@ -121,7 +127,7 @@ do
|
||||
}
|
||||
shift
|
||||
;;
|
||||
-n|-h|-\?)
|
||||
-f|-n|-h|-\?)
|
||||
OPT="$1"
|
||||
OPTARG=
|
||||
shift
|
||||
@ -154,6 +160,9 @@ do
|
||||
-o|-p)
|
||||
SSH_OPTS="${SSH_OPTS:+$SSH_OPTS }$OPT '$(quote "$OPTARG")'"
|
||||
;;
|
||||
-f)
|
||||
FORCED=1
|
||||
;;
|
||||
-n)
|
||||
DRY_RUN=1
|
||||
;;
|
||||
@ -194,27 +203,35 @@ fi
|
||||
populate_new_ids() {
|
||||
local L_SUCCESS="$1"
|
||||
|
||||
if [ "$FORCED" ] ; then
|
||||
NEW_IDS=$(eval $GET_ID)
|
||||
return
|
||||
fi
|
||||
|
||||
# repopulate "$@" inside this function
|
||||
eval set -- "$SSH_OPTS"
|
||||
|
||||
umask 0177
|
||||
local L_TMP_ID_FILE=$(mktemp ~/.ssh/ssh-copy-id_id.XXXXXXXXXX)
|
||||
if test $? -ne 0 || test "x$L_TMP_ID_FILE" = "x" ; then
|
||||
echo "mktemp failed" 1>&2
|
||||
printf '%s: ERROR: mktemp failed\n' "$0" >&2
|
||||
exit 1
|
||||
fi
|
||||
trap "rm -f $L_TMP_ID_FILE ${L_TMP_ID_FILE}.pub" EXIT TERM INT QUIT
|
||||
local L_CLEANUP="rm -f \"$L_TMP_ID_FILE\" \"${L_TMP_ID_FILE}.stderr\""
|
||||
trap "$L_CLEANUP" EXIT TERM INT QUIT
|
||||
printf '%s: INFO: attempting to log in with the new key(s), to filter out any that are already installed\n' "$0" >&2
|
||||
NEW_IDS=$(
|
||||
eval $GET_ID | {
|
||||
while read ID ; do
|
||||
printf '%s\n' "$ID" > $L_TMP_ID_FILE
|
||||
while read ID || [ "$ID" ] ; do
|
||||
printf '%s\n' "$ID" > "$L_TMP_ID_FILE"
|
||||
|
||||
# the next line assumes $PRIV_ID_FILE only set if using a single id file - this
|
||||
# assumption will break if we implement the possibility of multiple -i options.
|
||||
# The point being that if file based, ssh needs the private key, which it cannot
|
||||
# find if only given the contents of the .pub file in an unrelated tmpfile
|
||||
ssh -i "${PRIV_ID_FILE:-$L_TMP_ID_FILE}" \
|
||||
-o ControlPath=none \
|
||||
-o LogLevel=INFO \
|
||||
-o PreferredAuthentications=publickey \
|
||||
-o IdentitiesOnly=yes "$@" exit 2>$L_TMP_ID_FILE.stderr </dev/null
|
||||
if [ "$?" = "$L_SUCCESS" ] ; then
|
||||
@ -230,20 +247,21 @@ populate_new_ids() {
|
||||
done
|
||||
}
|
||||
)
|
||||
rm -f $L_TMP_ID_FILE* && trap - EXIT TERM INT QUIT
|
||||
eval "$L_CLEANUP" && trap - EXIT TERM INT QUIT
|
||||
|
||||
if expr "$NEW_IDS" : "^ERROR: " >/dev/null ; then
|
||||
printf '\n%s: %s\n\n' "$0" "$NEW_IDS" >&2
|
||||
exit 1
|
||||
fi
|
||||
if [ -z "$NEW_IDS" ] ; then
|
||||
printf '\n%s: WARNING: All keys were skipped because they already exist on the remote system.\n\n' "$0" >&2
|
||||
printf '\n%s: WARNING: All keys were skipped because they already exist on the remote system.\n' "$0" >&2
|
||||
printf '\t\t(if you think this is a mistake, you may want to use -f option)\n\n' "$0" >&2
|
||||
exit 0
|
||||
fi
|
||||
printf '%s: INFO: %d key(s) remain to be installed -- if you are prompted now it is to install the new keys\n' "$0" "$(printf '%s\n' "$NEW_IDS" | wc -l)" >&2
|
||||
}
|
||||
|
||||
REMOTE_VERSION=$(ssh -v -o PreferredAuthentications=',' "$@" 2>&1 |
|
||||
REMOTE_VERSION=$(ssh -v -o PreferredAuthentications=',' -o ControlPath=none "$@" 2>&1 |
|
||||
sed -ne 's/.*remote software version //p')
|
||||
|
||||
case "$REMOTE_VERSION" in
|
||||
@ -269,10 +287,9 @@ case "$REMOTE_VERSION" in
|
||||
*)
|
||||
# Assuming that the remote host treats ~/.ssh/authorized_keys as one might expect
|
||||
populate_new_ids 0
|
||||
[ "$DRY_RUN" ] || printf '%s\n' "$NEW_IDS" | ssh "$@" "
|
||||
umask 077 ;
|
||||
mkdir -p .ssh && cat >> .ssh/authorized_keys || exit 1 ;
|
||||
if type restorecon >/dev/null 2>&1 ; then restorecon -F .ssh .ssh/authorized_keys ; fi" \
|
||||
# in ssh below - to defend against quirky remote shells: use 'exec sh -c' to get POSIX; 'cd' to be at $HOME; and all on one line, because tcsh.
|
||||
[ "$DRY_RUN" ] || printf '%s\n' "$NEW_IDS" | \
|
||||
ssh "$@" "exec sh -c 'cd ; umask 077 ; mkdir -p .ssh && cat >> .ssh/authorized_keys || exit 1 ; if type restorecon >/dev/null 2>&1 ; then restorecon -F .ssh .ssh/authorized_keys ; fi'" \
|
||||
|| exit 1
|
||||
ADDED=$(printf '%s\n' "$NEW_IDS" | wc -l)
|
||||
;;
|
||||
|
@ -29,6 +29,7 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
.Nd use locally available keys to authorise logins on a remote machine
|
||||
.Sh SYNOPSIS
|
||||
.Nm
|
||||
.Op Fl f
|
||||
.Op Fl n
|
||||
.Op Fl i Op Ar identity_file
|
||||
.Op Fl p Ar port
|
||||
@ -76,6 +77,10 @@ is used.
|
||||
Note that this can be used to ensure that the keys copied have the
|
||||
comment one prefers and/or extra options applied, by ensuring that the
|
||||
key file has these set as preferred before the copy is attempted.
|
||||
.It Fl f
|
||||
Forced mode: doesn't check if the keys are present on the remote server.
|
||||
This means that it does not need the private key. Of course, this can result
|
||||
in more than one copy of the key being installed on the remote system.
|
||||
.It Fl n
|
||||
do a dry-run. Instead of installing keys on the remote system simply
|
||||
prints the key(s) that would have been installed.
|
||||
|
@ -13,7 +13,7 @@
|
||||
|
||||
Summary: OpenSSH, a free Secure Shell (SSH) protocol implementation
|
||||
Name: openssh
|
||||
Version: 7.1p2
|
||||
Version: 7.2p2
|
||||
URL: http://www.openssh.com/
|
||||
Release: 1
|
||||
Source0: openssh-%{version}.tar.gz
|
||||
|
@ -850,4 +850,11 @@ struct winsize {
|
||||
# endif /* gcc version */
|
||||
#endif /* __predict_true */
|
||||
|
||||
#if defined(HAVE_GLOB_H) && defined(GLOB_HAS_ALTDIRFUNC) && \
|
||||
defined(GLOB_HAS_GL_MATCHC) && defined(GLOB_HAS_GL_STATV) && \
|
||||
defined(HAVE_DECL_GLOB_NOMATCH) && HAVE_DECL_GLOB_NOMATCH != 0 && \
|
||||
!defined(BROKEN_GLOB)
|
||||
# define USE_SYSTEM_GLOB
|
||||
#endif
|
||||
|
||||
#endif /* _DEFINES_H */
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $OpenBSD: dh.h,v 1.13 2015/05/27 23:39:18 dtucker Exp $ */
|
||||
/* $OpenBSD: dh.h,v 1.14 2015/10/16 22:32:22 djm Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2000 Niels Provos. All rights reserved.
|
||||
@ -44,8 +44,11 @@ int dh_pub_is_valid(DH *, BIGNUM *);
|
||||
|
||||
u_int dh_estimate(int);
|
||||
|
||||
/* Min and max values from RFC4419. */
|
||||
#define DH_GRP_MIN 1024
|
||||
/*
|
||||
* Max value from RFC4419.
|
||||
* Miniumum increased in light of DH precomputation attacks.
|
||||
*/
|
||||
#define DH_GRP_MIN 2048
|
||||
#define DH_GRP_MAX 8192
|
||||
|
||||
/*
|
||||
|
@ -32,12 +32,6 @@
|
||||
#ifdef HAVE_BSTRING_H
|
||||
# include <bstring.h>
|
||||
#endif
|
||||
#if defined(HAVE_GLOB_H) && defined(GLOB_HAS_ALTDIRFUNC) && \
|
||||
defined(GLOB_HAS_GL_MATCHC) && defined(GLOB_HAS_GL_STATV) && \
|
||||
defined(HAVE_DECL_GLOB_NOMATCH) && HAVE_DECL_GLOB_NOMATCH != 0 && \
|
||||
!defined(BROKEN_GLOB)
|
||||
# include <glob.h>
|
||||
#endif
|
||||
#ifdef HAVE_ENDIAN_H
|
||||
# include <endian.h>
|
||||
#endif
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $OpenBSD: kex.c,v 1.109 2015/07/30 00:01:34 djm Exp $ */
|
||||
/* $OpenBSD: kex.c,v 1.117 2016/02/08 10:57:07 djm Exp $ */
|
||||
/*
|
||||
* Copyright (c) 2000, 2001 Markus Friedl. All rights reserved.
|
||||
*
|
||||
@ -49,7 +49,6 @@
|
||||
#include "misc.h"
|
||||
#include "dispatch.h"
|
||||
#include "monitor.h"
|
||||
#include "roaming.h"
|
||||
|
||||
#include "ssherr.h"
|
||||
#include "sshbuf.h"
|
||||
@ -67,6 +66,19 @@ extern const EVP_MD *evp_ssh_sha256(void);
|
||||
static int kex_choose_conf(struct ssh *);
|
||||
static int kex_input_newkeys(int, u_int32_t, void *);
|
||||
|
||||
static const char *proposal_names[PROPOSAL_MAX] = {
|
||||
"KEX algorithms",
|
||||
"host key algorithms",
|
||||
"ciphers ctos",
|
||||
"ciphers stoc",
|
||||
"MACs ctos",
|
||||
"MACs stoc",
|
||||
"compression ctos",
|
||||
"compression stoc",
|
||||
"languages ctos",
|
||||
"languages stoc",
|
||||
};
|
||||
|
||||
struct kexalg {
|
||||
char *name;
|
||||
u_int type;
|
||||
@ -267,7 +279,7 @@ kex_buf2prop(struct sshbuf *raw, int *first_kex_follows, char ***propp)
|
||||
for (i = 0; i < PROPOSAL_MAX; i++) {
|
||||
if ((r = sshbuf_get_cstring(b, &(proposal[i]), NULL)) != 0)
|
||||
goto out;
|
||||
debug2("kex_parse_kexinit: %s", proposal[i]);
|
||||
debug2("%s: %s", proposal_names[i], proposal[i]);
|
||||
}
|
||||
/* first kex follows / reserved */
|
||||
if ((r = sshbuf_get_u8(b, &v)) != 0 || /* first_kex_follows */
|
||||
@ -302,7 +314,14 @@ kex_prop_free(char **proposal)
|
||||
static int
|
||||
kex_protocol_error(int type, u_int32_t seq, void *ctxt)
|
||||
{
|
||||
error("Hm, kex protocol error: type %d seq %u", type, seq);
|
||||
struct ssh *ssh = active_state; /* XXX */
|
||||
int r;
|
||||
|
||||
error("kex protocol error: type %d seq %u", type, seq);
|
||||
if ((r = sshpkt_start(ssh, SSH2_MSG_UNIMPLEMENTED)) != 0 ||
|
||||
(r = sshpkt_put_u32(ssh, seq)) != 0 ||
|
||||
(r = sshpkt_send(ssh)) != 0)
|
||||
return r;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -314,6 +333,20 @@ kex_reset_dispatch(struct ssh *ssh)
|
||||
ssh_dispatch_set(ssh, SSH2_MSG_KEXINIT, &kex_input_kexinit);
|
||||
}
|
||||
|
||||
static int
|
||||
kex_send_ext_info(struct ssh *ssh)
|
||||
{
|
||||
int r;
|
||||
|
||||
if ((r = sshpkt_start(ssh, SSH2_MSG_EXT_INFO)) != 0 ||
|
||||
(r = sshpkt_put_u32(ssh, 1)) != 0 ||
|
||||
(r = sshpkt_put_cstring(ssh, "server-sig-algs")) != 0 ||
|
||||
(r = sshpkt_put_cstring(ssh, "rsa-sha2-256,rsa-sha2-512")) != 0 ||
|
||||
(r = sshpkt_send(ssh)) != 0)
|
||||
return r;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
kex_send_newkeys(struct ssh *ssh)
|
||||
{
|
||||
@ -326,9 +359,51 @@ kex_send_newkeys(struct ssh *ssh)
|
||||
debug("SSH2_MSG_NEWKEYS sent");
|
||||
debug("expecting SSH2_MSG_NEWKEYS");
|
||||
ssh_dispatch_set(ssh, SSH2_MSG_NEWKEYS, &kex_input_newkeys);
|
||||
if (ssh->kex->ext_info_c)
|
||||
if ((r = kex_send_ext_info(ssh)) != 0)
|
||||
return r;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
kex_input_ext_info(int type, u_int32_t seq, void *ctxt)
|
||||
{
|
||||
struct ssh *ssh = ctxt;
|
||||
struct kex *kex = ssh->kex;
|
||||
u_int32_t i, ninfo;
|
||||
char *name, *val, *found;
|
||||
int r;
|
||||
|
||||
debug("SSH2_MSG_EXT_INFO received");
|
||||
ssh_dispatch_set(ssh, SSH2_MSG_EXT_INFO, &kex_protocol_error);
|
||||
if ((r = sshpkt_get_u32(ssh, &ninfo)) != 0)
|
||||
return r;
|
||||
for (i = 0; i < ninfo; i++) {
|
||||
if ((r = sshpkt_get_cstring(ssh, &name, NULL)) != 0)
|
||||
return r;
|
||||
if ((r = sshpkt_get_cstring(ssh, &val, NULL)) != 0) {
|
||||
free(name);
|
||||
return r;
|
||||
}
|
||||
debug("%s: %s=<%s>", __func__, name, val);
|
||||
if (strcmp(name, "server-sig-algs") == 0) {
|
||||
found = match_list("rsa-sha2-256", val, NULL);
|
||||
if (found) {
|
||||
kex->rsa_sha2 = 256;
|
||||
free(found);
|
||||
}
|
||||
found = match_list("rsa-sha2-512", val, NULL);
|
||||
if (found) {
|
||||
kex->rsa_sha2 = 512;
|
||||
free(found);
|
||||
}
|
||||
}
|
||||
free(name);
|
||||
free(val);
|
||||
}
|
||||
return sshpkt_get_end(ssh);
|
||||
}
|
||||
|
||||
static int
|
||||
kex_input_newkeys(int type, u_int32_t seq, void *ctxt)
|
||||
{
|
||||
@ -468,7 +543,7 @@ kex_free_newkeys(struct newkeys *newkeys)
|
||||
newkeys->enc.key = NULL;
|
||||
}
|
||||
if (newkeys->enc.iv) {
|
||||
explicit_bzero(newkeys->enc.iv, newkeys->enc.block_size);
|
||||
explicit_bzero(newkeys->enc.iv, newkeys->enc.iv_len);
|
||||
free(newkeys->enc.iv);
|
||||
newkeys->enc.iv = NULL;
|
||||
}
|
||||
@ -511,6 +586,8 @@ kex_free(struct kex *kex)
|
||||
free(kex->client_version_string);
|
||||
free(kex->server_version_string);
|
||||
free(kex->failed_choice);
|
||||
free(kex->hostkey_alg);
|
||||
free(kex->name);
|
||||
free(kex);
|
||||
}
|
||||
|
||||
@ -529,6 +606,25 @@ kex_setup(struct ssh *ssh, char *proposal[PROPOSAL_MAX])
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Request key re-exchange, returns 0 on success or a ssherr.h error
|
||||
* code otherwise. Must not be called if KEX is incomplete or in-progress.
|
||||
*/
|
||||
int
|
||||
kex_start_rekex(struct ssh *ssh)
|
||||
{
|
||||
if (ssh->kex == NULL) {
|
||||
error("%s: no kex", __func__);
|
||||
return SSH_ERR_INTERNAL_ERROR;
|
||||
}
|
||||
if (ssh->kex->done == 0) {
|
||||
error("%s: requested twice", __func__);
|
||||
return SSH_ERR_INTERNAL_ERROR;
|
||||
}
|
||||
ssh->kex->done = 0;
|
||||
return kex_send_kexinit(ssh);
|
||||
}
|
||||
|
||||
static int
|
||||
choose_enc(struct sshenc *enc, char *client, char *server)
|
||||
{
|
||||
@ -593,6 +689,7 @@ choose_kex(struct kex *k, char *client, char *server)
|
||||
|
||||
k->name = match_list(client, server, NULL);
|
||||
|
||||
debug("kex: algorithm: %s", k->name ? k->name : "(no match)");
|
||||
if (k->name == NULL)
|
||||
return SSH_ERR_NO_KEX_ALG_MATCH;
|
||||
if ((kexalg = kex_alg_by_name(k->name)) == NULL)
|
||||
@ -606,15 +703,16 @@ choose_kex(struct kex *k, char *client, char *server)
|
||||
static int
|
||||
choose_hostkeyalg(struct kex *k, char *client, char *server)
|
||||
{
|
||||
char *hostkeyalg = match_list(client, server, NULL);
|
||||
k->hostkey_alg = match_list(client, server, NULL);
|
||||
|
||||
if (hostkeyalg == NULL)
|
||||
debug("kex: host key algorithm: %s",
|
||||
k->hostkey_alg ? k->hostkey_alg : "(no match)");
|
||||
if (k->hostkey_alg == NULL)
|
||||
return SSH_ERR_NO_HOSTKEY_ALG_MATCH;
|
||||
k->hostkey_type = sshkey_type_from_name(hostkeyalg);
|
||||
k->hostkey_type = sshkey_type_from_name(k->hostkey_alg);
|
||||
if (k->hostkey_type == KEY_UNSPEC)
|
||||
return SSH_ERR_INTERNAL_ERROR;
|
||||
k->hostkey_nid = sshkey_ecdsa_nid_from_name(hostkeyalg);
|
||||
free(hostkeyalg);
|
||||
k->hostkey_nid = sshkey_ecdsa_nid_from_name(k->hostkey_alg);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -653,8 +751,11 @@ kex_choose_conf(struct ssh *ssh)
|
||||
u_int mode, ctos, need, dh_need, authlen;
|
||||
int r, first_kex_follows;
|
||||
|
||||
if ((r = kex_buf2prop(kex->my, NULL, &my)) != 0 ||
|
||||
(r = kex_buf2prop(kex->peer, &first_kex_follows, &peer)) != 0)
|
||||
debug2("local %s KEXINIT proposal", kex->server ? "server" : "client");
|
||||
if ((r = kex_buf2prop(kex->my, NULL, &my)) != 0)
|
||||
goto out;
|
||||
debug2("peer %s KEXINIT proposal", kex->server ? "client" : "server");
|
||||
if ((r = kex_buf2prop(kex->peer, &first_kex_follows, &peer)) != 0)
|
||||
goto out;
|
||||
|
||||
if (kex->server) {
|
||||
@ -665,18 +766,30 @@ kex_choose_conf(struct ssh *ssh)
|
||||
sprop=peer;
|
||||
}
|
||||
|
||||
/* Check whether server offers roaming */
|
||||
if (!kex->server) {
|
||||
char *roaming = match_list(KEX_RESUME,
|
||||
peer[PROPOSAL_KEX_ALGS], NULL);
|
||||
/* Check whether client supports ext_info_c */
|
||||
if (kex->server) {
|
||||
char *ext;
|
||||
|
||||
if (roaming) {
|
||||
kex->roaming = 1;
|
||||
free(roaming);
|
||||
ext = match_list("ext-info-c", peer[PROPOSAL_KEX_ALGS], NULL);
|
||||
if (ext) {
|
||||
kex->ext_info_c = 1;
|
||||
free(ext);
|
||||
}
|
||||
}
|
||||
|
||||
/* Algorithm Negotiation */
|
||||
if ((r = choose_kex(kex, cprop[PROPOSAL_KEX_ALGS],
|
||||
sprop[PROPOSAL_KEX_ALGS])) != 0) {
|
||||
kex->failed_choice = peer[PROPOSAL_KEX_ALGS];
|
||||
peer[PROPOSAL_KEX_ALGS] = NULL;
|
||||
goto out;
|
||||
}
|
||||
if ((r = choose_hostkeyalg(kex, cprop[PROPOSAL_SERVER_HOST_KEY_ALGS],
|
||||
sprop[PROPOSAL_SERVER_HOST_KEY_ALGS])) != 0) {
|
||||
kex->failed_choice = peer[PROPOSAL_SERVER_HOST_KEY_ALGS];
|
||||
peer[PROPOSAL_SERVER_HOST_KEY_ALGS] = NULL;
|
||||
goto out;
|
||||
}
|
||||
for (mode = 0; mode < MODE_MAX; mode++) {
|
||||
if ((newkeys = calloc(1, sizeof(*newkeys))) == NULL) {
|
||||
r = SSH_ERR_ALLOC_FAIL;
|
||||
@ -709,24 +822,12 @@ kex_choose_conf(struct ssh *ssh)
|
||||
peer[ncomp] = NULL;
|
||||
goto out;
|
||||
}
|
||||
debug("kex: %s %s %s %s",
|
||||
debug("kex: %s cipher: %s MAC: %s compression: %s",
|
||||
ctos ? "client->server" : "server->client",
|
||||
newkeys->enc.name,
|
||||
authlen == 0 ? newkeys->mac.name : "<implicit>",
|
||||
newkeys->comp.name);
|
||||
}
|
||||
if ((r = choose_kex(kex, cprop[PROPOSAL_KEX_ALGS],
|
||||
sprop[PROPOSAL_KEX_ALGS])) != 0) {
|
||||
kex->failed_choice = peer[PROPOSAL_KEX_ALGS];
|
||||
peer[PROPOSAL_KEX_ALGS] = NULL;
|
||||
goto out;
|
||||
}
|
||||
if ((r = choose_hostkeyalg(kex, cprop[PROPOSAL_SERVER_HOST_KEY_ALGS],
|
||||
sprop[PROPOSAL_SERVER_HOST_KEY_ALGS])) != 0) {
|
||||
kex->failed_choice = peer[PROPOSAL_SERVER_HOST_KEY_ALGS];
|
||||
peer[PROPOSAL_SERVER_HOST_KEY_ALGS] = NULL;
|
||||
goto out;
|
||||
}
|
||||
need = dh_need = 0;
|
||||
for (mode = 0; mode < MODE_MAX; mode++) {
|
||||
newkeys = kex->newkeys[mode];
|
||||
@ -812,8 +913,7 @@ derive_key(struct ssh *ssh, int id, u_int need, u_char *hash, u_int hashlen,
|
||||
digest = NULL;
|
||||
r = 0;
|
||||
out:
|
||||
if (digest)
|
||||
free(digest);
|
||||
free(digest);
|
||||
ssh_digest_free(hashctx);
|
||||
return r;
|
||||
}
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $OpenBSD: kex.h,v 1.73 2015/07/30 00:01:34 djm Exp $ */
|
||||
/* $OpenBSD: kex.h,v 1.76 2016/02/08 10:57:07 djm Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2000, 2001 Markus Friedl. All rights reserved.
|
||||
@ -54,7 +54,6 @@
|
||||
#define KEX_DH14 "diffie-hellman-group14-sha1"
|
||||
#define KEX_DHGEX_SHA1 "diffie-hellman-group-exchange-sha1"
|
||||
#define KEX_DHGEX_SHA256 "diffie-hellman-group-exchange-sha256"
|
||||
#define KEX_RESUME "resume@appgate.com"
|
||||
#define KEX_ECDH_SHA2_NISTP256 "ecdh-sha2-nistp256"
|
||||
#define KEX_ECDH_SHA2_NISTP384 "ecdh-sha2-nistp384"
|
||||
#define KEX_ECDH_SHA2_NISTP521 "ecdh-sha2-nistp521"
|
||||
@ -129,10 +128,12 @@ struct kex {
|
||||
u_int dh_need;
|
||||
int server;
|
||||
char *name;
|
||||
char *hostkey_alg;
|
||||
int hostkey_type;
|
||||
int hostkey_nid;
|
||||
u_int kex_type;
|
||||
int roaming;
|
||||
int rsa_sha2;
|
||||
int ext_info_c;
|
||||
struct sshbuf *my;
|
||||
struct sshbuf *peer;
|
||||
sig_atomic_t done;
|
||||
@ -146,8 +147,8 @@ struct kex {
|
||||
struct sshkey *(*load_host_public_key)(int, int, struct ssh *);
|
||||
struct sshkey *(*load_host_private_key)(int, int, struct ssh *);
|
||||
int (*host_key_index)(struct sshkey *, int, struct ssh *);
|
||||
int (*sign)(struct sshkey *, struct sshkey *,
|
||||
u_char **, size_t *, const u_char *, size_t, u_int);
|
||||
int (*sign)(struct sshkey *, struct sshkey *, u_char **, size_t *,
|
||||
const u_char *, size_t, const char *, u_int);
|
||||
int (*kex[KEX_MAX])(struct ssh *);
|
||||
/* kex specific state */
|
||||
DH *dh; /* DH */
|
||||
@ -174,9 +175,11 @@ void kex_prop_free(char **);
|
||||
|
||||
int kex_send_kexinit(struct ssh *);
|
||||
int kex_input_kexinit(int, u_int32_t, void *);
|
||||
int kex_input_ext_info(int, u_int32_t, void *);
|
||||
int kex_derive_keys(struct ssh *, u_char *, u_int, const struct sshbuf *);
|
||||
int kex_derive_keys_bn(struct ssh *, u_char *, u_int, const BIGNUM *);
|
||||
int kex_send_newkeys(struct ssh *);
|
||||
int kex_start_rekex(struct ssh *);
|
||||
|
||||
int kexdh_client(struct ssh *);
|
||||
int kexdh_server(struct ssh *);
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $OpenBSD: kexc25519s.c,v 1.9 2015/04/27 00:37:53 dtucker Exp $ */
|
||||
/* $OpenBSD: kexc25519s.c,v 1.10 2015/12/04 16:41:28 markus Exp $ */
|
||||
/*
|
||||
* Copyright (c) 2001 Markus Friedl. All rights reserved.
|
||||
* Copyright (c) 2010 Damien Miller. All rights reserved.
|
||||
@ -134,8 +134,8 @@ input_kex_c25519_init(int type, u_int32_t seq, void *ctxt)
|
||||
}
|
||||
|
||||
/* sign H */
|
||||
if ((r = kex->sign(server_host_private, server_host_public,
|
||||
&signature, &slen, hash, hashlen, ssh->compat)) < 0)
|
||||
if ((r = kex->sign(server_host_private, server_host_public, &signature,
|
||||
&slen, hash, hashlen, kex->hostkey_alg, ssh->compat)) < 0)
|
||||
goto out;
|
||||
|
||||
/* send server hostkey, ECDH pubkey 'Q_S' and signed H */
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $OpenBSD: kexdhs.c,v 1.22 2015/01/26 06:10:03 djm Exp $ */
|
||||
/* $OpenBSD: kexdhs.c,v 1.23 2015/12/04 16:41:28 markus Exp $ */
|
||||
/*
|
||||
* Copyright (c) 2001 Markus Friedl. All rights reserved.
|
||||
*
|
||||
@ -181,8 +181,8 @@ input_kex_dh_init(int type, u_int32_t seq, void *ctxt)
|
||||
}
|
||||
|
||||
/* sign H */
|
||||
if ((r = kex->sign(server_host_private, server_host_public,
|
||||
&signature, &slen, hash, hashlen, ssh->compat)) < 0)
|
||||
if ((r = kex->sign(server_host_private, server_host_public, &signature,
|
||||
&slen, hash, hashlen, kex->hostkey_alg, ssh->compat)) < 0)
|
||||
goto out;
|
||||
|
||||
/* destroy_sensitive_data(); */
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $OpenBSD: kexecdhs.c,v 1.14 2015/01/26 06:10:03 djm Exp $ */
|
||||
/* $OpenBSD: kexecdhs.c,v 1.15 2015/12/04 16:41:28 markus Exp $ */
|
||||
/*
|
||||
* Copyright (c) 2001 Markus Friedl. All rights reserved.
|
||||
* Copyright (c) 2010 Damien Miller. All rights reserved.
|
||||
@ -169,8 +169,8 @@ input_kex_ecdh_init(int type, u_int32_t seq, void *ctxt)
|
||||
}
|
||||
|
||||
/* sign H */
|
||||
if ((r = kex->sign(server_host_private, server_host_public,
|
||||
&signature, &slen, hash, hashlen, ssh->compat)) < 0)
|
||||
if ((r = kex->sign(server_host_private, server_host_public, &signature,
|
||||
&slen, hash, hashlen, kex->hostkey_alg, ssh->compat)) < 0)
|
||||
goto out;
|
||||
|
||||
/* destroy_sensitive_data(); */
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $OpenBSD: kexgexs.c,v 1.25 2015/04/13 02:04:08 djm Exp $ */
|
||||
/* $OpenBSD: kexgexs.c,v 1.26 2015/12/04 16:41:28 markus Exp $ */
|
||||
/*
|
||||
* Copyright (c) 2000 Niels Provos. All rights reserved.
|
||||
* Copyright (c) 2001 Markus Friedl. All rights reserved.
|
||||
@ -220,8 +220,8 @@ input_kex_dh_gex_init(int type, u_int32_t seq, void *ctxt)
|
||||
}
|
||||
|
||||
/* sign H */
|
||||
if ((r = kex->sign(server_host_private, server_host_public,
|
||||
&signature, &slen, hash, hashlen, ssh->compat)) < 0)
|
||||
if ((r = kex->sign(server_host_private, server_host_public, &signature,
|
||||
&slen, hash, hashlen, kex->hostkey_alg, ssh->compat)) < 0)
|
||||
goto out;
|
||||
|
||||
/* destroy_sensitive_data(); */
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $OpenBSD: key.c,v 1.128 2015/07/03 03:43:18 djm Exp $ */
|
||||
/* $OpenBSD: key.c,v 1.129 2015/12/04 16:41:28 markus Exp $ */
|
||||
/*
|
||||
* placed in the public domain
|
||||
*/
|
||||
@ -132,7 +132,7 @@ key_to_blob(const Key *key, u_char **blobp, u_int *lenp)
|
||||
|
||||
int
|
||||
key_sign(const Key *key, u_char **sigp, u_int *lenp,
|
||||
const u_char *data, u_int datalen)
|
||||
const u_char *data, u_int datalen, const char *alg)
|
||||
{
|
||||
int r;
|
||||
u_char *sig;
|
||||
@ -143,7 +143,7 @@ key_sign(const Key *key, u_char **sigp, u_int *lenp,
|
||||
if (lenp != NULL)
|
||||
*lenp = 0;
|
||||
if ((r = sshkey_sign(key, &sig, &siglen,
|
||||
data, datalen, datafellows)) != 0) {
|
||||
data, datalen, alg, datafellows)) != 0) {
|
||||
fatal_on_fatal_errors(r, __func__, 0);
|
||||
error("%s: %s", __func__, ssh_err(r));
|
||||
return -1;
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $OpenBSD: key.h,v 1.48 2015/07/03 03:43:18 djm Exp $ */
|
||||
/* $OpenBSD: key.h,v 1.49 2015/12/04 16:41:28 markus Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2000, 2001 Markus Friedl. All rights reserved.
|
||||
@ -84,7 +84,8 @@ int key_ec_validate_private(const EC_KEY *);
|
||||
Key *key_from_blob(const u_char *, u_int);
|
||||
int key_to_blob(const Key *, u_char **, u_int *);
|
||||
|
||||
int key_sign(const Key *, u_char **, u_int *, const u_char *, u_int);
|
||||
int key_sign(const Key *, u_char **, u_int *, const u_char *, u_int,
|
||||
const char *);
|
||||
int key_verify(const Key *, const u_char *, u_int, const u_char *, u_int);
|
||||
|
||||
void key_private_serialize(const Key *, struct sshbuf *);
|
||||
|
@ -14,7 +14,7 @@
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/* $OpenBSD: krl.c,v 1.33 2015/07/03 03:43:18 djm Exp $ */
|
||||
/* $OpenBSD: krl.c,v 1.37 2015/12/31 00:33:52 djm Exp $ */
|
||||
|
||||
#include "includes.h"
|
||||
|
||||
@ -723,7 +723,7 @@ ssh_krl_to_blob(struct ssh_krl *krl, struct sshbuf *buf,
|
||||
if ((r = sshbuf_put(buf, KRL_MAGIC, sizeof(KRL_MAGIC) - 1)) != 0 ||
|
||||
(r = sshbuf_put_u32(buf, KRL_FORMAT_VERSION)) != 0 ||
|
||||
(r = sshbuf_put_u64(buf, krl->krl_version)) != 0 ||
|
||||
(r = sshbuf_put_u64(buf, krl->generated_date) != 0) ||
|
||||
(r = sshbuf_put_u64(buf, krl->generated_date)) != 0 ||
|
||||
(r = sshbuf_put_u64(buf, krl->flags)) != 0 ||
|
||||
(r = sshbuf_put_string(buf, NULL, 0)) != 0 ||
|
||||
(r = sshbuf_put_cstring(buf, krl->comment)) != 0)
|
||||
@ -772,7 +772,7 @@ ssh_krl_to_blob(struct ssh_krl *krl, struct sshbuf *buf,
|
||||
goto out;
|
||||
|
||||
if ((r = sshkey_sign(sign_keys[i], &sblob, &slen,
|
||||
sshbuf_ptr(buf), sshbuf_len(buf), 0)) != 0)
|
||||
sshbuf_ptr(buf), sshbuf_len(buf), NULL, 0)) != 0)
|
||||
goto out;
|
||||
KRL_DBG(("%s: signature sig len %zu", __func__, slen));
|
||||
if ((r = sshbuf_put_string(buf, sblob, slen)) != 0)
|
||||
@ -826,10 +826,8 @@ parse_revoked_certs(struct sshbuf *buf, struct ssh_krl *krl)
|
||||
goto out;
|
||||
|
||||
while (sshbuf_len(buf) > 0) {
|
||||
if (subsect != NULL) {
|
||||
sshbuf_free(subsect);
|
||||
subsect = NULL;
|
||||
}
|
||||
sshbuf_free(subsect);
|
||||
subsect = NULL;
|
||||
if ((r = sshbuf_get_u8(buf, &type)) != 0 ||
|
||||
(r = sshbuf_froms(buf, &subsect)) != 0)
|
||||
goto out;
|
||||
@ -1017,7 +1015,7 @@ ssh_krl_from_blob(struct sshbuf *buf, struct ssh_krl **krlp,
|
||||
}
|
||||
/* Check signature over entire KRL up to this point */
|
||||
if ((r = sshkey_verify(key, blob, blen,
|
||||
sshbuf_ptr(buf), sshbuf_len(buf) - sig_off, 0)) != 0)
|
||||
sshbuf_ptr(buf), sig_off, 0)) != 0)
|
||||
goto out;
|
||||
/* Check if this key has already signed this KRL */
|
||||
for (i = 0; i < nca_used; i++) {
|
||||
@ -1038,7 +1036,6 @@ ssh_krl_from_blob(struct sshbuf *buf, struct ssh_krl **krlp,
|
||||
ca_used = tmp_ca_used;
|
||||
ca_used[nca_used++] = key;
|
||||
key = NULL;
|
||||
break;
|
||||
}
|
||||
|
||||
if (sshbuf_len(copy) != 0) {
|
||||
@ -1059,10 +1056,8 @@ ssh_krl_from_blob(struct sshbuf *buf, struct ssh_krl **krlp,
|
||||
if ((r = sshbuf_consume(copy, sects_off)) != 0)
|
||||
goto out;
|
||||
while (sshbuf_len(copy) > 0) {
|
||||
if (sect != NULL) {
|
||||
sshbuf_free(sect);
|
||||
sect = NULL;
|
||||
}
|
||||
sshbuf_free(sect);
|
||||
sect = NULL;
|
||||
if ((r = sshbuf_get_u8(copy, &type)) != 0 ||
|
||||
(r = sshbuf_froms(copy, §)) != 0)
|
||||
goto out;
|
||||
@ -1105,7 +1100,7 @@ ssh_krl_from_blob(struct sshbuf *buf, struct ssh_krl **krlp,
|
||||
r = SSH_ERR_INVALID_FORMAT;
|
||||
goto out;
|
||||
}
|
||||
if (sshbuf_len(sect) > 0) {
|
||||
if (sect != NULL && sshbuf_len(sect) > 0) {
|
||||
error("KRL section contains unparsed data");
|
||||
r = SSH_ERR_INVALID_FORMAT;
|
||||
goto out;
|
||||
|
@ -14,7 +14,7 @@
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/* $OpenBSD: krl.h,v 1.4 2015/01/13 19:06:49 djm Exp $ */
|
||||
/* $OpenBSD: krl.h,v 1.5 2015/12/30 23:46:14 djm Exp $ */
|
||||
|
||||
#ifndef _KRL_H
|
||||
#define _KRL_H
|
||||
@ -43,7 +43,6 @@ struct ssh_krl;
|
||||
struct ssh_krl *ssh_krl_init(void);
|
||||
void ssh_krl_free(struct ssh_krl *krl);
|
||||
void ssh_krl_set_version(struct ssh_krl *krl, u_int64_t version);
|
||||
void ssh_krl_set_sign_key(struct ssh_krl *krl, const struct sshkey *sign_key);
|
||||
int ssh_krl_set_comment(struct ssh_krl *krl, const char *comment);
|
||||
int ssh_krl_revoke_cert_by_serial(struct ssh_krl *krl,
|
||||
const struct sshkey *ca_key, u_int64_t serial);
|
||||
|
@ -150,6 +150,9 @@
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/socket.h>
|
||||
#ifdef HAVE_SYS_TIME_H
|
||||
# include <sys/time.h>
|
||||
#endif
|
||||
|
||||
#include <netinet/in.h>
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $OpenBSD: misc.c,v 1.97 2015/04/24 01:36:00 deraadt Exp $ */
|
||||
/* $OpenBSD: misc.c,v 1.101 2016/01/20 09:22:39 dtucker Exp $ */
|
||||
/*
|
||||
* Copyright (c) 2000 Markus Friedl. All rights reserved.
|
||||
* Copyright (c) 2005,2006 Damien Miller. All rights reserved.
|
||||
@ -29,6 +29,7 @@
|
||||
#include <sys/types.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/time.h>
|
||||
#include <sys/un.h>
|
||||
|
||||
#include <limits.h>
|
||||
@ -604,6 +605,8 @@ percent_expand(const char *string, ...)
|
||||
/* %% case */
|
||||
if (*string == '%')
|
||||
goto append;
|
||||
if (*string == '\0')
|
||||
fatal("%s: invalid format", __func__);
|
||||
for (j = 0; j < num_keys; j++) {
|
||||
if (strchr(keys[j].key, *string) != NULL) {
|
||||
i = strlcat(buf, keys[j].repl, sizeof(buf));
|
||||
@ -653,62 +656,63 @@ tun_open(int tun, int mode)
|
||||
struct ifreq ifr;
|
||||
char name[100];
|
||||
int fd = -1, sock;
|
||||
const char *tunbase = "tun";
|
||||
|
||||
if (mode == SSH_TUNMODE_ETHERNET)
|
||||
tunbase = "tap";
|
||||
|
||||
/* Open the tunnel device */
|
||||
if (tun <= SSH_TUNID_MAX) {
|
||||
snprintf(name, sizeof(name), "/dev/tun%d", tun);
|
||||
snprintf(name, sizeof(name), "/dev/%s%d", tunbase, tun);
|
||||
fd = open(name, O_RDWR);
|
||||
} else if (tun == SSH_TUNID_ANY) {
|
||||
for (tun = 100; tun >= 0; tun--) {
|
||||
snprintf(name, sizeof(name), "/dev/tun%d", tun);
|
||||
snprintf(name, sizeof(name), "/dev/%s%d",
|
||||
tunbase, tun);
|
||||
if ((fd = open(name, O_RDWR)) >= 0)
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
debug("%s: invalid tunnel %u", __func__, tun);
|
||||
return (-1);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (fd < 0) {
|
||||
debug("%s: %s open failed: %s", __func__, name, strerror(errno));
|
||||
return (-1);
|
||||
debug("%s: %s open: %s", __func__, name, strerror(errno));
|
||||
return -1;
|
||||
}
|
||||
|
||||
debug("%s: %s mode %d fd %d", __func__, name, mode, fd);
|
||||
|
||||
/* Set the tunnel device operation mode */
|
||||
snprintf(ifr.ifr_name, sizeof(ifr.ifr_name), "tun%d", tun);
|
||||
/* Bring interface up if it is not already */
|
||||
snprintf(ifr.ifr_name, sizeof(ifr.ifr_name), "%s%d", tunbase, tun);
|
||||
if ((sock = socket(PF_UNIX, SOCK_STREAM, 0)) == -1)
|
||||
goto failed;
|
||||
|
||||
if (ioctl(sock, SIOCGIFFLAGS, &ifr) == -1)
|
||||
if (ioctl(sock, SIOCGIFFLAGS, &ifr) == -1) {
|
||||
debug("%s: get interface %s flags: %s", __func__,
|
||||
ifr.ifr_name, strerror(errno));
|
||||
goto failed;
|
||||
}
|
||||
|
||||
/* Set interface mode */
|
||||
ifr.ifr_flags &= ~IFF_UP;
|
||||
if (mode == SSH_TUNMODE_ETHERNET)
|
||||
ifr.ifr_flags |= IFF_LINK0;
|
||||
else
|
||||
ifr.ifr_flags &= ~IFF_LINK0;
|
||||
if (ioctl(sock, SIOCSIFFLAGS, &ifr) == -1)
|
||||
goto failed;
|
||||
|
||||
/* Bring interface up */
|
||||
ifr.ifr_flags |= IFF_UP;
|
||||
if (ioctl(sock, SIOCSIFFLAGS, &ifr) == -1)
|
||||
goto failed;
|
||||
if (!(ifr.ifr_flags & IFF_UP)) {
|
||||
ifr.ifr_flags |= IFF_UP;
|
||||
if (ioctl(sock, SIOCSIFFLAGS, &ifr) == -1) {
|
||||
debug("%s: activate interface %s: %s", __func__,
|
||||
ifr.ifr_name, strerror(errno));
|
||||
goto failed;
|
||||
}
|
||||
}
|
||||
|
||||
close(sock);
|
||||
return (fd);
|
||||
return fd;
|
||||
|
||||
failed:
|
||||
if (fd >= 0)
|
||||
close(fd);
|
||||
if (sock >= 0)
|
||||
close(sock);
|
||||
debug("%s: failed to set %s mode %d: %s", __func__, name,
|
||||
mode, strerror(errno));
|
||||
return (-1);
|
||||
return -1;
|
||||
#else
|
||||
error("Tunnel interfaces are not supported on this platform");
|
||||
return (-1);
|
||||
@ -1107,7 +1111,7 @@ unix_listener(const char *path, int backlog, int unlink_first)
|
||||
void
|
||||
sock_set_v6only(int s)
|
||||
{
|
||||
#ifdef IPV6_V6ONLY
|
||||
#if defined(IPV6_V6ONLY) && !defined(__OpenBSD__)
|
||||
int on = 1;
|
||||
|
||||
debug3("%s: set socket %d IPV6_V6ONLY", __func__, s);
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user