From nobody Wed Feb 19 10:45:57 2025 X-Original-To: freebsd-hackers@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4YyY3d435hz5p9wM; Wed, 19 Feb 2025 10:46:37 +0000 (UTC) (envelope-from marietto2008@gmail.com) Received: from mail-pj1-x102e.google.com (mail-pj1-x102e.google.com [IPv6:2607:f8b0:4864:20::102e]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (2048 bits) client-digest SHA256) (Client CN "smtp.gmail.com", Issuer "WR4" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4YyY3c6Ykbz3r0N; Wed, 19 Feb 2025 10:46:36 +0000 (UTC) (envelope-from marietto2008@gmail.com) Authentication-Results: mx1.freebsd.org; none Received: by mail-pj1-x102e.google.com with SMTP id 98e67ed59e1d1-2f9d3d0f55dso9362888a91.1; Wed, 19 Feb 2025 02:46:36 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1739961995; x=1740566795; darn=freebsd.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=aqwvb3C1IoYuh/UkUGRd1PA7flrZtqseOsoih5EJmgc=; b=cHlkf4JsPweEisZKSuOh6d2utGqXmflrf0l7c3r6WUizX/mxYNp43LPAqboxiCuqen 4miBZeIqL4Q6C2or2fQ9fGuw55fZv0M9fTMqSNVVJ+WeG25lXFzfufOE9J0PwBYmO7r5 xIFHyUcymYfAvusApi7SoEQkNtWz0C4CkX7w/GMJUmE2fo/pYY7H6OmrOgJAZJ548HfV L9MhK7uAKfOCz8M29R8mRsPR15dFYN98HDjpyBzlIE8Tw77xFI41BZ0dEEPm06Dbh1fh /HX2K9+pNoUE90BvLZThq9s+riH9MtseToPepNQxXAztiDQuDv5KytJMS5Dz3Uzb3p2M xTig== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1739961995; x=1740566795; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=aqwvb3C1IoYuh/UkUGRd1PA7flrZtqseOsoih5EJmgc=; b=CioharykOQdb9o2/7A1g0xYMaEyyEYityDmF/mZzVr6wr481lPRUYvlznZHJbdqBQ8 SafNO/kiJg9jPTL2cH7bEHc98iXIWeKrGtJUPWD3A3gsnSXMg7Qa5R2TwF+glbsFEJQu W+Vz6tun7b5tVTcxtFuIxFGAfI6qRb8Qchrmszjj2Lb1oFFt9ULsYTmfBwBBa5hgIw2S pF0tvjfKq/nvHSYFB5UIHmOZEEoDo2ZKCVV1Egs5/wjNrOKzUSJJKaJO8G4DMbaFn8AD Dgik3m1lY5JKm4Lrq6EaYfQVNQGpY7ujTBxN++/St6mvhcIqccVFZWlbAwwy2AKjU985 9/VQ== X-Forwarded-Encrypted: i=1; AJvYcCUI285GRZqsCJZm5jeatmqsEgsdaGaAC4VyPAI2lVK7A0xmyfPigvPK4JdqkobA6Aqjd9QrMjl5bCWHpqv6B5MvIog=@freebsd.org, AJvYcCV4EhdmrEvgUy7kjj8i+sopqMH2dQYYX7cQdlhgzgg4hEUBfNs4/xchBHgmCfEuEqpE9T0HowcIDT3HKRqv2pg=@freebsd.org X-Gm-Message-State: AOJu0Yz1aOGqhQO9sr0NXkE3hobzFuPZnfEapyXiOWfKZxXMNxz2hoKl QgVNLNg45XyMsDl1i5PXR3LfanOsW8f1t4pJz0Lff6mKE7dA1dHUreiC2O2N87MnyKYzzAsNppN nB8lN6B8wYg7i+aCKsMFaS1WNnPOLPxHABk0= X-Gm-Gg: ASbGnctGZ2CHcd2zn1rhZwiK3CbUvxg1ECZTT6gngwr2Pzs39SS7j2sXgh4ReSP8CNO uWYk1PfhnO3RQt4TF82VV78NH7c13GBtS9uDo4HAUiZsD4ySr/Cw0c3dU5P9g6pnxCuj6ce2mTA == X-Google-Smtp-Source: AGHT+IGfBgDe4JweHsmIpUjXE8ofoQBX4J3NCikLzOB1uE0eFcFjQZFP1DufyJH0QZrOeLzSuLcWD25Yk1CtM/Yq4Z0= X-Received: by 2002:a17:90b:510c:b0:2ee:44ec:e524 with SMTP id 98e67ed59e1d1-2fcb5ac056emr4800846a91.35.1739961994072; Wed, 19 Feb 2025 02:46:34 -0800 (PST) List-Id: Technical discussions relating to FreeBSD List-Archive: https://lists.freebsd.org/archives/freebsd-hackers List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-freebsd-hackers@FreeBSD.org MIME-Version: 1.0 References: In-Reply-To: From: Mario Marietto Date: Wed, 19 Feb 2025 11:45:57 +0100 X-Gm-Features: AWEUYZnxsytKZTYR5ibg_SGREHZGTuRLI8Bv7toWsJiimXyQqFY-IivsKme4-Lc Message-ID: Subject: Re: eval: startmsg: not found on FreeBSD 14.2-RELEASE-p1 To: Mark Millard Cc: zlei@freebsd.org, FreeBSD Mailing List , freebsd-hackers Content-Type: multipart/alternative; boundary="000000000000945aec062e7c78b3" X-Rspamd-Pre-Result: action=no action; module=replies; Message is reply to one we originated X-Spamd-Result: default: False [-4.00 / 15.00]; REPLY(-4.00)[]; ASN(0.00)[asn:15169, ipnet:2607:f8b0::/32, country:US] X-Rspamd-Queue-Id: 4YyY3c6Ykbz3r0N X-Spamd-Bar: ---- --000000000000945aec062e7c78b3 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Hello. Sorry for the mistake,I have /etc/rc.subr. This is the part of the code that may be correlated with the error that I get. Should I modify it ? How = ? # # check_startmsgs # If rc_quiet is set (usually as a result of using faststart at # boot time) check if rc_startmsgs is enabled. # check_startmsgs() { if [ -n "$rc_quiet" ]; then checkyesno rc_startmsgs else return 0 fi } This is the full code of rc.subr : # $NetBSD: rc.subr,v 1.67 2006/10/07 11:25:15 elad Exp $ # $FreeBSD$ # # Copyright (c) 1997-2004 The NetBSD Foundation, Inc. # All rights reserved. # # This code is derived from software contributed to The NetBSD Foundation # by Luke Mewburn. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS # ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED # TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULA= R # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS # BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF TH= E # POSSIBILITY OF SUCH DAMAGE. # # rc.subr # functions used by various rc scripts # : ${RC_PID:=3D$$}; export RC_PID # # Operating System dependent/independent variables # if [ -n "${_rc_subr_loaded}" ]; then return fi _rc_subr_loaded=3D"YES" SYSCTL=3D"/sbin/sysctl" SYSCTL_N=3D"${SYSCTL} -n" SYSCTL_W=3D"${SYSCTL}" PROTECT=3D"/usr/bin/protect" ID=3D"/usr/bin/id" IDCMD=3D"if [ -x $ID ]; then $ID -un; fi" PS=3D"/bin/ps -ww" JID=3D0 # rc_service provides the path to the service script that we are executing. # This is not being set here in an execution context, necessarily, so it's # really just a reasonable guess, and it will get overwritten later if # we are executing from some other means than direct execution by service(8= ) # or manual invocation of the service script. The prime example of this is # during system startup, all rc scripts will be invoked via /etc/rc, so # run_rc_script will overwrite rc_service with the file being sourced. rc_service=3D"$0" # # functions # --------- # list_vars pattern # List variables matching glob pattern. # list_vars() { # Localize 'set' option below. local - local IFS=3D$'\n' line varname # Disable path expansion in unquoted 'for' parameters below. set -o noglob for line in $(set); do varname=3D"${line%%=3D*}" case "$varname" in "$line"|*[!a-zA-Z0-9_]*) continue ;; $1) echo $varname ;; esac done } # set_rcvar [var] [defval] [desc] # # Echo or define a rc.conf(5) variable name. Global variable # $rcvars is used. # # If no argument is specified, echo "${name}_enable". # # If only a var is specified, echo "${var}_enable". # # If var and defval are specified, the ${var} is defined as # rc.conf(5) variable and the default value is ${defvar}. An # optional argument $desc can also be specified to add a # description for that. # set_rcvar() { local _var case $# in 0) echo ${name}_enable ;; 1) echo ${1}_enable ;; *) debug "set_rcvar: \$$1=3D$2 is added" \ " as a rc.conf(5) variable." _var=3D$1 rcvars=3D"${rcvars# } $_var" eval ${_var}_defval=3D\"$2\" shift 2 eval ${_var}_desc=3D\"$*\" ;; esac } # set_rcvar_obsolete oldvar [newvar] [msg] # Define obsolete variable. # Global variable $rcvars_obsolete is used. # set_rcvar_obsolete() { local _var _var=3D$1 debug "set_rcvar_obsolete: \$$1(old) -> \$$2(new) is defined" rcvars_obsolete=3D"${rcvars_obsolete# } $1" eval ${1}_newvar=3D\"$2\" shift 2 eval ${_var}_obsolete_msg=3D\"$*\" } # # force_depend script [rcvar] # Force a service to start. Intended for use by services # to resolve dependency issues. # $1 - filename of script, in /etc/rc.d, to run # $2 - name of the script's rcvar (minus the _enable) # force_depend() { local _depend _dep_rcvar _depend=3D"$1" _dep_rcvar=3D"${2:-$1}_enable" [ -n "$rc_fast" ] && ! checkyesno always_force_depends && checkyesno $_dep_rcvar && return 0 /etc/rc.d/${_depend} forcestatus >/dev/null 2>&1 && return 0 info "${name} depends on ${_depend}, which will be forced to start." if ! /etc/rc.d/${_depend} forcestart; then warn "Unable to force ${_depend}. It may already be running." return 1 fi } # # checkyesno var # Test $1 variable, and warn if not set to YES or NO. # Return 0 if it's "yes" (et al), nonzero otherwise. # checkyesno() { eval _value=3D\$${1} debug "checkyesno: $1 is set to $_value." case $_value in # "yes", "true", "on", or "1" [Yy][Ee][Ss]|[Tt][Rr][Uu][Ee]|[Oo][Nn]|1) return 0 ;; # "no", "false", "off", or "0" [Nn][Oo]|[Ff][Aa][Ll][Ss][Ee]|[Oo][Ff][Ff]|0) return 1 ;; *) warn "\$${1} is not set properly - see rc.conf(5)." return 1 ;; esac } # # reverse_list list # print the list in reverse order # reverse_list() { _revlist=3D for _revfile; do _revlist=3D"$_revfile $_revlist" done echo $_revlist } # stop_boot always # If booting directly to multiuser or $always is enabled, # send SIGTERM to the parent (/etc/rc) to abort the boot. # Otherwise just exit. # stop_boot() { local always case $1 in # "yes", "true", "on", or "1" [Yy][Ee][Ss]|[Tt][Rr][Uu][Ee]|[Oo][Nn]|1) always=3Dtrue ;; *) always=3Dfalse ;; esac if [ "$autoboot" =3D yes -o "$always" =3D true ]; then echo "ERROR: ABORTING BOOT (sending SIGTERM to parent)!" kill -TERM ${RC_PID} fi exit 1 } # # mount_critical_filesystems type # Go through the list of critical filesystems as provided in # the rc.conf(5) variable $critical_filesystems_${type}, checking # each one to see if it is mounted, and if it is not, mounting it. # mount_critical_filesystems() { eval _fslist=3D\$critical_filesystems_${1} for _fs in $_fslist; do mount | ( _ismounted=3Dfalse while read what _on on _type type; do if [ $on =3D $_fs ]; then _ismounted=3Dtrue fi done if $_ismounted; then : else mount $_fs >/dev/null 2>&1 fi ) done } # # check_pidfile pidfile procname [interpreter] # Parses the first line of pidfile for a PID, and ensures # that the process is running and matches procname. # Prints the matching PID upon success, nothing otherwise. # interpreter is optional; see _find_processes() for details. # check_pidfile() { _pidfile=3D$1 _procname=3D$2 _interpreter=3D$3 if [ -z "$_pidfile" -o -z "$_procname" ]; then err 3 'USAGE: check_pidfile pidfile procname [interpreter]' fi if [ ! -f $_pidfile ]; then debug "pid file ($_pidfile): not readable." return fi read _pid _junk < $_pidfile if [ -z "$_pid" ]; then debug "pid file ($_pidfile): no pid in file." return fi _find_processes $_procname ${_interpreter:-.} '-p '"$_pid" } # # check_process procname [interpreter] # Ensures that a process (or processes) named procname is running. # Prints a list of matching PIDs. # interpreter is optional; see _find_processes() for details. # check_process() { _procname=3D$1 _interpreter=3D$2 if [ -z "$_procname" ]; then err 3 'USAGE: check_process procname [interpreter]' fi _find_processes $_procname ${_interpreter:-.} '-ax' } # # _find_processes procname interpreter psargs # Search for procname in the output of ps generated by psargs. # Prints the PIDs of any matching processes, space separated. # # If interpreter =3D=3D ".", check the following variations of procname # against the first word of each command: # procname # `basename procname` # `basename procname` + ":" # "(" + `basename procname` + ")" # "[" + `basename procname` + "]" # # If interpreter !=3D ".", read the first line of procname, remove the # leading #!, normalise whitespace, append procname, and attempt to # match that against each command, either as is, or with extra words # at the end. As an alternative, to deal with interpreted daemons # using perl, the basename of the interpreter plus a colon is also # tried as the prefix to procname. # _find_processes() { if [ $# -ne 3 ]; then err 3 'USAGE: _find_processes procname interpreter psargs' fi _procname=3D$1 _interpreter=3D$2 _psargs=3D$3 _pref=3D if [ $_interpreter !=3D "." ]; then # an interpreted script _script=3D"${_chroot}${_chroot:+/}$_procname" if [ -r "$_script" ]; then read _interp < $_script # read interpreter name case "$_interp" in \#!*) _interp=3D${_interp#\#!} # strip #! set -- $_interp case $1 in */bin/env) shift # drop env to get real name ;; esac if [ $_interpreter !=3D $1 ]; then warn "\$command_interpreter $_interpreter !=3D $1" fi ;; *) warn "no shebang line in $_script" set -- $_interpreter ;; esac else warn "cannot read shebang line from $_script" set -- $_interpreter fi _interp=3D"$* $_procname" # cleanup spaces, add _procname _interpbn=3D${1##*/} _fp_args=3D'_argv' _fp_match=3D'case "$_argv" in ${_interp}|"${_interp} "*|"[${_interpbn}]"|"${_interpbn}: ${_procname}"*)' else # a normal daemon _procnamebn=3D${_procname##*/} _fp_args=3D'_arg0 _argv' _fp_match=3D'case "$_arg0" in $_procname|$_procnamebn|${_procnamebn}:|"(${_procnamebn})"|"[${_procnamebn= }]")' fi _proccheck=3D"\ $PS 2>/dev/null -o pid=3D -o jid=3D -o command=3D $_psargs"' | while read _npid _jid '"$_fp_args"'; do '"$_fp_match"' if [ "$JID" -eq "$_jid" ]; then echo -n "$_pref$_npid"; _pref=3D" "; fi ;; esac done' # debug "in _find_processes: proccheck is ($_proccheck)." eval $_proccheck } # sort_lite [-b] [-n] [-k POS] [-t SEP] # A lite version of sort(1) (supporting a few options) that can be used # before the real sort(1) is available (e.g., in scripts that run prior # to mountcritremote). Requires only shell built-in functionality. # sort_lite() { local funcname=3Dsort_lite local sort_sep=3D"$IFS" sort_ignore_leading_space=3D local sort_field=3D0 sort_strict_fields=3D sort_numeric=3D local nitems=3D0 skip_leading=3D0 trim=3D local OPTIND flag while getopts bnk:t: flag; do case "$flag" in b) sort_ignore_leading_space=3D1 ;; n) sort_numeric=3D1 sort_ignore_leading_space=3D1 ;; k) sort_field=3D"${OPTARG%%,*}" ;; # only up to first comma # NB: Unlike sort(1) only one POS allowed t) sort_sep=3D"$OPTARG" if [ ${#sort_sep} -gt 1 ]; then echo "$funcname: multi-character tab \`$sort_sep'" >&2 return 1 fi sort_strict_fields=3D1 ;; \?) return 1 ;; esac done shift $(( $OPTIND - 1 )) # Create transformation pattern to trim leading text if desired case "$sort_field" in ""|[!0-9]*|*[!0-9.]*) echo "$funcname: invalid sort field \`$sort_field'" >&2 return 1 ;; *.*) skip_leading=3D${sort_field#*.} sort_field=3D${sort_field%%.*} while [ ${skip_leading:-0} -gt 1 ] 2> /dev/null; do trim=3D"$trim?" skip_leading=3D$(( $skip_leading - 1 )) done esac # Copy input to series of local numbered variables # NB: IFS of NULL preserves leading whitespace local LINE while IFS=3D read -r LINE || [ "$LINE" ]; do nitems=3D$(( $nitems + 1 )) local src_$nitems=3D"$LINE" done # # Sort numbered locals using insertion sort # local curitem curitem_orig curitem_mod curitem_haskey local dest dest_orig dest_mod dest_haskey local d gt n local i=3D1 while [ $i -le $nitems ]; do curitem_haskey=3D1 # Assume sort field (-k POS) exists eval curitem=3D\"\$src_$i\" curitem_mod=3D"$curitem" # for modified comparison curitem_orig=3D"$curitem" # for original comparison # Trim leading whitespace if desired if [ "$sort_ignore_leading_space" ]; then while case "$curitem_orig" in [$IFS]*) : ;; *) false; esac do curitem_orig=3D"${curitem_orig#?}" done curitem_mod=3D"$curitem_orig" fi # Shift modified comparison value if sort field (-k POS) is > 1 n=3D$sort_field while [ $n -gt 1 ]; do case "$curitem_mod" in *[$sort_sep]*) # Cut text up-to (and incl.) first separator curitem_mod=3D"${curitem_mod#*[$sort_sep]}" # Skip NULLs unless strict field splitting [ "$sort_strict_fields" ] || [ "${curitem_mod%%[$sort_sep]*}" ] || [ $n -eq 2 ] || continue ;; *) # Asked for a field that doesn't exist curitem_haskey=3D break esac n=3D$(( $n - 1 )) done # Trim trailing words if sort field >=3D 1 [ $sort_field -ge 1 -a "$sort_numeric" ] && curitem_mod=3D"${curitem_mod%%[$sort_sep]*}" # Apply optional trim (-k POS.TRIM) to cut leading characters curitem_mod=3D"${curitem_mod#$trim}" # Determine the type of modified comparison to use initially # NB: Prefer numerical if requested but fallback to standard case "$curitem_mod" in ""|[!0-9]*) # NULL or begins with non-number gt=3D">" [ "$sort_numeric" ] && curitem_mod=3D0 ;; *) if [ "$sort_numeric" ]; then gt=3D"-gt" curitem_mod=3D"${curitem_mod%%[!0-9]*}" # NB: trailing non-digits removed # otherwise numeric comparison fails else gt=3D">" fi esac # If first time through, short-circuit below position-search if [ $i -le 1 ]; then d=3D0 else d=3D1 fi # # Find appropriate element position # while [ $d -gt 0 ] do dest_haskey=3D$curitem_haskey eval dest=3D\"\$dest_$d\" dest_mod=3D"$dest" # for modified comparison dest_orig=3D"$dest" # for original comparison # Trim leading whitespace if desired if [ "$sort_ignore_leading_space" ]; then while case "$dest_orig" in [$IFS]*) : ;; *) false; esac do dest_orig=3D"${dest_orig#?}" done dest_mod=3D"$dest_orig" fi # Shift modified value if sort field (-k POS) is > 1 n=3D$sort_field while [ $n -gt 1 ]; do case "$dest_mod" in *[$sort_sep]*) # Cut text up-to (and incl.) 1st sep dest_mod=3D"${dest_mod#*[$sort_sep]}" # Skip NULLs unless strict fields [ "$sort_strict_fields" ] || [ "${dest_mod%%[$sort_sep]*}" ] || [ $n -eq 2 ] || continue ;; *) # Asked for a field that doesn't exist dest_haskey=3D break esac n=3D$(( $n - 1 )) done # Trim trailing words if sort field >=3D 1 [ $sort_field -ge 1 -a "$sort_numeric" ] && dest_mod=3D"${dest_mod%%[$sort_sep]*}" # Apply optional trim (-k POS.TRIM), cut leading chars dest_mod=3D"${dest_mod#$trim}" # Determine type of modified comparison to use # NB: Prefer numerical if requested, fallback to std case "$dest_mod" in ""|[!0-9]*) # NULL or begins with non-number gt=3D">" [ "$sort_numeric" ] && dest_mod=3D0 ;; *) if [ "$sort_numeric" ]; then gt=3D"-gt" dest_mod=3D"${dest_mod%%[!0-9]*}" # NB: kill trailing non-digits # for numeric comparison safety else gt=3D">" fi esac # Break if we've found the proper element position if [ "$curitem_haskey" -a "$dest_haskey" ]; then if [ "$dest_mod" =3D "$curitem_mod" ]; then [ "$dest_orig" ">" "$curitem_orig" ] && break elif [ "$dest_mod" $gt "$curitem_mod" ] \ 2> /dev/null then break fi else [ "$dest_orig" ">" "$curitem_orig" ] && break fi # Break if we've hit the end [ $d -ge $i ] && break d=3D$(( $d + 1 )) done # Shift remaining positions forward, making room for new item n=3D$i while [ $n -ge $d ]; do # Shift destination item forward one placement eval dest_$(( $n + 1 ))=3D\"\$dest_$n\" n=3D$(( $n - 1 )) done # Place the element if [ $i -eq 1 ]; then local dest_1=3D"$curitem" else local dest_$d=3D"$curitem" fi i=3D$(( $i + 1 )) done # Print sorted results d=3D1 while [ $d -le $nitems ]; do eval echo \"\$dest_$d\" d=3D$(( $d + 1 )) done } # # wait_for_pids pid [pid ...] # spins until none of the pids exist # wait_for_pids() { local _list _prefix _nlist _j _list=3D"$@" if [ -z "$_list" ]; then return fi _prefix=3D while true; do _nlist=3D""; for _j in $_list; do if kill -0 $_j 2>/dev/null; then _nlist=3D"${_nlist}${_nlist:+ }$_j" [ -n "$_prefix" ] && sleep 1 fi done if [ -z "$_nlist" ]; then break fi _list=3D$_nlist echo -n ${_prefix:-"Waiting for PIDS: "}$_list _prefix=3D", " pwait $_list 2>/dev/null done if [ -n "$_prefix" ]; then echo "." fi } # # get_pidfile_from_conf string file # # Takes a string to search for in the specified file. # Ignores lines with traditional comment characters. # # Example: # # if get_pidfile_from_conf string file; then # pidfile=3D"$_pidfile_from_conf" # else # pidfile=3D'appropriate default' # fi # get_pidfile_from_conf() { if [ -z "$1" -o -z "$2" ]; then err 3 "USAGE: get_pidfile_from_conf string file ($name)" fi local string file line string=3D"$1" ; file=3D"$2" if [ ! -s "$file" ]; then err 3 "get_pidfile_from_conf: $file does not exist ($name)" fi while read line; do case "$line" in *[#\;]*${string}*) continue ;; *${string}*) break ;; esac done < $file if [ -n "$line" ]; then line=3D${line#*/} _pidfile_from_conf=3D"/${line%%[\"\;]*}" else return 1 fi } # # check_startmsgs # If rc_quiet is set (usually as a result of using faststart at # boot time) check if rc_startmsgs is enabled. # check_startmsgs() { if [ -n "$rc_quiet" ]; then checkyesno rc_startmsgs else return 0 fi } # # run_rc_command argument # Search for argument in the list of supported commands, which is: # "start stop restart rcvar status poll ${extra_commands}" # If there's a match, run ${argument}_cmd or the default method # (see below). # # If argument has a given prefix, then change the operation as follows: # Prefix Operation # ------ --------- # fast Skip the pid check, and set rc_fast=3Dyes, rc_quiet=3Dyes # force Set ${rcvar} to YES, and set rc_force=3Dyes # one Set ${rcvar} to YES # quiet Don't output some diagnostics, and set rc_quiet=3Dyes # # The following globals are used: # # Name Needed Purpose # ---- ------ ------- # name y Name of script. # # command n Full path to command. # Not needed if ${rc_arg}_cmd is set for # each keyword. # # command_args n Optional args/shell directives for command. # # command_interpreter n If not empty, command is interpreted, so # call check_{pidfile,process}() appropriately. # # desc n Description of script. # # extra_commands n List of extra commands supported. # # pidfile n If set, use check_pidfile $pidfile $command, # otherwise use check_process $command. # In either case, only check if $command is set. # # procname n Process name to check for instead of $command. # # rcvar n This is checked with checkyesno to determine # if the action should be run. # # ${name}_program n Full path to command. # Meant to be used in /etc/rc.conf to override # ${command}. # # ${name}_chroot n Directory to chroot to before running ${command} # Requires /usr to be mounted. # # ${name}_chdir n Directory to cd to before running ${command} # (if not using ${name}_chroot). # # ${name}_flags n Arguments to call ${command} with. # NOTE: $flags from the parent environment # can be used to override this. # # ${name}_env n Environment variables to run ${command} with. # # ${name}_env_file n File to source variables to run ${command} with. # # ${name}_fib n Routing table number to run ${command} with. # # ${name}_nice n Nice level to run ${command} at. # # ${name}_oomprotect n Don't kill ${command} when swap space is exhausted. # # ${name}_user n User to run ${command} as, using su(1) if not # using ${name}_chroot. # Requires /usr to be mounted. # # ${name}_group n Group to run chrooted ${command} as. # Requires /usr to be mounted. # # ${name}_groups n Comma separated list of supplementary groups # to run the chrooted ${command} with. # Requires /usr to be mounted. # # ${name}_prepend n Command added before ${command}. # # ${name}_login_class n Login class to use, else "daemon". # # ${name}_limits n limits(1) to apply to ${command}. # # ${rc_arg}_cmd n If set, use this as the method when invoked; # Otherwise, use default command (see below) # # ${rc_arg}_precmd n If set, run just before performing the # ${rc_arg}_cmd method in the default # operation (i.e, after checking for required # bits and process (non)existence). # If this completes with a non-zero exit code, # don't run ${rc_arg}_cmd. # # ${rc_arg}_postcmd n If set, run just after performing the # ${rc_arg}_cmd method, if that method # returned a zero exit code. # # required_dirs n If set, check for the existence of the given # directories before running a (re)start command. # # required_files n If set, check for the readability of the given # files before running a (re)start command. # # required_modules n If set, ensure the given kernel modules are # loaded before running a (re)start command. # The check and possible loads are actually # done after start_precmd so that the modules # aren't loaded in vain, should the precmd # return a non-zero status to indicate a error. # If a word in the list looks like "foo:bar", # "foo" is the KLD file name and "bar" is the # module name. If a word looks like "foo~bar", # "foo" is the KLD file name and "bar" is a # egrep(1) pattern matching the module name. # Otherwise the module name is assumed to be # the same as the KLD file name, which is most # common. See load_kld(). # # required_vars n If set, perform checkyesno on each of the # listed variables before running the default # (re)start command. # # Default behaviour for a given argument, if no override method is # provided: # # Argument Default behaviour # -------- ----------------- # start if !running && checkyesno ${rcvar} # ${command} # # stop if ${pidfile} # rc_pid=3D$(check_pidfile $pidfile $command) # else # rc_pid=3D$(check_process $command) # kill $sig_stop $rc_pid # wait_for_pids $rc_pid # ($sig_stop defaults to TERM.) # # reload Similar to stop, except use $sig_reload instead, # and doesn't wait_for_pids. # $sig_reload defaults to HUP. # Note that `reload' isn't provided by default, # it should be enabled via $extra_commands. # # restart Run `stop' then `start'. # # status Show if ${command} is running, etc. # # poll Wait for ${command} to exit. # # rcvar Display what rc.conf variable is used (if any). # # enabled Return true if the service is enabled. # # describe Show the service's description # # extracommands Show the service's extra commands # # Variables available to methods, and after run_rc_command() has # completed: # # Variable Purpose # -------- ------- # rc_arg Argument to command, after fast/force/one processing # performed # # rc_flags Flags to start the default command with. # Defaults to ${name}_flags, unless overridden # by $flags from the environment. # This variable may be changed by the precmd method. # # rc_service Path to the service being executed, in case the service # needs to re-invoke itself. # # rc_pid PID of command (if appropriate) # # rc_fast Not empty if "fast" was provided (q.v.) # # rc_force Not empty if "force" was provided (q.v.) # # rc_quiet Not empty if "quiet" was provided # # run_rc_command() { _return=3D0 rc_arg=3D$1 if [ -z "$name" ]; then err 3 'run_rc_command: $name is not set.' fi # Don't repeat the first argument when passing additional command- # line arguments to the command subroutines. # shift 1 rc_extra_args=3D"$*" _rc_prefix=3D case "$rc_arg" in fast*) # "fast" prefix; don't check pid rc_arg=3D${rc_arg#fast} rc_fast=3Dyes rc_quiet=3Dyes ;; force*) # "force" prefix; always run rc_force=3Dyes _rc_prefix=3Dforce rc_arg=3D${rc_arg#${_rc_prefix}} if [ -n "${rcvar}" ]; then eval ${rcvar}=3DYES fi ;; one*) # "one" prefix; set ${rcvar}=3Dyes _rc_prefix=3Done rc_arg=3D${rc_arg#${_rc_prefix}} if [ -n "${rcvar}" ]; then eval ${rcvar}=3DYES fi ;; quiet*) # "quiet" prefix; omit some messages _rc_prefix=3Dquiet rc_arg=3D${rc_arg#${_rc_prefix}} rc_quiet=3Dyes ;; esac eval _override_command=3D\$${name}_program command=3D${_override_command:-$command} _keywords=3D"start stop restart rcvar enable disable delete enabled describ= e extracommands $extra_commands" rc_pid=3D _pidcmd=3D _procname=3D${procname:-${command}} # setup pid check command if [ -n "$_procname" ]; then if [ -n "$pidfile" ]; then _pidcmd=3D'rc_pid=3D$(check_pidfile '"$pidfile $_procname $command_interpreter"')' else _pidcmd=3D'rc_pid=3D$(check_process '"$_procname $command_interpreter"')' fi _keywords=3D"${_keywords} status poll" fi if [ -z "$rc_arg" ]; then rc_usage $_keywords fi if [ "$rc_arg" =3D "enabled" ] ; then checkyesno ${rcvar} return $? fi if [ -n "$flags" ]; then # allow override from environment rc_flags=3D$flags else eval rc_flags=3D\$${name}_flags fi eval _chdir=3D\$${name}_chdir _chroot=3D\$${name}_chroot \ _nice=3D\$${name}_nice _user=3D\$${name}_user \ _group=3D\$${name}_group _groups=3D\$${name}_groups \ _fib=3D\$${name}_fib _env=3D\$${name}_env \ _prepend=3D\$${name}_prepend _login_class=3D\${${name}_login_class:-daem= on} \ _limits=3D\$${name}_limits _oomprotect=3D\$${name}_oomprotect \ _env_file=3D\$${name}_env_file if [ -n "$_env_file" ] && [ -r "${_env_file}" ]; then # load env from file set -a . $_env_file set +a fi if [ -n "$_user" ]; then # unset $_user if running as that user if [ "$_user" =3D "$(eval $IDCMD)" ]; then unset _user fi fi [ -z "$autoboot" ] && eval $_pidcmd # determine the pid if necessary for _elem in $_keywords; do if [ "$_elem" !=3D "$rc_arg" ]; then continue fi # if ${rcvar} is set, $1 is not "rcvar", "describe", # "enable" or "delete", and ${rc_pid} is not set, run: # checkyesno ${rcvar} # and return if that failed # if [ -n "${rcvar}" -a "$rc_arg" !=3D "rcvar" -a "$rc_arg" !=3D "stop" \ -a "$rc_arg" !=3D "delete" -a "$rc_arg" !=3D "enable" \ -a "$rc_arg" !=3D "describe" ] || [ -n "${rcvar}" -a "$rc_arg" =3D "stop" -a -z "${rc_pid}" ]; then if ! checkyesno ${rcvar}; then if [ -n "${rc_quiet}" ]; then return 0 fi echo -n "Cannot '${rc_arg}' $name. Set ${rcvar} to " echo -n "YES in /etc/rc.conf or use 'one${rc_arg}' " echo "instead of '${rc_arg}'." return 0 fi fi if [ $rc_arg =3D "start" -a -z "$rc_fast" -a -n "$rc_pid" ]; then if [ -z "$rc_quiet" ]; then echo 1>&2 "${name} already running? " \ "(pid=3D$rc_pid)." fi return 1 fi # if there's a custom ${XXX_cmd}, # run that instead of the default # eval _cmd=3D\$${rc_arg}_cmd \ _precmd=3D\$${rc_arg}_precmd \ _postcmd=3D\$${rc_arg}_postcmd if [ -n "$_cmd" ]; then if [ -n "$_env" ]; then eval "export -- $_env" fi _run_rc_precmd || return 1 _run_rc_doit "$_cmd $rc_extra_args" || return 1 _run_rc_postcmd return $_return fi case "$rc_arg" in # default operations... describe) if [ -n "$desc" ]; then echo "$desc" fi ;; extracommands) echo "$extra_commands" ;; enable) _out=3D$(/usr/sbin/sysrc -vs "$name" "$rcvar=3DYES") && echo "$name enabled in ${_out%%:*}" ;; disable) _out=3D$(/usr/sbin/sysrc -vs "$name" "$rcvar=3DNO") && echo "$name disabled in ${_out%%:*}" ;; delete) _files=3D for _file in $(sysrc -lEs "$name"); do _out=3D$(sysrc -Fif $_file "$rcvar") && _files=3D"$_files $_file" done /usr/sbin/sysrc -x "$rcvar" && echo "$rcvar deleted in ${_files# }" # delete file in rc.conf.d if desired and empty. checkyesno service_delete_empty || _files=3D for _file in $_files; do [ "$_file" =3D "${_file#*/rc.conf.d/}" ] && continue [ $(/usr/bin/stat -f%z $_file) -gt 0 ] && continue /bin/rm "$_file" && echo "Empty file $_file removed" done ;; status) _run_rc_precmd || return 1 if [ -n "$rc_pid" ]; then echo "${name} is running as pid $rc_pid." else echo "${name} is not running." return 1 fi _run_rc_postcmd ;; start) if [ ! -x "${_chroot}${_chroot:+/}${command}" ]; then warn "run_rc_command: cannot run $command" return 1 fi if ! _run_rc_precmd; then warn "failed precmd routine for ${name}" return 1 fi # setup the full command to run # check_startmsgs && echo "Starting ${name}." if [ -n "$_chroot" ]; then _cd=3D _doit=3D"\ ${_nice:+nice -n $_nice }\ ${_fib:+setfib -F $_fib }\ ${_env:+env $_env }\ chroot ${_user:+-u $_user }${_group:+-g $_group }${_groups:+-G $_groups }\ $_chroot $command $rc_flags $command_args" else _cd=3D"${_chdir:+cd $_chdir && }" _doit=3D"\ ${_fib:+setfib -F $_fib }\ ${_env:+env $_env }\ $command $rc_flags $command_args" if [ -n "$_user" ]; then _doit=3D"su -m $_user -c 'sh -c \"$_doit\"'" fi if [ -n "$_nice" ]; then if [ -z "$_user" ]; then _doit=3D"sh -c \"$_doit\"" fi _doit=3D"nice -n $_nice $_doit" fi if [ -n "$_prepend" ]; then _doit=3D"$_prepend $_doit" fi fi # Prepend default limits _doit=3D"$_cd limits -C $_login_class $_limits $_doit" # run the full command # if ! _run_rc_doit "$_doit"; then warn "failed to start ${name}" return 1 fi # finally, run postcmd # _run_rc_postcmd ;; stop) if [ -z "$rc_pid" ]; then [ -n "$rc_fast" ] && return 0 _run_rc_notrunning return 1 fi _run_rc_precmd || return 1 # send the signal to stop # echo "Stopping ${name}." _doit=3D$(_run_rc_killcmd "${sig_stop:-TERM}") _run_rc_doit "$_doit" || return 1 # wait for the command to exit, # and run postcmd. wait_for_pids $rc_pid _run_rc_postcmd ;; reload) if [ -z "$rc_pid" ]; then _run_rc_notrunning return 1 fi _run_rc_precmd || return 1 _doit=3D$(_run_rc_killcmd "${sig_reload:-HUP}") _run_rc_doit "$_doit" || return 1 _run_rc_postcmd ;; restart) # prevent restart being called more # than once by any given script # if ${_rc_restart_done:-false}; then return 0 fi _rc_restart_done=3Dtrue _run_rc_precmd || return 1 # run those in a subshell to keep global variables ( run_rc_command ${_rc_prefix}stop $rc_extra_args ) ( run_rc_command ${_rc_prefix}start $rc_extra_args ) _return=3D$? [ $_return -ne 0 ] && [ -z "$rc_force" ] && return 1 _run_rc_postcmd ;; poll) _run_rc_precmd || return 1 if [ -n "$rc_pid" ]; then wait_for_pids $rc_pid fi _run_rc_postcmd ;; rcvar) echo -n "# $name" if [ -n "$desc" ]; then echo " : $desc" else echo "" fi echo "#" # Get unique vars in $rcvar $rcvars for _v in $rcvar $rcvars; do case $v in $_v\ *|\ *$_v|*\ $_v\ *) ;; *) v=3D"${v# } $_v" ;; esac done # Display variables. for _v in $v; do if [ -z "$_v" ]; then continue fi eval _desc=3D\$${_v}_desc eval _defval=3D\$${_v}_defval _h=3D"-" eval echo \"$_v=3D\\\"\$$_v\\\"\" # decode multiple lines of _desc while [ -n "$_desc" ]; do case $_desc in *^^*) echo "# $_h ${_desc%%^^*}" _desc=3D${_desc#*^^} _h=3D" " ;; *) echo "# $_h ${_desc}" break ;; esac done echo "# (default: \"$_defval\")" done echo "" ;; *) rc_usage $_keywords ;; esac # Apply protect(1) to the PID if ${name}_oomprotect is set. case "$rc_arg" in start) # We cannot use protect(1) inside jails. if [ -n "$_oomprotect" ] && [ -f "${PROTECT}" ] && [ "$(sysctl -n security.jail.jailed)" -eq 0 ]; then [ -z "${rc_pid}" ] && eval $_pidcmd case $_oomprotect in [Aa][Ll][Ll]) ${PROTECT} -d -i -p ${rc_pid} ;; [Yy][Ee][Ss]) ${PROTECT} -p ${rc_pid} ;; esac fi ;; esac return $_return done echo 1>&2 "$0: unknown directive '$rc_arg'." rc_usage $_keywords # not reached } # # Helper functions for run_rc_command: common code. # They use such global variables besides the exported rc_* ones: # # name R/W # ------------------ # _precmd R # _postcmd R # _return W # _run_rc_precmd() { check_required_before "$rc_arg" || return 1 if [ -n "$_precmd" ]; then debug "run_rc_command: ${rc_arg}_precmd: $_precmd $rc_extra_args" eval "$_precmd $rc_extra_args" _return=3D$? # If precmd failed and force isn't set, request exit. if [ $_return -ne 0 ] && [ -z "$rc_force" ]; then return 1 fi fi check_required_after "$rc_arg" || return 1 return 0 } _run_rc_postcmd() { if [ -n "$_postcmd" ]; then debug "run_rc_command: ${rc_arg}_postcmd: $_postcmd $rc_extra_args" eval "$_postcmd $rc_extra_args" _return=3D$? fi return 0 } _run_rc_doit() { debug "run_rc_command: doit: $*" eval "$@" _return=3D$? # If command failed and force isn't set, request exit. if [ $_return -ne 0 ] && [ -z "$rc_force" ]; then return 1 fi return 0 } _run_rc_notrunning() { local _pidmsg if [ -n "$pidfile" ]; then _pidmsg=3D" (check $pidfile)." else _pidmsg=3D fi echo 1>&2 "${name} not running?${_pidmsg}" } _run_rc_killcmd() { local _cmd _cmd=3D"kill -$1 $rc_pid" if [ -n "$_user" ]; then _cmd=3D"su -m ${_user} -c 'sh -c \"${_cmd}\"'" fi echo "$_cmd" } # # run_rc_script file arg # Start the script `file' with `arg', and correctly handle the # return value from the script. # If `file' ends with `.sh' and lives in /etc/rc.d, ignore it as it's # an old-style startup file. # If `file' ends with `.sh' and does not live in /etc/rc.d, it's sourced # into the current environment if $rc_fast_and_loose is set; otherwise # it is run as a child process. # If `file' appears to be a backup or scratch file, ignore it. # Otherwise if it is executable run as a child process. # run_rc_script() { _file=3D$1 _arg=3D$2 if [ -z "$_file" -o -z "$_arg" ]; then err 3 'USAGE: run_rc_script file arg' fi unset name command command_args command_interpreter \ extra_commands pidfile procname \ rcvar rcvars rcvars_obsolete required_dirs required_files \ required_vars eval unset ${_arg}_cmd ${_arg}_precmd ${_arg}_postcmd rc_service=3D"$_file" case "$_file" in /etc/rc.d/*.sh) # no longer allowed in the base warn "Ignoring old-style startup script $_file" ;; *[~#]|*.OLD|*.bak|*.orig|*,v) # scratch file; skip warn "Ignoring scratch file $_file" ;; *) # run in subshell if [ -x $_file ]; then if [ -n "$rc_fast_and_loose" ]; then set $_arg; . $_file else ( trap "echo Script $_file interrupted >&2 ; kill -QUIT $$" 3 trap "echo Script $_file interrupted >&2 ; exit 1" 2 trap "echo Script $_file running >&2" 29 set $_arg; . $_file ) fi fi ;; esac } # # load_rc_config [service] # Source in the configuration file(s) for a given service. # If no service is specified, only the global configuration # file(s) will be loaded. # load_rc_config() { local _name _rcvar_val _var _defval _v _msg _new _d _name=3D$1 if ${_rc_conf_loaded:-false}; then : else if [ -r /etc/defaults/rc.conf ]; then debug "Sourcing /etc/defaults/rc.conf" . /etc/defaults/rc.conf source_rc_confs elif [ -r /etc/rc.conf ]; then debug "Sourcing /etc/rc.conf (/etc/defaults/rc.conf doesn't exist)." . /etc/rc.conf fi _rc_conf_loaded=3Dtrue fi # If a service name was specified, attempt to load # service-specific configuration if [ -n "$_name" ] ; then for _d in /etc ${local_startup}; do _d=3D${_d%/rc.d} if [ -f ${_d}/rc.conf.d/"$_name" ]; then debug "Sourcing ${_d}/rc.conf.d/$_name" . ${_d}/rc.conf.d/"$_name" elif [ -d ${_d}/rc.conf.d/"$_name" ] ; then local _rc for _rc in ${_d}/rc.conf.d/"$_name"/* ; do if [ -f "$_rc" ] ; then debug "Sourcing $_rc" . "$_rc" fi done fi done fi # Set defaults if defined. for _var in $rcvar $rcvars; do eval _defval=3D\$${_var}_defval if [ -n "$_defval" ]; then eval : \${$_var:=3D\$${_var}_defval} fi done # check obsolete rc.conf variables for _var in $rcvars_obsolete; do eval _v=3D\$$_var eval _msg=3D\$${_var}_obsolete_msg eval _new=3D\$${_var}_newvar case $_v in "") ;; *) if [ -z "$_new" ]; then _msg=3D"Ignored." else eval $_new=3D\"\$$_var\" if [ -z "$_msg" ]; then _msg=3D"Use \$$_new instead." fi fi warn "\$$_var is obsolete. $_msg" ;; esac done } # # load_rc_config_var name var # Read the rc.conf(5) var for name and set in the # current shell, using load_rc_config in a subshell to prevent # unwanted side effects from other variable assignments. # load_rc_config_var() { if [ $# -ne 2 ]; then err 3 'USAGE: load_rc_config_var name var' fi eval $(eval '( load_rc_config '$1' >/dev/null; if [ -n "${'$2'}" -o "${'$2'-UNSET}" !=3D "UNSET" ]; then echo '$2'=3D\'\''${'$2'}\'\''; fi )' ) } # # rc_usage commands # Print a usage string for $0, with `commands' being a list of # valid commands. # rc_usage() { echo -n 1>&2 "Usage: $0 [fast|force|one|quiet](" _sep=3D for _elem; do echo -n 1>&2 "$_sep$_elem" _sep=3D"|" done echo 1>&2 ")" exit 1 } # # err exitval message # Display message to stderr and log to the syslog, and exit with exitval. # err() { exitval=3D$1 shift if [ -x /usr/bin/logger ]; then logger "$0: ERROR: $*" fi echo 1>&2 "$0: ERROR: $*" exit $exitval } # # warn message # Display message to stderr and log to the syslog. # warn() { if [ -x /usr/bin/logger ]; then logger "$0: WARNING: $*" fi echo 1>&2 "$0: WARNING: $*" } # # info message # Display informational message to stdout and log to syslog. # info() { case ${rc_info} in [Yy][Ee][Ss]|[Tt][Rr][Uu][Ee]|[Oo][Nn]|1) if [ -x /usr/bin/logger ]; then logger "$0: INFO: $*" fi echo "$0: INFO: $*" ;; esac } # # debug message # If debugging is enabled in rc.conf output message to stderr. # BEWARE that you don't call any subroutine that itself calls this # function. # debug() { case ${rc_debug} in [Yy][Ee][Ss]|[Tt][Rr][Uu][Ee]|[Oo][Nn]|1) if [ -x /usr/bin/logger ]; then logger "$0: DEBUG: $*" fi echo 1>&2 "$0: DEBUG: $*" ;; esac } # # backup_file action file cur backup # Make a backup copy of `file' into `cur', and save the previous # version of `cur' as `backup'. # # The `action' keyword can be one of the following: # # add `file' is now being backed up (and is possibly # being reentered into the backups system). `cur' # is created. # # update `file' has changed and needs to be backed up. # If `cur' exists, it is copied to `back' # and then `file' is copied to `cur'. # # remove `file' is no longer being tracked by the backups # system. `cur' is moved `back'. # # backup_file() { _action=3D$1 _file=3D$2 _cur=3D$3 _back=3D$4 case $_action in add|update) if [ -f $_cur ]; then cp -p $_cur $_back fi cp -p $_file $_cur chown root:wheel $_cur ;; remove) mv -f $_cur $_back ;; esac } # make_symlink src link # Make a symbolic link 'link' to src from basedir. If the # directory in which link is to be created does not exist # a warning will be displayed and an error will be returned. # Returns 0 on success, 1 otherwise. # make_symlink() { local src link linkdir _me src=3D"$1" link=3D"$2" linkdir=3D"`dirname $link`" _me=3D"make_symlink()" if [ -z "$src" -o -z "$link" ]; then warn "$_me: requires two arguments." return 1 fi if [ ! -d "$linkdir" ]; then warn "$_me: the directory $linkdir does not exist." return 1 fi if ! ln -sf $src $link; then warn "$_me: unable to make a symbolic link from $link to $src" return 1 fi return 0 } # devfs_rulesets_from_file file # Reads a set of devfs commands from file, and creates # the specified rulesets with their rules. Returns non-zero # if there was an error. # devfs_rulesets_from_file() { local file _err _me _opts file=3D"$1" _me=3D"devfs_rulesets_from_file" _err=3D0 if [ -z "$file" ]; then warn "$_me: you must specify a file" return 1 fi if [ ! -e "$file" ]; then debug "$_me: no such file ($file)" return 0 fi # Disable globbing so that the rule patterns are not expanded # by accident with matching filesystem entries. _opts=3D$-; set -f debug "reading rulesets from file ($file)" { while read line do case $line in \#*) continue ;; \[*\]*) rulenum=3D`expr "$line" : "\[.*=3D\([0-9]*\)\]"` if [ -z "$rulenum" ]; then warn "$_me: cannot extract rule number ($line)" _err=3D1 break fi rulename=3D`expr "$line" : "\[\(.*\)=3D[0-9]*\]"` if [ -z "$rulename" ]; then warn "$_me: cannot extract rule name ($line)" _err=3D1 break; fi eval $rulename=3D\$rulenum debug "found ruleset: $rulename=3D$rulenum" if ! /sbin/devfs rule -s $rulenum delset; then _err=3D1 break fi ;; *) rulecmd=3D"${line%%"\#*"}" # evaluate the command incase it includes # other rules if [ -n "$rulecmd" ]; then debug "adding rule ($rulecmd)" if ! eval /sbin/devfs rule -s $rulenum $rulecmd then _err=3D1 break fi fi ;; esac if [ $_err -ne 0 ]; then debug "error in $_me" break fi done } < $file case $_opts in *f*) ;; *) set +f ;; esac return $_err } # devfs_init_rulesets # Initializes rulesets from configuration files. Returns # non-zero if there was an error. # devfs_init_rulesets() { local file _me _me=3D"devfs_init_rulesets" # Go through this only once if [ -n "$devfs_rulesets_init" ]; then debug "$_me: devfs rulesets already initialized" return fi for file in $devfs_rulesets; do if ! devfs_rulesets_from_file $file; then warn "$_me: could not read rules from $file" return 1 fi done devfs_rulesets_init=3D1 debug "$_me: devfs rulesets initialized" return 0 } # devfs_set_ruleset ruleset [dir] # Sets the default ruleset of dir to ruleset. The ruleset argument # must be a ruleset name as specified in devfs.rules(5) file. # Returns non-zero if it could not set it successfully. # devfs_set_ruleset() { local devdir rs _me [ -n "$1" ] && eval rs=3D\$$1 || rs=3D [ -n "$2" ] && devdir=3D"-m "$2"" || devdir=3D _me=3D"devfs_set_ruleset" if [ -z "$rs" ]; then warn "$_me: you must specify a ruleset number" return 1 fi debug "$_me: setting ruleset ($rs) on mount-point (${devdir#-m })" if ! /sbin/devfs $devdir ruleset $rs; then warn "$_me: unable to set ruleset $rs to ${devdir#-m }" return 1 fi return 0 } # devfs_apply_ruleset ruleset [dir] # Apply ruleset number $ruleset to the devfs mountpoint $dir. # The ruleset argument must be a ruleset name as specified # in a devfs.rules(5) file. Returns 0 on success or non-zero # if it could not apply the ruleset. # devfs_apply_ruleset() { local devdir rs _me [ -n "$1" ] && eval rs=3D\$$1 || rs=3D [ -n "$2" ] && devdir=3D"-m "$2"" || devdir=3D _me=3D"devfs_apply_ruleset" if [ -z "$rs" ]; then warn "$_me: you must specify a ruleset" return 1 fi debug "$_me: applying ruleset ($rs) to mount-point (${devdir#-m })" if ! /sbin/devfs $devdir rule -s $rs applyset; then warn "$_me: unable to apply ruleset $rs to ${devdir#-m }" return 1 fi return 0 } # devfs_domount dir [ruleset] # Mount devfs on dir. If ruleset is specified it is set # on the mount-point. It must also be a ruleset name as specified # in a devfs.rules(5) file. Returns 0 on success. # devfs_domount() { local devdir rs _me devdir=3D"$1" [ -n "$2" ] && rs=3D$2 || rs=3D _me=3D"devfs_domount()" if [ -z "$devdir" ]; then warn "$_me: you must specify a mount-point" return 1 fi debug "$_me: mount-point is ($devdir), ruleset is ($rs)" if ! mount -t devfs dev "$devdir"; then warn "$_me: Unable to mount devfs on $devdir" return 1 fi if [ -n "$rs" ]; then devfs_init_rulesets devfs_set_ruleset $rs $devdir devfs -m $devdir rule applyset fi return 0 } # Provide a function for normalizing the mounting of memory # filesystems. This should allow the rest of the code here to remain # as close as possible between 5-current and 4-stable. # $1 =3D size # $2 =3D mount point # $3 =3D (optional) extra mdmfs flags mount_md() { if [ -n "$3" ]; then flags=3D"$3" fi /sbin/mdmfs $flags -s $1 ${mfs_type} $2 } # Code common to scripts that need to load a kernel module # if it isn't in the kernel yet. Syntax: # load_kld [-e regex] [-m module] file # where -e or -m chooses the way to check if the module # is already loaded: # regex is egrep'd in the output from `kldstat -v', # module is passed to `kldstat -m'. # The default way is as though `-m file' were specified. load_kld() { local _loaded _mod _opt _re while getopts "e:m:" _opt; do case "$_opt" in e) _re=3D"$OPTARG" ;; m) _mod=3D"$OPTARG" ;; *) err 3 'USAGE: load_kld [-e regex] [-m module] file' ;; esac done shift $(($OPTIND - 1)) if [ $# -ne 1 ]; then err 3 'USAGE: load_kld [-e regex] [-m module] file' fi _mod=3D${_mod:-$1} _loaded=3Dfalse if [ -n "$_re" ]; then if kldstat -v | egrep -q -e "$_re"; then _loaded=3Dtrue fi else if kldstat -q -m "$_mod"; then _loaded=3Dtrue fi fi if ! $_loaded; then if ! kldload "$1"; then warn "Unable to load kernel module $1" return 1 else info "$1 kernel module loaded." fi else debug "load_kld: $1 kernel module already loaded." fi return 0 } # ltr str src dst [var] # Change every $src in $str to $dst. # Useful when /usr is not yet mounted and we cannot use tr(1), sed(1) nor # awk(1). If var is non-NULL, set it to the result. ltr() { local _str _src _dst _out _com _var _str=3D"$1" _src=3D"$2" _dst=3D"$3" _var=3D"$4" _out=3D"" local IFS=3D"${_src}" for _com in ${_str}; do if [ -z "${_out}" ]; then _out=3D"${_com}" else _out=3D"${_out}${_dst}${_com}" fi done if [ -n "${_var}" ]; then setvar "${_var}" "${_out}" else echo "${_out}" fi } # Creates a list of providers for GELI encryption. geli_make_list() { local devices devices2 local provider mountpoint type options rest # Create list of GELI providers from fstab. while read provider mountpoint type options rest ; do case ":${options}" in :*noauto*) noauto=3Dyes ;; *) noauto=3Dno ;; esac case ":${provider}" in :#*) continue ;; *.eli) # Skip swap devices. if [ "${type}" =3D "swap" -o "${options}" =3D "sw" -o "${noauto}" =3D "yes"= ]; then continue fi devices=3D"${devices} ${provider}" ;; esac done < /etc/fstab # Append providers from geli_devices. devices=3D"${devices} ${geli_devices}" for provider in ${devices}; do provider=3D${provider%.eli} provider=3D${provider#/dev/} devices2=3D"${devices2} ${provider}" done echo ${devices2} } # Originally, root mount hold had to be released before mounting # the root filesystem. This delayed the boot, so it was changed # to only wait if the root device isn't readily available. This # can result in rc scripts executing before all the devices - such # as graid(8), or USB disks - can be accessed. This function can # be used to explicitly wait for root mount holds to be released. root_hold_wait() { local wait waited holders waited=3D0 while true; do holders=3D"$(sysctl -n vfs.root_mount_hold)" if [ -z "${holders}" ]; then break; fi if [ ${waited} -eq 0 ]; then echo -n "Waiting ${root_hold_delay}s" \ "for the root mount holders: ${holders}" else echo -n . fi if [ ${waited} -ge ${root_hold_delay} ]; then echo break fi sleep 1 waited=3D$(($waited + 1)) done } # Find scripts in local_startup directories that use the old syntax # find_local_scripts_old() { zlist=3D'' slist=3D'' for dir in ${local_startup}; do if [ -d "${dir}" ]; then for file in ${dir}/[0-9]*.sh; do grep '^# PROVIDE:' $file >/dev/null 2>&1 && continue zlist=3D"$zlist $file" done for file in ${dir}/[!0-9]*.sh; do grep '^# PROVIDE:' $file >/dev/null 2>&1 && continue slist=3D"$slist $file" done fi done } find_local_scripts_new() { local_rc=3D'' for dir in ${local_startup}; do if [ -d "${dir}" ]; then for file in `grep -l '^# PROVIDE:' ${dir}/* 2>/dev/null`; do case "$file" in *.sample) ;; *) if [ -x "$file" ]; then local_rc=3D"${local_rc} ${file}" fi ;; esac done fi done } # check_required_{before|after} command # Check for things required by the command before and after its precmd, # respectively. The two separate functions are needed because some # conditions should prevent precmd from being run while other things # depend on precmd having already been run. # check_required_before() { local _f case "$1" in start) for _f in $required_vars; do if ! checkyesno $_f; then warn "\$${_f} is not enabled." if [ -z "$rc_force" ]; then return 1 fi fi done for _f in $required_dirs; do if [ ! -d "${_f}/." ]; then warn "${_f} is not a directory." if [ -z "$rc_force" ]; then return 1 fi fi done for _f in $required_files; do if [ ! -r "${_f}" ]; then warn "${_f} is not readable." if [ -z "$rc_force" ]; then return 1 fi fi done ;; esac return 0 } check_required_after() { local _f _args case "$1" in start) for _f in $required_modules; do case "${_f}" in *~*) _args=3D"-e ${_f#*~} ${_f%%~*}" ;; *:*) _args=3D"-m ${_f#*:} ${_f%%:*}" ;; *) _args=3D"${_f}" ;; esac if ! load_kld ${_args}; then if [ -z "$rc_force" ]; then return 1 fi fi done ;; esac return 0 } # check_jail mib # Return true if security.jail.$mib exists and set to 1. check_jail() { local _mib _v _mib=3D$1 if _v=3D$(${SYSCTL_N} "security.jail.$_mib" 2> /dev/null); then case $_v in 1) return 0;; esac fi return 1 } # check_kern_features mib # Return existence of kern.features.* sysctl MIB as true or # false. The result will be cached in $_rc_cache_kern_features_ # namespace. "0" means the kern.features.X exists. check_kern_features() { local _v [ -n "$1" ] || return 1; eval _v=3D\$_rc_cache_kern_features_$1 [ -n "$_v" ] && return "$_v"; if ${SYSCTL_N} kern.features.$1 > /dev/null 2>&1; then eval _rc_cache_kern_features_$1=3D0 return 0 else eval _rc_cache_kern_features_$1=3D1 return 1 fi } # check_namevarlist var # Return "0" if ${name}_var is reserved in rc.subr. _rc_namevarlist=3D"program chroot chdir env flags fib nice user group group= s prepend" check_namevarlist() { local _v for _v in $_rc_namevarlist; do case $1 in $_v) return 0 ;; esac done return 1 } # _echoonce var msg mode # mode=3D0: Echo $msg if ${$var} is empty. # After doing echo, a string is set to ${$var}. # # mode=3D1: Echo $msg if ${$var} is a string with non-zero length. # _echoonce() { local _var _msg _mode eval _var=3D\$$1 _msg=3D$2 _mode=3D$3 case $_mode in 1) [ -n "$_var" ] && echo "$_msg" ;; *) [ -z "$_var" ] && echo -n "$_msg" && eval "$1=3Dfinished" ;; esac } # If the loader env variable rc.debug is set, turn on debugging. rc.conf will # still override this, but /etc/defaults/rc.conf can't unconditionally set this # since it would undo what we've done here. if kenv -q rc.debug > /dev/null ; then rc_debug=3DYES fi On Wed, Feb 19, 2025 at 4:33=E2=80=AFAM Mark Millard wr= ote: > On Feb 18, 2025, at 17:35, Mario Marietto wrote: > > > Hello. > > Everytime I try to install a package in FreeBSD 14.2-RELEASE-p1,this is > what happens : > > marietto# pkg install qcad Updating FreeBSD repository catalogue... > FreeBSD repository is up to date. All repositories are up to date. The > following 1 package(s) will be affected (of 0 checked): New packages to b= e > INSTALLED: `qcad:` [`3.31.2.0`](http://3.31.2.0) > > Number of packages to be installed: 1 The process will require 212 MiB > more space. 28 MiB to be downloaded. Proceed with this action? [y/N]: y > [1/1] Fetching qcad-3.31.2.0.pkg: 100% 28 MiB 9.9MB/s 00:03 Checking > integrity... done (0 conflicting) [1/1] Installing qcad-3.31.2.0... [1/1] > Extracting qcad-3.31.2.0: 100% eval: startmsg: not found > > eval: startmsg: not found =3D=3D> Running trigger: desktop-file-utils.u= cl > Building cache database of MIME types > > Maybe I found the solution here : > > > > > https://lists.freebsd.org/archives/freebsd-stable/2023-February/001144.ht= ml > > > > but I don't' understand what to do,since : > > > > 1) I don't have any /libexec/rc/rc.d/machine_id on my 14.2-RELEASE-p1 > > 2) I don't have any /etc/rc.subr > > That last indicates an incomplete install. You may need > to report on how you installed in order to figure out > what else needs to be done now. > > Per "man 8 rc" and "man 8 rc.subr" that talk about > /etc/rc.subr (only some references are shown below): > > > RC(8) FreeBSD System Manager's Manual > RC(8) > > NAME > rc =E2=80=93 command scripts for auto-reboot and daemon startup > > SYNOPSIS > rc > rc.conf > rc.conf.local > rc.d/ > rc.firewall > rc.local > rc.resume > rc.shutdown > rc.subr > . . . > FILES > /etc/rc > /etc/rc.conf > /etc/rc.conf.local > /etc/rc.d/ > /etc/rc.firewall > /etc/rc.local > /etc/rc.shutdown > /etc/rc.subr > /var/run/dmesg.boot dmesg(8) results soon after the rc > process begins. Useful when > dmesg(8) > buffer in the kernel no longer has > this > information. > . . . > SEE ALSO > kill(1), rc.conf(5), init(8), rc.resume(8), rc.subr(8), rcorder(8), > reboot(8), savecore(8), service(8), sysrc(8) > . . . > > > > RC.SUBR(8) FreeBSD System Manager's Manual > RC.SUBR(8) > > NAME > rc.subr =E2=80=93 functions used by system shell scripts > > SYNOPSIS > . /etc/rc.subr > > backup_file action file current backup > checkyesno var > check_pidfile pidfile procname [interpreter] > check_process procname [interpreter] > DebugOn tag ... > DebugOff tag ... > debug message > dot file ... > err exitval message > force_depend name > info message > is_verified file > load_kld [-e regex] [-m module] file > load_rc_config [flag] [service] > load_rc_config_var name var > mount_critical_filesystems type > rc_log message > rc_trace level message > rc_usage command ... > reverse_list item ... > run_rc_command argument > run_rc_script file argument > run_rc_scripts [options] file ... > safe_dot file ... > sdot file ... > startmsg [-n] message > vdot file ... > wait_for_pids [pid ...] > warn message > > DESCRIPTION > The rc.subr script contains commonly used shell script functions and > variable definitions which are used by various scripts such as rc(8)= . > Scripts required by ports in /usr/local/etc/rc.d will also eventuall= y > be > rewritten to make use of it. > > The rc.subr functions were mostly imported from NetBSD. > > They are accessed by sourcing /etc/rc.subr into the current shell. > . . . > > > =3D=3D=3D > Mark Millard > marklmi at yahoo.com > > --=20 Mario. --000000000000945aec062e7c78b3 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Hello.

Sorry for the mistake= ,I have /etc/rc.subr. This is the part of the code that may be correlated w= ith the error that I get. Should I modify it ? How ?

#
# check_startmsgs
# If rc_quiet is set (usually as a result of u= sing faststart at
# boot time) check if rc_startmsgs is enabled.
#check_startmsgs()
{
if [ -n "$rc_quiet" ]; then
chec= kyesno rc_startmsgs
else
return 0
fi
}

<= /div>
This is the full code of rc.subr :

# $Ne= tBSD: rc.subr,v 1.67 2006/10/07 11:25:15 elad Exp $
# $FreeBSD$
#
= # Copyright (c) 1997-2004 The NetBSD Foundation, Inc.
# All rights reser= ved.
#
# This code is derived from software contributed to The NetBSD= Foundation
# by Luke Mewburn.
#
# Redistribution and use in sourc= e and binary forms, with or without
# modification, are permitted provid= ed that the following conditions
# are met:
# 1. Redistributions of s= ource code must retain the above copyright
# =C2=A0 =C2=A0notice, this l= ist of conditions and the following disclaimer.
# 2. Redistributions in = binary form must reproduce the above copyright
# =C2=A0 =C2=A0notice, th= is list of conditions and the following disclaimer in the
# =C2=A0 =C2= =A0documentation and/or other materials provided with the distribution.
= #
# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIB= UTORS
# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDI= NG, BUT NOT LIMITED
# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND = FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED.=C2=A0 IN NO EVENT SHA= LL THE FOUNDATION OR CONTRIBUTORS
# BE LIABLE FOR ANY DIRECT, INDIRECT, = INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, B= UT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS O= F USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND = ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR = TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE= USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMA= GE.
#
# rc.subr
# functions used by various rc scripts
#
: ${RC_PID:=3D$$}; export RC_PID

#
# Operating System dependent/= independent variables
#

if [ -n "${_rc_subr_loaded}" ];= then
return
fi

_rc_subr_loaded=3D"YES"

SYSC= TL=3D"/sbin/sysctl"
SYSCTL_N=3D"${SYSCTL} -n"
SYS= CTL_W=3D"${SYSCTL}"
PROTECT=3D"/usr/bin/protect"
= ID=3D"/usr/bin/id"
IDCMD=3D"if [ -x $ID ]; then $ID -un; = fi"
PS=3D"/bin/ps -ww"
JID=3D0
# rc_service provide= s the path to the service script that we are executing.
# This is not be= ing set here in an execution context, necessarily, so it's
# really = just a reasonable guess, and it will get overwritten later if
# we are e= xecuting from some other means than direct execution by service(8)
# or = manual invocation of the service script.=C2=A0 The prime example of this is=
# during system startup, all rc scripts will be invoked via /etc/rc, so=
# run_rc_script will overwrite rc_service with the file being sourced.<= br>rc_service=3D"$0"

#
# functions
# ---------
# list_vars pattern
# List variables matching glob pattern.
#
l= ist_vars()
{
# Localize 'set' option below.
local -
= local IFS=3D$'\n' line varname

# Disable path expansion in = unquoted 'for' parameters below.
set -o noglob

for line= in $(set); do
varname=3D"${line%%=3D*}"

case "= ;$varname" in
"$line"|*[!a-zA-Z0-9_]*)
continue ;;
$1)
echo $varname
;;
esac
done
}
# set_rcvar [var] [defval] [desc]
#
# Echo or define a rc.conf(5) v= ariable name.=C2=A0 Global variable
# $rcvars is used.
#
# If no a= rgument is specified, echo "${name}_enable".
#
# If only a = var is specified, echo "${var}_enable".
#
# If var and defv= al are specified, the ${var} is defined as
# rc.conf(5) variable and the= default value is ${defvar}.=C2=A0 An
# optional argument $desc can also= be specified to add a
# description for that.
#
set_rcvar()
{<= br> local _var

case $# in
0) echo ${name}_enable ;;
1) echo= ${1}_enable ;;
*)
debug "set_rcvar: \$$1=3D$2 is added"= \
=C2=A0 =C2=A0" as a rc.conf(5) variable."
_var=3D$1=
rcvars=3D"${rcvars# } $_var"
eval ${_var}_defval=3D\&q= uot;$2\"
shift 2
eval ${_var}_desc=3D\"$*\"
;;=
esac
}

