1.\" $NetBSD: rc.subr.8,v 1.12 2004/01/06 00:52:24 lukem Exp $ 2.\" 3.\" Copyright (c) 2002-2004 The NetBSD Foundation, Inc. 4.\" All rights reserved. 5.\" 6.\" This code is derived from software contributed to The NetBSD Foundation 7.\" by Luke Mewburn. 8.\" 9.\" Redistribution and use in source and binary forms, with or without 10.\" modification, are permitted provided that the following conditions 11.\" are met: 12.\" 1. Redistributions of source code must retain the above copyright 13.\" notice, this list of conditions and the following disclaimer. 14.\" 2. Redistributions in binary form must reproduce the above copyright 15.\" notice, this list of conditions and the following disclaimer in the 16.\" documentation and/or other materials provided with the distribution. 17.\" 18.\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 19.\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 20.\" TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 21.\" PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 22.\" BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 23.\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 24.\" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 25.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 26.\" CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 27.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 28.\" POSSIBILITY OF SUCH DAMAGE. 29.\" 30.Dd February 10, 2024 31.Dt RC.SUBR 8 32.Os 33.Sh NAME 34.Nm rc.subr 35.Nd functions used by system shell scripts 36.Sh SYNOPSIS 37.Bl -item -compact 38.It 39.Ic .\& Pa /etc/rc.subr 40.Pp 41.It 42.Ic backup_file Ar action Ar file Ar current Ar backup 43.It 44.Ic checkyesno Ar var 45.It 46.Ic check_pidfile Ar pidfile Ar procname Op Ar interpreter 47.It 48.Ic check_process Ar procname Op Ar interpreter 49.It 50.Ic DebugOn Ar tag ... 51.It 52.Ic DebugOff Ar tag ... 53.It 54.Ic debug Ar message 55.It 56.Ic dot Ar file ... 57.It 58.Ic err Ar exitval Ar message 59.It 60.Ic force_depend Ar name 61.It 62.Ic info Ar message 63.It 64.Ic is_verified Ar file 65.It 66.Ic load_kld Oo Fl e Ar regex Oc Oo Fl m Ar module Oc Ar file 67.It 68.Ic load_rc_config Oo Ar flag Oc Op Ar service 69.It 70.Ic load_rc_config_var Ar name Ar var 71.It 72.Ic mount_critical_filesystems Ar type 73.It 74.Ic rc_log Ar message 75.It 76.It rc_trace Ar level Ar message 77.It 78.Ic rc_usage Ar command ... 79.It 80.Ic reverse_list Ar item ... 81.It 82.Ic run_rc_command Ar argument 83.It 84.Ic run_rc_script Ar file Ar argument 85.It 86.Ic run_rc_scripts Oo options Oc Ar file ... 87.It 88.Ic safe_dot Ar file ... 89.It 90.Ic sdot Ar file ... 91.It 92.Ic startmsg Oo Fl n Oc Ar message 93.It 94.Ic vdot Ar file ... 95.It 96.Ic wait_for_pids Op Ar pid ... 97.It 98.Ic warn Ar message 99.El 100.Sh DESCRIPTION 101The 102.Nm 103script 104contains commonly used shell script functions and variable 105definitions which are used by various scripts such as 106.Xr rc 8 . 107Scripts required by ports in 108.Pa /usr/local/etc/rc.d 109will also eventually 110be rewritten to make use of it. 111.Pp 112The 113.Nm 114functions were mostly imported from 115.Nx . 116.Pp 117They are accessed by sourcing 118.Pa /etc/rc.subr 119into the current shell. 120.Pp 121The following shell functions are available: 122.Bl -tag -width 4n 123.It Ic backup_file Ar action file current backup 124Make a backup copy of 125.Ar file 126into 127.Ar current . 128Save the previous version of 129.Ar current 130as 131.Ar backup . 132.Pp 133The 134.Ar action 135argument 136may be one of the following: 137.Bl -tag -width ".Cm remove" 138.It Cm add 139.Ar file 140is now being backed up by or possibly re-entered into this backup mechanism. 141.Ar current 142is created. 143.It Cm update 144.Ar file 145has changed and needs to be backed up. 146If 147.Ar current 148exists, it is copied to 149.Ar backup 150and then 151.Ar file 152is copied to 153.Ar current . 154.It Cm remove 155.Ar file 156is no longer being tracked by this backup mechanism. 157.Ar current 158is moved to 159.Ar backup . 160.El 161.It Ic checkyesno Ar var 162Return 0 if 163.Ar var 164is defined to 165.Dq Li YES , 166.Dq Li TRUE , 167.Dq Li ON , 168or 169.Ql 1 . 170Return 1 if 171.Ar var 172is defined to 173.Dq Li NO , 174.Dq Li FALSE , 175.Dq Li OFF , 176or 177.Ql 0 . 178Otherwise, warn that 179.Ar var 180is not set correctly. 181The values are case insensitive. 182.Em Note : 183.Ar var 184should be a variable name, not its value; 185.Ic checkyesno 186will expand the variable by itself. 187.It Ic check_pidfile Ar pidfile procname Op Ar interpreter 188Parses the first word of the first line of 189.Ar pidfile 190for a PID, and ensures that the process with that PID 191is running and its first argument matches 192.Ar procname . 193Prints the matching PID if successful, otherwise nothing. 194If 195.Ar interpreter 196is provided, parse the first line of 197.Ar procname , 198ensure that the line is of the form: 199.Pp 200.Dl "#! interpreter [...]" 201.Pp 202and use 203.Ar interpreter 204with its optional arguments and 205.Ar procname 206appended as the process string to search for. 207.It Ic check_process Ar procname Op Ar interpreter 208Prints the PIDs of any processes that are running with a first 209argument that matches 210.Ar procname . 211.Ar interpreter 212is handled as per 213.Ic check_pidfile . 214.It Ic DebugOn Ar tag ... 215Enable tracing if not already enabled, 216and any 217.Ar tag 218is found in 219.Va DEBUG_SH 220(a comma separated list of tags). 221.Pp 222Record the 223.Ar tag 224that caused it to be enabled in 225.Va DEBUG_ON , 226set 227.Va DEBUG_DO 228empty and 229.Va DEBUG_SKIP 230to 231.Ql \&: . 232.Pp 233See 234.Xr debug.sh 8 235for more details. 236.It Ic DebugOff Ar tag ... 237Disable tracing if enabled and any 238.Ar tag 239matches 240.Va DEBUG_ON , 241which means it was the reason tracing was enabled. 242.Pp 243Set 244.Va DEBUG_DO 245to 246.Ql \&: , 247and 248.Va DEBUG_ON , 249.Va DEBUG_SKIP 250empty. 251.It Ic debug Ar message 252Display a debugging message to 253.Va stderr , 254log it to the system log using 255.Xr logger 1 , 256and 257return to the caller. 258The error message consists of the script name 259(from 260.Va $0 ) , 261followed by 262.Dq Li ": DEBUG: " , 263and then 264.Ar message . 265This function is intended to be used by developers 266as an aid to debugging scripts. 267It can be turned on or off 268by the 269.Xr rc.conf 5 270variable 271.Va rc_debug . 272.It Ic dot Ar file ... 273For reading in unverified files. 274.Pp 275Ensure shell 276.Li verify 277option is off. 278This option is only meaningful when 279.Xr mac_veriexec 4 280is active. 281.Pp 282Read each 283.Ar file 284if it exists. 285.Pp 286Restore previous state of the 287.Li verify 288option. 289.It Ic err Ar exitval message 290Display an error message to 291.Va stderr , 292log it to the system log 293using 294.Xr logger 1 , 295and 296.Ic exit 297with an exit value of 298.Ar exitval . 299The error message consists of the script name 300(from 301.Va $0 ) , 302followed by 303.Dq Li ": ERROR: " , 304and then 305.Ar message . 306.It Ic force_depend Ar name 307Output an advisory message and force the 308.Ar name 309service to start. 310The 311.Ar name 312argument is the 313.Xr basename 1 314component of the path to the script located at 315.Pa /etc/rc.d 316(scripts stored in other locations such as 317.Pa /usr/local/etc/rc.d 318cannot be controlled with 319.Ic force_depend 320currently). 321If the script fails for any reason it will output a warning 322and return with a return value of 1. 323If it was successful 324it will return 0. 325.It Ic is_verified Ar file 326If 327.Xr veriexec 8 328does not exist, or 329.Xr mac_veriexec 4 330is not active, just return success. 331Otherwise use 332.Xr veriexec 8 333to check if 334.Ar file 335is verified. 336If not verified the return code will be 80 (EAUTH). 337.It Ic info Ar message 338Display an informational message to 339.Va stdout , 340and log it to the system log using 341.Xr logger 1 . 342The message consists of the script name 343(from 344.Va $0 ) , 345followed by 346.Dq Li ": INFO: " , 347and then 348.Ar message . 349The display of this informational output can be 350turned on or off by the 351.Xr rc.conf 5 352variable 353.Va rc_info . 354.It Ic load_kld Oo Fl e Ar regex Oc Oo Fl m Ar module Oc Ar file 355Load 356.Ar file 357as a kernel module unless it is already loaded. 358For the purpose of checking the module status, 359either the exact module name can be specified using 360.Fl m , 361or an 362.Xr egrep 1 363regular expression matching the module name can be supplied via 364.Fl e . 365By default, the module is assumed to have the same name as 366.Ar file , 367which is not always the case. 368.It Ic load_rc_config Oo Ar flag Oc Op Ar service 369Source in the configuration file(s) for 370.Ar service . 371If no 372.Ar service 373is specified, 374only the global configuration file(s) will be loaded. 375First, 376.Pa /etc/rc.conf 377is sourced if it has not yet been read in. 378Then, 379.Pa /etc/rc.conf.d/ Ns Ar service 380is sourced if it is an existing file. 381The latter may also contain other variable assignments to override 382.Ic run_rc_command 383arguments defined by the calling script, to provide an easy 384mechanism for an administrator to override the behaviour of a given 385.Xr rc.d 8 386script without requiring the editing of that script. 387.Pp 388The function named by 389.Va load_rc_config_reader 390(default is 391.Ic dot ) 392is used to read configuration unless 393.Ar flag 394is: 395.Bl -tag -width Ds 396.It Fl s 397use 398.Ic sdot 399to read configuration, 400because we want verified configuration or 401to use 402.Ic safe_dot 403to read an unverified configuration. 404.It Fl v 405use 406.Ic vdot 407to read in configuration only if it is verified. 408.El 409.Pp 410.Ic DebugOn 411will be called with tags derived from 412.Ar name 413to enable tracing if any appear in 414.Va DEBUG_SH . 415.It Ic load_rc_config_var Ar name Ar var 416Read the 417.Xr rc.conf 5 418variable 419.Ar var 420for 421.Ar name 422and set in the current shell, using 423.Ic load_rc_config 424in a sub-shell to prevent unwanted side effects from other variable 425assignments. 426.It Ic mount_critical_filesystems Ar type 427Go through a list of critical file systems, 428as found in the 429.Xr rc.conf 5 430variable 431.Va critical_filesystems_ Ns Ar type , 432mounting each one that 433is not currently mounted. 434.It Ic rc_log Ar message 435Output 436.Ar message 437with a timestamp, which is both human readable and 438easily parsed for post processing, using: 439.Bd -literal -offset indent 440date "+@ %s [%Y-%m-%d %H:%M:%S %Z] $*" 441.Ed 442.It Ic rc_trace Ar level Ar message 443If the file 444.Pa /etc/rc.conf.d/rc_trace 445exists and is not empty attempt to set 446.Va RC_LEVEL 447based on its content. 448If the file is empty or does not contain 449a value for 450.Va RC_LEVEL , 451set it to 452.Li 0 . 453.Pp 454If 455.Ar level 456is greater than or equal to 457.Va RC_LEVEL 458pass 459.Ar message 460to 461.Ic rc_log . 462.It Ic rc_usage Ar command ... 463Print a usage message for 464.Va $0 , 465with 466.Ar commands 467being the list of valid arguments 468prefixed by 469.Sm off 470.Dq Bq Li fast | force | one | quiet . 471.Sm on 472.It Ic reverse_list Ar item ... 473Print the list of 474.Ar items 475in reverse order. 476.It Ic run_rc_command Ar argument 477Run the 478.Ar argument 479method for the current 480.Xr rc.d 8 481script, based on the settings of various shell variables. 482.Ic run_rc_command 483is extremely flexible, and allows fully functional 484.Xr rc.d 8 485scripts to be implemented in a small amount of shell code. 486.Pp 487.Ar argument 488is searched for in the list of supported commands, which may be one 489of: 490.Bl -tag -width ".Cm restart" -offset indent 491.It Cm start 492Start the service. 493This should check that the service is to be started as specified by 494.Xr rc.conf 5 . 495Also checks if the service is already running and refuses to start if 496it is. 497This latter check is not performed by standard 498.Fx 499scripts if the system is starting directly to multi-user mode, to 500speed up the boot process. 501.It Cm stop 502If the service is to be started as specified by 503.Xr rc.conf 5 , 504stop the service. 505This should check that the service is running and complain if it is not. 506.It Cm restart 507Perform a 508.Cm stop 509then a 510.Cm start . 511Defaults to displaying the process ID of the program (if running). 512.It Cm enabled 513Return 0 if the service is enabled and 1 if it is not. 514This command does not print anything. 515.It Cm rcvar 516Display which 517.Xr rc.conf 5 518variables are used to control the startup of the service (if any). 519.El 520.Pp 521If 522.Va pidfile 523or 524.Va procname 525is set, also support: 526.Bl -tag -width ".Cm restart" -offset indent 527.It Cm poll 528Wait for the command to exit. 529.It Cm status 530Show the status of the process. 531.El 532.Pp 533Other supported commands are listed in the optional variable 534.Va extra_commands . 535.Pp 536.Ar argument 537may have one of the following prefixes which alters its operation: 538.Bl -tag -width ".Li force" -offset indent 539.It Li fast 540Skip the check for an existing running process, 541and sets 542.Va rc_fast Ns = Ns Li YES . 543.It Li force 544Skip the checks for 545.Va rcvar 546being set to 547.Dq Li YES , 548and sets 549.Va rc_force Ns = Ns Li YES . 550This ignores 551.Ar argument Ns Va _precmd 552returning non-zero, and ignores any of the 553.Va required_* 554tests failing, and always returns a zero exit status. 555.It Li one 556Skip the checks for 557.Va rcvar 558being set to 559.Dq Li YES , 560but performs all the other prerequisite tests. 561.It Li quiet 562Inhibits some verbose diagnostics. 563Currently, this includes messages 564.Qq Starting ${name} 565(as checked by 566.Ic check_startmsgs 567inside 568.Nm ) 569and errors about usage of services that are not enabled in 570.Xr rc.conf 5 . 571This prefix also sets 572.Va rc_quiet Ns = Ns Li YES . 573.Em Note : 574.Va rc_quiet 575is not intended to completely mask all debug and warning messages, 576but only certain small classes of them. 577.El 578.Pp 579.Ic run_rc_command 580uses the following shell variables to control its behaviour. 581Unless otherwise stated, these are optional. 582.Bl -tag -width ".Va procname" -offset indent 583.It Va name 584The name of this script. 585This is not optional. 586.It Va rcvar 587The value of 588.Va rcvar 589is checked with 590.Ic checkyesno 591to determine if this method should be run. 592.It Va command 593Full path to the command. 594Not required if 595.Ar argument Ns Va _cmd 596is defined for each supported keyword. 597Can be overridden by 598.Va ${name}_program . 599.It Va command_args 600Optional arguments and/or shell directives for 601.Va command . 602.It Va command_interpreter 603.Va command 604is started with: 605.Pp 606.Dl "#! command_interpreter [...]" 607.Pp 608which results in its 609.Xr ps 1 610command being: 611.Pp 612.Dl "command_interpreter [...] command" 613.Pp 614so use that string to find the PID(s) of the running command 615rather than 616.Va command . 617.It Va extra_commands 618Extra commands/keywords/arguments supported. 619.It Va pidfile 620Path to PID file. 621Used to determine the PID(s) of the running command. 622If 623.Va pidfile 624is set, use: 625.Pp 626.Dl "check_pidfile $pidfile $procname" 627.Pp 628to find the PID. 629Otherwise, if 630.Va command 631is set, use: 632.Pp 633.Dl "check_process $procname" 634.Pp 635to find the PID. 636.It Va procname 637Process name to check for. 638Defaults to the value of 639.Va command . 640.It Va required_dirs 641Check for the existence of the listed directories 642before running the 643.Cm start 644method. 645The list is checked before running 646.Va start_precmd . 647.It Va required_files 648Check for the readability of the listed files 649before running the 650.Cm start 651method. 652The list is checked before running 653.Va start_precmd . 654.It Va required_modules 655Ensure that the listed kernel modules are loaded 656before running the 657.Cm start 658method. 659The list is checked after running 660.Va start_precmd . 661This is done after invoking the commands from 662.Va start_precmd 663so that the missing modules are not loaded in vain 664if the preliminary commands indicate a error condition. 665A word in the list can have an optional 666.Dq Li \&: Ns Ar modname 667or 668.Dq Li ~ Ns Ar pattern 669suffix. 670The 671.Ar modname 672or 673.Ar pattern 674parameter is passed to 675.Ic load_kld 676through a 677.Fl m 678or 679.Fl e 680option, respectively. 681See the description of 682.Ic load_kld 683in this document for details. 684.It Va required_vars 685Perform 686.Ic checkyesno 687on each of the list variables 688before running the 689.Cm start 690method. 691The list is checked after running 692.Va start_precmd . 693.It Va ${name}_chdir 694Directory to 695.Ic cd 696to before running 697.Va command , 698if 699.Va ${name}_chroot 700is not provided. 701.It Va ${name}_chroot 702Directory to 703.Xr chroot 8 704to before running 705.Va command . 706Only supported after 707.Pa /usr 708is mounted. 709.It Va ${name}_env 710A list of environment variables to run 711.Va command 712with. 713Those variables will be passed as arguments to the 714.Xr env 1 715utility unless 716.Ar argument Ns Va _cmd 717is defined. 718In that case the contents of 719.Va ${name}_env 720will be exported via the 721.Xr export 1 722builtin of 723.Xr sh 1 , 724which puts some limitations on the names of variables 725(e.g., a variable name may not start with a digit). 726.It Va ${name}_env_file 727A file to source for environmental variables to run 728.Va command 729with. 730.Em Note : 731all the variables which are being assigned in this file are going 732to be exported into the environment of 733.Va command . 734.It Va ${name}_fib 735FIB 736.Pa Routing Table 737number to run 738.Va command 739with. 740See 741.Xr setfib 1 742for more details. 743.It Va ${name}_flags 744Arguments to call 745.Va command 746with. 747This is usually set in 748.Xr rc.conf 5 , 749and not in the 750.Xr rc.d 8 751script. 752The environment variable 753.Sq Ev flags 754can be used to override this. 755.It Va ${name}_nice 756.Xr nice 1 757level to run 758.Va command 759as. 760Only supported after 761.Pa /usr 762is mounted. 763.It Va ${name}_limits 764Resource limits to apply to 765.Va command . 766This will be passed as arguments to the 767.Xr limits 1 768utility. 769By default, the resource limits are based on the login class defined in 770.Va ${name}_login_class . 771.It Va ${name}_login_class 772Login class to use with 773.Va ${name}_limits . 774Defaults to 775.Dq Li daemon . 776.It Va ${name}_oomprotect 777.Xr protect 1 778.Va command 779from being killed when swap space is exhausted. 780If 781.Dq Li YES 782is used, no child processes are protected. 783If 784.Dq Li ALL , 785protect all child processes. 786.It Va ${name}_program 787Full path to the command. 788Overrides 789.Va command 790if both are set, but has no effect if 791.Va command 792is unset. 793As a rule, 794.Va command 795should be set in the script while 796.Va ${name}_program 797should be set in 798.Xr rc.conf 5 . 799.It Va ${name}_user 800User to run 801.Va command 802as, using 803.Xr chroot 8 804if 805.Va ${name}_chroot 806is set, otherwise 807uses 808.Xr su 1 . 809Only supported after 810.Pa /usr 811is mounted. 812.It Va ${name}_group 813Group to run the chrooted 814.Va command 815as. 816.It Va ${name}_groups 817Comma separated list of supplementary groups to run the chrooted 818.Va command 819with. 820.It Va ${name}_prepend 821Commands to be prepended to 822.Va command . 823This is a generic version of 824.Va ${name}_env , 825.Va ${name}_fib , 826or 827.Va ${name}_nice . 828.It Va ${name}_setup 829Command to be run prior to 830.Va command . 831.It Ar argument Ns Va _cmd 832Shell commands which override the default method for 833.Ar argument . 834.It Ar argument Ns Va _precmd 835Shell commands to run just before running 836.Ar argument Ns Va _cmd 837or the default method for 838.Ar argument . 839If this returns a non-zero exit code, the main method is not performed. 840If the default method is being executed, this check is performed after 841the 842.Va required_* 843checks and process (non-)existence checks. 844.It Ar argument Ns Va _postcmd 845Shell commands to run if running 846.Ar argument Ns Va _cmd 847or the default method for 848.Ar argument 849returned a zero exit code. 850.It Va sig_stop 851Signal to send the processes to stop in the default 852.Cm stop 853method. 854Defaults to 855.Dv SIGTERM . 856.It Va sig_reload 857Signal to send the processes to reload in the default 858.Cm reload 859method. 860Defaults to 861.Dv SIGHUP . 862.El 863.Pp 864For a given method 865.Ar argument , 866if 867.Ar argument Ns Va _cmd 868is not defined, then a default method is provided by 869.Ic run_rc_command : 870.Bl -tag -width ".Sy Argument" -offset indent 871.It Sy Argument 872.Sy Default method 873.It Cm start 874If 875.Va command 876is not running and 877.Ic checkyesno Va rcvar 878succeeds, start 879.Va command . 880.It Cm stop 881Determine the PIDs of 882.Va command 883with 884.Ic check_pidfile 885or 886.Ic check_process 887(as appropriate), 888.Ic kill Va sig_stop 889those PIDs, and run 890.Ic wait_for_pids 891on those PIDs. 892.It Cm reload 893Similar to 894.Cm stop , 895except that it uses 896.Va sig_reload 897instead, and does not run 898.Ic wait_for_pids . 899Another difference from 900.Cm stop 901is that 902.Cm reload 903is not provided by default. 904It can be enabled via 905.Va extra_commands 906if appropriate: 907.Pp 908.Dl "extra_commands=reload" 909.It Cm restart 910Runs the 911.Cm stop 912method, then the 913.Cm start 914method. 915.It Cm status 916Show the PID of 917.Va command , 918or some other script specific status operation. 919.It Cm poll 920Wait for 921.Va command 922to exit. 923.It Cm rcvar 924Display which 925.Xr rc.conf 5 926variable is used (if any). 927This method always works, even if the appropriate 928.Xr rc.conf 5 929variable is set to 930.Dq Li NO . 931.El 932.Pp 933The following variables are available to the methods 934(such as 935.Ar argument Ns Va _cmd ) 936as well as after 937.Ic run_rc_command 938has completed: 939.Bl -tag -width ".Va rc_service" -offset indent 940.It Va rc_arg 941Argument provided to 942.Ic run_rc_command , 943after fast and force processing has been performed. 944.It Va rc_flags 945Flags to start the default command with. 946Defaults to 947.Va ${name}_flags , 948unless overridden by the environment variable 949.Sq Ev flags . 950This variable may be changed by the 951.Ar argument Ns Va _precmd 952method. 953.It Va rc_service 954Path to the service script being executed, in case it needs to re-invoke itself. 955.It Va rc_pid 956PID of 957.Va command 958(if appropriate). 959.It Va rc_fast 960Not empty if 961.Dq Li fast 962prefix was used. 963.It Va rc_force 964Not empty if 965.Dq Li force 966prefix was used. 967.El 968.It Ic run_rc_script Ar file argument 969Start the script 970.Ar file 971with an argument of 972.Ar argument , 973and handle the return value from the script. 974.Pp 975Various shell variables are unset before 976.Ar file 977is started: 978.Bd -ragged -offset indent 979.Va name , 980.Va command , 981.Va command_args , 982.Va command_interpreter , 983.Va extra_commands , 984.Va pidfile , 985.Va rcvar , 986.Va required_dirs , 987.Va required_files , 988.Va required_vars , 989.Ar argument Ns Va _cmd , 990.Ar argument Ns Va _precmd . 991.Ar argument Ns Va _postcmd . 992.Ed 993.Pp 994Call 995.Ic rc_trace 996to indicate that 997.Ar file 998is to be run. 999.Pp 1000However, if 1001.Ic is_verified Ar file 1002fails, just return. 1003.Pp 1004.Ic DebugOn 1005will be called with tags derrived from 1006.Va name 1007and 1008.Va rc_arg 1009to enable tracing if any of those tags appear in 1010.Va DEBUG_SH . 1011.Pp 1012The startup behaviour of 1013.Ar file 1014depends upon the following checks: 1015.Bl -enum 1016.It 1017If 1018.Ar file 1019ends in 1020.Pa .sh , 1021it is sourced into the current shell. 1022.It 1023If 1024.Ar file 1025appears to be a backup or scratch file 1026(e.g., with a suffix of 1027.Pa ~ , # , .OLD , 1028or 1029.Pa .orig ) , 1030ignore it. 1031.It 1032If 1033.Ar file 1034is not executable, ignore it. 1035.It 1036If the 1037.Xr rc.conf 5 1038variable 1039.Va rc_fast_and_loose 1040is empty, 1041source 1042.Ar file 1043in a sub shell, 1044otherwise source 1045.Ar file 1046into the current shell. 1047.El 1048.It Ic run_rc_scripts Oo options Oc file ... 1049Call 1050.Ic run_rc_script 1051for each 1052.Ar file , 1053unless it is already recorded as having been run. 1054.Pp 1055The 1056.Ar options 1057are: 1058.Bl -tag -width "--break break" 1059.It Ic --arg Ar arg 1060Pass 1061.Ar arg 1062to 1063.Ic run_rc_script , 1064default is 1065.Ar _boot 1066set by 1067.Xr rc 8 . 1068.It Ic --break Ar break 1069Stop processing if any 1070.Ar file 1071matches any 1072.Ar break 1073.El 1074.It Ic safe_dot Ar file ... 1075Used by 1076.Ic sdot 1077when 1078.Xr mac_veriexec 4 1079is active and 1080.Ar file 1081is not verified. 1082.Pp 1083This function limits the input from 1084.Ar file 1085to simple variable assignments with any 1086non-alphanumeric characters replaced with 1087.Ql _ . 1088.It Ic sdot Ar file ... 1089For reading in configuration files. 1090Skip files that do not exist or are empty. 1091Try using 1092.Ic vdot 1093and if that fails (the file is unverified) 1094fall back to using 1095.Ic safe_dot . 1096.It Ic startmsg Oo Fl n Oc Ar message 1097Display a start message to 1098.Va stdout . 1099It should be used instead of 1100.Xr echo 1 . 1101The display of this output can be turned off if the 1102.Xr rc.conf 5 1103variable 1104.Va rc_startmsgs 1105is set to 1106.Dq Li NO . 1107.It Ic stop_boot Op Ar always 1108Prevent booting to multiuser mode. 1109If the 1110.Va autoboot 1111variable is set to 1112.Ql yes 1113(see 1114.Xr rc 8 1115to learn more about 1116.Va autoboot ) , 1117or 1118.Ic checkyesno Ar always 1119indicates a truth value, then a 1120.Dv SIGTERM 1121signal is sent to the parent 1122process, which is assumed to be 1123.Xr rc 8 . 1124Otherwise, the shell exits with a non-zero status. 1125.It Ic vdot Ar file ... 1126For reading in only verified files. 1127.Pp 1128Ensure shell 1129.Li verify 1130option is on. 1131This option is only meaningful when 1132.Xr mac_veriexec 4 1133is active, 1134otherwise this function is effectively the same as 1135.Ic dot . 1136.Pp 1137Read in each 1138.Ar file 1139if it exists and 1140.Ic is_verfied Ar file 1141is successful, otherwise set return code to 80 (EAUTH). 1142.Pp 1143Restore previous state of the 1144.Li verify 1145option. 1146.It Ic wait_for_pids Op Ar pid ... 1147Wait until all of the provided 1148.Ar pids 1149do not exist any more, printing the list of outstanding 1150.Ar pids 1151every two seconds. 1152.It Ic warn Ar message 1153Display a warning message to 1154.Va stderr 1155and log it to the system log 1156using 1157.Xr logger 1 . 1158The warning message consists of the script name 1159(from 1160.Va $0 ) , 1161followed by 1162.Dq Li ": WARNING: " , 1163and then 1164.Ar message . 1165.El 1166.Sh FILES 1167.Bl -tag -width ".Pa /etc/rc.subr" -compact 1168.It Pa /etc/rc.subr 1169The 1170.Nm 1171file resides in 1172.Pa /etc . 1173.El 1174.Sh SEE ALSO 1175.Xr debug.sh 8 , 1176.Xr rc.conf 5 , 1177.Xr rc 8 1178.Sh HISTORY 1179The 1180.Nm 1181script 1182appeared in 1183.Nx 1.3 . 1184The 1185.Xr rc.d 8 1186support functions appeared in 1187.Nx 1.5 . 1188The 1189.Nm 1190script 1191first appeared in 1192.Fx 5.0 . 1193