# set_rcvar_obsolete oldvar [newvar] [msg]
# Defin= e obsolete variable.
# Global variable $rcvars_obsolete is used.
#set_rcvar_obsolete()
{
local _var
_var=3D$1
debug "set= _rcvar_obsolete: \$$1(old) -> \$$2(new) is defined"

rcvars_= obsolete=3D"${rcvars_obsolete# } $1"
eval ${1}_newvar=3D\&quo= t;$2\"
shift 2
eval ${_var}_obsolete_msg=3D\"$*\"}

#
# force_depend script [rcvar]
# Force a service to start.= Intended for use by services
# to resolve dependency issues.
# $1 - = filename of script, in /etc/rc.d, to run
# $2 - name of the script's= rcvar (minus the _enable)
#
force_depend()
{
local _depend _d= ep_rcvar

_depend=3D"$1"
_dep_rcvar=3D"${2:-$1}_e= nable"

[ -n "$rc_fast" ] && ! checkyesno alw= ays_force_depends &&
=C2=A0 =C2=A0checkyesno $_dep_rcvar &= & return 0

/etc/rc.d/${_depend} forcestatus >/dev/null 2>= &1 && return 0

info "${name} depends on ${_depend}= , which will be forced to start."
if ! /etc/rc.d/${_depend} forces= tart; then
warn "Unable to force ${_depend}. It may already be ru= nning."
return 1
fi
}

#
# checkyesno var
# Te= st $1 variable, and warn if not set to YES or NO.
# Return 0 if it's= "yes" (et al), nonzero otherwise.
#
checkyesno()
{
= eval _value=3D\$${1}
debug "checkyesno: $1 is set to $_value."= ;
case $_value in

# "yes", "true", "o= n", or "1"
[Yy][Ee][Ss]|[Tt][Rr][Uu][Ee]|[Oo][Nn]|1)
= return 0
;;

# "no", "false", "off&= quot;, or "0"
[Nn][Oo]|[Ff][Aa][Ll][Ss][Ee]|[Oo][Ff][Ff]|0) return 1
;;
*)
warn "\$${1} is not set properly - se= e rc.conf(5)."
return 1
;;
esac
}

#
# rever= se_list list
# print the list in reverse order
#
reverse_list(){
_revlist=3D
for _revfile; do
_revlist=3D"$_revfile $_r= evlist"
done
echo $_revlist
}

# stop_boot always
= # If booting directly to multiuser or $always is enabled,
# send SIGTERM= to the parent (/etc/rc) to abort the boot.
# Otherwise just exit.
#<= br>stop_boot()
{
local always

case $1 in
# "yes&qu= ot;, "true", "on", or "1"
=C2=A0 =C2=A0 = =C2=A0 =C2=A0 [Yy][Ee][Ss]|[Tt][Rr][Uu][Ee]|[Oo][Nn]|1)
always=3Dtrue<= br> ;;
*)
always=3Dfalse
;;
esac
if [ "$autoboo= t" =3D yes -o "$always" =3D true ]; then
echo "ERR= OR: ABORTING BOOT (sending SIGTERM to parent)!"
kill -TERM ${RC_P= ID}
fi
exit 1
}

#
# mount_critical_filesystems type# Go through the list of critical filesystems as provided in
# the rc.c= onf(5) variable $critical_filesystems_${type}, checking
# each one to se= e if it is mounted, and if it is not, mounting it.
#
mount_critical_f= ilesystems()
{
eval _fslist=3D\$critical_filesystems_${1}
for _f= s in $_fslist; do
mount | (
_ismounted=3Dfalse
while read = what _on on _type type; do
if [ $on =3D $_fs ]; then
_ismoun= ted=3Dtrue
fi
done
if $_ismounted; then
:
e= lse
mount $_fs >/dev/null 2>&1
fi
)
done}

#
# check_pidfile pidfile procname [interpreter]
# Parses t= he first line of pidfile for a PID, and ensures
# that the process is ru= nning and matches procname.
# Prints the matching PID upon success, noth= ing otherwise.
# interpreter is optional; see _find_processes() for deta= ils.
#
check_pidfile()
{
_pidfile=3D$1
_procname=3D$2
= _interpreter=3D$3
if [ -z "$_pidfile" -o -z "$_procname&= quot; ]; then
err 3 'USAGE: check_pidfile pidfile procname [interp= reter]'
fi
if [ ! -f $_pidfile ]; then
debug "pid fil= e ($_pidfile): not readable."
return
fi
read _pid _junk &= lt; $_pidfile
if [ -z "$_pid" ]; then
debug "pid fi= le ($_pidfile): no pid in file."
return
fi
_find_processe= s $_procname ${_interpreter:-.} '-p '"$_pid"
}

= #
# check_process procname [interpreter]
# Ensures that a process (or= processes) named procname is running.
# Prints a list of matching PIDs.=
# interpreter is optional; see _find_processes() for details.
#
c= heck_process()
{
_procname=3D$1
_interpreter=3D$2
if [ -z &q= uot;$_procname" ]; then
err 3 'USAGE: check_process procname = [interpreter]'
fi
_find_processes $_procname ${_interpreter:-.}= '-ax'
}

#
# _find_processes procname interpreter psar= gs
# Search for procname in the output of ps generated by psargs.
# P= rints the PIDs of any matching processes, space separated.
#
# If int= erpreter =3D=3D ".", check the following variations of procname# against the first word of each command:
# procname
# `basename = procname`
# `basename procname` + ":"
# "(" + `= basename procname` + ")"
# "[" + `basename procname= ` + "]"
#
# If interpreter !=3D ".", read the fir= st line of procname, remove the
# leading #!, normalise whitespace, appe= nd procname, and attempt to
# match that against each command, either as= is, or with extra words
# at the end.=C2=A0 As an alternative, to deal = with interpreted daemons
# using perl, the basename of the interpreter p= lus a colon is also
# tried as the prefix to procname.
#
_find_pro= cesses()
{
if [ $# -ne 3 ]; then
err 3 'USAGE: _find_proces= ses procname interpreter psargs'
fi
_procname=3D$1
_interpr= eter=3D$2
_psargs=3D$3

_pref=3D
if [ $_interpreter !=3D &qu= ot;." ]; then # an interpreted script
_script=3D"${_chroot}$= {_chroot:+/}$_procname"
if [ -r "$_script" ]; then
= read _interp < $_script # read interpreter name
case "$_int= erp" in
\#!*)
_interp=3D${_interp#\#!} # strip #!
= set -- $_interp
case $1 in
*/bin/env)
shift # drop en= v to get real name
;;
esac
if [ $_interpreter !=3D $1= ]; then
warn "\$command_interpreter $_interpreter !=3D $1&quo= t;
fi
;;
*)
warn "no shebang line in $_scri= pt"
set -- $_interpreter
;;
esac
else
w= arn "cannot read shebang line from $_script"
set -- $_inter= preter
fi
_interp=3D"$* $_procname" # cleanup spaces, = add _procname
_interpbn=3D${1##*/}
_fp_args=3D'_argv'
= _fp_match=3D'case "$_argv" in
=C2=A0 =C2=A0${_interp}= |"${_interp} "*|"[${_interpbn}]"|"${_interpbn}: ${= _procname}"*)'
else # a normal daemon
_procnamebn=3D$= {_procname##*/}
_fp_args=3D'_arg0 _argv'
_fp_match=3D'= ;case "$_arg0" in
=C2=A0 =C2=A0$_procname|$_procnamebn|${_p= rocnamebn}:|"(${_procnamebn})"|"[${_procnamebn}]")'=
fi

_proccheck=3D"\
$PS 2>/dev/null -o pid=3D -o j= id=3D -o command=3D $_psargs"' |
while read _npid _jid '&= quot;$_fp_args"'; do
'"$_fp_match"'
= if [ "$JID" -eq "$_jid" ];
then echo -n "$= _pref$_npid";
_pref=3D" ";
fi
;;
= esac
done'

# debug "in _find_processes: proccheck is (= $_proccheck)."
eval $_proccheck
}

# sort_lite [-b] [-n] = [-k POS] [-t SEP]
# A lite version of sort(1) (supporting a few options)= that can be used
# before the real sort(1) is available (e.g., in scrip= ts that run prior
# to mountcritremote). Requires only shell built-in fu= nctionality.
#
sort_lite()
{
local funcname=3Dsort_lite
lo= cal sort_sep=3D"$IFS" sort_ignore_leading_space=3D
local sort= _field=3D0 sort_strict_fields=3D sort_numeric=3D
local nitems=3D0 skip_= leading=3D0 trim=3D

local OPTIND flag
while getopts bnk:t: flag= ; do
case "$flag" in
b) sort_ignore_leading_space=3D1 ;= ;
n) sort_numeric=3D1 sort_ignore_leading_space=3D1 ;;
k) sort_fi= eld=3D"${OPTARG%%,*}" ;; # only up to first comma
# NB: Unl= ike sort(1) only one POS allowed
t) sort_sep=3D"$OPTARG"
= =C2=A0 if [ ${#sort_sep} -gt 1 ]; then
=C2=A0 echo "$funcnam= e: multi-character tab \`$sort_sep'" >&2
=C2=A0 retu= rn 1
=C2=A0 fi
=C2=A0 sort_strict_fields=3D1
=C2=A0 ;; \?) return 1 ;;
esac
done
shift $(( $OPTIND - 1 ))

= # Create transformation pattern to trim leading text if desired
case &q= uot;$sort_field" in
""|[!0-9]*|*[!0-9.]*)
echo &quo= t;$funcname: invalid sort field \`$sort_field'" >&2
re= turn 1
;;
*.*)
skip_leading=3D${sort_field#*.} sort_field=3D$= {sort_field%%.*}
while [ ${skip_leading:-0} -gt 1 ] 2> /dev/null; d= o
trim=3D"$trim?" skip_leading=3D$(( $skip_leading - 1 )) done
esac

# Copy input to series of local numbered variable= s
# NB: IFS of NULL preserves leading whitespace
local LINE
whi= le IFS=3D read -r LINE || [ "$LINE" ]; do
nitems=3D$(( $nite= ms + 1 ))
local src_$nitems=3D"$LINE"
done

#
= # Sort numbered locals using insertion sort
#
local curitem curite= m_orig curitem_mod curitem_haskey
local dest dest_orig dest_mod dest_ha= skey
local d gt n
local i=3D1
while [ $i -le $nitems ]; do
= curitem_haskey=3D1 # Assume sort field (-k POS) exists
eval curitem= =3D\"\$src_$i\"
curitem_mod=3D"$curitem" # for mod= ified comparison
curitem_orig=3D"$curitem" # for original co= mparison

# Trim leading whitespace if desired
if [ "$sor= t_ignore_leading_space" ]; then
while case "$curitem_orig&q= uot; in
[$IFS]*) : ;; *) false; esac
do
curitem_orig=3D= "${curitem_orig#?}"
done
curitem_mod=3D"$curitem= _orig"
fi

# Shift modified comparison value if sort fiel= d (-k POS) is > 1
n=3D$sort_field
while [ $n -gt 1 ]; do
= case "$curitem_mod" in
*[$sort_sep]*)
# Cut text up= -to (and incl.) first separator
curitem_mod=3D"${curitem_mod#*[= $sort_sep]}"

# Skip NULLs unless strict field splitting
= [ "$sort_strict_fields" ] ||
[ "${curitem_mod%%[= $sort_sep]*}" ] ||
[ $n -eq 2 ] ||
continue
;;<= br> *)
# Asked for a field that doesn't exist
curitem_h= askey=3D break
esac
n=3D$(( $n - 1 ))
done

# Trim= trailing words if sort field >=3D 1
[ $sort_field -ge 1 -a "$= sort_numeric" ] &&
curitem_mod=3D"${curitem_mod%%[$= sort_sep]*}"

# Apply optional trim (-k POS.TRIM) to cut leadi= ng characters
curitem_mod=3D"${curitem_mod#$trim}"

= # Determine the type of modified comparison to use initially
# NB: Pre= fer numerical if requested but fallback to standard
case "$curite= m_mod" in
""|[!0-9]*) # NULL or begins with non-number<= br> gt=3D">"
[ "$sort_numeric" ] && = curitem_mod=3D0
;;
*)
if [ "$sort_numeric" ]; th= en
gt=3D"-gt"
curitem_mod=3D"${curitem_mod%%[!= 0-9]*}"
# NB: trailing non-digits removed
# otherwise = numeric comparison fails
else
gt=3D">"
fi esac

# If first time through, short-circuit below position-sea= rch
if [ $i -le 1 ]; then
d=3D0
else
d=3D1
fi
#
# Find appropriate element position
#
while [ $d -g= t 0 ]
do
dest_haskey=3D$curitem_haskey
eval dest=3D\"= \$dest_$d\"
dest_mod=3D"$dest" # for modified comparis= on
dest_orig=3D"$dest" # for original comparison

= # Trim leading whitespace if desired
if [ "$sort_ignore_leading_= space" ]; then
while case "$dest_orig" in
[$I= FS]*) : ;; *) false; esac
do
dest_orig=3D"${dest_orig#?= }"
done
dest_mod=3D"$dest_orig"
fi
# Shift modified value if sort field (-k POS) is > 1
n=3D$sor= t_field
while [ $n -gt 1 ]; do
case "$dest_mod" in *[$sort_sep]*)
# Cut text up-to (and incl.) 1st sep
d= est_mod=3D"${dest_mod#*[$sort_sep]}"

# Skip NULLs unl= ess strict fields
[ "$sort_strict_fields" ] ||
= =C2=A0 =C2=A0[ "${dest_mod%%[$sort_sep]*}" ] ||
=C2=A0 = =C2=A0[ $n -eq 2 ] ||
=C2=A0 =C2=A0continue
;;
*) # Asked for a field that doesn't exist
dest_haskey=3D br= eak
esac
n=3D$(( $n - 1 ))
done

# Trim traili= ng words if sort field >=3D 1
[ $sort_field -ge 1 -a "$sort_n= umeric" ] &&
dest_mod=3D"${dest_mod%%[$sort_sep]*}= "

# Apply optional trim (-k POS.TRIM), cut leading chars
= dest_mod=3D"${dest_mod#$trim}"

# Determine type of m= odified comparison to use
# NB: Prefer numerical if requested, fallba= ck to std
case "$dest_mod" in
""|[!0-9]*) #= NULL or begins with non-number
gt=3D">"
[ "= ;$sort_numeric" ] && dest_mod=3D0
;;
*)
if= [ "$sort_numeric" ]; then
gt=3D"-gt"
d= est_mod=3D"${dest_mod%%[!0-9]*}"
# NB: kill trailing non= -digits
# for numeric comparison safety
else
gt=3D&= quot;>"
fi
esac

# Break if we've found t= he proper element position
if [ "$curitem_haskey" -a "= $dest_haskey" ]; then
if [ "$dest_mod" =3D "$cur= item_mod" ]; then
[ "$dest_orig" ">" &q= uot;$curitem_orig" ] &&
break
elif [ "$de= st_mod" $gt "$curitem_mod" ] \
2> /dev/null
= then
break
fi
else
[ "$dest_orig" &= quot;>" "$curitem_orig" ] && break
fi
# Break if we've hit the end
[ $d -ge $i ] && break<= br>
d=3D$(( $d + 1 ))
done

# Shift remaining positions = forward, making room for new item
n=3D$i
while [ $n -ge $d ]; do<= br> # Shift destination item forward one placement
eval dest_$(( $n= + 1 ))=3D\"\$dest_$n\"
n=3D$(( $n - 1 ))
done

= # Place the element
if [ $i -eq 1 ]; then
local dest_1=3D"= ;$curitem"
else
local dest_$d=3D"$curitem"
f= i

i=3D$(( $i + 1 ))
done

# Print sorted results
d= =3D1
while [ $d -le $nitems ]; do
eval echo \"\$dest_$d\"= ;
d=3D$(( $d + 1 ))
done
}

#
# wait_for_pids pid [pid= ...]
# spins until none of the pids exist
#
wait_for_pids()
{<= br> local _list _prefix _nlist _j

_list=3D"$@"
if [ -= z "$_list" ]; then
return
fi
_prefix=3D
while tr= ue; do
_nlist=3D"";
for _j in $_list; do
if kill = -0 $_j 2>/dev/null; then
_nlist=3D"${_nlist}${_nlist:+ }$_j&= quot;
[ -n "$_prefix" ] && sleep 1
fi
d= one
if [ -z "$_nlist" ]; then
break
fi
_list= =3D$_nlist
echo -n ${_prefix:-"Waiting for PIDS: "}$_list _prefix=3D", "
pwait $_list 2>/dev/null
done
i= f [ -n "$_prefix" ]; then
echo "."
fi
}
=
#
# get_pidfile_from_conf string file
#
# Takes a string to se= arch for in the specified file.
# Ignores lines with traditional comment= characters.
#
# Example:
#
# if get_pidfile_from_conf string f= ile; then
# pidfile=3D"$_pidfile_from_conf"
# else
# pid= file=3D'appropriate default'
# fi
#
get_pidfile_from_conf(= )
{
if [ -z "$1" -o -z "$2" ]; then
err 3 &= quot;USAGE: get_pidfile_from_conf string file ($name)"
fi

= local string file line

string=3D"$1" ; file=3D"$2&qu= ot;

if [ ! -s "$file" ]; then
err 3 "get_pidfil= e_from_conf: $file does not exist ($name)"
fi

while read l= ine; do
case "$line" in
*[#\;]*${string}*) continue ;;<= br> *${string}*) break ;;
esac
done < $file

if [ -n &= quot;$line" ]; then
line=3D${line#*/}
_pidfile_from_conf=3D&= quot;/${line%%[\"\;]*}"
else
return 1
fi
}
#
# check_startmsgs
# If rc_quiet is set (usually as a result of usi= ng faststart at
# boot time) check if rc_startmsgs is enabled.
#
c= heck_startmsgs()
{
if [ -n "$rc_quiet" ]; then
checky= esno rc_startmsgs
else
return 0
fi
}

#
# run_rc_c= ommand argument
# Search for argument in the list of supported commands,= which is:
# "start stop restart rcvar status poll ${extra_command= s}"
# If there's a match, run ${argument}_cmd or the default me= thod
# (see below).
#
# If argument has a given prefix, then chang= e the operation as follows:
# Prefix Operation
# ------ ---------# fast Skip the pid check, and set rc_fast=3Dyes, rc_quiet=3Dyes
# f= orce Set ${rcvar} to YES, and set rc_force=3Dyes
# one Set ${rcvar} to = YES
# quiet Don't output some diagnostics, and set rc_quiet=3Dyes#
# The following globals are used:
#
# Name Needed Purpose
= # ---- ------ -------
# name y Name of script.
#
# command n Fu= ll path to command.
# Not needed if ${rc_arg}_cmd is set for
# = each keyword.
#
# command_args n Optional args/shell directives for c= ommand.
#
# command_interpreter n If not empty, command is interprete= d, so
# call check_{pidfile,process}() appropriately.
#
# desc = n Description of script.
#
# extra_commands n List of extra commands= supported.
#
# pidfile n If set, use check_pidfile $pidfile $comman= d,
# otherwise use check_process $command.
# In either case, on= ly check if $command is set.
#
# procname n Process name to check for= instead of $command.
#
# rcvar n This is checked with checkyesno to= determine
# if the action should be run.
#
# ${name}_program n= Full path to command.
# Meant to be used in /etc/rc.conf to override=
# ${command}.
#
# ${name}_chroot n Directory to chroot to befo= re running ${command}
# Requires /usr to be mounted.
#
# ${name= }_chdir n Directory to cd to before running ${command}
# (if not usin= g ${name}_chroot).
#
# ${name}_flags n Arguments to call ${command} w= ith.
# NOTE: $flags from the parent environment
# can be used = to override this.
#
# ${name}_env n Environment variables to run ${co= mmand} with.
#
# ${name}_env_file n File to source variables to run $= {command} with.
#
# ${name}_fib n Routing table number to run ${comma= nd} with.
#
# ${name}_nice n Nice level to run ${command} at.
## ${name}_oomprotect n Don't kill ${command} when swap space is exhaus= ted.
#
# ${name}_user n User to run ${command} as, using su(1) if not=
# using ${name}_chroot.
# Requires /usr to be mounted.
## ${name}_group n Group to run chrooted ${command} as.
# Requires /u= sr to be mounted.
#
# ${name}_groups n Comma separated list of supple= mentary groups
# to run the chrooted ${command} with.
# Require= s /usr to be mounted.
#
# ${name}_prepend n Command added before ${co= mmand}.
#
# ${name}_login_class n Login class to use, else "daem= on".
#
# ${name}_limits n limits(1) to apply to ${command}.
#=
# ${rc_arg}_cmd n If set, use this as the method when invoked;
# = Otherwise, use default command (see below)
#
# ${rc_arg}_precmd n If = set, run just before performing the
# ${rc_arg}_cmd method in the def= ault
# operation (i.e, after checking for required
# bits and p= rocess (non)existence).
# If this completes with a non-zero exit code= ,
# don't run ${rc_arg}_cmd.
#
# ${rc_arg}_postcmd n If set= , run just after performing the
# ${rc_arg}_cmd method, if that metho= d
# returned a zero exit code.
#
# required_dirs n If set, chec= k for the existence of the given
# directories before running a (re)s= tart command.
#
# required_files n If set, check for the readability = of the given
# files before running a (re)start command.
#
# re= quired_modules n If set, ensure the given kernel modules are
# loaded= before running a (re)start command.
# The check and possible loads a= re actually
# done after start_precmd so that the modules
# are= n't loaded in vain, should the precmd
# return a non-zero status = to indicate a error.
# If a word in the list looks like "foo:bar= ",
# "foo" is the KLD file name and "bar" is= the
# module name.=C2=A0 If a word looks like "foo~bar",# "foo" is the KLD file name and "bar" is a
# = egrep(1) pattern matching the module name.
# Otherwise the module n= ame is assumed to be
# the same as the KLD file name, which is most# common.=C2=A0 See load_kld().
#
# required_vars n If set, perf= orm checkyesno on each of the
# listed variables before running the d= efault
# (re)start command.
#
# Default behaviour for a given a= rgument, if no override method is
# provided:
#
# Argument Default= behaviour
# -------- -----------------
# start if !running &&am= p; checkyesno ${rcvar}
# ${command}
#
# stop if ${pidfile}
= # rc_pid=3D$(check_pidfile $pidfile $command)
# else
# rc_pid= =3D$(check_process $command)
# kill $sig_stop $rc_pid
# wait_for_= pids $rc_pid
# ($sig_stop defaults to TERM.)
#
# reload Similar= to stop, except use $sig_reload instead,
# and doesn't wait_for_p= ids.
# $sig_reload defaults to HUP.
# Note that `reload' isn&= #39;t provided by default,
# it should be enabled via $extra_commands.=
#
# restart Run `stop' then `start'.
#
# status Show= if ${command} is running, etc.
#
# poll Wait for ${command} to exit= .
#
# rcvar Display what rc.conf variable is used (if any).
#
= # enabled Return true if the service is enabled.
#
# describe Show t= he service's description
#
# extracommands Show the service's= extra commands
#
# Variables available to methods, and after run_rc_= command() has
# completed:
#
# Variable Purpose
# -------- ----= ---
# rc_arg Argument to command, after fast/force/one processing
# = performed
#
# rc_flags Flags to start the default command with.
= # Defaults to ${name}_flags, unless overridden
# by $flags from the = environment.
# This variable may be changed by the precmd method.
#=
# =C2=A0 =C2=A0 =C2=A0 rc_service =C2=A0 =C2=A0 =C2=A0Path to the servi= ce being executed, in case the service
# =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 needs to re-invoke itself.#
# rc_pid PID of command (if appropriate)
#
# rc_fast Not empt= y if "fast" was provided (q.v.)
#
# rc_force Not empty if &= quot;force" was provided (q.v.)
#
# rc_quiet Not empty if "= quiet" was provided
#
#
run_rc_command()
{
_return=3D0=
rc_arg=3D$1
if [ -z "$name" ]; then
err 3 'run_= rc_command: $name is not set.'
fi

# Don't repeat the fi= rst argument when passing additional command-
# line arguments to the c= ommand subroutines.
#
shift 1
rc_extra_args=3D"$*"
_rc_prefix=3D
case "$rc_arg" in
fast*) # "f= ast" prefix; don't check pid
rc_arg=3D${rc_arg#fast}
rc_= fast=3Dyes
rc_quiet=3Dyes
;;
force*) # "force" p= refix; always run
rc_force=3Dyes
_rc_prefix=3Dforce
rc_arg= =3D${rc_arg#${_rc_prefix}}
if [ -n "${rcvar}" ]; then
= eval ${rcvar}=3DYES
fi
;;
one*) # "one" prefix; = set ${rcvar}=3Dyes
_rc_prefix=3Done
rc_arg=3D${rc_arg#${_rc_prefi= x}}
if [ -n "${rcvar}" ]; then
eval ${rcvar}=3DYES
= fi
;;
quiet*) # "quiet" prefix; omit some messages<= br> _rc_prefix=3Dquiet
rc_arg=3D${rc_arg#${_rc_prefix}}
rc_quiet= =3Dyes
;;
esac

eval _override_command=3D\$${name}_program<= br> command=3D${_override_command:-$command}

_keywords=3D"star= t stop restart rcvar enable disable delete enabled describe extracommands $= extra_commands"
rc_pid=3D
_pidcmd=3D
_procname=3D${procnam= e:-${command}}

# setup pid check command
if [ -n "$_pr= ocname" ]; then
if [ -n "$pidfile" ]; then
_pidcm= d=3D'rc_pid=3D$(check_pidfile '"$pidfile $_procname $command_i= nterpreter"')'
else
_pidcmd=3D'rc_pid=3D$(check= _process '"$_procname $command_interpreter"')'
f= i
_keywords=3D"${_keywords} status poll"
fi

if [= -z "$rc_arg" ]; then
rc_usage $_keywords
fi

if = [ "$rc_arg" =3D "enabled" ] ; then
checkyesno ${rc= var}
return $?
fi

if [ -n "$flags" ]; then # all= ow override from environment
rc_flags=3D$flags
else
eval rc_f= lags=3D\$${name}_flags
fi
eval _chdir=3D\$${name}_chdir _chroot=3D\= $${name}_chroot \
=C2=A0 =C2=A0_nice=3D\$${name}_nice _user=3D\$${name= }_user \
=C2=A0 =C2=A0_group=3D\$${name}_group _groups=3D\$${name}_gro= ups \
=C2=A0 =C2=A0_fib=3D\$${name}_fib _env=3D\$${name}_env \
= =C2=A0 =C2=A0_prepend=3D\$${name}_prepend _login_class=3D\${${name}_login_c= lass:-daemon} \
=C2=A0 =C2=A0_limits=3D\$${name}_limits =C2=A0 =C2=A0_= oomprotect=3D\$${name}_oomprotect \
=C2=A0 =C2=A0_env_file=3D\$${name}= _env_file

if [ -n "$_env_file" ] && [ -r "${= _env_file}" ]; then # load env from file
set -a
. $_env_file=
set +a
fi

if [ -n "$_user" ]; then # unset $_us= er if running as that user
if [ "$_user" =3D "$(eval $I= DCMD)" ]; then
unset _user
fi
fi

[ -z "$au= toboot" ] && eval $_pidcmd # determine the pid if necessary
for _elem in $_keywords; do
if [ "$_elem" !=3D "$= rc_arg" ]; then
continue
fi
# if ${rcvar} is set, $= 1 is not "rcvar", "describe",
# "enable&qu= ot; or "delete", and ${rc_pid} is not set, run:
# checkye= sno ${rcvar}
# and return if that failed
#
if [ -n &qu= ot;${rcvar}" -a "$rc_arg" !=3D "rcvar" -a "$r= c_arg" !=3D "stop" \
=C2=A0 =C2=A0-a "$rc_arg&quo= t; !=3D "delete" -a "$rc_arg" !=3D "enable" \=
=C2=A0 =C2=A0-a "$rc_arg" !=3D "describe" ] || =C2=A0 =C2=A0[ -n "${rcvar}" -a "$rc_arg" =3D &quo= t;stop" -a -z "${rc_pid}" ]; then
if ! checkyesno ${rc= var}; then
if [ -n "${rc_quiet}" ]; then
return 0<= br> fi
echo -n "Cannot '${rc_arg}' $name. Set ${rcva= r} to "
echo -n "YES in /etc/rc.conf or use 'one${rc_a= rg}' "
echo "instead of '${rc_arg}'."
= return 0
fi
fi

if [ $rc_arg =3D "start" -= a -z "$rc_fast" -a -n "$rc_pid" ]; then
if [ -z &= quot;$rc_quiet" ]; then
echo 1>&2 "${name} already = running? " \
=C2=A0 =C2=A0"(pid=3D$rc_pid)."
f= i
return 1
fi

# if there's a custom ${XXX_cmd},<= br> # run that instead of the default
#
eval _cmd=3D\$${rc= _arg}_cmd \
=C2=A0 =C2=A0 _precmd=3D\$${rc_arg}_precmd \
=C2=A0= =C2=A0 _postcmd=3D\$${rc_arg}_postcmd

if [ -n "$_cmd" ]= ; then
if [ -n "$_env" ]; then
eval "export -- = $_env"
fi
_run_rc_precmd || return 1
_run_rc_doit &q= uot;$_cmd $rc_extra_args" || return 1
_run_rc_postcmd
retu= rn $_return
fi

case "$rc_arg" in # default operatio= ns...

describe)
if [ -n "$desc" ]; then
ech= o "$desc"
fi
;;

extracommands)
echo &= quot;$extra_commands"
;;

enable)
_out=3D$(/usr/sb= in/sysrc -vs "$name" "$rcvar=3DYES") &&
= echo "$name enabled in ${_out%%:*}"
;;

disable) _out=3D$(/usr/sbin/sysrc -vs "$name" "$rcvar=3DNO"= ) &&
echo "$name disabled in ${_out%%:*}"
;= ;

delete)
_files=3D
for _file in $(sysrc -lEs "$n= ame"); do
_out=3D$(sysrc -Fif $_file "$rcvar") &&= amp; _files=3D"$_files $_file"
done
/usr/sbin/sysrc -= x "$rcvar" && echo "$rcvar deleted in ${_files# }&qu= ot;
# delete file in rc.conf.d if desired and empty.
checkyesn= o service_delete_empty || _files=3D
for _file in $_files; do
[= "$_file" =3D "${_file#*/rc.conf.d/}" ] && cont= inue
[ $(/usr/bin/stat -f%z $_file) -gt 0 ] && continue
= /bin/rm "$_file" && echo "Empty file $_file remov= ed"
done
;;

status)
_run_rc_precmd || retur= n 1
if [ -n "$rc_pid" ]; then
echo "${name} is = running as pid $rc_pid."
else
echo "${name} is not r= unning."
return 1
fi
_run_rc_postcmd
;;
start)
if [ ! -x "${_chroot}${_chroot:+/}${command}" ];= then
warn "run_rc_command: cannot run $command"
re= turn 1
fi

if ! _run_rc_precmd; then
warn "faile= d precmd routine for ${name}"
return 1
fi

# s= etup the full command to run
#
check_startmsgs && ech= o "Starting ${name}."
if [ -n "$_chroot" ]; then<= br> _cd=3D
_doit=3D"\
${_nice:+nice -n $_nice }\
${_fi= b:+setfib -F $_fib }\
${_env:+env $_env }\
chroot ${_user:+-u $_user = }${_group:+-g $_group }${_groups:+-G $_groups }\
$_chroot $command $rc_f= lags $command_args"
else
_cd=3D"${_chdir:+cd $_chdir= && }"
_doit=3D"\
${_fib:+setfib -F $_fib }\${_env:+env $_env }\
$command $rc_flags $command_args"
if [= -n "$_user" ]; then
=C2=A0 =C2=A0_doit=3D"su -m $_u= ser -c 'sh -c \"$_doit\"'"
fi
if [ -n = "$_nice" ]; then
if [ -z "$_user" ]; then
= _doit=3D"sh -c \"$_doit\""
fi
_doit= =3D"nice -n $_nice $_doit"
fi
if [ -n "$_prepe= nd" ]; then
_doit=3D"$_prepend $_doit"
fi
= fi

# Prepend default limits
_doit=3D"$_cd limits = -C $_login_class $_limits $_doit"

# run the full command #
if ! _run_rc_doit "$_doit"; then
warn "= ;failed to start ${name}"
return 1
fi

# final= ly, run postcmd
#
_run_rc_postcmd
;;

stop)
= if [ -z "$rc_pid" ]; then
[ -n "$rc_fast" ] &= amp;& return 0
_run_rc_notrunning
return 1
fi
_run_rc_precmd || return 1

# send the signal to stop
= #
echo "Stopping ${name}."
_doit=3D$(_run_rc_killc= md "${sig_stop:-TERM}")
_run_rc_doit "$_doit" || = return 1

# wait for the command to exit,
# and run post= cmd.
wait_for_pids $rc_pid

_run_rc_postcmd
;;

= reload)
if [ -z "$rc_pid" ]; then
_run_rc_notrunni= ng
return 1
fi

_run_rc_precmd || return 1

= _doit=3D$(_run_rc_killcmd "${sig_reload:-HUP}")
_run_rc_doi= t "$_doit" || return 1

_run_rc_postcmd
;;

= restart)
# prevent restart being called more
# than once = by any given script
#
if ${_rc_restart_done:-false}; then
= return 0
fi
_rc_restart_done=3Dtrue

_run_rc_precm= d || return 1

# run those in a subshell to keep global variables<= br> ( run_rc_command ${_rc_prefix}stop $rc_extra_args )
( run_rc_co= mmand ${_rc_prefix}start $rc_extra_args )
_return=3D$?
[ $_retu= rn -ne 0 ] && [ -z "$rc_force" ] && return 1
<= br> _run_rc_postcmd
;;

poll)
_run_rc_precmd || retur= n 1
if [ -n "$rc_pid" ]; then
wait_for_pids $rc_pid<= br> fi
_run_rc_postcmd
;;

rcvar)
echo -n "= ;# $name"
if [ -n "$desc" ]; then
echo " := $desc"
else
echo ""
fi
echo "= #"
# Get unique vars in $rcvar $rcvars
for _v in $rcvar $r= cvars; do
case $v in
$_v\ *|\ *$_v|*\ $_v\ *) ;;
*) v= =3D"${v# } $_v" ;;
esac
done

# Display var= iables.
for _v in $v; do
if [ -z "$_v" ]; then
= continue
fi

eval _desc=3D\$${_v}_desc
eval _def= val=3D\$${_v}_defval
_h=3D"-"

eval echo \"= $_v=3D\\\"\$$_v\\\"\"
# decode multiple lines of _des= c
while [ -n "$_desc" ]; do
case $_desc in
= *^^*)
echo "# $_h ${_desc%%^^*}"
_desc=3D${_de= sc#*^^}
_h=3D" "
;;
*)
echo &q= uot;# $_h ${_desc}"
break
;;
esac
don= e
echo "# =C2=A0 (default: \"$_defval\")"
= done
echo ""
;;

*)
rc_usage $_keywords=
;;

esac

# Apply protect(1) to the PID if ${name}_o= omprotect is set.
case "$rc_arg" in
start)
# We c= annot use protect(1) inside jails.
if [ -n "$_oomprotect" ]= && [ -f "${PROTECT}" ] &&
=C2=A0 =C2=A0[ = "$(sysctl -n security.jail.jailed)" -eq 0 ]; then
[ -z &qu= ot;${rc_pid}" ] && eval $_pidcmd
case $_oomprotect in [Aa][Ll][Ll])
${PROTECT} -d -i -p ${rc_pid}
;;
= [Yy][Ee][Ss])
${PROTECT} -p ${rc_pid}
;;
esac
= fi
;;
esac

return $_return
done

echo 1>&= amp;2 "$0: unknown directive '$rc_arg'."
rc_usage $_k= eywords
# not reached
}

#
# Helper functions for run_rc_co= mmand: common code.
# They use such global variables besides the exporte= d rc_* ones:
#
# name =C2=A0 =C2=A0 =C2=A0 R/W
# ----------------= --
# _precmd R
# _postcmd R
# _return W
#
_run_rc_precmd()=
{
check_required_before "$rc_arg" || return 1

if = [ -n "$_precmd" ]; then
debug "run_rc_command: ${rc_arg= }_precmd: $_precmd $rc_extra_args"
eval "$_precmd $rc_extra_= args"
_return=3D$?

# If precmd failed and force isn'= t set, request exit.
if [ $_return -ne 0 ] && [ -z "$rc_f= orce" ]; then
return 1
fi
fi

check_required_aft= er "$rc_arg" || return 1

return 0
}

_run_rc_pos= tcmd()
{
if [ -n "$_postcmd" ]; then
debug "run_= rc_command: ${rc_arg}_postcmd: $_postcmd $rc_extra_args"
eval &qu= ot;$_postcmd $rc_extra_args"
_return=3D$?
fi
return 0
= }

_run_rc_doit()
{
debug "run_rc_command: doit: $*"=
eval "$@"
_return=3D$?

# If command failed and f= orce isn't set, request exit.
if [ $_return -ne 0 ] && [ -z= "$rc_force" ]; then
return 1
fi

return 0
}
_run_rc_notrunning()
{
local _pidmsg

if [ -n "$pi= dfile" ]; then
_pidmsg=3D" (check $pidfile)."
else<= br> _pidmsg=3D
fi
echo 1>&2 "${name} not running?${_pi= dmsg}"
}

_run_rc_killcmd()
{
local _cmd

_cmd= =3D"kill -$1 $rc_pid"
if [ -n "$_user" ]; then
= _cmd=3D"su -m ${_user} -c 'sh -c \"${_cmd}\"'"=
fi
echo "$_cmd"
}

#
# run_rc_script file ar= g
# Start the script `file' with `arg', and correctly handle the=
# return value from the script.
# If `file' ends with `.sh' = and lives in /etc/rc.d, ignore it as it's
# an old-style startup fil= e.
# If `file' ends with `.sh' and does not live in /etc/rc.d, i= t's sourced
# into the current environment if $rc_fast_and_loose is = set; otherwise
# it is run as a child process.
# If `file' appear= s to be a backup or scratch file, ignore it.
# Otherwise if it is execut= able run as a child process.
#
run_rc_script()
{
_file=3D$1 _arg=3D$2
if [ -z "$_file" -o -z "$_arg" ]; then<= br> err 3 'USAGE: run_rc_script file arg'
fi

unset nam= e command command_args command_interpreter \
extra_commands pidfile pr= ocname \
rcvar rcvars rcvars_obsolete required_dirs required_files \ required_vars
eval unset ${_arg}_cmd ${_arg}_precmd ${_arg}_postcmd=

rc_service=3D"$_file"
case "$_file" in
= /etc/rc.d/*.sh) # no longer allowed in the base
warn "Ignoring= old-style startup script $_file"
;;
*[~#]|*.OLD|*.bak|*.orig= |*,v) # scratch file; skip
warn "Ignoring scratch file $_file&quo= t;
;;
*) # run in subshell
if [ -x $_file ]; then
if= [ -n "$rc_fast_and_loose" ]; then
set $_arg; . $_file
= else
( trap "echo Script $_file interrupted >&2 ; kil= l -QUIT $$" 3
=C2=A0trap "echo Script $_file interrupted = >&2 ; exit 1" 2
=C2=A0trap "echo Script $_file run= ning >&2" 29
=C2=A0set $_arg; . $_file )
fi
= fi
;;
esac
}

#
# load_rc_config [service]
# Source= in the configuration file(s) for a given service.
# If no service is sp= ecified, only the global configuration
# file(s) will be loaded.
#load_rc_config()
{
local _name _rcvar_val _var _defval _v _msg _new= _d
_name=3D$1

if ${_rc_conf_loaded:-false}; then
:
el= se
if [ -r /etc/defaults/rc.conf ]; then
debug "Sourcing /e= tc/defaults/rc.conf"
. /etc/defaults/rc.conf
source_rc_con= fs
elif [ -r /etc/rc.conf ]; then
debug "Sourcing /etc/rc.c= onf (/etc/defaults/rc.conf doesn't exist)."
. /etc/rc.conf fi
_rc_conf_loaded=3Dtrue
fi

# If a service name was s= pecified, attempt to load
# service-specific configuration
if [ -n = "$_name" ] ; then
for _d in /etc ${local_startup}; do
= _d=3D${_d%/rc.d}
if [ -f ${_d}/rc.conf.d/"$_name" ]; then debug "Sourcing ${_d}/rc.conf.d/$_name"
. ${_d}/rc.c= onf.d/"$_name"
elif [ -d ${_d}/rc.conf.d/"$_name"= ] ; then
local _rc
for _rc in ${_d}/rc.conf.d/"$_name&q= uot;/* ; do
if [ -f "$_rc" ] ; then
debug "= Sourcing $_rc"
. "$_rc"
fi
done
= fi
done
fi

# Set defaults if defined.
for _var in $r= cvar $rcvars; do
eval _defval=3D\$${_var}_defval
if [ -n "$_= defval" ]; then
eval : \${$_var:=3D\$${_var}_defval}
fi
= done

# check obsolete rc.conf variables
for _var in $rcvars_ob= solete; do
eval _v=3D\$$_var
eval _msg=3D\$${_var}_obsolete_msg eval _new=3D\$${_var}_newvar
case $_v in
"")
= ;;
*)
if [ -z "$_new" ]; then
_msg=3D"Igno= red."
else
eval $_new=3D\"\$$_var\"
if [= -z "$_msg" ]; then
_msg=3D"Use \$$_new instead.&quo= t;
fi
fi
warn "\$$_var is obsolete. =C2=A0$_msg&quo= t;
;;
esac
done
}

#
# load_rc_config_var name v= ar
# Read the rc.conf(5) var for name and set in the
# current shell,= using load_rc_config in a subshell to prevent
# unwanted side effects f= rom other variable assignments.
#
load_rc_config_var()
{
if [ = $# -ne 2 ]; then
err 3 'USAGE: load_rc_config_var name var' fi
eval $(eval '(
load_rc_config '$1' >/dev/null;=
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if [ -n "$= {'$2'}" -o "${'$2'-UNSET}" !=3D "UNSET&= quot; ]; then
echo '$2'=3D\'\''${'$2'}\&#= 39;\'';
fi
)' )
}

#
# rc_usage commands# Print a usage string for $0, with `commands' being a list of
# v= alid commands.
#
rc_usage()
{
echo -n 1>&2 "Usage:= $0 [fast|force|one|quiet]("

_sep=3D
for _elem; do
ec= ho -n 1>&2 "$_sep$_elem"
_sep=3D"|"
don= e
echo 1>&2 ")"
exit 1
}

#
# err exit= val message
# Display message to stderr and log to the syslog, and exit = with exitval.
#
err()
{
exitval=3D$1
shift

if [ -x= /usr/bin/logger ]; then
logger "$0: ERROR: $*"
fi
e= cho 1>&2 "$0: ERROR: $*"
exit $exitval
}

## warn message
# Display message to stderr and log to the syslog.
#=
warn()
{
if [ -x /usr/bin/logger ]; then
logger "$0: W= ARNING: $*"
fi
echo 1>&2 "$0: WARNING: $*"}

#
# info message
# Display informational message to stdout = and log to syslog.
#
info()
{
case ${rc_info} in
[Yy][Ee][= Ss]|[Tt][Rr][Uu][Ee]|[Oo][Nn]|1)
if [ -x /usr/bin/logger ]; then
= logger "$0: INFO: $*"
fi
echo "$0: INFO: $*"=
;;
esac
}

#
# debug message
# If debugging is ena= bled in rc.conf output message to stderr.
# BEWARE that you don't ca= ll any subroutine that itself calls this
# function.
#
debug()
= {
case ${rc_debug} in
[Yy][Ee][Ss]|[Tt][Rr][Uu][Ee]|[Oo][Nn]|1)
= if [ -x /usr/bin/logger ]; then
logger "$0: DEBUG: $*" fi
echo 1>&2 "$0: DEBUG: $*"
;;
esac
}=

#
# backup_file action file cur backup
# Make a backup copy o= f `file' into `cur', and save the previous
# version of `cur'= ; as `backup'.
#
# The `action' keyword can be one of the fol= lowing:
#
# add `file' is now being backed up (and is possibly# being reentered into the backups system). =C2=A0`cur'
# is c= reated.
#
# update `file' has changed and needs to be backed up.=
# If `cur' exists, it is copied to `back'
# and then `fi= le' is copied to `cur'.
#
# remove `file' is no longer b= eing tracked by the backups
# system. =C2=A0`cur' is moved `back&#= 39;.
#
#
backup_file()
{
_action=3D$1
_file=3D$2
_c= ur=3D$3
_back=3D$4

case $_action in
add|update)
if [ -= f $_cur ]; then
cp -p $_cur $_back
fi
cp -p $_file $_cur chown root:wheel $_cur
;;
remove)
mv -f $_cur $_back
= ;;
esac
}

# make_symlink src link
# Make a symbolic link &= #39;link' to src from basedir. If the
# directory in which link is t= o be created does not exist
# a warning will be displayed and an error w= ill be returned.
# Returns 0 on success, 1 otherwise.
#
make_symli= nk()
{
local src link linkdir _me
src=3D"$1"
link= =3D"$2"
linkdir=3D"`dirname $link`"
_me=3D"= ;make_symlink()"

if [ -z "$src" -o -z "$link&qu= ot; ]; then
warn "$_me: requires two arguments."
return= 1
fi
if [ ! -d "$linkdir" ]; then
warn "$_me: = the directory $linkdir does not exist."
return 1
fi
if ! = ln -sf $src $link; then
warn "$_me: unable to make a symbolic lin= k from $link to $src"
return 1
fi
return 0
}

# = devfs_rulesets_from_file file
# Reads a set of devfs commands from file,= and creates
# the specified rulesets with their rules. Returns non-zero=
# if there was an error.
#
devfs_rulesets_from_file()
{
lo= cal file _err _me _opts
file=3D"$1"
_me=3D"devfs_rul= esets_from_file"
_err=3D0

if [ -z "$file" ]; the= n
warn "$_me: you must specify a file"
return 1
fi<= br> if [ ! -e "$file" ]; then
debug "$_me: no such file= ($file)"
return 0
fi

# Disable globbing so that the = rule patterns are not expanded
# by accident with matching filesystem e= ntries.
_opts=3D$-; set -f

debug "reading rulesets from fi= le ($file)"
{ while read line
do
case $line in
\#*)<= br> continue
;;
\[*\]*)
rulenum=3D`expr "$line"= ; : "\[.*=3D\([0-9]*\)\]"`
if [ -z "$rulenum" ]; = then
warn "$_me: cannot extract rule number ($line)"
= _err=3D1
break
fi
rulename=3D`expr "$line" := "\[\(.*\)=3D[0-9]*\]"`
if [ -z "$rulename" ]; th= en
warn "$_me: cannot extract rule name ($line)"
_e= rr=3D1
break;
fi
eval $rulename=3D\$rulenum
debug = "found ruleset: $rulename=3D$rulenum"
if ! /sbin/devfs rule= -s $rulenum delset; then
_err=3D1
break
fi
;; *)
rulecmd=3D"${line%%"\#*"}"
# evaluate= the command incase it includes
# other rules
if [ -n "$ru= lecmd" ]; then
debug "adding rule ($rulecmd)"
= if ! eval /sbin/devfs rule -s $rulenum $rulecmd
then
_err=3D= 1
break
fi
fi
;;
esac
if [ $_err -ne 0= ]; then
debug "error in $_me"
break
fi
done= } < $file
case $_opts in *f*) ;; *) set +f ;; esac
return $_err=
}

# devfs_init_rulesets
# Initializes rulesets from configura= tion files. Returns
# non-zero if there was an error.
#
devfs_init= _rulesets()
{
local file _me
_me=3D"devfs_init_rulesets&quo= t;

# Go through this only once
if [ -n "$devfs_rulesets_in= it" ]; then
debug "$_me: devfs rulesets already initialized&= quot;
return
fi
for file in $devfs_rulesets; do
if ! devf= s_rulesets_from_file $file; then
warn "$_me: could not read rule= s from $file"
return 1
fi
done
devfs_rulesets_init= =3D1
debug "$_me: devfs rulesets initialized"
return 0}

# devfs_set_ruleset ruleset [dir]
# Sets the default ruleset o= f dir to ruleset. The ruleset argument
# must be a ruleset name as speci= fied in devfs.rules(5) file.
# Returns non-zero if it could not set it s= uccessfully.
#
devfs_set_ruleset()
{
local devdir rs _me
[= -n "$1" ] && eval rs=3D\$$1 || rs=3D
[ -n "$2&q= uot; ] && devdir=3D"-m "$2"" || devdir=3D
_= me=3D"devfs_set_ruleset"

if [ -z "$rs" ]; then<= br> warn "$_me: you must specify a ruleset number"
return 1=
fi
debug "$_me: setting ruleset ($rs) on mount-point (${devdi= r#-m })"
if ! /sbin/devfs $devdir ruleset $rs; then
warn &quo= t;$_me: unable to set ruleset $rs to ${devdir#-m }"
return 1
= fi
return 0
}

# devfs_apply_ruleset ruleset [dir]
# Apply = ruleset number $ruleset to the devfs mountpoint $dir.
# The ruleset argu= ment must be a ruleset name as specified
# in a devfs.rules(5) file.=C2= =A0 Returns 0 on success or non-zero
# if it could not apply the ruleset= .
#
devfs_apply_ruleset()
{
local devdir rs _me
[ -n "= ;$1" ] && eval rs=3D\$$1 || rs=3D
[ -n "$2" ] &a= mp;& devdir=3D"-m "$2"" || devdir=3D
_me=3D&quo= t;devfs_apply_ruleset"

if [ -z "$rs" ]; then
wa= rn "$_me: you must specify a ruleset"
return 1
fi
de= bug "$_me: applying ruleset ($rs) to mount-point (${devdir#-m })"=
if ! /sbin/devfs $devdir rule -s $rs applyset; then
warn "$_= me: unable to apply ruleset $rs to ${devdir#-m }"
return 1
fi=
return 0
}

# devfs_domount dir [ruleset]
# Mount devfs on= dir. If ruleset is specified it is set
# on the mount-point. It must al= so be a ruleset name as specified
# in a devfs.rules(5) file. Returns 0 = on success.
#
devfs_domount()
{
local devdir rs _me
devdir= =3D"$1"
[ -n "$2" ] && rs=3D$2 || rs=3D
= _me=3D"devfs_domount()"

if [ -z "$devdir" ]; t= hen
warn "$_me: you must specify a mount-point"
return = 1
fi
debug "$_me: mount-point is ($devdir), ruleset is ($rs)&q= uot;
if ! mount -t devfs dev "$devdir"; then
warn "= $_me: Unable to mount devfs on $devdir"
return 1
fi
if [ = -n "$rs" ]; then
devfs_init_rulesets
devfs_set_ruleset = $rs $devdir
devfs -m $devdir rule applyset
fi
return 0
}
# Provide a function for normalizing the mounting of memory
# files= ystems.=C2=A0 This should allow the rest of the code here to remain
# as= close as possible between 5-current and 4-stable.
# =C2=A0 $1 =3D size<= br># =C2=A0 $2 =3D mount point
# =C2=A0 $3 =3D (optional) extra mdmfs fl= ags
mount_md()
{
if [ -n "$3" ]; then
flags=3D&quo= t;$3"
fi
/sbin/mdmfs $flags -s $1 ${mfs_type} $2
}

#= Code common to scripts that need to load a kernel module
# if it isn= 9;t in the kernel yet. Syntax:
# =C2=A0 load_kld [-e regex] [-m module] = file
# where -e or -m chooses the way to check if the module
# is alr= eady loaded:
# =C2=A0 regex is egrep'd in the output from `kldstat -= v',
# =C2=A0 module is passed to `kldstat -m'.
# The default = way is as though `-m file' were specified.
load_kld()
{
local= _loaded _mod _opt _re

while getopts "e:m:" _opt; do
= case "$_opt" in
e) _re=3D"$OPTARG" ;;
m) _mo= d=3D"$OPTARG" ;;
*) err 3 'USAGE: load_kld [-e regex] [-= m module] file' ;;
esac
done
shift $(($OPTIND - 1))
if= [ $# -ne 1 ]; then
err 3 'USAGE: load_kld [-e regex] [-m module] = file'
fi
_mod=3D${_mod:-$1}
_loaded=3Dfalse
if [ -n &qu= ot;$_re" ]; then
if kldstat -v | egrep -q -e "$_re"; th= en
_loaded=3Dtrue
fi
else
if kldstat -q -m "$_mod&= quot;; then
_loaded=3Dtrue
fi
fi
if ! $_loaded; then
= if ! kldload "$1"; then
warn "Unable to load kernel = module $1"
return 1
else
info "$1 kernel module = loaded."
fi
else
debug "load_kld: $1 kernel module = already loaded."
fi
return 0
}

# ltr str src dst [va= r]
# Change every $src in $str to $dst.
# Useful when /usr is not yet= mounted and we cannot use tr(1), sed(1) nor
# awk(1). If var is non-NUL= L, set it to the result.
ltr()
{
local _str _src _dst _out _com _= var
_str=3D"$1"
_src=3D"$2"
_dst=3D"$3= "
_var=3D"$4"
_out=3D""

local IFS= =3D"${_src}"
for _com in ${_str}; do
if [ -z "${_ou= t}" ]; then
_out=3D"${_com}"
else
_out=3D&q= uot;${_out}${_dst}${_com}"
fi
done
if [ -n "${_var}&= quot; ]; then
setvar "${_var}" "${_out}"
else<= br> echo "${_out}"
fi
}

# Creates a list of provid= ers for GELI encryption.
geli_make_list()
{
local devices devices= 2
local provider mountpoint type options rest

# Create list of = GELI providers from fstab.
while read provider mountpoint type options = rest ; do
case ":${options}" in
:*noauto*)
noauto= =3Dyes
;;
*)
noauto=3Dno
;;
esac

case = ":${provider}" in
:#*)
continue
;;
*.eli) # Skip swap devices.
if [ "${type}" =3D "swap&quo= t; -o "${options}" =3D "sw" -o "${noauto}" = =3D "yes" ]; then
continue
fi
devices=3D"= ${devices} ${provider}"
;;
esac
done < /etc/fstab
# Append providers from geli_devices.
devices=3D"${devices} = ${geli_devices}"

for provider in ${devices}; do
provider= =3D${provider%.eli}
provider=3D${provider#/dev/}
devices2=3D"= ;${devices2} ${provider}"
done

echo ${devices2}
}
# Originally, root mount hold had to be released before mounting
# the= root filesystem.=C2=A0 This delayed the boot, so it was changed
# to on= ly wait if the root device isn't readily available.=C2=A0 This
# can= result in rc scripts executing before all the devices - such
# as graid= (8), or USB disks - can be accessed.=C2=A0 This function can
# be used t= o explicitly wait for root mount holds to be released.
root_hold_wait()<= br>{
local wait waited holders

waited=3D0
while true; do holders=3D"$(sysctl -n vfs.root_mount_hold)"
if [ -z &quo= t;${holders}" ]; then
break;
fi
if [ ${waited} -eq 0 ]= ; then
echo -n "Waiting ${root_hold_delay}s" \
"= for the root mount holders: ${holders}"
else
echo -n .
= fi
if [ ${waited} -ge ${root_hold_delay} ]; then
echo
bre= ak
fi
sleep 1
waited=3D$(($waited + 1))
done
}
# Find scripts in local_startup directories that use the old syntax
#find_local_scripts_old() {
zlist=3D''
slist=3D''<= br> for dir in ${local_startup}; do
if [ -d "${dir}" ]; then=
for file in ${dir}/[0-9]*.sh; do
grep '^# PROVIDE:' $= file >/dev/null 2>&1 &&
=C2=A0 =C2=A0continue
= zlist=3D"$zlist $file"
done
for file in ${dir}/[!= 0-9]*.sh; do
grep '^# PROVIDE:' $file >/dev/null 2>&am= p;1 &&
=C2=A0 =C2=A0continue
slist=3D"$slist $f= ile"
done
fi
done
}

find_local_scripts_new() = {
local_rc=3D''
for dir in ${local_startup}; do
if [ -= d "${dir}" ]; then
for file in `grep -l '^# PROVIDE:= 9; ${dir}/* 2>/dev/null`; do
case "$file" in
*.s= ample) ;;
*) if [ -x "$file" ]; then
local_rc=3D&= quot;${local_rc} ${file}"
fi
;;
esac
done=
fi
done
}

# check_required_{before|after} command
# = Check for things required by the command before and after its precmd,
# = respectively.=C2=A0 The two separate functions are needed because some
#= conditions should prevent precmd from being run while other things
# de= pend on precmd having already been run.
#
check_required_before()
= {
local _f

case "$1" in
start)
for _f in $re= quired_vars; do
if ! checkyesno $_f; then
warn "\$${_f} i= s not enabled."
if [ -z "$rc_force" ]; then
r= eturn 1
fi
fi
done

for _f in $required_dirs; do<= br> if [ ! -d "${_f}/." ]; then
warn "${_f} is not = a directory."
if [ -z "$rc_force" ]; then
ret= urn 1
fi
fi
done

for _f in $required_files; do if [ ! -r "${_f}" ]; then
warn "${_f} is not rea= dable."
if [ -z "$rc_force" ]; then
return 1<= br> fi
fi
done
;;
esac

return 0
}

= check_required_after()
{
local _f _args

case "$1" = in
start)
for _f in $required_modules; do
case "${_f}&q= uot; in
*~*) _args=3D"-e ${_f#*~} ${_f%%~*}" ;;
*:*= ) _args=3D"-m ${_f#*:} ${_f%%:*}" ;;
*) _args=3D"${_f= }" ;;
esac
if ! load_kld ${_args}; then
if [ -z &qu= ot;$rc_force" ]; then
return 1
fi
fi
done ;;
esac

return 0
}

# check_jail mib
# Return tr= ue if security.jail.$mib exists and set to 1.

check_jail()
{
= local _mib _v

_mib=3D$1
if _v=3D$(${SYSCTL_N} "security.ja= il.$_mib" 2> /dev/null); then
case $_v in
1) return 0;; esac
fi
return 1
}

# check_kern_features mib
# Ret= urn existence of kern.features.* sysctl MIB as true or
# false.=C2=A0 Th= e result will be cached in $_rc_cache_kern_features_
# namespace. =C2=A0= "0" means the kern.features.X exists.

check_kern_features(= )
{
local _v

[ -n "$1" ] || return 1;
eval _v= =3D\$_rc_cache_kern_features_$1
[ -n "$_v" ] && retur= n "$_v";

if ${SYSCTL_N} kern.features.$1 > /dev/null 2= >&1; then
eval _rc_cache_kern_features_$1=3D0
return 0
= else
eval _rc_cache_kern_features_$1=3D1
return 1
fi
}
# check_namevarlist var
# Return "0" if ${name}_var is re= served in rc.subr.

_rc_namevarlist=3D"program chroot chdir env = flags fib nice user group groups prepend"
check_namevarlist()
{<= br> local _v

for _v in $_rc_namevarlist; do
case $1 in
$_v)= return 0 ;;
esac
done

return 1
}

# _echoonce var= msg mode
# mode=3D0: Echo $msg if ${$var} is empty.
# =C2=A0 =C2=A0= =C2=A0 =C2=A0After doing echo, a string is set to ${$var}.
#
# mode= =3D1: Echo $msg if ${$var} is a string with non-zero length.
#
_echoo= nce()
{
local _var _msg _mode
eval _var=3D\$$1
_msg=3D$2
= _mode=3D$3

case $_mode in
1) [ -n "$_var" ] &&am= p; echo "$_msg" ;;
*) [ -z "$_var" ] && ech= o -n "$_msg" && eval "$1=3Dfinished" ;;
esa= c
}

# If the loader env variable rc.debug is set, turn on debuggi= ng. rc.conf will
# still override this, but /etc/defaults/rc.conf can= 9;t unconditionally set this
# since it would undo what we've done h= ere.
if kenv -q rc.debug > /dev/null ; then
rc_debug=3DYES
fi<= br>

On Wed, Feb 19, 2025 at 4:33=E2=80=AFAM = Mark Millard <marklmi@yahoo.com= > wrote:
On F= eb 18, 2025, at 17:35, Mario Marietto <marietto2008@gmail.com> wrote:

> Hello.
> Everytime I try to install a package in FreeBSD 14.2-RELEASE-p1,this i= s what happens :
> marietto# pkg install qcad Updating FreeBSD repository catalogue... Fr= eeBSD repository is up to date. All repositories are up to date. The follow= ing 1 package(s) will be affected (of 0 checked): New packages to be INSTAL= LED: `qcad:` [`3.31.2.0`](http://3.31.2.0)
> Number of packages to be installed: 1 The process will require 212 MiB= more space. 28 MiB to be downloaded. Proceed with this action? [y/N]: y [1= /1] Fetching qcad-3.31.2.0.pkg: 100% 28 MiB 9.9MB/s 00:03 Checking integrit= y... done (0 conflicting) [1/1] Installing qcad-3.31.2.0... [1/1] Extractin= g qcad-3.31.2.0: 100% eval: startmsg: not found
> eval: startmsg: not found =3D=3D> Running trigger: desktop-file-uti= ls.ucl Building cache database of MIME types
> Maybe I found the solution here :
>
> https://lists.freebs= d.org/archives/freebsd-stable/2023-February/001144.html
>
> but I don't' understand what to do,since :
>
> 1) I don't have any /libexec/rc/rc.d/machine_id on my 14.2-RELEASE= -p1
> 2) I don't have any /etc/rc.subr

That last indicates an incomplete install. You may need
to report on how you installed in order to figure out
what else needs to be done now.

Per "man 8 rc" and "man 8 rc.subr" that talk about
/etc/rc.subr (only some references are shown below):


RC(8)=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0F= reeBSD System Manager's Manual=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 RC(8)

NAME
=C2=A0 =C2=A0 =C2=A0rc =E2=80=93 command scripts for auto-reboot and daemon= startup

SYNOPSIS
=C2=A0 =C2=A0 =C2=A0rc
=C2=A0 =C2=A0 =C2=A0rc.conf
=C2=A0 =C2=A0 =C2=A0rc.conf.local
=C2=A0 =C2=A0 =C2=A0rc.d/
=C2=A0 =C2=A0 =C2=A0rc.firewall
=C2=A0 =C2=A0 =C2=A0rc.local
=C2=A0 =C2=A0 =C2=A0rc.resume
=C2=A0 =C2=A0 =C2=A0rc.shutdown
=C2=A0 =C2=A0 =C2=A0rc.subr
. . .
FILES
=C2=A0 =C2=A0 =C2=A0/etc/rc
=C2=A0 =C2=A0 =C2=A0/etc/rc.conf
=C2=A0 =C2=A0 =C2=A0/etc/rc.conf.local
=C2=A0 =C2=A0 =C2=A0/etc/rc.d/
=C2=A0 =C2=A0 =C2=A0/etc/rc.firewall
=C2=A0 =C2=A0 =C2=A0/etc/rc.local
=C2=A0 =C2=A0 =C2=A0/etc/rc.shutdown
=C2=A0 =C2=A0 =C2=A0/etc/rc.subr
=C2=A0 =C2=A0 =C2=A0/var/run/dmesg.boot=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0dmesg(8) results soon after the rc
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0process b= egins.=C2=A0 Useful when dmesg(8)
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0buffer in= the kernel no longer has this
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0informati= on.
. . .
SEE ALSO
=C2=A0 =C2=A0 =C2=A0kill(1), rc.conf(5), init(8), rc.resume(8), rc.subr(8),= rcorder(8),
=C2=A0 =C2=A0 =C2=A0reboot(8), savecore(8), service(8), sysrc(8)
. . .



RC.SUBR(8)=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 FreeBSD System M= anager's Manual=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0RC.SUBR(= 8)

NAME
=C2=A0 =C2=A0 =C2=A0rc.subr =E2=80=93 functions used by system shell script= s

SYNOPSIS
=C2=A0 =C2=A0 =C2=A0. /etc/rc.subr

=C2=A0 =C2=A0 =C2=A0backup_file action file current backup
=C2=A0 =C2=A0 =C2=A0checkyesno var
=C2=A0 =C2=A0 =C2=A0check_pidfile pidfile procname [interpreter]
=C2=A0 =C2=A0 =C2=A0check_process procname [interpreter]
=C2=A0 =C2=A0 =C2=A0DebugOn tag ...
=C2=A0 =C2=A0 =C2=A0DebugOff tag ...
=C2=A0 =C2=A0 =C2=A0debug message
=C2=A0 =C2=A0 =C2=A0dot file ...
=C2=A0 =C2=A0 =C2=A0err exitval message
=C2=A0 =C2=A0 =C2=A0force_depend name
=C2=A0 =C2=A0 =C2=A0info message
=C2=A0 =C2=A0 =C2=A0is_verified file
=C2=A0 =C2=A0 =C2=A0load_kld [-e regex] [-m module] file
=C2=A0 =C2=A0 =C2=A0load_rc_config [flag] [service]
=C2=A0 =C2=A0 =C2=A0load_rc_config_var name var
=C2=A0 =C2=A0 =C2=A0mount_critical_filesystems type
=C2=A0 =C2=A0 =C2=A0rc_log message
=C2=A0 =C2=A0 =C2=A0rc_trace level message
=C2=A0 =C2=A0 =C2=A0rc_usage command ...
=C2=A0 =C2=A0 =C2=A0reverse_list item ...
=C2=A0 =C2=A0 =C2=A0run_rc_command argument
=C2=A0 =C2=A0 =C2=A0run_rc_script file argument
=C2=A0 =C2=A0 =C2=A0run_rc_scripts [options] file ...
=C2=A0 =C2=A0 =C2=A0safe_dot file ...
=C2=A0 =C2=A0 =C2=A0sdot file ...
=C2=A0 =C2=A0 =C2=A0startmsg [-n] message
=C2=A0 =C2=A0 =C2=A0vdot file ...
=C2=A0 =C2=A0 =C2=A0wait_for_pids [pid ...]
=C2=A0 =C2=A0 =C2=A0warn message

DESCRIPTION
=C2=A0 =C2=A0 =C2=A0The rc.subr script contains commonly used shell script = functions and
=C2=A0 =C2=A0 =C2=A0variable definitions which are used by various scripts = such as rc(8).
=C2=A0 =C2=A0 =C2=A0Scripts required by ports in /usr/local/etc/rc.d will a= lso eventually be
=C2=A0 =C2=A0 =C2=A0rewritten to make use of it.

=C2=A0 =C2=A0 =C2=A0The rc.subr functions were mostly imported from NetBSD.=

=C2=A0 =C2=A0 =C2=A0They are accessed by sourcing /etc/rc.subr into the cur= rent shell.
. . .


=3D=3D=3D
Mark Millard
marklmi at yahoo.com



--
Ma= rio.
--000000000000945aec062e7c78b3--