Compare commits

..

207 Commits

Author SHA1 Message Date
William Hubbs
d0160dd96e update ChangeLog 2021-11-29 09:53:30 -06:00
William Hubbs
eca4c2d31e support/init.d.examples: Do not use @PKG_PREFIX@ in service examples
I can't think of a reason to do this since these scripts are just
examples.

This is for #474.
2021-11-29 09:51:35 -06:00
Sam James
6a91444bd9 meson: fallback to libcrypt detection outside of pkg-config
Much like PAM, not all implementations of libcrypt provide a pkg-config
file, and hence we can't find it using the old logic.

Let's fall back to the standard AC_SEARCH_LIBS-style check if the pkg-config-style
detection fails.

This fixes finding e.g. musl's libcrypt.

X-Gentoo-Bug: 827074
X-Gentoo-Bug-URL: https://bugs.gentoo.org/827074
2021-11-27 15:51:06 -06:00
Sam James
075fb7c646 src/rc/rc-selinux.c: fix use of deprecated security_context_t
It's only a char* and has been deprecated upstream [0].

[0] https://github.com/SELinuxProject/selinux/commit/7a124ca27581

Fixes: #478
2021-11-27 15:49:03 -06:00
Sam James
7f597d024a meson: only find libcrypt if SELinux and no PAM
We only need libcrypt if we're building _with_ SELinux and
_without_ PAM. We don't use libcrypt for general SELinux
with PAM.

This is mostly a correctness change as libcrypt should
generally be available (as opposed to the previous
change which fixed some real-world cases).

Fixes: f3f0fde861
Fixes: #478
2021-11-27 15:48:32 -06:00
Sam James
27219666ab meson: link against libcrypt for SELinux if no PAM
We use libcrypt's crypt() if we're _not_ using PAM
in the SELinux code (rc-selinux, specifically).

X-Gentoo-Bug: 824954
X-Gentoo-Bug-URL: https://bugs.gentoo.org/824954
Fixes: https://github.com/openrc/openrc/pull/477
2021-11-27 14:53:19 -06:00
Sam James
76022cba36 meson: fix pam_misc_dep definition
X-Gentoo-Bug: 824954
X-Gentoo-Bug-URL: https://bugs.gentoo.org/824954
Fixes: https://github.com/OpenRC/openrc/issues/470
Fixes: https://github.com/OpenRC/openrc/pull/477
2021-11-27 14:52:00 -06:00
Sam James
792dc7f6e8 src/librc/librc-daemon.c: add missing include for kill (fix uclibc)
Fixes: #471
Fixes: #473
2021-11-27 14:47:31 -06:00
Sam James
b5d576255b src/librc/librc-misc.c: add missing include for fileno (fix uclibc)
Fixes: #471
Fixes: #473
2021-11-27 14:46:43 -06:00
William Hubbs
45d1494b5d version 0.44.8 2021-11-12 22:20:34 -06:00
William Hubbs
20856a14e9 update ChangeLog 2021-11-12 22:19:34 -06:00
William Hubbs
a850651f5c openrc-init: fix build for selinux
X-Gentoo-Bug: 821520
X-Gentoo-Bug-URL: https://bugs.gentoo.org/show_bug.cgi?id=821520
2021-11-12 22:16:04 -06:00
William Hubbs
b0a80a042d build: pam fix
Set the HAVE_PAM option if the dependency is found *and* pam is
requested.

X-Gentoo-Bug: 821211
X-Gentoo-Bug-URL: https://bugs.gentoo.org/show_bug.cgi?id=821211
2021-11-12 20:57:46 -06:00
William Hubbs
49620e95ec fix permission of installed version file 2021-11-12 20:56:00 -06:00
William Hubbs
b4789b9910 version 0.44.7 2021-10-15 13:57:57 -05:00
William Hubbs
d5ae8a2ad1 update ChangeLog 2021-10-15 13:54:16 -05:00
Kerin Millar
3a276728e0 init.d/s6-svscan.in: make sure $command exists
While the s6-svscan runscript belongs to OpenRC, the user is required to
install s6 before it can actually be used, potentially leading to
confusion. Check for the existence of $command in start_pre and, if it does not
exist, bail out with an error that makes this observation.

X-Gentoo-Bug: 816978
X-Gentoo-Bug-URL: https://bugs.gentoo.org/show_bug.cgi?id=816978
2021-10-14 23:06:19 -05:00
William Hubbs
29d3e0bde2 selinux build fix 2021-10-14 19:32:16 -05:00
William Hubbs
969a036225 fix bug in pam build tests 2021-10-14 19:29:45 -05:00
William Hubbs
9767d24510 support older pam versions
Some distros are still using versions of pam which do not create
*.pc files, so we need fallback logic for that situation.
2021-10-14 19:26:22 -05:00
William Hubbs
c73284ef96 build: fix pam and pam_misc dependencies
Pam generates pkgconfig files now, so meson can use them to find the pam
dependencies.
2021-10-14 18:31:24 -05:00
William Hubbs
0657bf0d25 separate github actions based on OS
This fixes #466.
2021-10-14 16:04:39 -05:00
Sam James
80aad11b02 add github action to build on several linux platforms
This github action runs a build on each of the following platforms on a
push or pull request.

- Ubuntu LTS with gcc and glibc
- Ubuntu LTS with clang and glibc
- Alpine with gcc and musl

This fixes #463.
2021-10-14 16:03:44 -05:00
Sam James
2d9dc654b5 .cirrus.yml: update FreeBSD images 2021-10-14 16:02:44 -05:00
William Hubbs
f46cc83ef7 move rc_bindir and rc_sbindir definitions to the top level 2021-10-09 15:26:09 -05:00
Sam James
cc45b55f89 checkpath: fix allocation size of path buffer
strlen's return value isn't enough to be used
directly for (x)malloc; it doesn't include
the null byte at the end of the string.

X-Gentoo-Bug: 816900
X-Gentoo-Bug-URL: https://bugs.gentoo.org/816900
Fixes: #459
Fixes: #462
2021-10-07 23:13:24 -05:00
William Hubbs
930e69017f version 0.44.6 2021-10-04 10:36:14 -05:00
William Hubbs
44912434cf update ChangeLog 2021-10-04 10:31:46 -05:00
William Hubbs
c7fde9a3da fix build for selinux
I would like to thank jpds@protonmail.com for the patch.

X-Gentoo-Bug: 815847
X-Gentoo-Bug-URL: https://bugs.gentoo.org/show_bug.cgi?id=815847
2021-10-04 10:26:53 -05:00
William Hubbs
ffededbf95 version 0.44.5 2021-09-21 11:21:17 -05:00
William Hubbs
b0efb663f9 update ChangeLog 2021-09-21 11:12:35 -05:00
William Hubbs
aa69e48125 build: fix rootprefix
This fixes #438.
2021-09-21 11:10:36 -05:00
William Hubbs
4ba10f1d50 link runscript with audit 2021-09-18 17:06:19 -05:00
William Hubbs
38a9e2ff63 link openrc-run with audit and libpam_misc 2021-09-18 17:06:19 -05:00
William Hubbs
783af5abac version 0.44.4 2021-09-15 10:27:48 -05:00
William Hubbs
75c3b53e31 update ChangeLog 2021-09-15 10:25:47 -05:00
Natanael Copa
c300c180a2 hide error when migrating /var/run to /run
The script tries to copy non-existing files. We simply hide the error

http://bugs.alpinelinux.org/issues/3160
This fixes #451.
2021-09-15 10:23:59 -05:00
Natanael Copa
be8d2ee6e3 force root to be rw before localmount
The original service that pulled in root remount was mtab which
is not part of OpenRC.

This fixes #449.
2021-09-14 11:51:40 -05:00
Aaditya Bagga
d9ef1bb635 [runit integration] give a bit of time to start the service
Currently, we run sv start immediately after linking the service.
The runsv process may not be up at the moment, as a result of which
openrc will mark the service as stopped, even though it may be brought up
by runit at the next scan.

This is documented in the gentoo wiki:
https://wiki.gentoo.org/wiki/Runit#OpenRC.27s_runit_integration_feature

This PR adds a timeout so that correct process state can be reported.

Before:
 * Starting netdata-runit ...
fail: /run/openrc/sv/netdata: runsv not running
 * Failed to start netdata-runit

After:
 * Starting netdata-runit ...
fail: /run/openrc/sv/netdata: runsv not running
ok: run: /run/openrc/sv/netdata: (pid 9042) 0s

This fixes #253.
2021-09-12 13:28:20 -05:00
Jakub Jirutka
cfc6991219 Fix undeclared UT_LINESIZE
Fix the following error:

	broadcast.c:41:21: error: '__UT_LINESIZE' undeclared (first use in this function); did you mean 'UT_LINESIZE'?
	 #define UT_LINESIZE __UT_LINESIZE
                          ^~~~~~~~~~

Constant UT_LINESIZE is defined in <utmp.h> provided by musl.
2021-09-09 22:42:51 -05:00
Sören Tempel
97ae5af201 rc-mount: make timeout invocation compatible with busybox timeout
Busybox timeout does not support the `-k` flag. As such, invoking fuser
from do_unmount never worked without this patch. This went unnoticed as
standard error is redirected to /dev/null. This patch fixes this by
simply removing the incompatible `-k` flag.

[Ariadne: the `-k` is redundant anyway, since we are sending the KILL
 signal to begin with.]
2021-09-09 22:18:22 -05:00
William Hubbs
4c820a0e48 version 0.44.3 2021-09-09 12:56:50 -05:00
William Hubbs
9c39b381a5 update ChangeLog 2021-09-09 12:53:42 -05:00
Ariadne Conill
321bb2cd90 fix build under musl 1.2 on 32 bit systems
Since musl 1.2 time_t is a 64 bit value, even on 32 bit systems. A
hotfix for printing the value is simply using PRIu64 from inttypes.h
in the format string.

This fixes #446.
2021-09-09 12:49:03 -05:00
Ariadne Conill
8c99d817d4 fix trailing whitespace in tools/meson_runlevels.sh 2021-09-09 12:49:03 -05:00
2e1fb4d02b meson: fix symlinks with sysvinit 2021-09-08 18:18:39 -05:00
William Hubbs
a2f0afb8bc version 0.44.2 2021-09-08 15:36:20 -05:00
William Hubbs
430fa132f2 update ChangeLog 2021-09-08 15:33:46 -05:00
William Hubbs
12cd7ce9de build: install pam files 2021-09-08 15:31:42 -05:00
William Hubbs
167acac140 meson: typo fix 2021-09-08 15:31:42 -05:00
William Hubbs
f839ba27c5 version 0.44.1 2021-09-08 13:41:39 -05:00
William Hubbs
80dd6aac5f update ChangeLog 2021-09-08 13:41:20 -05:00
William Hubbs
0d00b8d8ab build: fix sysvinit script installation 2021-09-08 13:37:36 -05:00
William Hubbs
551bdff2fb build: fix symlinks 2021-09-08 13:37:36 -05:00
William Hubbs
803aa1c637 version 0.44 2021-09-07 16:16:51 -05:00
William Hubbs
fb186a3867 update ChangeLog 2021-09-07 16:14:08 -05:00
William Hubbs
c9b64b64fa update README 2021-09-07 16:13:35 -05:00
William Hubbs
9cce9f8ce8 news typo fix 2021-09-07 15:59:19 -05:00
William Hubbs
5a41f1ef20 add discussion about removing old build system to NEWS 2021-09-07 14:17:44 -05:00
William Hubbs
6e3afc29f3 update NEWS 2021-09-07 13:31:16 -05:00
William Hubbs
7c29fbd36f build: install bash and zsh completions 2021-09-07 12:45:53 -05:00
William Hubbs
593be166d1 build: fix libexecdir 2021-09-06 18:52:54 -05:00
William Hubbs
ca0270967c tools/meson_final.sh: typo fix 2021-09-06 18:37:11 -05:00
William Hubbs
3a187f88f4 build: typo fix 2021-09-06 16:04:46 -05:00
William Hubbs
f2362cc277 build: add split-usr option 2021-09-06 15:22:28 -05:00
William Hubbs
444e44eb9d build: change root_prefix to rootprefix 2021-09-06 14:30:30 -05:00
William Hubbs
c0f8313164 sync meson build version with makefiles 2021-09-05 20:04:55 -05:00
William Hubbs
d6622a1156 add meson build files
Closes #116.
Closes #171.
Closes #172.
Closes #175.
2021-09-04 16:01:29 -05:00
William Hubbs
92004a2ed6 README: add note about github discussions 2021-09-04 14:23:18 -05:00
Matt Whitlock
5f6d7ac028 supervise-daemon: implement SSD_IONICELEVEL
supervise-daemon was apparently overlooked when support for the
SSD_IONICELEVEL environment variable was added. This commit brings
supervise-daemon up to parity with start-stop-daemon with respect to
this environment variable.
2021-08-17 00:57:47 -04:00
William Hubbs
7cedc4942b update travis ci irc notifications
- move to libera network
- always notify on successful build
2021-08-14 15:05:07 -05:00
William Hubbs
091cd8015f man/supervise-daemon.8: document --pidfile option 2021-08-13 23:08:07 -05:00
Sven Wegener
63955056ec on_ac_power: support multiple power_supply devices in sysfs
Newer devices have multiple power_supply devices in sysfs:

$ grep ^ /sys/class/power_supply/*/type
/sys/class/power_supply/AC/type:Mains
/sys/class/power_supply/BAT0/type:Battery
/sys/class/power_supply/ucsi-source-psy-USBC000:001/type:USB
/sys/class/power_supply/ucsi-source-psy-USBC000:002/type:USB

There are two "USB" Type-C ports than can supply power and both are
aggregated into the "Mains" power supply by the firmware. The "Battery"
also counts as a power supply, but is missing the online attribute.

The -f check with a wildcard pattern results in an error, when multiple
devices are present:

/lib/rc/bin/on_ac_power: line 21: [: too many arguments

When the power_supply class is registered, check for a "Mains" device.

Fixes #427.
2021-08-13 13:38:07 -05:00
Alex Xu
1e975be896 conf.d/hostname: clarify hostname variable usage
https://gitlab.alpinelinux.org/alpine/aports/-/issues/9744

This fixes #433.
2021-08-13 13:13:14 -05:00
kyoreln
18e53f7fed move supervise-daemon out of experimental status
supervise-daemon is no longer experimental so remove the statements to
that affect.

This fixes #434.
2021-08-13 12:46:52 -05:00
William Hubbs
b5e4c2c2db Revert "openrc-init: ignore an empty string in argv[1]"
This reverts commit dec9ef200b.
This check is no longer needed since rc_runlevel_exists() is fixed.

    X-Gentoo-Bug: 803536
    X-Gentoo-Bug-URL: https://bugs.gentoo.org/803536
    Closes: https://github.com/OpenRC/openrc/pull/431
2021-08-13 10:46:57 -05:00
William Hubbs
0a97bad6c9 librc: fix rc_runlevel_exists return for empty string
This function should return false if the runlevel is an empty string.

    X-Gentoo-Bug: 803536
    X-Gentoo-Bug-URL: https://bugs.gentoo.org/803536
    Closes: https://github.com/OpenRC/openrc/pull/431
2021-08-13 10:28:44 -05:00
Mike Gilbert
dec9ef200b openrc-init: ignore an empty string in argv[1]
X-Gentoo-Bug: 803536
X-Gentoo-Bug-URL: https://bugs.gentoo.org/803536
Closes: https://github.com/OpenRC/openrc/pull/431
2021-08-12 15:04:38 -05:00
William Hubbs
7f47539fb1 sh/rc-cgroup.sh: fix case in starting message
X-Gentoo-Bug: 804193
X-Gentoo-Bug-URL: https://bugs.gentoo.org/show_bug.cgi?id=804193
2021-08-12 14:23:34 -05:00
William Hubbs
9c7bedca9e sh/rc-cgroup.sh: fix cgroup_cleanup
X-Gentoo-Bug: 804193
X-Gentoo-Bug-URL: https://bugs.gentoo.org/show_bug.cgi?id=804193
2021-08-12 14:21:58 -05:00
William Hubbs
1d282ddc80 move the irc channel to the libera network 2021-05-23 16:45:32 -05:00
Lars Wendler
0d86c4903b init.d/modules.in: Avoid loading modules twice in Linux with dash shell
Since commit 6b475ab269, openrc tries to load
modules twice which have been defined in /etc/conf.d/modules via modules=
variable when /bin/sh points to dash shell.
The reason is that when the "modules-load" service was merged into "modules"
service, the "modules" variable name got used in both, load_modules()
function and in Linux_modules() function which both get called when modules
service is started. Although "modules" variable is marked as local in
load_modules(), dash simply ignores this.

Avoid the issue by renaming "modules" variable to "_modules" in
load_modules() function.

This fixes #419.
2021-05-12 18:20:43 -05:00
William Hubbs
791322d7fa checkpath: fix code to walk the directory path
X-Gentoo-Bug: 782808
X-Gentoo-Bug-URL: https://bugs.gentoo.org/782808
2021-04-15 17:40:00 -05:00
William Hubbs
63db2d99e7 checkpath: remove extra slashes from paths
This fixes #418.
2021-04-13 17:13:25 -05:00
William Hubbs
8400e7d302 style fix 2021-04-13 16:29:21 -05:00
William Hubbs
533a8c70b3 cgroup2_set_limits: fix harmless error message
In legacy cgroups mode, we were running `mountinfo -q ""` which was
generating an error message. If we return immediately when
cgroup2_find_path returns an empty value, we avoid this message.
2021-04-04 17:31:49 -05:00
William Hubbs
852a3c86f6 NEWNET.md: fix the title 2021-04-03 15:18:30 -05:00
William Hubbs
b3e8072403 rename README.newnet to a markdown file
All of our documentation is in markdown, so rename this file to be
consistent.
2021-04-03 15:14:35 -05:00
William Hubbs
b7c03dea27 README: convert references to markdown links 2021-04-03 15:13:09 -05:00
William Hubbs
ee05403c50 version 0.43 2021-04-02 12:47:39 -05:00
William Hubbs
c1558abb0f update ChangeLog 2021-04-02 12:43:37 -05:00
William Hubbs
901b752463 README: force references to be on separate lines for github 2021-04-02 12:35:29 -05:00
William Hubbs
c88368b792 update news
This adds a note about SHLIBDIR being dropped from the makefiles.
2021-04-02 11:37:35 -05:00
William Hubbs
bfffe2c585 drop reference to gentoo bugzilla
OpenRC has a bug tracker on github, so ask people to file issues there.
2021-03-29 12:55:04 -05:00
William Hubbs
5f890ee8ab init.sh: rework the /run setup for linux xystems
- fix mount options for /run.
- run restorecon after everything is set up.

X-Gentoo-Bug: 740576
X-Gentoo-Bug-URL: https://bugs.gentoo.org/740576
2021-03-22 15:47:21 -05:00
William Hubbs
ef76a663bc stop namespaced services with specified pids
The previous fix excludes PIDs of processes running in a different namespace
regardless of whether the PID has been explicitly stored in a PID file mentioned
in the --pidfile parameter.  The correct behavior is to only exclude the pid if
it is not stored in a pidfile.

X-Gentoo-Bug: 776010
X-Gentoo-Bug-URL: https://bugs.gentoo.org/776010
2021-03-22 11:34:41 -05:00
William Hubbs
fccd37c34c add PKGCONFIGDIR to the makefiles
This allows pkgconfig files to be stored in /usr even if PREFIX is /.
2021-03-21 17:41:58 -05:00
William Hubbs
5058b6668c drop shlibdir
I know of no other build systems that have separate paths for static vs
shared libraries, so this changes ours to use libdir for all libraries.
2021-03-21 17:20:25 -05:00
Thomas Deutschmann
1878a74a12 numlock: Don't disable numlock on shutdown
When dealing with remote consoles, a shutdown could disable
host's numlock which is not desired.

This fixes #413.
2021-03-19 10:36:31 -05:00
btdmaster
897c2c00ef README: Wrap 'make install' in backticks
This fixes #412
2021-03-18 16:50:43 -05:00
William Hubbs
08d518b7fe rc_cgroup.sh: do not add newline when writing group2 values
Fixes: #407
2021-03-15 16:59:43 -05:00
William Hubbs
de77674663 rc-cgroup.sh: avoid process substitution for cgroup_get_pids
This should make cgroup_cleanup work successfully since cgroup_get_pids
no longer uses a subshell.

This fixes #396.
This fixes #397.
2021-03-01 14:21:24 -06:00
William Hubbs
4fb4674374 fix unified cgroups v2 setup
The cgroups v2 setup required the rc_cgroups_controllers variable
to be set to the list of controllers to enable regardless of whether the
mode was hybrid or unified.

This makes sense for hybrid mode since the controllers can't be in both
the cgroups v1 and v2 hierarchies, but for unified mode we should enable
all controllers that are configured in the kernel.
2021-02-23 23:08:56 -06:00
Disconnect3d
0ddab761be start-stop-daemon: Fix off by ones when checking for RC_* envvars
The same as https://github.com/OpenRC/openrc/pull/361

This fixes #362.
2021-02-22 16:09:32 -06:00
Disconnect3d
f5dd2f5baf supervise-daemon: Fix off by ones when checking for RC_* envvars
Fixes strncmp size argument off by one as the current implementation didn't
match the `=` character.

This fixes #361.
2021-02-22 15:34:45 -06:00
Rin Cat
b12c52d40f Support docker and lxc stop
This fixes #398.
2021-02-22 11:56:21 -06:00
sqozz
bac71fce5b start-stop-daemon: fix typo in manpage 2021-02-02 10:04:57 -05:00
William Hubbs
12ee72a9b3 allow devfs to run on lxc
X-Gentoo-Bug: 761918
X-Gentoo-Bug-URL: https://bugs.gentoo.org/show_bug.cgi?id=761918
Closes #272.
2021-01-28 12:32:09 -06:00
William Hubbs
170ce2624a typo fix 2021-01-05 17:11:01 -06:00
William Hubbs
9a6698876a improve the diagnostic when the ulimit builtin fails
X-Gentoo-Bug:739274
X-Gentoo-Bug-URL:https://bugs.gentoo.org/739274
2021-01-05 17:02:30 -06:00
Gaël PORTAY
bf9af1fb23 net-online: fix process of symlinks in sysfs
The test `[ -h "${ifname}" ] && continue` skips the symlinks while it is
the opposite that is the expected: ignoring files that are not symlinks.

Fixes commit f42ec82f21.
This fixes #391.
2020-12-22 12:49:48 -06:00
Patrick Noll
5c9c2a1939 remove statement about not providing an init
This fixes #359.
2020-12-22 12:10:15 -06:00
Manuel Rüger
4b2a61f1b8 rc-status: Remove noise from ini-formatted output
Otherwise this would create the following output:

rc-status -f ini
 * Caching service dependencies ...        [ ok ]
[default]
dbus =  started
NetworkManager =  started
syslog-ng =  started
...

This fixes #364.
2020-12-20 16:01:02 -06:00
William Hubbs
62bc463c63 update freebsd 11.x image on cirrus ci 2020-12-20 15:37:52 -06:00
Clayton Craft
7019bfad3b user-guide: clarify note for Runlevels/rc-update usage
I found the original note a little confusing, since using rc-update will
add it to a runlevel so it *is* auto-started when the system reaches
that runlevel again, but I don't think that was the intended meaning of
'auto-start', so hopefully this makes it a little more clear.
2020-12-20 13:54:33 +01:00
lishuxiang
8346c985d5 Update user-guide.md
fix a typo

This fixes #389.
2020-12-05 12:42:00 -06:00
William Hubbs
da30767353 supervise-daemon: do not spawn a process if we are exiting
This fixes #375 and allows us to not add another level of indentation in
the supervisor loop.
2020-11-29 21:22:43 -06:00
Dermot Bradley
57d9528a0b Remove warning when osclock init.d script runs
Currently when osclock is enabled as a init.d service the following
messages appear during boot when osclock starts:

  * The command variable is undefined.
  * There is nothing for osclock to start.
  * If this is what you intend, please write a start function.
  * This will become a failure in a future release.

osclock is activated whenever a machine's system clock is automatically
configured from a RTC by the kernel and the osclock's only purpose is to
satisfy the "clock" dependency defined by other init.d services.

Adding a stub start() function prevents OpenRC from showing warnings but
continues to ensure that the osclock service still does not actually do
anything.

This fixes #377.
2020-11-27 18:06:38 -06:00
Calvin Montgomery
6ce48f124a man/openrc.8: populate OPTIONS from --help output
This fixes #378.
2020-11-27 17:46:27 -06:00
Michael Orlitzky
00ea216608 src/rc/checkpath.c: replace mkdir() with mkdirat().
The do_check() function recently gained some defenses against symlink
replacement attacks that involve the use of *at functions in place of
their vanilla counterparts; openat() instead of open(), for example.
One opportunity to replace mkdir() with mkdirat() was missed, however,
and this commit replaces it.

This fixes #386.
2020-11-27 17:29:26 -06:00
Michael Orlitzky
ac7ca6d901 src/rc/checkpath.c: fix typo "synbolic" -> "symbolic". 2020-11-27 17:25:30 -06:00
Johannes Heimansberg
47819f004c start-stop-daemon, supervise-daemon: fix parsing of usernames passed via --user that start with a number
start-stop-daemon and supervise-daemon parse usernames and group names
passed via the --user argument as numeric UID/GID if they start with a
number (e.g. user "4foo" will be treated as UID 4). This results in the
process that is being started to run under a totally unexpected user if
that UID exists.

Even though the result of the sscanf calls are tested for a result of
exactly 1, which means exactly one value was extracted, because sscanf's
format string only contains only one placeholder, it will never return
a value greater than 1, even if there are still characters left to be
parsed. This causes start-stop-daemon and supervise-daemon to assume
that usernames starting with a number are just that number. Adding a
second placeholder "%1s" to the format string, which matches a string of
length 1, makes sure that sscanf can distinguish between pure numbers
(in which case it will return 1) and strings either starting with a
number (in which case it will return 2) and any other string (in which
case it will return 0).

This fixes #379.
This fixes #380.
2020-11-27 16:40:12 -06:00
William Hubbs
0fab3e837b bootmisc: allow sysvinit compatibility during shutdown
Use "halt -w" to write the halt record if it exists.
Otherwise use openrc-shutdown.

This fixes #336.
2020-11-27 15:18:57 -06:00
William Hubbs
38aaba28ee scripts/shutdown.in: fix sysvinit compatible shutdown
X-Gentoo-Bug: https://bugs.gentoo.org/755422
2020-11-20 14:57:04 -06:00
William Hubbs
3ed4126a31 update news for 0.43 with info on checkpath fix 2020-11-20 10:00:34 -06:00
Lars Wendler
aa0fdf6d08 start-stop-daemon: Don't segfault if --exec was given a non-existing file name
Starting program: /sbin/start-stop-daemon --start --exec i-dont-exist

  Program received signal SIGSEGV, Segmentation fault.
  0x0000555555559053 in main (argc=1, argv=0x7fffffffdc20)
      at start-stop-daemon.c:631
  631                         *exec_file ? exec_file : exec);

This fixes #385.
2020-11-20 09:22:18 -06:00
William Hubbs
b6fef599bf checkpath: fix CVE-2018-21269
This walks the directory path to the file we are going to manipulate to make
sure that when we create the file and change the ownership and permissions
we are working on the same file.
Also, all non-terminal symbolic links must be owned by root. This will
keep a non-root user from making a symbolic link as described in the
bug. If root creates the symbolic link, it is assumed to be trusted.

On non-linux platforms, we no longer follow non-terminal symbolic links
by default. If you need to do that, add the -s option on the checkpath
command line, but keep in mind that this is not secure.

This fixes #201.
2020-11-20 09:15:59 -06:00
Julien Surloppe
aac1734a70 Update user-guide.md
Add missing underscore.
2020-11-01 15:45:12 -05:00
William Hubbs
2355f1a3f2 supervise-daemon: only log debug logs when verbose mode is active 2020-09-25 16:33:32 -05:00
Manuel Rüger
fbec1eed51 .cirrus.yml: Update FreeBSD releases
Signed-off-by: Manuel Rüger <manuel@rueg.eu>
2020-04-19 13:15:35 +02:00
Austin English
229692cc34 man/openrc-run.8: fix a typo 2020-02-05 12:37:46 -05:00
Sergei Trofimovich
375ef42393 src/rc/rc-logger.h: fix build failure against gcc-10
On gcc-10 (and gcc-9 -fno-common) build fails as:

```
cc  -L../librc -L../libeinfo -O2 -g -std=c99 -Wall -Wextra -Wimplicit -Wshadow \
  -Wformat=2 -Wmissing-prototypes -Wmissing-declarations -Wmissing-noreturn \
  -Wmissing-format-attribute -Wnested-externs -Winline -Wwrite-strings \
  -Wcast-align -Wcast-qual -Wpointer-arith -Wdeclaration-after-statement \
  -Wsequence-point -Werror=implicit-function-declaration    \
  -Wl,-rpath=/lib   -o openrc rc.o rc-logger.o rc-misc.o rc-plugin.o _usage.o -lutil -lrc -leinfo -Wl,-Bdynamic -ldl
ld: rc-logger.o:/home/slyfox/dev/git/openrc/src/rc/rc-logger.h:16:
  multiple definition of `rc_logger_pid'; rc.o:openrc/src/rc/rc-logger.h:16: first defined here
ld: rc-logger.o:/home/slyfox/dev/git/openrc/src/rc/rc-logger.h:17:
  multiple definition of `rc_logger_tty'; rc.o:openrc/src/rc/rc-logger.h:17: first defined here
```

gcc-10 will change the default from -fcommon to fno-common:
https://gcc.gnu.org/PR85678.

The error also happens if CFLAGS=-fno-common passed explicitly.

This fixes #348.
2020-01-19 16:52:21 -06:00
Wolf
6deda13754 supervise-daemon: Fix segfault when executable does not exist
When executable is provided just by name (and therefore searched in a
path), exec_file is reset to NULL every time. exists() handles it being
NULL just fine, but dereferencing it in eerror does not work.

Fixes #326
Fixes #327
2020-01-11 13:36:33 -06:00
eb61085951 binfmt: ensure a file is ungegistered before registering
This fixes #328
2020-01-11 13:32:38 -06:00
Andrew Scheller
039845b742 Fix typo in README
This fixes #338
2020-01-11 12:16:19 -06:00
Ethan Sommer
a7e7fd2b37 make grep usage POSIX compliant
use grep -E instead of egrep
check for space or end of line instead of GNU-specific word boundary

This fixes #345
2020-01-11 12:09:10 -06:00
Jason Bowen
12e147a107 Delete stray text.
It looks like some stray text was left at the bottom of the file:
```
package.
migrating your system to openrc-init.
```
There's a subsection on migrating a system to `openrc-ini`; perhaps this was
an embryonic section title?

This fixes #347.
2020-01-11 11:15:56 -06:00
William Hubbs
fd852865e0 openrc-shutdown.c: typo fix 2019-12-05 12:11:08 -06:00
William Hubbs
35ec935741 ci/travis.sh: run shellcheck on shell scripts 2019-10-28 18:42:10 -05:00
Austin English
19cfd82dad .travis.yml: install shellcheck 2019-10-28 16:48:40 -05:00
E5ten
87cfad3d6c cgroup2_set_limits: verify that the cgroup2 path is a mount point
prior to cgroups getting mounted, /sys/fs/cgroup will still exist,
but attempts to make directories in it will fail, change cgroup2_set_limits() to
verify that cgroups are mounted instead of just checking that /sys/fs/cgroup
exists.

This fixes #307.
This fixes #321.
2019-09-03 16:38:03 -05:00
William Hubbs
8e31614c4b fix clang build 2019-08-20 16:06:46 -05:00
William Hubbs
a177d15641 version 0.42 2019-08-20 13:13:30 -05:00
William Hubbs
2b4c486043 Update ChangeLog 2019-08-20 13:09:50 -05:00
William Hubbs
ed24d28163 update sysvinit support files 2019-08-20 13:08:44 -05:00
William Hubbs
1bc96141e6 fix single user mode 2019-08-19 14:55:54 -05:00
William Hubbs
c7000aeaab optimize loops for installing gettys 2019-08-15 18:40:51 -05:00
William Hubbs
5c5129b534 Remove "single" runlevel directory
Single user mode should be handled in the init process directly.
2019-08-15 18:40:51 -05:00
William Hubbs
0dabda6f6f fix sysvinit compatibility
This allows openrc to direct sysvinit to shut down the system by setting
the INIT_HALT environment variable appropriately. Also, we do not try to
communicate with sysvinit if its fifo does not exist.
2019-08-15 12:02:30 -05:00
William Hubbs
92de9a693b Add documentation for openrc-init and update the NEWS file 2019-08-02 16:29:03 -05:00
William Hubbs
a71aebcae1 init.d/agetty: provide the getty virtual service 2019-07-29 17:39:11 -05:00
William Hubbs
61596b16d2 Install gettys if the MKSYSVINIT switch is set to yes
The default is to put one getty in the "single" runlevel and 6 in the
"default" runlevel.
2019-07-29 17:38:47 -05:00
William Hubbs
104eb3420b Add the "single" runlevel 2019-07-29 16:27:14 -05:00
Chloe Kudryavtsev
70b8df3e9c clarify supervise-daemon-guide
1. The given default for respawn_max is wrong.
2. The example for respawn_period is nonsensical.

This fixes #311.
2019-07-26 12:52:52 -05:00
William Hubbs
cac41092e4 add ability for openrc-shutdown to communicate with sysvinit
This fixes #315.
2019-07-25 14:47:18 -05:00
Martin Wilke
7ddc281ab6 Fix build with Clang
This fixes #313.
2019-07-24 12:32:23 -05:00
William Hubbs
c092ff6da1 Add Sony Interactive Entertainment as an author 2019-07-22 10:46:32 -05:00
William Hubbs
54780a4582 supervise-daemon: allow --respawn-max to be zero 2019-03-29 14:09:08 -05:00
William Hubbs
44f5a72d1a remove hidden-visibility.h
I am removing this on the advice of a member of the Gentoo toolchain
team. It was explained to me that this doesn't offer any significant
benefits to OpenRC.

If anyone ffeels differently, please open a pull request reverting
this and adding an explanation of what it does and how to know which
functions to mark hidden in the future.

This fixes #301.
2019-02-26 17:47:55 -06:00
William Hubbs
0d378974bf openrc-init: fix waitpid checks
The do_openrc() function was not waiting properly for the child process
which started the runlevel to return. We need to repeatedly call
waitpid() until its return value matches the pid of the child process or
the child process does not exist.

This fixes #216.
This fixes #300.
2019-02-25 18:55:13 -06:00
William Hubbs
028da5c2e3 librc: fix potential buffer overflow in pid_is_argv
This fixes #299.
2019-02-23 17:44:07 -06:00
William Hubbs
d8dbb890aa Revert "src/librc/librc-daemon.c: fix buffer overrun in pid_is_argv"
This reverts commit 084877eb52.
The mentioned commit caused some systems to have some services reported
as crashed.

This fixes #297.
This fixes #298.
2019-02-23 16:24:55 -06:00
William Hubbs
56c006ebd6 Update ChangeLog 2019-02-22 19:03:41 -06:00
William Hubbs
067088bbff move ci scripts to their own directory
This fixes #296.
2019-02-22 18:50:13 -06:00
William Hubbs
52d4e56674 combine test directories
This fixes #295.
2019-02-22 18:08:19 -06:00
William Hubbs
6e6902c28b remove unused test ignore patterns 2019-02-22 16:27:52 -06:00
William Hubbs
084823182a remove unused test data files 2019-02-22 13:25:51 -06:00
Georgy Yakovlev
7478c104fc librc/librc-depend.c: fix NULL pointer dereference
In some cases deptree or depinfo can be NULL, check
before dereferencing.

Fixes https://github.com/OpenRC/openrc/issues/293
Fixes https://github.com/OpenRC/openrc/pulls/294
X-Gentoo-Bug: 659906
X-Gentoo-Bug-URL: https://bugs.gentoo.org/659906
2019-02-21 17:49:54 -06:00
Georgy Yakovlev
065b7ecc0d use cirrus-ci for FreeBSD builds
This fixes #265.
2019-02-19 13:59:01 -06:00
Sergei Trofimovich
b054aca50b src/test/runtests.sh: drop 'readelf'-based tests
The 'readelf'-based tests cover a few situations:
1. undefined symbols in shared libraries
2. unexpected exports in shared libraries

Bug #575958 shows that [2.] implementation is too simplistic
in assuming that presence of relocation equals to export presence.

It is incorrect for PLT stubs and local symbols.
Let's just drop these tests.

If one needs to cover [1.] it is better to use LDFLAGS=-Wl,--no-undefined.

This closes #292.

X-Reported-by: Benda Xu
X-Gentoo-Bug: https://bugs.gentoo.org/575958
X-Gentoo-Bug-URL: https://bugs.gentoo.org/575958
2019-02-19 11:50:11 -06:00
William Hubbs
f9e7a00ba9 rc-status: style fixes 2019-02-15 20:36:46 -06:00
William Hubbs
f1f48011ac update ChangeLog 2019-02-15 14:37:57 -06:00
William Hubbs
427a1ce299 rc-status: add -f option to allow formatting output
The -f option can be used when showing the status of services in
runlevels to allow making the output more easily parsable.
Currently, the .ini format is the only one supported.
2019-02-15 14:21:43 -06:00
William Hubbs
f43cec34ca rc-status.c: small style changes 2019-02-14 13:14:31 -06:00
William Hubbs
d64c9d2050 add experimental support for an alternate shell for service scripts
This is for #288.
2019-02-13 18:22:25 -06:00
Edan Bedrik
b2b2c57a38 librc: fix realpath() return value check
This fixes #226.
2019-02-12 17:56:17 -06:00
William Hubbs
155b845194 improve shutdown documentation
This fixes #290.
2019-02-12 16:54:12 -06:00
Austin English
9b578808fb travis: try enabling musl-gcc
This fixes #261.
2019-02-11 13:56:55 -06:00
Austin English
03164dd38d fix build with muslc
This fixes #261.
2019-02-11 13:56:33 -06:00
Austin English
2b82766452 test/skel.runtests.sh: remove unused file
git grep shows no usage, and `make test` passes

This fixes #256.
2019-02-11 11:54:10 -06:00
Felix Neumärker
3eef6e9127 zsh-completion: _rc-service support extra actions
- use rc-service <service> describe to get action list

This is for #285.
2019-01-21 17:41:59 -06:00
Felix Neumärker
77f09900a2 zsh-completion: _rc-service fix flag/command combinations
- handle `rc-service -<flag> <service> <action>` correctly

This is for #285.
2019-01-21 17:41:38 -06:00
Kim Jahn
50d77a4e5d man/openrc.8: add openrc-run.8 to see also
This fixes #283.
2019-01-18 13:40:06 -06:00
Mike Frysinger
2d31b0a3f8 man: supervise-daemon: fix various style issues
The .Dt header is supposed to be all caps.  This was mixing case.

The options block was being incorrectly indented due to a missing .El.

Some of the new options were missing the .It block, so add that.

Finally, the -D option was missing capitalization.
2019-01-01 18:36:40 -05:00
William Hubbs
b84d0bac4d travis-ci: add IRC notifications 2018-12-29 11:37:06 -06:00
William Hubbs
1ff3a37c60 start-stop-daemon: fix compiler warning 2018-12-28 09:31:38 -06:00
William Hubbs
7e95d924c9 bash-completions/rc-service: allow tab to be used again
X-Gentoo-Bug: 670290
X-Gentoo-Bug-URL: https://bugs.gentoo.org/670290
2018-12-27 16:31:15 -06:00
a15b532a02 scripts: fix halt, poweroff and reboot wrappers
These are designed to emulate the sysvinit equivalents, so pass "now" as
the time argument if no arguments are given.

This fixes #268.
2018-12-27 13:52:16 -06:00
philhofer
3e00fbc9b0 fix leading whitespace
Clean up code indented with mixed tabs and spaces.
No actual code changes.

This fixes #280.
2018-12-27 13:13:09 -06:00
philhofer
846e460075 fix potential out-of-bounds reads
readlink(3) does not nul-terminate the result it sticks
into the supplied buffer. Consequently, the code

  rc = readlink(path, buf, sizeof(buf));

does not necessarily produce a C string.

The code in rc_find_pid() produces some C strings this way
and passes them to strlen() and strcmp(), which can lead
to an out-of-bounds read.

In this case, since the code already takes care to
zero-initialize the buffers before passing them
to readlink(3), only allow sizeof(buf)-1 bytes to
be returned.

(While fixing this issue, I fixed two other locations that
used the same problematic pattern.)

This fixes #270.
2018-12-27 11:28:27 -06:00
William Hubbs
a32b14bbb4 Do not use UT_LINESIZE or __UT_LINESIZE
These are not standard.
For more information see issue #279.
This fixes #279.
2018-12-25 12:13:23 -06:00
philhofer
084877eb52 src/librc/librc-daemon.c: fix buffer overrun in pid_is_argv
The contents of /proc/<pid>/cmdline are read into
a stack buffer using

  bytes = read(fd, buffer, sizeof(buffer));

followed by appending a null terminator to the buffer with

  buffer[bytes] = '\0';

If bytes == sizeof(buffer), then this write is out-of-bounds.

Refactor the code to use rc_getfile instead, since PATH_MAX
is not the maximum size of /proc/<pid>/cmdline. (I hit this
issue in practice while compiling Linux; it tripped the
stack-smashing protector.)

This is roughly the same buffer overflow condition
that was fixed by commit 0ddee9b7d2
This fixes #269.
2018-12-24 11:55:48 -06:00
philhofer
97e74f9734 src/rc/supervise-daemon.c: formatting fixes
Fix misleading indentation and other erroneous whitespace.
This fixes #273.
2018-12-24 10:36:12 -06:00
William Hubbs
d328de198d remove /run migration script again
This time it was done correctly.
I missed a '\' the last time.
2018-12-23 21:04:00 -06:00
philhofer
a9fc26ac13 src/rc/supervise-daemon.c: do not pass NULL to strcmp
The following will cause a segfault due to NULL being
passed to strcmp(3)

$ RC_SVCNAME=foo supervise-daemon

Fix the bounds check on argc in main. If argc<=1, then
it is not safe to dereference argv[1].
2018-12-23 21:01:39 -05:00
philhofer
40f7046696 src/rc/openrc-run.c: remove duplicate statement
The statement

  ll = strlen(applet);

appears twice in the same block without any
intervening assignment to the variables
'll' or 'applet'

Remove the second (duplicate) statement.
2018-12-23 20:27:06 -05:00
William Hubbs
894995176e Revert "remove /run migration script"
For some reason removing this broke the build.

This reverts commit 5246ea7b6f.
2018-12-23 18:13:06 -06:00
William Hubbs
5246ea7b6f remove /run migration script
We have used /run for some time now and we have had this migration
script for 6 years. Linux users should have upgraded by now to a version
of OpenRC which stores its information in /run.
2018-12-23 17:49:34 -06:00
William Hubbs
ed8b768c4a fix compiler warnings 2018-12-21 12:06:15 -06:00
William Hubbs
825caa14de supervise-daemon: do not use the exec_service() function
In order to run healthcheck() and the unhealthy() function, add an
exec_command call to the supervisor.
Another difference is This function also logs errors instead of
attempting to display them.

This is for #271.
2018-12-20 17:39:31 -06:00
William Hubbs
d5c396cbfc Add debug logging to start-stop-daemon and rc-supervisor
This will make it easier to track down why the supervisor intermittently
hangs after it runs for a long time.
2018-12-18 11:29:26 -06:00
William Hubbs
5427783fdf standardize the default shell
I do not know of a need to have the default shell be a build-time
configurable setting. All *nix systems I am aware of have /bin/sh as a
default posix compatible shell.
If some systems running OpenRC do not make that assumption about
/bin/sh, I will consider bringing this back, so feel free to open an
issue.
2018-12-08 12:06:26 -06:00
William Hubbs
d95425b08a rc-cgroup.sh: remove shebang line
This is not a stand-alone script, so it does not need the shebang line.
This also means it is not necessary to run this through sed.
2018-12-07 15:31:13 -06:00
William Hubbs
76420d9849 init.d/agetty: set default respawn period to 60 seconds
Without a respawn period setting, the supervisor will give up on
respawning agetty after it is respawned respawn_max times. For most
daemons giving up like this is reasonable, but not for agettys. Agettys
should always be respawned unless they are respawning too fafst,.

If an agetty is respawning faster than 10 times in 60 seconds, this
seems to be too fast.
2018-12-06 16:37:40 -06:00
William Hubbs
bebc604438 supervise-daemon: fix busy loop
This fixes #264.
2018-12-06 16:22:15 -06:00
Alexander Zubkov
9dae4f2e38 supervise-daemon: redirect std{in,out,err} to /dev/null after demonizing
This fixes #239.
2018-12-04 16:53:39 -06:00
William Hubbs
d126542dc6 version 0.41 2018-12-03 18:14:34 -06:00
141 changed files with 3471 additions and 2121 deletions

16
.cirrus.yml Normal file
View File

@@ -0,0 +1,16 @@
# Cirrus CI integration
# https://cirrus-ci.org
test_task:
freebsd_instance:
matrix:
image: freebsd-13-0-release-amd64
image: freebsd-12-2-release-amd64
image: freebsd-11-4-release-amd64
env:
OS: FreeBSD
procfs_script: >
[ -f /proc/curproc ] || mount -t procfs proc /proc
pkg_install_script: pkg install -y bash gawk gmake gsed
gsed_hack_script: rm /usr/bin/sed && ln -s /usr/local/bin/gsed /usr/bin/sed
test_script: bash ci/cirrus.sh

26
.github/workflows/ci-alpine-linux.yml vendored Normal file
View File

@@ -0,0 +1,26 @@
name: ci_alpine_linux
on: [push, pull_request]
jobs:
gcc-musl:
runs-on: ubuntu-latest
container: alpine:latest
steps:
- name: install deps
run: >-
apk --no-cache add \
build-base \
meson \
pkgconf \
linux-pam \
linux-pam-dev
- name: checkout
uses: actions/checkout@v2
- run: meson setup builddir/
env:
CC: gcc
- run: ninja -C builddir
env:
CC: gcc

32
.github/workflows/ci-ubuntu.yml vendored Normal file
View File

@@ -0,0 +1,32 @@
name: ci_ubuntu
on: [push, pull_request]
jobs:
gcc-glibc:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- run: sudo apt-get update -q
- run: sudo apt-get install -q -y build-essential libpam-dev meson
- run: meson setup builddir/
env:
CC: gcc
- run: ninja -C builddir
env:
CC: gcc
clang-glibc:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- run: sudo apt-get update -q
- run: sudo apt-get install -q -y build-essential clang libpam-dev meson
- run: meson setup builddir/
env:
CC: clang
- run: ninja -C builddir
env:
CC: clang

View File

@@ -9,6 +9,24 @@ os:
compiler:
- gcc
- clang
- musl-gcc
addons:
apt:
packages:
- musl-tools
notifications:
irc:
channels:
- "irc.libera.chat#openrc"
on_success: always # options: [always|never|change] default: always
on_failure: always # options: [always|never|change] default: always
on_start: false # default: false
before_install:
- sudo apt-get update
- sudo apt-get install -y shellcheck
script:
- ./test/travis.sh
- ./ci/travis.sh

View File

@@ -82,6 +82,7 @@ Semen Maryasin <marsoft@ya.ru>
Sergei Trofimovich <slyfox@gentoo.org>
Seth Robertson <in-gentoo@baka.org>
S. Gilles <sgilles@umd.edu>
Sony Interactive Entertainment, llc.
Stefan Knoblich <s.knoblich@axsentis.de>
Stef Simoens <stef.simoens@scarlet.be>
Steve L <slong@rathaus.eclipse.co.uk>

2236
ChangeLog

File diff suppressed because it is too large Load Diff

View File

@@ -33,8 +33,9 @@ ifeq (${MKZSHCOMP},yes)
SUBDIR+= zsh-completion
endif
# We need to ensure that runlevels is done last
# We need to ensure that runlevels is done last other than test
SUBDIR+= runlevels
SUBDIR+= test
INSTALLAFTER= _installafter

View File

@@ -1,3 +1,3 @@
NAME= openrc
VERSION= 0.40.3
VERSION= 0.44.8
PKG= ${NAME}-${VERSION}

View File

@@ -1,5 +1,5 @@
OpenRC Network Ideals
---------------------
=====================
The new style networking for OpenRC is very simplistic - provide a basic means
of configuring static interface address and routes whilst allowing the

43
NEWS.md
View File

@@ -4,6 +4,49 @@ OpenRC NEWS
This file will contain a list of notable changes for each release. Note
the information in this file is in reverse order.
## OpenRC 0.44
This version is the first to use a meson-based build system.
The gnu make build system should now be considered deprecated; it will
be removed sometime after 0.44.x.
I have opened a [discussion](https://github.com/OpenRC/openrc/discussions/441)
where you can voice concerns about removing it.
## OpenRC 0.43
This version changes the behavior of the checkpath helper to address
CVE-2018-21269. on Linux systems, We require non-terminal symbolic links
to be owned by root. Since we can't do this on non-linux systems, we do
not dereference non-terminal symbolic links by default. If you need them
dereferenced, you should add the "-s" switch to the appropriate
checkpath calls.
For more information, see http://github.com/openrc/openrc/issues/201.
The SHLIBDIR variable has been removed from the makefiles to make them
more consistent with most common makefiles. All libraries are now in
LIBDIR, so if you need to put them in /, override the LIBDIR variable
when you run make.
## OpenRC 0.42
openrc-shutdown now has the ability to shut down sysvinit-based systems.
A guide has been added for migrating systems using another init system
to openrc-init.
## OpenRC 0.41.
This version adds the ability to format the output of rc-status when
showing the status of services in a runlevel so that it may be parsed.
Currently, the -f switch only accepts ini as an argument which
causes the output to be in the .ini format.
This version adds an experimental build time switch to allow setting the
default shell to use for service scripts.
By default, this is set to /bin/sh if it is changed, the new shell must
be able to understand posix-compatible syntax.
## OpenRC 0.40
In this version, the keymaps and termencoding services on Linux needed

View File

@@ -2,19 +2,27 @@ OpenRC README
=============
OpenRC is a dependency-based init system that works with the
system-provided init program, normally `/sbin/init`. Currently, it does
not have an init program of its own.
system-provided init program, normally `/sbin/init`.
## Installation
## building and installing
OpenRC uses the [meson](http://mesonbuild.com) build system, so use the
usual methods for this build system to build and install.
The old build system is still available for the 0.44.x branch, but it is
considered deprecated and will be removed. The previous documentation is
below.
## Installation (historical)
OpenRC requires GNU make.
Once you have GNU Make installed, the default OpenRC installation can be
executed using this command:
make install
`make install`
## Configuration
## Configuration (historical)
You may wish to configure the installation by passing one or more of the
below arguments to the make command
@@ -38,19 +46,22 @@ PKG_PREFIX=/usr/pkg
LOCAL_PREFIX=/usr/local
PREFIX=/usr/local
BRANDING=\"Gentoo/$(uname -s)\"
SH=/bin/sh
```
## Notes
We don't support building a static OpenRC with PAM.
You may need to use `PROGLDFLAGS=-Wl,-Bstatic` on glibc instead of just `-static`.
You may need to use `PROGLDFLAGS=-Wl,-Bstatic` on glibc instead of just `-static`
(This is now handled by the meson build system).
If you are building OpenRC for a Gentoo Prefix installation, add `MKPREFIX=yes`.
If you are building OpenRC for a Gentoo Prefix installation, add `MKPREFIX=yes`
(this is not supported in the meson build currently, but patches are welcome).
`PKG_PREFIX` should be set to where packages install to by default.
`LOCAL_PREFIX` should be set when to where user maintained packages are.
`LOCAL_PREFIX` should be set to where user maintained packages are.
Only set `LOCAL_PREFIX` if different from `PKG_PREFIX`.
`PREFIX` should be set when OpenRC is not installed to /.
@@ -76,20 +87,21 @@ Obviously, if you're installing this onto a system that does not use
OpenRC by default then you may wish to backup the above listed files,
remove them and then install so that the OS hooks into OpenRC.
## Discussions
We are testing [discussions](https://github.com/OpenRC/openrc/discussions), so
feel free to open topics there.
## Reporting Bugs
If you are using Gentoo Linux, bugs can be filed on their bugzilla under
the `gentoo hosted projects` product and the `openrc` component [1].
Otherwise, you can report issues on our github [2].
Please report bugs on our [bug tracker](http://github.com/OpenRC/openrc/issues).
Better yet, if you can contribute code, please feel free to submit pull
requests [3].
If you can contribute code , please feel free to do so by opening
[pull requests](https://github.com/OpenRC/openrc/pulls).
## IRC Channel
We have an official irc channel, #openrc on freenode, feel free to join
us there.
We have an official irc channel, #openrc on the libera network.
Please connect your irc client to irc.libera.chat and join #openrc on
that network.
[1] https://bugs.gentoo.org/
[2] https://github.com/openrc/openrc/issues
[3] https://github.com/openrc/openrc/pulls

View File

@@ -0,0 +1,10 @@
bash_completions = [
'openrc',
'openrc-service-script',
'rc-service',
'rc-status',
'rc-update',
]
install_data(bash_completions,
install_dir : get_option('datadir') / 'bash-completion/completions')

View File

@@ -91,11 +91,14 @@ _rc_service()
done))
return 0
elif [[ ${COMP_CWORD} -eq 2 ]] && [[ ${prev} != -* ]]; then # if second word typed and we didn't type in a function
filename=$(rc-service --resolve ${prev})
opts=$(cat ${filename} | grep "^\w*()" | sed "s/().*$//") # Greps the functions included in the init script
if [[ "x${opts}" == "x" ]] ; then # if no options found loosen the grep algorhythm
opts=$(cat ${filename} | grep "\w*()" | sed "s/().*$//")
fi
rc-service --exists "$prev" || return
shopt -s extglob
while read -r _ line; do
if [[ $line == +([[:alnum:]_]):* ]]; then
opts+="${line%%:*} "
fi
done < <(rc-service "$prev" describe 2>&1)
shopt -u extglob
COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
return 0
fi

View File

@@ -13,11 +13,9 @@ set -e
set -u
set -x
# These are steps to run on TravisCI under a containerized Ubuntu system.
# See $TOP/.travis.yml for more info about the TravisCI setup.
# These are steps to run on Cirrus CI under a jailed FreeBSD system.
# See $TOP/.cirrus.yml for more info about the Cirrus CI setup.
cpus=$(getconf _NPROCESSORS_CONF || echo 1)
# make on TravisCI doesn't support -O yet
make -j"${cpus}"
make test
cpus=$(getconf NPROCESSORS_CONF || echo 1)
gmake -j"${cpus}" -O
gmake test

40
ci/travis.sh Executable file
View File

@@ -0,0 +1,40 @@
#!/bin/bash
# Copyright (c) 2007-2018 The OpenRC Authors.
# See the Authors file at the top-level directory of this distribution and
# https://github.com/OpenRC/openrc/blob/master/AUTHORS
#
# This file is part of OpenRC. It is subject to the license terms in
# the LICENSE file found in the top-level directory of this
# distribution and at https://github.com/OpenRC/openrc/blob/master/LICENSE
# This file may not be copied, modified, propagated, or distributed
# except according to the terms contained in the LICENSE file.
set -e
set -u
set -x
# These are steps to run on TravisCI under a containerized Ubuntu system.
# See $TOP/.travis.yml for more info about the TravisCI setup.
# Run shellcheck, but don't fail (yet):
shellcheck --version
for shellscript in $(git ls-files); do
case $shellscript in
init.d/*.in) ;;
sh/*.in) ;;
sh/*.sh) ;;
support/init.d.examples/*.in) ;;
support/openvpn/*.sh) ;;
support/sysvinit/halt.sh) ;;
test/*.sh) ;;
*) continue ;;
esac
echo "Checking ${shellscript} with shellcheck:"
shellcheck -s sh "${shellscript}" || true
done
cpus=$(getconf _NPROCESSORS_CONF || echo 1)
# make on TravisCI doesn't support -O yet
make -j"${cpus}"
make test

View File

@@ -1,2 +1,2 @@
# Set to the hostname of this machine
# Hostname fallback if /etc/hostname does not exist
hostname="localhost"

59
conf.d/meson.build Normal file
View File

@@ -0,0 +1,59 @@
conf_d_dir = get_option('sysconfdir') / 'conf.d'
conf_common = [
'bootmisc',
'fsck',
'hostname',
'localmount',
'netmount',
'swap',
'urandom',
]
conf_net = [
'network',
'staticroute',
]
conf_FreeBSD = [
'ipfw',
'modules',
'moused',
'powerd',
'rarpd',
'savecore',
'syscons',
]
conf_Linux = [
'agetty',
'consolefont',
'devfs',
'dmesg',
'hwclock',
'keymaps',
'killprocs',
'modules',
'mtab',
'net-online',
]
conf_NetBSD = [
'moused',
'rarpd',
'savecore',
]
conf_data = conf_common
if get_option('newnet')
conf_data = conf_data + conf_net
endif
if os == 'FreeBSD'
conf_data = conf_data + conf_FreeBSD
elif os == 'Linux'
conf_data = conf_data + conf_Linux
elif os == 'NetBSD'
conf_data = conf_data + conf_NetBSD
endif
install_data(conf_data, install_dir : conf_d_dir)

44
etc/meson.build Normal file
View File

@@ -0,0 +1,44 @@
etc_conf_data = configuration_data()
if os == 'FreeBSD'
etc_conf_data.set('TERM', 'cons25')
elif os == 'Linux'
etc_conf_data.set('TERM', 'wsvt25')
endif
etc_conf_common = [
'rc.conf',
]
etc_bin_FreeBSD = [
'rc.devd',
]
etc_conf_FreeBSD = [
'devd.conf',
]
etc_bin_NetBSD = [
'rc.in',
'rc.shutdown.in',
]
install_data(etc_conf_common,
install_dir : get_option('sysconfdir'))
if os == 'FreeBSD'
install_data(etc_bin_FreeBSD,
install_dir : get_option('sysconfdir'),
install_mode: 'rwxr-xr-x')
install_data(etc_conf_FreeBSD,
install_dir : get_option('sysconfdir'))
endif
if os == 'FreeBSD' or os == 'NetBSD'
foreach file : etc_bin_NetBSD
configure_file(input : file,
output : '@BASENAME@',
configuration : etc_conf_data,
install_dir: get_option('sysconfdir'),
install_mode: 'rwxr-xr-x')
endforeach
endif

View File

@@ -198,10 +198,9 @@ rc_tty_number=12
# "unified" mounts cgroups version 2 on /sys/fs/cgroup
#rc_cgroup_mode="hybrid"
# This is a list of controllers which should be enabled for cgroups version 2.
# If hybrid mode is being used, controllers listed here will not be
# available for cgroups version 1.
# This is a global setting.
# This is a list of controllers which should be enabled for cgroups version 2
# when hybrid mode is being used.
# Controllers listed here will not be available for cgroups version 1.
#rc_cgroup_controllers=""
# This variable contains the cgroups version 2 settings for your services.

View File

@@ -1,4 +1,4 @@
#!@SHELL@
#!/bin/sh
# Copyright (c) 2007-2015 The OpenRC Authors.
# See the Authors file at the top-level directory of this distribution and
# https://github.com/OpenRC/openrc/blob/master/AUTHORS

View File

@@ -1,4 +1,4 @@
#!@SHELL@
#!/bin/sh
# Copyright (c) 2007-2015 The OpenRC Authors.
# See the Authors file at the top-level directory of this distribution and
# https://github.com/OpenRC/openrc/blob/master/AUTHORS

47
init-guide.md Normal file
View File

@@ -0,0 +1,47 @@
# OpenRC init process guide
OpenRC now includes an init process which can be used on Linux systems
in place of sysvinit.
## migrating a live system to openrc-init
Configuring a live system to use this init process is very
straight-forward, but the steps must be completed in this order.
* have your boot loader add "init=/sbin/openrc-init" to the kernel command line
The details of how to do this will vary from distro to distro, so they are
out of scope for this document.
* Install gettys into the runlevels where you need them.
If you are using the provided /etc/init.d/agetty script,, you should
first create symlinks in /etc/init.d to it for the ports where you
want gettys to run, e.g. the following will work if you want gettys on
tty1-tty6.
```
# cd /etc/init.d
# for x in tty1 tty2 tty3 tty4 tty5 tty6; do
ln -snf agetty agetty.$x
done
```
Once this is done, use ```rc-update``` as normal to install the agetty
services in the appropriate runlevels.
* Reboot your system.
At this point you are running under openrc-init, and you should use
openrc-shutdown to handle shutting down, powering off, rebooting etc.
## optional sysvinit compatibility
If you build and install OpenRC with MKSYSVINIT=yes, you will build and install
wrappers that make openrc-init compatible with sysvinit -- you will have
commands like "halt" "shutdown" "reboot" and "poweroff".
If you want this functionality on a live system, you should first
migrate the system to openrc-init, remove sysvinit, then rebuild and
install this package with MKSYSVINIT=yes.

View File

@@ -21,6 +21,7 @@ pidfile="/run/${RC_SVCNAME}.pid"
depend() {
after local
keyword -prefix
provide getty
}
start_pre() {

View File

@@ -113,8 +113,10 @@ migrate_to_run()
rm $src
elif [ ! -L $src -a -d $src ]; then
ebegin "Migrating $src to $dst"
cp -a $src/* $dst/
rm -rf $src
if ! rmdir $src 2>/dev/null; then
cp -a $src/* $dst/
rm -rf $src
fi
eend $?
fi
# If $src doesn't exist at all, just run this
@@ -241,7 +243,13 @@ stop()
{
# Write a halt record if we're shutting down
if [ "$RC_RUNLEVEL" = shutdown ]; then
[ "$RC_UNAME" = Linux ] && openrc-shutdown -w
if [ "$RC_UNAME" = Linux ]; then
if [ -x /sbin/halt ]; then
halt -w
else
openrc-shutdown -w
fi
fi
if [ "$RC_SYS" = OPENVZ ]; then
yesno $RC_REBOOT && printf "" >/reboot
fi

View File

@@ -83,14 +83,22 @@ cgroup2_controllers()
local active cgroup_path x y
cgroup_path="$(cgroup2_find_path)"
[ -z "${cgroup_path}" ] && return 0
[ -e "${cgroup_path}/cgroup.controllers" ] &&
[ ! -e "${cgroup_path}/cgroup.controllers" ] && return 0
[ ! -e "${cgroup_path}/cgroup.subtree_control" ]&& return 0
read -r active < "${cgroup_path}/cgroup.controllers"
for x in ${rc_cgroup_controllers}; do
for y in ${active}; do
[ "$x" = "$y" ] &&
[ -e "${cgroup_path}/cgroup.subtree_control" ]&&
for x in ${active}; do
case "$rc_cgroup_mode" in
unified)
echo "+${x}" > "${cgroup_path}/cgroup.subtree_control"
done
;;
hybrid)
for y in ${rc_cgroup_controllers}; do
if [ "$x" = "$y" ]; then
echo "+${x}" > "${cgroup_path}/cgroup.subtree_control"
fi
done
;;
esac
done
return 0
}

View File

@@ -15,7 +15,7 @@ depend()
{
provide dev-mount
before dev
keyword -docker -lxc -prefix -systemd-nspawn -vserver
keyword -docker -prefix -systemd-nspawn -vserver
}
mount_dev()
@@ -66,18 +66,20 @@ seed_dev()
{
# Seed /dev with some things that we know we need
# creating /dev/console, /dev/tty and /dev/tty1 to be able to write
# to $CONSOLE with/without bootsplash before udevd creates it
[ -c /dev/console ] || mknod -m 600 /dev/console c 5 1
[ -c /dev/tty1 ] || mknod -m 620 /dev/tty1 c 4 1
[ -c /dev/tty ] || mknod -m 666 /dev/tty c 5 0
if [ "${RC_SYS}" != LXC ]; then
# creating /dev/console, /dev/tty and /dev/tty1 to be able to write
# to $CONSOLE with/without bootsplash before udevd creates it
[ -c /dev/console ] || mknod -m 600 /dev/console c 5 1
[ -c /dev/tty1 ] || mknod -m 620 /dev/tty1 c 4 1
[ -c /dev/tty ] || mknod -m 666 /dev/tty c 5 0
# udevd will dup its stdin/stdout/stderr to /dev/null
# and we do not want a file which gets buffered in ram
[ -c /dev/null ] || mknod -m 666 /dev/null c 1 3
# udevd will dup its stdin/stdout/stderr to /dev/null
# and we do not want a file which gets buffered in ram
[ -c /dev/null ] || mknod -m 666 /dev/null c 1 3
# so udev can add its start-message to dmesg
[ -c /dev/kmsg ] || mknod -m 660 /dev/kmsg c 1 11
# so udev can add its start-message to dmesg
[ -c /dev/kmsg ] || mknod -m 660 /dev/kmsg c 1 11
fi
# extra symbolic links not provided by default
[ -e /dev/fd ] || ln -snf /proc/self/fd /dev/fd

View File

@@ -13,9 +13,9 @@ description="Mounts disks and swap according to /etc/fstab."
depend()
{
need fsck
use lvm modules root
after clock lvm modules root
need fsck root
use lvm modules
after clock lvm modules
keyword -docker -jail -lxc -prefix -systemd-nspawn -vserver
}

100
init.d/meson.build Normal file
View File

@@ -0,0 +1,100 @@
init_d_dir = get_option('sysconfdir') / 'init.d'
init_common = [
'bootmisc.in',
'fsck.in',
'hostname.in',
'local.in',
'localmount.in',
'loopback.in',
'netmount.in',
'osclock.in',
'root.in',
'savecache.in',
'swap.in',
'swclock.in',
'sysctl.in',
'runsvdir.in',
'urandom.in',
's6-svscan.in',
]
if get_option('newnet')
init_common = init_common + [
'network.in',
'staticroute.in',
]
endif
init_Linux = [
'agetty.in',
'binfmt.in',
'cgroups.in',
'consolefont.in',
'devfs.in',
'dmesg.in',
'hwclock.in',
'keymaps.in',
'killprocs.in',
'modules.in',
'mount-ro.in',
'mtab.in',
'numlock.in',
'procfs.in',
'net-online.in',
'save-keymaps.in',
'save-termencoding.in',
'sysfs.in',
'termencoding.in',
]
init_BSD = [
'hostid.in',
'moused.in',
'newsyslog.in',
'pf.in',
'rarpd.in',
'rc-enabled.in',
'rpcbind.in',
'savecore.in',
'syslogd.in',
]
init_FreeBSD = [
'adjkerntz.in',
'devd .in',
'dumpon.in',
'encswap.in',
'ipfw.in',
'modules.in',
'mixer.in',
'nscd.in',
'powerd.in',
'syscons.in',
]
init_NetBSD = [
'devdb.in',
'swap-blk.in',
'ttys.in',
'wscons.in',
]
init_data = init_common
if os == 'Dragonfly'
init_data = init_data + init_BSD
elif os == 'FreeBSD' or os == 'Gnu-kFreeBSD'
init_data = init_data + init_BSD + init_FreeBSD
elif os == 'Linux'
init_data = init_data + init_Linux
elif os == 'NetBSD'
init_data = init_data + init_BSD + init_NetBSD
endif
foreach init_d_file : init_data
configure_file(input : init_d_file,
output : '@BASENAME@',
configuration : init_d_conf_data,
install_dir: init_d_dir,
install_mode: 'rwxr-xr-x')
endforeach

View File

@@ -41,18 +41,18 @@ find_modfiles()
load_modules()
{
local file m modules rc x
local file m _modules rc x
file=$1
[ -z "$file" ] && return 0
while read m x; do
case $m in
\;*) continue ;;
\#*) continue ;;
*) modules="$modules $m"
*) _modules="$_modules $m"
;;
esac
done < $file
for x in $modules; do
for x in $_modules; do
ebegin "Loading module $x"
case "$RC_UNAME" in
FreeBSD) kldload "$x"; rc=$? ;;

View File

@@ -23,7 +23,7 @@ get_interfaces()
{
local ifname iftype
for ifname in /sys/class/net/*; do
[ -h "${ifname}" ] && continue
[ -h "${ifname}" ] || continue
read iftype < ${ifname}/type
[ "$iftype" = "1" ] && printf "%s " ${ifname##*/}
done

View File

@@ -42,6 +42,8 @@ start()
stop()
{
yesno $RC_GOINGDOWN && return 0
ebegin "Disabling numlock on ttys"
_setleds -
eend $? "Failed to disable numlock"

View File

@@ -17,3 +17,15 @@ depend()
{
provide clock
}
start()
{
# This stub function is required to avoid OpenRC warning at boot:
#
# * The command variable is undefined.
# * There is nothing for osclock to start.
# * If this is what you intend, please write a start function.
# * This will become a failure in a future release.
#
return 0
}

View File

@@ -21,9 +21,13 @@ depend()
start_pre()
{
einfo "Creating s6 scan directory"
checkpath -d -m 0755 "$RC_SVCDIR"/s6-scan
return $?
if [ ! -e "$command" ]; then
eerror "$command is missing (please install s6)"
else
einfo "Creating s6 scan directory"
checkpath -d -m 0755 "$RC_SVCDIR"/s6-scan
fi
return
}
stop_post()

7
local.d/meson.build Normal file
View File

@@ -0,0 +1,7 @@
local_d_dir = get_option('sysconfdir') / 'local.d'
local_data = [
'README'
]
install_data(local_data, install_dir : local_d_dir)

34
man/meson.build Normal file
View File

@@ -0,0 +1,34 @@
man3 = [
'einfo.3',
'rc_config.3',
'rc_deptree.3',
'rc_find_pids.3',
'rc_plugin_hook.3',
'rc_runlevel.3',
'rc_service.3',
'rc_stringlist.3',
]
man8 = [
'openrc.8',
'openrc-run.8',
'rc-service.8',
'rc-status.8',
'rc-update.8',
'start-stop-daemon.8',
'supervise-daemon.8',
]
if os == 'Linux'
man8 = man8 + [
'rc-sstat.8',
'openrc-init.8',
'openrc-shutdown.8',
]
endif
install_data(man3,
install_dir : get_option('mandir') / 'man3')
install_data(man8,
install_dir : get_option('mandir') / 'man8')
meson.add_install_script('meson_man_links.sh', get_option('mandir'), man3 + man8)

20
man/meson_man_links.sh Executable file
View File

@@ -0,0 +1,20 @@
#!/bin/sh
get_links() {
sed -e 's/ ,//g' \
-e '/^\.Sh NAME$/,/\.Sh/ s/\.Nm //p' \
-n ${MESON_SOURCE_ROOT}/man/${1}
}
MANDIR="$1"
shift
for man in $@; do
prefix=${man%%.*}
suffix=${man#*.}
links=$(get_links ${man})
for link in ${links}; do
if [ "${link}" != "${prefix}" ]; then
ln -sf ${man} ${MESON_INSTALL_DESTDIR_PREFIX}/${MANDIR}/man${suffix}/${link}.${suffix}
fi
done
done

View File

@@ -104,8 +104,6 @@ supervisor=s6.
or set
supervisor=supervise-daemon
to use supervise-daemon.
Note that supervise-daemon is still in early development, so it is
considered experimental.
.It Ar s6_service_path
The path to the s6 service directory if you are monitoring this service
with S6. The default is /var/svc.d/${RC_SVCNAME}.
@@ -332,7 +330,7 @@ section below.
.Sh _pre AND _post FUNCTIONS
Any command defined in extra_commands, extra_started_commands or
extra_stopped_commands can have _pre and _post functions in the service
script. If the command function is called foo, the_pre and _post
script. If the command function is called foo, the _pre and _post
functions for it should be called foo_pre and foo_post.
.Pp
These functions should be used to perform preparation before the
@@ -461,6 +459,7 @@ Mark the service as inactive.
.Op Fl p , -pipe
.Op Fl m , -mode Ar mode
.Op Fl o , -owner Ar owner
.Op Fl s , -symlinks
.Op Fl W , -writable
.Op Fl q , -quiet
.Ar path ...
@@ -481,6 +480,11 @@ or with names, and are separated by a colon.
The truncate options (-D and -F) cause the directory or file to be
cleared of all contents.
.Pp
If -s is not specified on a non-linux platform, checkpath will refuse to
allow non-terminal symbolic links to exist in the path. This is for
security reasons so that a non-root user can't create a symbolic link to
a root-owned file and take ownership of that file.
.Pp
If -W is specified, checkpath checks to see if the first path given on
the command line is writable. This is different from how the test
command in the shell works, because it also checks to make sure the file

View File

@@ -17,15 +17,35 @@
.Sh SYNOPSIS
.Nm
.Op Fl c , -cancel
.Nm
.Op Fl R , -reexec
.Nm
.Op Fl w , -write-only
.Nm
.Op Fl d , -no-write
.Op Fl D , -dry-run
.Op Fl H , -halt
time
.Nm
.Op Fl d , -no-write
.Op Fl D , -dry-run
.Op Fl k , -kexec
time
.Nm
.Op Fl d , -no-write
.Op Fl D , -dry-run
.Op Fl p , -poweroff
.Op Fl R , -reexec
time
.Nm
.Op Fl d , -no-write
.Op Fl D , -dry-run
.Op Fl r , -reboot
time
.Nm
.Op Fl d , -no-write
.Op Fl D , -dry-run
.Op Fl s , -single
.Op Fl w , -write-only
time
.Sh DESCRIPTION
.Nm
is the utility that communicates with
@@ -56,7 +76,7 @@ Stop all services, kill all processes and reboot the system.
.It Fl s , -single
Stop all services, kill all processes and move to single user mode.
.It Fl w , -write-only
Stop all services, kill all processes and move to single user mode.
Wrrite a wtmp shutdown record and do nothing else.
.El
.Sh SEE ALSO
.Xr openrc-init 8 ,

View File

@@ -65,7 +65,31 @@ Instead you should use
and
.Xr shutdown 8
and let them call these special runlevels.
.Sh OPTIONS
.Pp
.Bl -tag -width "-o , --override"
.It Fl n , -no-stop
Do not stop any services.
.It Fl o , -override
Override the next runlevel to change into when leaving single user or boot
runlevels
.It Fl s , -service
Run the service specified with the rest of the arguments.
.It Fl S , -sys
Output the RC system type, if any.
.It Fl h , -help
Display usage information and exit.
.It Fl C , -nocolor
Disable color output.
.It Fl V , -version
Display software version.
.It Fl v , -verbose
Run verbosely.
.It Fl q , -quiet
Run quietly (repeat to suppress errors).
.El
.Sh SEE ALSO
.Xr openrc-run 8 ,
.Xr rc-status 8 ,
.Xr rc-update 8 ,
.Xr init 8 ,

View File

@@ -17,6 +17,7 @@
.Sh SYNOPSIS
.Nm
.Op Fl aclsuC
.Op Fl f Ar ini
.Op Ar runlevel
.Sh DESCRIPTION
.Nm
@@ -37,6 +38,9 @@ The options are as follows:
Show all runlevels and their services.
.It Fl c , -crashed
List all services that have crashed.
.It Fl f , -format
Select a format for the output. Currently, the only one that can be
specified is ini, which outputs in *.ini format.
.It Fl l , -list
List all defined runlevels.
.It Fl m , -manual

View File

@@ -120,7 +120,7 @@ Saves the pid of the daemon in the file specified by the
.Fl p , -pidfile
option. Only useful when used with daemons that run in the foreground and
forced into the background with the
.Fl -b , -background
.Fl b , -background
option.
.It Fl I , -ionice Ar class Ns Op : Ns Ar data
Modifies the IO scheduling priority of the daemon.

View File

@@ -9,7 +9,7 @@
.\" except according to the terms contained in the LICENSE file.
.\"
.Dd April 27, 2016
.Dt supervise-DAEMON 8 SMM
.Dt SUPERVISE-DAEMON 8 SMM
.Os OpenRC
.Sh NAME
.Nm supervise-daemon
@@ -37,6 +37,8 @@ servicename
.Ar count
.Fl N , -nicelevel
.Ar level
.Fl p , -pidfile
.Ar supervisorpidfile
.Fl P , -respawn-period
.Ar seconds
.Fl R , -retry
@@ -88,16 +90,17 @@ owned by the user. You can optionally append a
name here also.
.It Fl v , -verbose
Print the action(s) that are taken just before doing them.
.El
.Pp
The options are as follows:
.Bl -tag -width indent
.Fl a , -healthcheck-timer Ar seconds
.It Fl a , -healthcheck-timer Ar seconds
Run the healthcheck() command, possibly followed by the unhealthy()
command every time this number of seconds passes.
.Fl A , -healthcheck-delay Ar seconds
.It Fl A , -healthcheck-delay Ar seconds
Wait this long before the first health check.
.It Fl D , -respawn-delay Ar seconds
wait this number of seconds before restarting a daemon after it crashes.
Wait this number of seconds before restarting a daemon after it crashes.
The default is 0.
.It Fl d , -chdir Ar path
chdir to this directory before starting the daemon.
@@ -121,6 +124,9 @@ If respawn-period is also set, more than respawn-max crashes must occur
during respawn-period seconds to cause
.Nm
to give up and exit.
.It Fl p , -pidfile Ar supervisorpidfile
Sets a path for the supervisor's pid file. Note that this is not the pid
file of the process that is being supervised.
.It Fl N , -nicelevel Ar level
Modifies the scheduling priority of the daemon.
.It Fl P , -respawn-period Ar seconds
@@ -150,6 +156,10 @@ The same thing as
but with the standard error output.
.El
.Sh ENVIRONMENT
.Va SSD_IONICELEVEL
can also set the IO scheduling priority of the daemon, but the command line
option takes precedence.
.Pp
.Va SSD_NICELEVEL
can also set the scheduling priority of the daemon, but the command line
option takes precedence.

212
meson.build Normal file
View File

@@ -0,0 +1,212 @@
project('OpenRC', 'c',
version : '0.44.8',
license: 'BSD-2',
default_options : [
'c_std=c99',
'prefix=/usr',
'warning_level=3',
],
meson_version : '>=0.49.0')
cc = meson.get_compiler('c')
audit_dep = dependency('audit', required : get_option('audit'))
if audit_dep.found()
cc_audit_flags = '-DHAVE_AUDIT'
else
cc_audit_flags = []
endif
if get_option('branding') != ''
cc_branding_flags = '-DBRANDING=' + get_option('branding')
else
cc_branding_flags = []
endif
libname = get_option('libdir').split('/')[-1]
option_local_prefix = get_option('local_prefix')
if option_local_prefix == ''
local_prefix = get_option('prefix') / 'usr' / 'local'
else
local_prefix = option_local_prefix
endif
option_os = get_option('os')
if option_os == ''
uname = find_program('uname')
r = run_command(uname, '-s')
os = r.stdout().strip()
os = '-'.join(os.split('/'))
else
os = option_os
endif
pam_dep = dependency('pam', required: false)
if not pam_dep.found()
pam_dep = cc.find_library('pam', required: false)
endif
if pam_dep.found() and get_option('pam')
cc_pam_flags = '-DHAVE_PAM'
else
cc_pam_flags = []
endif
if not pam_dep.found() and get_option('pam')
error('Pam was requested but could not be located')
endif
option_pkg_prefix = get_option('pkg_prefix')
if option_pkg_prefix == ''
if os == 'Dragonfly' or os == 'FreeBSD'
pkg_prefix = '/usr/local'
elif os == 'GNU' or os == 'GNU-kFreeBSD' or os == 'Linux'
pkg_prefix = '/usr'
elif os == 'NetBSD'
pkg_prefix = '/usr/pkg'
endif
else
pkg_prefix = option_pkg_prefix
endif
if get_option('split-usr') == 'auto'
split_usr = run_command('test', '-L', '/bin').returncode() != 0
else
split_usr = get_option('split-usr') == 'true'
endif
rootprefix = get_option('rootprefix')
rootprefix_default = '/'
if rootprefix == ''
rootprefix = rootprefix_default
endif
bindir = rootprefix / get_option('bindir')
libdir = rootprefix / get_option('libdir')
libexecdir = get_option('libexecdir')
if os == 'Linux' and libexecdir == 'libexec'
libexecdir = 'lib'
endif
libexecdir = rootprefix / libexecdir
rc_libexecdir = libexecdir / 'rc'
rc_bindir = rc_libexecdir / 'bin'
rc_sbindir = rc_libexecdir / 'sbin'
sbindir = rootprefix / get_option('sbindir')
crypt_dep = []
selinux_dep = dependency('libselinux', required : get_option('selinux'))
pam_misc_dep = []
if selinux_dep.found()
cc_selinux_flags = '-DHAVE_SELINUX'
if pam_dep.found() and get_option('pam')
pam_misc_dep = dependency('pam_misc', required: false)
if not pam_misc_dep.found()
pam_misc_dep = cc.find_library('pam_misc', required: false)
endif
if not pam_misc_dep.found() and get_option('pam')
error('Pam was requested but could not be located')
endif
else
crypt_dep = dependency('libcrypt', required : false)
if not crypt_dep.found()
crypt_dep = cc.find_library('crypt', required : true)
endif
endif
else
cc_selinux_flags = []
endif
termcap = get_option('termcap')
if termcap != ''
termcap_dep = dependency(termcap)
termcap_flags = '-DHAVE_TERMCAP'
else
termcap_dep = []
termcap_flags = []
endif
if get_option('buildtype').startswith('debug')
cc_debug_flags = ['-DRC_DEBUG']
else
cc_debug_flags = []
endif
if os == 'Linux' or os == 'GNU-kFreeBSD'
cc_os_flags = ['-D_DEFAULT_SOURCE']
elif os == 'FreeBSD'
cc_os_flags = ['-D_BSD_SOURCE']
elif os == 'GNU'
cc_os_flags = ['-D_DEFAULT_SOURCE', '-DMAXPATHLEN=4096', '-DPATH_MAX=4096']
endif
# Try and use some good cc flags if we're building from git. We don't use
# -pedantic as it will warn about our perfectly valid use of %m in our logger.
# We should be using -Wredundant-decls, but our library hidden proto stuff gives
# loads of warnings. I don't fully understand it (the hidden proto, not the
# warning) so we just silence the warning.
cc_warning_flags_test = [
'-Wcast-align',
'-Wcast-qual',
'-Wdeclaration-after-statement',
'-Wformat=2',
'-Winline',
'-Wmissing-declarations',
'-Wmissing-format-attribute',
'-Wmissing-noreturn',
'-Wmissing-prototypes',
'-Wnested-externs',
'-Wpointer-arith',
'-Wsequence-point',
'-Wshadow',
'-Wwrite-strings',
'-Werror=implicit-function-declaration',
]
cc_warning_flags = cc.get_supported_arguments(cc_warning_flags_test)
cc_flags = [cc_debug_flags, cc_os_flags, cc_warning_flags]
add_project_arguments(cc_flags, language : 'c')
incdir = include_directories('src/includes')
einfo_incdir = include_directories('src/libeinfo')
rc_incdir = include_directories('src/librc')
init_d_conf_data = configuration_data()
init_d_conf_data.set('SBINDIR', sbindir)
init_d_conf_data.set('PKG_PREFIX', pkg_prefix)
init_d_conf_data.set('SYSCONFDIR', get_option('sysconfdir'))
dl_dep = cc.find_library('dl', required: false)
util_dep = cc.find_library('util', required: false)
if get_option('bash-completions')
subdir('bash-completion')
endif
subdir('conf.d')
subdir('etc')
subdir('init.d')
subdir('local.d')
subdir('man')
if get_option('pam')
subdir('pam')
endif
if get_option('pkgconfig')
subdir('pkgconfig')
endif
subdir('scripts')
subdir('sh')
subdir('src')
subdir('support')
subdir('sysctl.d')
if get_option('zsh-completions')
subdir('zsh-completion')
endif
meson.add_install_script('tools/meson_runlevels.sh',
os,
get_option('newnet') ? 'yes' : 'no',
rc_libexecdir,
get_option('sysconfdir'),
get_option('sysvinit') ? 'yes' : 'no')
meson.add_install_script('tools/meson_final.sh',
rc_libexecdir,
os)

37
meson_options.txt Normal file
View File

@@ -0,0 +1,37 @@
option('audit', type : 'feature', value : 'auto',
description : 'enable libaudit support')
option('bash-completions', type : 'boolean',
description : 'install bash completions')
option('branding', type : 'string',
description : 'Add branding to OpenRC')
option('local_prefix', type : 'string', value : '/usr/local',
description : 'default location of user maintained packages')
option('newnet', type : 'boolean',
description : 'build and install our networking scripts')
option('os', type : 'combo',
choices :
[ '', 'DragonFly', 'FreeBSD', 'GNU', 'GNU-kFreeBSD', 'Linux', 'NetBSD' ],
description : 'Operating System (autodetected if not specified)')
option('pam', type : 'boolean',
description : 'enable PAM support')
option('pkg_prefix', type : 'string',
description : 'default location where packages are installed')
option('pkgconfig', type : 'boolean',
description : 'build PKGConfig files')
option('rootprefix', type : 'string',
description : 'override the root prefix')
option('selinux', type : 'feature', value : 'auto',
description : 'enable SELinux support')
option('shell', type : 'string', value : '/bin/sh',
description : 'Default posix compatible shell')
option('split-usr', type : 'combo',
choices : ['auto', 'true', 'false'],
description : '''/bin, /sbin aren't symlinks into /usr''')
option('sysvinit', type : 'boolean', value : false,
description : 'enable SysVinit compatibility (linux only)')
option('termcap', type : 'combo',
choices :
[ '', 'ncurses', 'termcap' ],
description : 'the termcap library to use')
option('zsh-completions', type : 'boolean',
description : 'install zsh completions')

View File

@@ -52,13 +52,12 @@ ${SHLIB_NAME}: ${SOBJS}
${SOBJS} ${LDADD}
install: all
ifeq (${MKSTATICLIBS},yes)
${INSTALL} -d ${DESTDIR}${LIBDIR}
ifeq (${MKSTATICLIBS},yes)
${INSTALL} -m ${LIBMODE} lib${LIB}.a ${DESTDIR}${LIBDIR}
endif
${INSTALL} -d ${DESTDIR}${SHLIBDIR}
${INSTALL} -m ${LIBMODE} ${SHLIB_NAME} ${DESTDIR}${SHLIBDIR}
ln -fs ${SHLIB_NAME} ${DESTDIR}${SHLIBDIR}/${SHLIB_LINK}
${INSTALL} -m ${LIBMODE} ${SHLIB_NAME} ${DESTDIR}${LIBDIR}
ln -fs ${SHLIB_NAME} ${DESTDIR}${LIBDIR}/${SHLIB_LINK}
${INSTALL} -d ${DESTDIR}${INCDIR}
for x in ${INCS}; do ${INSTALL} -m ${INCMODE} $$x ${DESTDIR}${INCDIR}; done

View File

@@ -11,7 +11,7 @@
SFX= .Linux.in
PKG_PREFIX?= /usr
CPPFLAGS+= -D_DEFAULT_SOURCE -D_POSIX_C_SOURCE=200809L
CPPFLAGS+= -D_DEFAULT_SOURCE -D_POSIX_C_SOURCE=200809L -D_BSD_SOURCE -D_XOPEN_SOURCE
LIBDL= -Wl,-Bdynamic -ldl
ifeq (${MKSELINUX},yes)

View File

@@ -19,7 +19,7 @@ _PKG_SED:= $(shell ${_PKG_SED_SH})
_LCL_SED_SH= if test "${PREFIX}" = "${LOCAL_PREFIX}"; then echo "-e 's:@LOCAL_PREFIX@::g'"; else echo "-e 's:@LOCAL_PREFIX@:${LOCAL_PREFIX}:g'"; fi
_LCL_SED:= $(shell ${_LCL_SED_SH})
SED_REPLACE= -e 's:@SHELL@:${SH}:g' -e 's:@LIB@:${LIBNAME}:g' -e 's:@SYSCONFDIR@:${SYSCONFDIR}:g' -e 's:@LIBEXECDIR@:${LIBEXECDIR}:g' -e 's:@PREFIX@:${PREFIX}:g' -e 's:@BINDIR@:${BINDIR}:g' -e 's:@SBINDIR@:${SBINDIR}:g' ${_PKG_SED} ${_LCL_SED}
SED_REPLACE= -e 's:@SHELL@:${SH}:' -e 's:@LIB@:${LIBNAME}:g' -e 's:@SYSCONFDIR@:${SYSCONFDIR}:g' -e 's:@LIBEXECDIR@:${LIBEXECDIR}:g' -e 's:@PREFIX@:${PREFIX}:g' -e 's:@BINDIR@:${BINDIR}:g' -e 's:@SBINDIR@:${SBINDIR}:g' ${_PKG_SED} ${_LCL_SED}
# Tweak our shell scripts
%.sh: %.sh.in
@@ -53,7 +53,6 @@ realinstall: ${BIN} ${CONF} ${INC}
install: all realinstall ${INSTALLAFTER}
check test::
@if test -e runtests.sh ; then ./runtests.sh || exit $$? ; fi
# A lot of scripts don't have anything to clean
# Also, some rm implentation require a file argument regardless of error

View File

@@ -52,9 +52,9 @@ _LIBNAME:= $(shell ${_LIBNAME_SH})
LIBNAME?= ${_LIBNAME}
LIBDIR?= ${UPREFIX}/${LIBNAME}
LIBMODE?= 0644
SHLIBDIR?= ${PREFIX}/${LIBNAME}
LIBEXECDIR?= ${PREFIX}/libexec/rc
PKGCONFIGDIR?= ${UPREFIX}/${LIBNAME}/pkgconfig
MANPREFIX?= ${UPREFIX}/share
MANDIR?= ${MANPREFIX}/man

9
pam/meson.build Normal file
View File

@@ -0,0 +1,9 @@
pam_dir = get_option('sysconfdir') / 'pam.d'
pam_files = [
'start-stop-daemon',
'supervise-daemon',
]
install_data(pam_files,
install_dir : pam_dir)

6
pam/start-stop-daemon Normal file
View File

@@ -0,0 +1,6 @@
#%PAM-1.0
auth required pam_permit.so
account required pam_permit.so
password required pam_deny.so
session optional pam_limits.so

6
pam/supervise-daemon Normal file
View File

@@ -0,0 +1,6 @@
#%PAM-1.0
auth required pam_permit.so
account required pam_permit.so
password required pam_deny.so
session optional pam_limits.so

View File

@@ -1,4 +1,4 @@
DIR= ${LIBDIR}/pkgconfig
DIR= ${PKGCONFIGDIR}
SRCS= einfo.pc.in openrc.pc.in
INC= einfo.pc openrc.pc

22
pkgconfig/meson.build Normal file
View File

@@ -0,0 +1,22 @@
pkgconfig_dir = get_option('libdir') / 'pkgconfig'
pkgconfig_conf_data = configuration_data()
if rootprefix != '/'
pkgconfig_conf_data.set('PREFIX', rootprefix)
else
pkgconfig_conf_data.set('PREFIX', '')
endif
pkgconfig_conf_data.set('LIB', get_option('libdir'))
pkgconfig_conf_data.set('VERSION', meson.project_version())
pkgconfig_files = [
'einfo.pc.in',
'openrc.pc.in',
]
foreach file : pkgconfig_files
configure_file(input : file,
output : '@BASENAME@',
configuration : pkgconfig_conf_data,
install_dir : pkgconfig_dir)
endforeach

View File

@@ -90,6 +90,12 @@ install:
fi; \
ln -snf ${INITDIR}/"$$x" ${SHUTDOWNDIR}/"$$x" || exit $$?; done \
fi
if test "${MKSYSVINIT}" = yes && test "${OS}" = Linux; then \
for x in tty1 tty2 tty3 tty4 tty5 tty6; do \
ln -snf ${INITDIR}/agetty ${DESTDIR}/${INITDIR}/"agetty.$$x" || exit $$?; \
ln -snf ${INITDIR}/agetty.$$x ${DEFAULTDIR}/"agetty.$$x" || exit $$?; \
done; \
fi
check test::

View File

@@ -1,4 +1,4 @@
#!@SHELL@
#!/bin/sh
option_arg=
poweroff_arg=
@@ -21,4 +21,9 @@ if [ -z "${poweroff_arg}" ]; then
poweroff_arg=--poweroff
fi
exec @SBINDIR@/openrc-shutdown ${option_arg} ${poweroff_arg} "$@"
script_args="$@"
if [ -z "${script_args}" ]; then
script_args=now
fi
exec @SBINDIR@/openrc-shutdown ${option_arg} ${poweroff_arg} "${script_args}"

45
scripts/meson.build Normal file
View File

@@ -0,0 +1,45 @@
script_conf_data = configuration_data()
script_conf_data.set('SBINDIR', sbindir)
script_dir = rc_libexecdir / 'bin'
scripts_internal = [
'on_ac_power',
]
scripts_Linux = [
'rc-sstat.in',
]
scripts_sysvinit = [
'halt.in',
'poweroff.in',
'shutdown.in',
'reboot.in',
]
install_data(scripts_internal,
install_dir : script_dir,
install_mode: 'rwxr-xr-x')
if os == 'Linux'
foreach file : scripts_Linux
configure_file(input : file,
output : '@BASENAME@',
configuration : script_conf_data,
install_dir: script_dir,
install_mode: 'rwxr-xr-x')
endforeach
if get_option('sysvinit')
foreach file : scripts_sysvinit
configure_file(input : file,
output : '@BASENAME@',
configuration : script_conf_data,
install_dir: script_dir,
install_mode: 'rwxr-xr-x')
endforeach
endif
endif
meson.add_install_script('meson_script_links.sh', rc_libexecdir,
sbindir)

19
scripts/meson_script_links.sh Executable file
View File

@@ -0,0 +1,19 @@
#!/bin/sh
set -e
set -u
rc_libexecdir="$1"
sbindir="$2"
binaries=" halt poweroff rc-sstat reboot shutdown"
for f in $binaries; do
if [ -x "${DESTDIR}${rc_libexecdir}/bin/${f}" ]; then
ln -snf "${rc_libexecdir}/bin/${f}" \
"${DESTDIR}${sbindir}/${f}"
fi
done
# sysvinit is active when halt exits
if [ -x "${DESTDIR}${rc_libexecdir}/bin/halt" ]; then
ln -snf "${sbindir}/openrc-init" \
"${DESTDIR}${sbindir}/init"
fi

View File

@@ -18,9 +18,10 @@ if [ -f /proc/acpi/ac_adapter/*/state ]; then
"state:"*"off-line") exit 128;;
esac
done
elif [ -f /sys/class/power_supply/*/online ]; then
cat /sys/class/power_supply/*/online | while read line; do
[ "${line}" = 0 ] && exit 128
elif [ -d /sys/class/power_supply ]; then
for dir in /sys/class/power_supply/*/; do
[ "$(cat "${dir}/type")" != "Mains" ] && continue
[ "$(cat "${dir}/online")" = 0 ] && exit 128
done
elif [ -f /proc/pmu/info ]; then
cat /proc/pmu/info | while read line; do

View File

@@ -1,4 +1,4 @@
#!@SHELL@
#!/bin/sh
option_arg=
poweroff_arg=
@@ -20,4 +20,9 @@ if [ -z "${poweroff_arg}" ]; then
poweroff_arg=--poweroff
fi
exec @SBINDIR@/openrc-shutdown ${option_arg} ${poweroff_arg} "$@"
script_args="$@"
if [ -z "${script_args}" ]; then
script_args=now
fi
exec @SBINDIR@/openrc-shutdown ${option_arg} ${poweroff_arg} "${script_args}"

View File

@@ -1,4 +1,4 @@
#!@SHELL@
#!/bin/sh
# Copyright (c) 2015 The OpenRC Authors.
# See the Authors file at the top-level directory of this distribution and
# https://github.com/OpenRC/openrc/blob/master/AUTHORS

View File

@@ -1,4 +1,4 @@
#!@SHELL@
#!/bin/sh
option_arg=
poweroff_arg=
@@ -22,4 +22,9 @@ if [ -z "${poweroff_arg}" ]; then
poweroff_arg=--reboot
fi
exec @SBINDIR@/openrc-shutdown ${option_arg} ${poweroff_arg} "$@"
script_args="$@"
if [ -z "${script_args}" ]; then
script_args=now
fi
exec @SBINDIR@/openrc-shutdown ${option_arg} ${poweroff_arg} "${script_args}"

View File

@@ -1,14 +1,31 @@
#!@SHELL@
#!/bin/sh
shutdown_arg=
do_halt=false
while getopts :akrhPHfFnct: opt; do
case "$opt" in
a) ;;
k) ;;
r) shutdown_arg=--reboot ;;
h) shutdown_arg=--halt ;;
P) shutdown_arg=--poweroff ;;
H) shutdown_arg=--halt ;;
r)
shutdown_arg=--reboot
;;
h)
do_halt=true
shutdown_arg=--poweroff
;;
P)
if ! ${do_halt}; then
printf "%s\n" "The -P flag requires the -h flag" >&2
exit 1
fi
shutdown_arg=--poweroff
;;
H)
if ! ${do_halt}; then
printf "%s\n" "The -H flag requires the -h flag" >&2
exit 1
fi
shutdown_arg=--halt
;;
f) ;;
F) ;;
n) ;;
@@ -25,5 +42,5 @@ if [ -z "${shutdown_arg}" ]; then
shutdown_arg=--single
fi
echo @SBINDIR@/openrc-shutdown ${shutdown_arg} "$@"
printf "%s %s\n" "@SBINDIR@/openrc-shutdown ${shutdown_arg}" "$@"
exec @SBINDIR@/openrc-shutdown ${shutdown_arg} "$@"

2
sh/.gitignore vendored
View File

@@ -4,6 +4,4 @@ openrc-run.sh
cgroup-release-agent.sh
init.sh
init-early.sh
rc-cgroup.sh
migrate-to-run.sh
binfmt.sh

View File

@@ -2,7 +2,7 @@ DIR= ${LIBEXECDIR}/sh
SRCS= init.sh.in functions.sh.in gendepends.sh.in \
openrc-run.sh.in ${SRCS-${OS}}
INC= rc-mount.sh functions.sh rc-functions.sh runit.sh s6.sh \
start-stop-daemon.sh supervise-daemon.sh
start-stop-daemon.sh supervise-daemon.sh ${INC-${OS}}
BIN= gendepends.sh init.sh openrc-run.sh ${BIN-${OS}}
INSTALLAFTER= _installafter
@@ -13,10 +13,9 @@ include ${MK}/os.mk
SRCS-FreeBSD=
BIN-FreeBSD=
SRCS-Linux= binfmt.sh.in cgroup-release-agent.sh.in init-early.sh.in \
migrate-to-run.sh.in rc-cgroup.sh.in
BIN-Linux= binfmt.sh cgroup-release-agent.sh init-early.sh migrate-to-run.sh \
rc-cgroup.sh
SRCS-Linux= binfmt.sh.in cgroup-release-agent.sh.in init-early.sh.in
BIN-Linux= binfmt.sh cgroup-release-agent.sh init-early.sh
INC-Linux= rc-cgroup.sh
SRCS-NetBSD=
BIN-NetBSD=
@@ -32,4 +31,3 @@ _installafter:
ln -snf ${LIBEXECDIR}/sh/functions.sh ${DESTDIR}/${INITDIR} || exit $$?
check test::
./runtests.sh

View File

@@ -1,4 +1,4 @@
#!@SHELL@
#!/bin/sh
# This is a reimplementation of the systemd binfmt.d code to register
# misc binary formats with the kernel.
#
@@ -29,6 +29,9 @@ apply_file() {
\;*) continue ;;
esac
local reg=${line#*:}
[ -e /proc/sys/fs/binfmt_misc/${reg%%:*} ] && echo -1 > /proc/sys/fs/binfmt_misc/${reg%%:*}
echo "${line}" > /proc/sys/fs/binfmt_misc/register
rc=$?
if [ $rc -ne 0 ]; then

View File

@@ -1,4 +1,4 @@
#!@SHELL@
#!/bin/sh
# This is run by the kernel after the last task is removed from a
# control group in the openrc hierarchy.

View File

@@ -1,4 +1,4 @@
#!@SHELL@
#!/bin/sh
# Copyright (c) 2007-2015 The OpenRC Authors.
# See the Authors file at the top-level directory of this distribution and
# https://github.com/OpenRC/openrc/blob/master/AUTHORS
@@ -20,7 +20,7 @@ service_present()
# succeed if $RC_SYS empty, can't check further, assume script will run
[ -z "$RC_SYS" ] && return 0
# fail if file contains "-$RC_SYS", because then it won't run
egrep -qi "^[[:space:]]*keyword[[:space:]].*-$RC_SYS\>" "$p" && return 1
grep -Eqi "^[[:space:]]*keyword[[:space:]].*-$RC_SYS([[:space:]]|$)" "$p" && return 1
# succeed otherwise
return 0
}

View File

@@ -1,4 +1,4 @@
#!@SHELL@
#!/bin/sh
# Copyright (c) 2007-2015 The OpenRC Authors.
# See the Authors file at the top-level directory of this distribution and
# https://github.com/OpenRC/openrc/blob/master/AUTHORS

View File

@@ -1,4 +1,4 @@
#!@SHELL@
#!/bin/sh
# Copyright (c) 2007-2015 The OpenRC Authors.
# See the Authors file at the top-level directory of this distribution and
# https://github.com/OpenRC/openrc/blob/master/AUTHORS

View File

@@ -1,4 +1,4 @@
#!@SHELL@
#!/bin/sh
# Copyright (c) 2007-2015 The OpenRC Authors.
# See the Authors file at the top-level directory of this distribution and
# https://github.com/OpenRC/openrc/blob/master/AUTHORS

View File

@@ -1,4 +1,4 @@
#!@SHELL@
#!/bin/sh
# Copyright (c) 1999-2007 Gentoo Foundation
# Copyright (c) 2007-2009 Roy Marples <roy@marples.name>
# Released under the 2-clause BSD license.
@@ -71,20 +71,17 @@ if [ "$sys" = VSERVER ]; then
rm -rf /run/*
elif ! mountinfo -q /run; then
ebegin "Mounting /run"
rc=0
run_mount_opts="mode=0755,nosuid,nodev,nr_inodes=800k,size=20%,strictatime"
if ! fstabinfo --mount /run; then
mount -t tmpfs -o mode=0755,nodev,size=10% tmpfs /run
rc=$?
fi
if [ $rc != 0 ]; then
eerror "Unable to mount tmpfs on /run."
eerror "Can't continue."
exit 1
if ! mount -t tmpfs -o ${run_mount_opts} tmpfs /run; then
eerror "Unable to mount tmpfs on /run."
eerror "Can't continue."
exit 1
fi
fi
fi
[ -x /sbin/restorecon ] && /sbin/restorecon -rF /run
checkpath -d $RC_SVCDIR
checkpath -d "$RC_SVCDIR"
checkpath -d -m 0775 -o root:uucp /run/lock
# Try to mount xenfs as early as possible, otherwise rc_sys() will always
@@ -102,4 +99,5 @@ if [ -e "$RC_LIBEXECDIR"/cache/softlevel ]; then
fi
echo sysinit >"$RC_SVCDIR"/softlevel
[ -x /sbin/restorecon ] && /sbin/restorecon -rF /run
exit 0

84
sh/meson.build Normal file
View File

@@ -0,0 +1,84 @@
sh_conf_data = configuration_data()
if rootprefix == '/'
sh_conf_data.set('PREFIX', '')
else
sh_conf_data.set('PREFIX', rootprefix)
endif
sh_conf_data.set('BINDIR', bindir)
sh_conf_data.set('LIBEXECDIR', rc_libexecdir)
sh_conf_data.set('LOCAL_PREFIX', local_prefix)
sh_conf_data.set('PKG_PREFIX', pkg_prefix)
sh_conf_data.set('SBINDIR', sbindir)
sh_conf_data.set('SHELL', get_option('shell'))
sh_conf_data.set('SYSCONFDIR', get_option('sysconfdir'))
sh_dir = rc_libexecdir / 'sh'
sh = [
'rc-functions.sh',
'rc-mount.sh',
'runit.sh',
's6.sh',
'start-stop-daemon.sh',
'supervise-daemon.sh',
]
sh_config = [
'functions.sh.in',
]
scripts_config = [
'gendepends.sh.in',
'openrc-run.sh.in',
]
if os == 'Linux'
sh += [
'rc-cgroup.sh',
]
scripts_config += [
'binfmt.sh.in',
'cgroup-release-agent.sh.in',
]
scripts_config_os = [
['init-early.sh.Linux.in', 'init-early.sh'],
['init.sh.Linux.in', 'init.sh'],
]
elif os == 'GNU'
scripts_config_os = [
['init.sh.GNU.in', 'init.sh'],
]
elif os == 'Gnu-KFreeBSD'
scripts_config_os = [
['init.sh.GNU-kFreeBSD.in', 'init.sh'],
]
else
scripts_config_os = [
['init.sh.BSD.in', 'init.sh'],
]
endif
install_data(sh,
install_dir : sh_dir)
foreach file : sh_config
configure_file(input : file,
output : '@BASENAME@',
configuration : sh_conf_data,
install_dir : sh_dir)
endforeach
foreach file : scripts_config
configure_file(input : file,
output : '@BASENAME@',
configuration : sh_conf_data,
install_dir : sh_dir,
install_mode : 'rwxr-xr-x')
endforeach
foreach file : scripts_config_os
configure_file(input : file.get(0),
output : file.get(1),
configuration : sh_conf_data,
install_dir : sh_dir,
install_mode : 'rwxr-xr-x')
endforeach

View File

@@ -1,36 +0,0 @@
#!@SHELL@
# Copyright (c) 2012-2015 The OpenRC Authors.
# See the Authors file at the top-level directory of this distribution and
# https://github.com/OpenRC/openrc/blob/master/AUTHORS
#
# This file is part of OpenRC. It is subject to the license terms in
# the LICENSE file found in the top-level directory of this
# distribution and at https://github.com/OpenRC/openrc/blob/master/LICENSE
# This file may not be copied, modified, propagated, or distributed
# except according to the terms contained in the LICENSE file.
. "@LIBEXECDIR@/sh/functions.sh"
if [ -e /run/openrc/softlevel ]; then
einfo "The OpenRC dependency data has already been migrated."
exit 0
fi
if [ ! -d /run ]; then
eerror "/run is not a directory."
eerror "moving /run to /run.pre-openrc"
mv /run /run.pre-openrc
mkdir /run
fi
rm -rf /run/openrc
if ! mountinfo -q -f tmpfs /run; then
ln -s "@LIBEXECDIR@"/init.d /run/openrc
else
cp -a "@LIBEXECDIR@/init.d" /run/openrc
rc-update -u
fi
einfo "The OpenRC dependency data was migrated successfully."
exit 0

View File

@@ -254,8 +254,11 @@ fi
for _cmd; do
if [ "$_cmd" != status -a "$_cmd" != describe ]; then
# Apply any ulimit defined
[ -n "${rc_ulimit:-$RC_ULIMIT}" ] && \
ulimit ${rc_ulimit:-$RC_ULIMIT}
if [ -n "${rc_ulimit:-$RC_ULIMIT}" ]; then
if ! ulimit ${rc_ulimit:-$RC_ULIMIT}; then
eerror "${RC_SVCNAME}: unable to apply RC_ULIMIT settings"
fi
fi
# Apply cgroups settings if defined
if [ "$(command -v cgroup_add_service)" = "cgroup_add_service" ]
then

View File

@@ -1,4 +1,3 @@
#!@SHELL@
# Copyright (c) 2012-2015 The OpenRC Authors.
# See the Authors file at the top-level directory of this distribution and
# https://github.com/OpenRC/openrc/blob/master/AUTHORS
@@ -25,18 +24,26 @@ cgroup_find_path()
printf "%s" "${result}"
}
# This extracts all pids in a cgroup and puts them in the cgroup_pids
# variable.
# It is done this way to avoid subshells so we don't have to worry about
# locating the pid of the subshell in the cgroup.
# https://github.com/openrc/openrc/issues/396
cgroup_get_pids()
{
local cgroup_procs p pids
local cgroup_procs p
cgroup_pids=
cgroup_procs="$(cgroup2_find_path)"
[ -n "${cgroup_procs}" ] &&
cgroup_procs="${cgroup_procs}/${RC_SVCNAME}/cgroup.procs" ||
if [ -n "${cgroup_procs}" ]; then
cgroup_procs="${cgroup_procs}/${RC_SVCNAME}/cgroup.procs"
else
cgroup_procs="/sys/fs/cgroup/openrc/${RC_SVCNAME}/tasks"
fi
[ -f "${cgroup_procs}" ] || return 0
while read -r p; do
[ "$p" -eq $$ ] || pids="${pids} ${p}"
[ "$p" -eq $$ ] && continue
cgroup_pids="${cgroup_pids} ${p}"
done < "${cgroup_procs}"
printf "%s" "${pids}"
return 0
}
@@ -182,7 +189,8 @@ cgroup2_set_limits()
{
local cgroup_path
cgroup_path="$(cgroup2_find_path)"
[ -d "${cgroup_path}" ] || return 0
[ -z "${cgroup_path}" ] && return 0
mountinfo -q "${cgroup_path}"|| return 0
rc_cgroup_path="${cgroup_path}/${RC_SVCNAME}"
[ ! -d "${rc_cgroup_path}" ] && mkdir "${rc_cgroup_path}"
[ -f "${rc_cgroup_path}"/cgroup.procs ] &&
@@ -193,7 +201,7 @@ cgroup2_set_limits()
[ -z "${value}" ] && continue
[ ! -f "${rc_cgroup_path}/${key}" ] && continue
veinfo "${RC_SVCNAME}: cgroups: setting ${key} to ${value}"
printf "%s\n" "${value}" > "${rc_cgroup_path}/${key}"
printf "%s" "${value}" > "${rc_cgroup_path}/${key}"
done
return 0
}
@@ -201,26 +209,29 @@ cgroup2_set_limits()
cgroup_cleanup()
{
cgroup_running || return 0
ebegin "starting cgroups cleanup"
local pids loops=0
pids="$(cgroup_get_pids)"
if [ -n "${pids}" ]; then
kill -s CONT ${pids} 2> /dev/null
kill -s "${stopsig:-TERM}" ${pids} 2> /dev/null
ebegin "Starting cgroups cleanup"
local loops=0
cgroup_get_pids
if [ -n "${cgroup_pids}" ]; then
kill -s CONT ${cgroup_pids} 2> /dev/null
kill -s "${stopsig:-TERM}" ${cgroup_pids} 2> /dev/null
yesno "${rc_send_sighup:-no}" &&
kill -s HUP ${pids} 2> /dev/null
kill -s "${stopsig:-TERM}" ${pids} 2> /dev/null
while [ -n "$(cgroup_get_pids)" ] &&
kill -s HUP ${cgroup_pids} 2> /dev/null
kill -s "${stopsig:-TERM}" ${cgroup_pids} 2> /dev/null
cgroup_get_pids
while [ -n "${cgroup_pids}" ] &&
[ "${loops}" -lt "${rc_timeout_stopsec:-90}" ]; do
loops=$((loops+1))
sleep 1
cgroup_get_pids
done
pids="$(cgroup_get_pids)"
[ -n "${pids}" ] && yesno "${rc_send_sigkill:-yes}" &&
kill -s KILL ${pids} 2> /dev/null
if [ -n "${cgroup_pids}" ] && yesno "${rc_send_sigkill:-yes}"; then
kill -s KILL ${cgroup_pids} 2> /dev/null
fi
fi
cgroup2_remove
[ -z "$(cgroup_get_pids)" ]
cgroup_get_pids
[ -z "${cgroup_pids}" ]
eend $? "Unable to stop all processes"
return 0
}

View File

@@ -48,7 +48,7 @@ do_unmount()
retry=4 # Effectively TERM, sleep 1, TERM, sleep 1, KILL, sleep 1
while ! LC_ALL=C $cmd "$mnt" 2>/dev/null; do
if command -v fuser >/dev/null 2>&1; then
pids="$(timeout -k 10 -s KILL "${rc_fuser_timeout:-60}" \
pids="$(timeout -s KILL "${rc_fuser_timeout:-60}" \
fuser $f_opts "$mnt" 2>/dev/null)"
fi
case " $pids " in

View File

@@ -20,8 +20,20 @@ runit_start()
service_link="${RC_SVCDIR}/sv/${service_path##*/}"
ebegin "Starting ${name:-$RC_SVCNAME}"
ln -snf "${service_path}" "${service_link}"
sv start "${service_link}" > /dev/null 2>&1
eend $? "Failed to start ${name:-$RC_SVCNAME}"
local i=0 retval=1
# it can take upto 5 seconds for runsv to start
while [ $i -lt 6 ] ; do
if sv start "${service_link}" > /dev/null 2>&1; then
retval=0
break
fi
sleep 1 && i=$(expr $i + 1)
done
if [ $retval -eq 1 ]; then
# clean up the link else sv will keep on trying
rm "${service_link}"
fi
eend $retval "Failed to start ${name:-$RC_SVCNAME}"
}
runit_stop()

View File

@@ -1,7 +1,7 @@
# Copyright (c) 2007-2008 Roy Marples <roy@marples.name>
# Released under the 2-clause BSD license.
SUBDIR= test libeinfo librc rc
SUBDIR= libeinfo librc rc
MK= ../mk
include ${MK}/subdir.mk

6
src/common/meson.build Normal file
View File

@@ -0,0 +1,6 @@
version_h = vcs_tag(
input : 'version.h.in',
output : 'version.h')
version_f = vcs_tag(
input : 'version.in',
output : 'version')

18
src/common/version.h.in Normal file
View File

@@ -0,0 +1,18 @@
/*
* Copyright (c) 2007-2015 The OpenRC Authors.
* See the Authors file at the top-level directory of this distribution and
* https://github.com/OpenRC/openrc/blob/master/AUTHORS
*
* This file is part of OpenRC. It is subject to the license terms in
* the LICENSE file found in the top-level directory of this
* distribution and at https://github.com/OpenRC/openrc/blob/master/LICENSE
* This file may not be copied, modified, propagated, or distributed
* except according to the terms contained in the LICENSE file.
*/
#ifndef _VERSION_H_
#define _VERSION_H_
#define VERSION "@VCS_TAG@"
#endif

1
src/common/version.in Normal file
View File

@@ -0,0 +1 @@
@VCS_TAG@

View File

@@ -1,26 +0,0 @@
/*
* Written by Mike Frysinger
* Placed in the Public Domain
*/
#ifndef _HIDDEN_VISIBILITY_H_
#define _HIDDEN_VISIBILITY_H_
#if defined(__ELF__) && defined(__GNUC__)
# define __hidden_asmname(name) __hidden_asmname1 (__USER_LABEL_PREFIX__, name)
# define __hidden_asmname1(prefix, name) __hidden_asmname2(prefix, name)
# define __hidden_asmname2(prefix, name) #prefix name
# define __hidden_proto(name, internal) \
extern __typeof (name) name __asm__ (__hidden_asmname (#internal)) \
__attribute__ ((visibility ("hidden")));
# define __hidden_ver(local, internal, name) \
extern __typeof (name) __EI_##name __asm__(__hidden_asmname (#internal)); \
extern __typeof (name) __EI_##name __attribute__((alias (__hidden_asmname1 (,#local))))
# define hidden_proto(name) __hidden_proto(name, __RC_##name)
# define hidden_def(name) __hidden_ver(__RC_##name, name, name);
#else
# define hidden_proto(name)
# define hidden_def(name)
#endif
#endif

View File

@@ -15,7 +15,7 @@
* except according to the terms contained in the LICENSE file.
*/
const char libeinfo_copyright[] = "Copyright (c) 2007-2008 Roy Marples";
static const char libeinfo_copyright[] = "Copyright (c) 2007-2008 Roy Marples";
#include <sys/types.h>
#include <sys/ioctl.h>
@@ -39,34 +39,6 @@ const char libeinfo_copyright[] = "Copyright (c) 2007-2008 Roy Marples";
#include "einfo.h"
#include "helpers.h"
#include "hidden-visibility.h"
hidden_proto(ecolor)
hidden_proto(ebegin)
hidden_proto(ebeginv)
hidden_proto(ebracket)
hidden_proto(eend)
hidden_proto(eendv)
hidden_proto(eerror)
hidden_proto(eerrorn)
hidden_proto(eerrorx)
hidden_proto(eindent)
hidden_proto(eindentv)
hidden_proto(einfo)
hidden_proto(einfon)
hidden_proto(einfov)
hidden_proto(einfovn)
hidden_proto(elog)
hidden_proto(eoutdent)
hidden_proto(eoutdentv)
hidden_proto(eprefix)
hidden_proto(ewarn)
hidden_proto(ewarnn)
hidden_proto(ewarnv)
hidden_proto(ewarnvn)
hidden_proto(ewarnx)
hidden_proto(ewend)
hidden_proto(ewendv)
/* Incase we cannot work out how many columns from ioctl, supply a default */
#define DEFAULT_COLS 80
@@ -510,7 +482,6 @@ eprefix(const char *EINFO_RESTRICT prefix)
{
_eprefix = prefix;
}
hidden_def(eprefix)
static void EINFO_PRINTF(2, 0)
elogv(int level, const char *EINFO_RESTRICT fmt, va_list ap)
@@ -537,7 +508,6 @@ elog(int level, const char *EINFO_RESTRICT fmt, ...)
elogv(level, fmt, ap);
va_end(ap);
}
hidden_def(elog)
static int
_eindent(FILE * EINFO_RESTRICT stream)
@@ -576,7 +546,6 @@ _ecolor(FILE * EINFO_RESTRICT f, ECOLOR color)
return ecolors_str[i];
return "";
}
hidden_def(ecolor)
const char *
ecolor(ECOLOR color)
@@ -643,7 +612,6 @@ einfon(const char *EINFO_RESTRICT fmt, ...)
LASTCMD("einfon");
return retval;
}
hidden_def(einfon)
int
ewarnn(const char *EINFO_RESTRICT fmt, ...)
@@ -659,7 +627,6 @@ ewarnn(const char *EINFO_RESTRICT fmt, ...)
LASTCMD("ewarnn");
return retval;
}
hidden_def(ewarnn)
int
eerrorn(const char *EINFO_RESTRICT fmt, ...)
@@ -675,7 +642,6 @@ eerrorn(const char *EINFO_RESTRICT fmt, ...)
LASTCMD("errorn");
return retval;
}
hidden_def(eerrorn)
int
einfo(const char *EINFO_RESTRICT fmt, ...)
@@ -692,7 +658,6 @@ einfo(const char *EINFO_RESTRICT fmt, ...)
LASTCMD("einfo");
return retval;
}
hidden_def(einfo)
int
ewarn(const char *EINFO_RESTRICT fmt, ...)
@@ -710,7 +675,6 @@ ewarn(const char *EINFO_RESTRICT fmt, ...)
LASTCMD("ewarn");
return retval;
}
hidden_def(ewarn)
void
ewarnx(const char *EINFO_RESTRICT fmt, ...)
@@ -727,7 +691,6 @@ ewarnx(const char *EINFO_RESTRICT fmt, ...)
}
exit(EXIT_FAILURE);
}
hidden_def(ewarnx)
int
eerror(const char *EINFO_RESTRICT fmt, ...)
@@ -745,7 +708,6 @@ eerror(const char *EINFO_RESTRICT fmt, ...)
LASTCMD("eerror");
return retval;
}
hidden_def(eerror)
void
eerrorx(const char *EINFO_RESTRICT fmt, ...)
@@ -761,7 +723,6 @@ eerrorx(const char *EINFO_RESTRICT fmt, ...)
}
exit(EXIT_FAILURE);
}
hidden_def(eerrorx)
int
ebegin(const char *EINFO_RESTRICT fmt, ...)
@@ -780,7 +741,6 @@ ebegin(const char *EINFO_RESTRICT fmt, ...)
LASTCMD("ebegin");
return retval;
}
hidden_def(ebegin)
static void
_eend(FILE * EINFO_RESTRICT fp, int col, ECOLOR color, const char *msg)
@@ -854,7 +814,6 @@ eend(int retval, const char *EINFO_RESTRICT fmt, ...)
LASTCMD("eend");
return retval;
}
hidden_def(eend)
int
ewend(int retval, const char *EINFO_RESTRICT fmt, ...)
@@ -869,14 +828,12 @@ ewend(int retval, const char *EINFO_RESTRICT fmt, ...)
LASTCMD("ewend");
return retval;
}
hidden_def(ewend)
void
ebracket(int col, ECOLOR color, const char *msg)
{
_eend(stdout, col, color, msg);
}
hidden_def(ebracket)
void
eindent(void)
@@ -898,7 +855,6 @@ eindent(void)
setenv("EINFO_INDENT", num, 1);
free(num);
}
hidden_def(eindent)
void eoutdent(void)
{
@@ -924,7 +880,6 @@ void eoutdent(void)
}
errno = serrno;
}
hidden_def(eoutdent)
int
einfovn(const char *EINFO_RESTRICT fmt, ...)
@@ -940,7 +895,6 @@ einfovn(const char *EINFO_RESTRICT fmt, ...)
LASTCMD("einfovn");
return retval;
}
hidden_def(einfovn)
int
ewarnvn(const char *EINFO_RESTRICT fmt, ...)
@@ -956,7 +910,6 @@ ewarnvn(const char *EINFO_RESTRICT fmt, ...)
LASTCMD("ewarnvn");
return retval;
}
hidden_def(ewarnvn)
int
einfov(const char *EINFO_RESTRICT fmt, ...)
@@ -973,7 +926,6 @@ einfov(const char *EINFO_RESTRICT fmt, ...)
LASTCMD("einfov");
return retval;
}
hidden_def(einfov)
int
ewarnv(const char *EINFO_RESTRICT fmt, ...)
@@ -990,7 +942,6 @@ ewarnv(const char *EINFO_RESTRICT fmt, ...)
LASTCMD("ewarnv");
return retval;
}
hidden_def(ewarnv)
int
ebeginv(const char *EINFO_RESTRICT fmt, ...)
@@ -1010,7 +961,6 @@ ebeginv(const char *EINFO_RESTRICT fmt, ...)
LASTCMD("ebeginv");
return retval;
}
hidden_def(ebeginv)
int
eendv(int retval, const char *EINFO_RESTRICT fmt, ...)
@@ -1025,7 +975,6 @@ eendv(int retval, const char *EINFO_RESTRICT fmt, ...)
LASTCMD("eendv");
return retval;
}
hidden_def(eendv)
int
ewendv(int retval, const char *EINFO_RESTRICT fmt, ...)
@@ -1040,7 +989,6 @@ ewendv(int retval, const char *EINFO_RESTRICT fmt, ...)
LASTCMD("ewendv");
return retval;
}
hidden_def(ewendv)
void
eindentv(void)
@@ -1048,7 +996,6 @@ eindentv(void)
if (is_verbose())
eindent();
}
hidden_def(eindentv)
void
eoutdentv(void)
@@ -1056,4 +1003,3 @@ eoutdentv(void)
if (is_verbose())
eoutdent();
}
hidden_def(eoutdentv)

12
src/libeinfo/meson.build Normal file
View File

@@ -0,0 +1,12 @@
libeinfo_version = '1'
libeinfo = library('einfo', ['libeinfo.c'],
c_args : termcap_flags,
include_directories : incdir,
dependencies : termcap_dep,
link_depends : 'einfo.map',
version : libeinfo_version,
install : true,
install_dir : libdir)
install_headers('einfo.h')

View File

@@ -15,6 +15,8 @@
* except according to the terms contained in the LICENSE file.
*/
#include <signal.h>
#include "queue.h"
#include "librc.h"
@@ -59,7 +61,7 @@ pid_is_argv(pid_t pid, const char *const *argv)
free(cmdline);
return false;
}
bytes = read(fd, buffer, sizeof(buffer));
bytes = read(fd, buffer, sizeof(buffer) - 1);
close(fd);
free(cmdline);
if (bytes == -1)
@@ -141,7 +143,7 @@ rc_find_pids(const char *exec, const char *const *argv, uid_t uid, pid_t pid)
memset(my_ns, 0, sizeof(my_ns));
memset(proc_ns, 0, sizeof(proc_ns));
if (exists("/proc/self/ns/pid")) {
rc = readlink("/proc/self/ns/pid", my_ns, sizeof(my_ns));
rc = readlink("/proc/self/ns/pid", my_ns, sizeof(my_ns)-1);
if (rc <= 0)
my_ns[0] = '\0';
}
@@ -155,12 +157,12 @@ rc_find_pids(const char *exec, const char *const *argv, uid_t uid, pid_t pid)
continue;
xasprintf(&buffer, "/proc/%d/ns/pid", p);
if (exists(buffer)) {
rc = readlink(buffer, proc_ns, sizeof(proc_ns));
rc = readlink(buffer, proc_ns, sizeof(proc_ns)-1);
if (rc <= 0)
proc_ns[0] = '\0';
}
free(buffer);
if (strlen(my_ns) && strlen (proc_ns) && strcmp(my_ns, proc_ns))
if (pid == 0 && strlen(my_ns) && strlen (proc_ns) && strcmp(my_ns, proc_ns))
continue;
if (uid) {
xasprintf(&buffer, "/proc/%d", p);
@@ -208,7 +210,6 @@ rc_find_pids(const char *exec, const char *const *argv, uid_t uid, pid_t pid)
closedir(procdir);
return pids;
}
librc_hidden_def(rc_find_pids)
#elif BSD
@@ -313,7 +314,6 @@ rc_find_pids(const char *exec, const char *const *argv, uid_t uid, pid_t pid)
return pids;
}
librc_hidden_def(rc_find_pids)
#else
# error "Platform not supported!"
@@ -455,7 +455,6 @@ rc_service_daemon_set(const char *service, const char *exec,
free(dirpath);
return retval;
}
librc_hidden_def(rc_service_daemon_set)
bool
rc_service_started_daemon(const char *service,
@@ -495,7 +494,6 @@ rc_service_started_daemon(const char *service,
free(dirpath);
return retval;
}
librc_hidden_def(rc_service_started_daemon)
bool
rc_service_daemons_crashed(const char *service)
@@ -615,7 +613,7 @@ rc_service_daemons_crashed(const char *service)
i = 0;
TAILQ_FOREACH(s, list, entries)
argv[i++] = s->value;
argv[i] = '\0';
argv[i] = NULL;
}
}
@@ -653,4 +651,3 @@ rc_service_daemons_crashed(const char *service)
return retval;
}
librc_hidden_def(rc_service_daemons_crashed)

View File

@@ -78,16 +78,16 @@ rc_deptree_free(RC_DEPTREE *deptree)
}
free(deptree);
}
librc_hidden_def(rc_deptree_free)
static RC_DEPINFO *
get_depinfo(const RC_DEPTREE *deptree, const char *service)
{
RC_DEPINFO *di;
TAILQ_FOREACH(di, deptree, entries)
if (strcmp(di->service, service) == 0)
return di;
if (deptree) {
TAILQ_FOREACH(di, deptree, entries)
if (strcmp(di->service, service) == 0)
return di;
}
return NULL;
}
@@ -96,9 +96,11 @@ get_deptype(const RC_DEPINFO *depinfo, const char *type)
{
RC_DEPTYPE *dt;
TAILQ_FOREACH(dt, &depinfo->depends, entries)
if (strcmp(dt->type, type) == 0)
return dt;
if (depinfo) {
TAILQ_FOREACH(dt, &depinfo->depends, entries)
if (strcmp(dt->type, type) == 0)
return dt;
}
return NULL;
}
@@ -106,7 +108,6 @@ RC_DEPTREE *
rc_deptree_load(void) {
return rc_deptree_load_file(RC_DEPTREE_CACHE);
}
librc_hidden_def(rc_deptree_load)
RC_DEPTREE *
rc_deptree_load_file(const char *deptree_file)
@@ -170,7 +171,6 @@ rc_deptree_load_file(const char *deptree_file)
return deptree;
}
librc_hidden_def(rc_deptree_load_file)
static bool
valid_service(const char *runlevel, const char *service, const char *type)
@@ -456,7 +456,6 @@ rc_deptree_depend(const RC_DEPTREE *deptree,
rc_stringlist_add(svcs, svc->value);
return svcs;
}
librc_hidden_def(rc_deptree_depend)
RC_STRINGLIST *
rc_deptree_depends(const RC_DEPTREE *deptree,
@@ -484,7 +483,6 @@ rc_deptree_depends(const RC_DEPTREE *deptree,
rc_stringlist_free(visited);
return sorted;
}
librc_hidden_def(rc_deptree_depends)
RC_STRINGLIST *
rc_deptree_order(const RC_DEPTREE *deptree, const char *runlevel, int options)
@@ -540,7 +538,6 @@ rc_deptree_order(const RC_DEPTREE *deptree, const char *runlevel, int options)
rc_stringlist_free(types);
return services;
}
librc_hidden_def(rc_deptree_order)
/* Given a time, recurse the target path to find out if there are
@@ -616,11 +613,11 @@ mtime_check(const char *source, const char *target, bool newer,
return false;
mtime = buf.st_mtime;
retval = deep_mtime_check(target,newer,&mtime,file);
if (rel) {
*rel = mtime;
}
return retval;
retval = deep_mtime_check(target,newer,&mtime,file);
if (rel) {
*rel = mtime;
}
return retval;
}
bool
@@ -630,7 +627,6 @@ rc_newer_than(const char *source, const char *target,
return mtime_check(source, target, true, newest, file);
}
librc_hidden_def(rc_newer_than)
bool
rc_older_than(const char *source, const char *target,
@@ -638,7 +634,6 @@ rc_older_than(const char *source, const char *target,
{
return mtime_check(source, target, false, oldest, file);
}
librc_hidden_def(rc_older_than)
typedef struct deppair
{
@@ -734,7 +729,6 @@ rc_deptree_update_needed(time_t *newest, char *file)
return newer;
}
librc_hidden_def(rc_deptree_update_needed)
/* This is a 7 phase operation
Phase 1 is a shell script which loads each init script and config in turn
@@ -1081,4 +1075,3 @@ rc_deptree_update(void)
rc_deptree_free(deptree);
return retval;
}
librc_hidden_def(rc_deptree_update)

View File

@@ -16,6 +16,7 @@
*/
#include <fnmatch.h>
#include <stdio.h>
#include "queue.h"
#include "librc.h"
@@ -43,7 +44,6 @@ rc_yesno(const char *value)
return false;
}
librc_hidden_def(rc_yesno)
/**
@@ -91,7 +91,6 @@ rc_getfile(const char *file, char **buffer, size_t *len)
fclose(fp);
return ret;
}
librc_hidden_def(rc_getfile)
ssize_t
rc_getline(char **line, size_t *len, FILE *fp)
@@ -116,7 +115,6 @@ rc_getline(char **line, size_t *len, FILE *fp)
}
return last;
}
librc_hidden_def(rc_getline)
char *
rc_proc_getent(const char *ent _unused)
@@ -163,7 +161,6 @@ rc_proc_getent(const char *ent _unused)
return NULL;
#endif
}
librc_hidden_def(rc_proc_getent)
RC_STRINGLIST *
rc_config_list(const char *file)
@@ -202,7 +199,6 @@ rc_config_list(const char *file)
return list;
}
librc_hidden_def(rc_config_list)
static void rc_config_set_value(RC_STRINGLIST *config, char *value)
{
@@ -373,7 +369,6 @@ rc_config_load(const char *file)
return config;
}
librc_hidden_def(rc_config_load)
char *
rc_config_value(RC_STRINGLIST *list, const char *entry)
@@ -392,7 +387,6 @@ rc_config_value(RC_STRINGLIST *list, const char *entry)
}
return NULL;
}
librc_hidden_def(rc_config_value)
/* Global for caching the strings loaded from rc.conf to avoid reparsing for
* each rc_conf_value call */
@@ -423,7 +417,7 @@ rc_conf_value(const char *setting)
}
rc_conf = rc_config_directory(rc_conf);
rc_conf = rc_config_kcl(rc_conf);
rc_conf = rc_config_kcl(rc_conf);
/* Convert old uppercase to lowercase */
TAILQ_FOREACH(s, rc_conf, entries) {
@@ -438,4 +432,3 @@ rc_conf_value(const char *setting)
return rc_config_value(rc_conf, setting);
}
librc_hidden_def(rc_conf_value)

View File

@@ -25,7 +25,6 @@ rc_stringlist_new(void)
TAILQ_INIT(l);
return l;
}
librc_hidden_def(rc_stringlist_new)
RC_STRING *
rc_stringlist_add(RC_STRINGLIST *list, const char *value)
@@ -36,7 +35,6 @@ rc_stringlist_add(RC_STRINGLIST *list, const char *value)
TAILQ_INSERT_TAIL(list, s, entries);
return s;
}
librc_hidden_def(rc_stringlist_add)
RC_STRING *
rc_stringlist_addu(RC_STRINGLIST *list, const char *value)
@@ -51,7 +49,6 @@ rc_stringlist_addu(RC_STRINGLIST *list, const char *value)
return rc_stringlist_add(list, value);
}
librc_hidden_def(rc_stringlist_addu)
bool
rc_stringlist_delete(RC_STRINGLIST *list, const char *value)
@@ -69,7 +66,6 @@ rc_stringlist_delete(RC_STRINGLIST *list, const char *value)
errno = EEXIST;
return false;
}
librc_hidden_def(rc_stringlist_delete)
RC_STRING *
rc_stringlist_find(RC_STRINGLIST *list, const char *value)
@@ -83,7 +79,6 @@ rc_stringlist_find(RC_STRINGLIST *list, const char *value)
}
return NULL;
}
librc_hidden_def(rc_stringlist_find)
RC_STRINGLIST *
rc_stringlist_split(const char *value, const char *sep)
@@ -98,7 +93,6 @@ rc_stringlist_split(const char *value, const char *sep)
return list;
}
librc_hidden_def(rc_stringlist_split)
void
rc_stringlist_sort(RC_STRINGLIST **list)
@@ -128,7 +122,6 @@ rc_stringlist_sort(RC_STRINGLIST **list)
free(l);
*list = new;
}
librc_hidden_def(rc_stringlist_sort)
void
rc_stringlist_free(RC_STRINGLIST *list)
@@ -148,4 +141,3 @@ rc_stringlist_free(RC_STRINGLIST *list)
}
free(list);
}
librc_hidden_def(rc_stringlist_free)

View File

@@ -15,7 +15,7 @@
* except according to the terms contained in the LICENSE file.
*/
const char librc_copyright[] = "Copyright (c) 2007-2008 Roy Marples";
static const char librc_copyright[] = "Copyright (c) 2007-2008 Roy Marples";
#include "queue.h"
#include "librc.h"
@@ -351,7 +351,6 @@ rc_sys(void)
return sys;
}
librc_hidden_def(rc_sys)
static const char *
rc_parse_service_state(RC_SERVICE state)
@@ -426,20 +425,17 @@ rc_runlevel_starting(void)
{
return exists(RC_STARTING);
}
librc_hidden_def(rc_runlevel_starting)
bool
rc_runlevel_stopping(void)
{
return exists(RC_STOPPING);
}
librc_hidden_def(rc_runlevel_stopping)
RC_STRINGLIST *rc_runlevel_list(void)
{
return ls_dir(RC_RUNLEVELDIR, LS_DIR);
}
librc_hidden_def(rc_runlevel_list)
char *
rc_runlevel_get(void)
@@ -466,7 +462,6 @@ rc_runlevel_get(void)
return runlevel;
}
librc_hidden_def(rc_runlevel_get)
bool
rc_runlevel_set(const char *runlevel)
@@ -479,7 +474,6 @@ rc_runlevel_set(const char *runlevel)
fclose(fp);
return true;
}
librc_hidden_def(rc_runlevel_set)
bool
rc_runlevel_exists(const char *runlevel)
@@ -487,14 +481,14 @@ rc_runlevel_exists(const char *runlevel)
char path[PATH_MAX];
struct stat buf;
if (!runlevel || strcmp(runlevel, ".") == 0 || strcmp(runlevel, "..") == 0)
if (!runlevel || strcmp(runlevel, "") == 0 || strcmp(runlevel, ".") == 0 ||
strcmp(runlevel, "..") == 0)
return false;
snprintf(path, sizeof(path), "%s/%s", RC_RUNLEVELDIR, runlevel);
if (stat(path, &buf) == 0 && S_ISDIR(buf.st_mode))
return true;
return false;
}
librc_hidden_def(rc_runlevel_exists)
bool
rc_runlevel_stack(const char *dst, const char *src)
@@ -507,7 +501,6 @@ rc_runlevel_stack(const char *dst, const char *src)
snprintf(d, sizeof(s), "%s/%s/%s", RC_RUNLEVELDIR, dst, src);
return (symlink(s, d) == 0 ? true : false);
}
librc_hidden_def(rc_runlevel_stack)
bool
rc_runlevel_unstack(const char *dst, const char *src)
@@ -517,7 +510,6 @@ rc_runlevel_unstack(const char *dst, const char *src)
snprintf(path, sizeof(path), "%s/%s/%s", RC_RUNLEVELDIR, dst, src);
return (unlink(path) == 0 ? true : false);
}
librc_hidden_def(rc_runlevel_unstack)
RC_STRINGLIST *
rc_runlevel_stacks(const char *runlevel)
@@ -530,7 +522,6 @@ rc_runlevel_stacks(const char *runlevel)
rc_stringlist_free(ancestor_list);
return stack;
}
librc_hidden_def(rc_runlevel_stacks)
/* Resolve a service name to its full path */
char *
@@ -558,7 +549,7 @@ rc_service_resolve(const char *service)
if (*file) {
memset(buffer, 0, sizeof(buffer));
r = readlink(file, buffer, sizeof(buffer));
r = readlink(file, buffer, sizeof(buffer)-1);
if (r > 0)
return xstrdup(buffer);
}
@@ -584,7 +575,6 @@ rc_service_resolve(const char *service)
return NULL;
}
librc_hidden_def(rc_service_resolve)
bool
rc_service_exists(const char *service)
@@ -623,7 +613,6 @@ rc_service_exists(const char *service)
free(file);
return retval;
}
librc_hidden_def(rc_service_exists)
#define OPTSTR \
". '%s'; echo $extra_commands $extra_started_commands $extra_stopped_commands"
@@ -665,7 +654,6 @@ rc_service_extra_commands(const char *service)
free(cmd);
return commands;
}
librc_hidden_def(rc_service_extra_commands)
#define DESCSTR ". '%s'; echo \"${description%s%s}\""
char *
@@ -695,7 +683,6 @@ rc_service_description(const char *service, const char *option)
free(cmd);
return desc;
}
librc_hidden_def(rc_service_description)
bool
rc_service_in_runlevel(const char *service, const char *runlevel)
@@ -706,7 +693,6 @@ rc_service_in_runlevel(const char *service, const char *runlevel)
runlevel, basename_c(service));
return exists(file);
}
librc_hidden_def(rc_service_in_runlevel)
bool
rc_service_mark(const char *service, const RC_SERVICE state)
@@ -826,7 +812,6 @@ rc_service_mark(const char *service, const RC_SERVICE state)
free(init);
return true;
}
librc_hidden_def(rc_service_mark)
RC_SERVICE
rc_service_state(const char *service)
@@ -869,7 +854,6 @@ rc_service_state(const char *service)
return state;
}
librc_hidden_def(rc_service_state)
char *
rc_service_value_get(const char *service, const char *option)
@@ -884,7 +868,6 @@ rc_service_value_get(const char *service, const char *option)
return buffer;
}
librc_hidden_def(rc_service_value_get)
bool
rc_service_value_set(const char *service, const char *option,
@@ -909,7 +892,6 @@ rc_service_value_set(const char *service, const char *option,
}
return true;
}
librc_hidden_def(rc_service_value_set)
bool
@@ -936,7 +918,6 @@ rc_service_schedule_start(const char *service, const char *service_to_start)
free(init);
return retval;
}
librc_hidden_def(rc_service_schedule_start)
bool
rc_service_schedule_clear(const char *service)
@@ -949,7 +930,6 @@ rc_service_schedule_clear(const char *service)
return true;
return false;
}
librc_hidden_def(rc_service_schedule_clear)
RC_STRINGLIST *
rc_services_in_runlevel(const char *runlevel)
@@ -987,7 +967,6 @@ rc_services_in_runlevel(const char *runlevel)
list = rc_stringlist_new();
return list;
}
librc_hidden_def(rc_services_in_runlevel)
RC_STRINGLIST *
rc_services_in_runlevel_stacked(const char *runlevel)
@@ -1004,7 +983,6 @@ rc_services_in_runlevel_stacked(const char *runlevel)
}
return list;
}
librc_hidden_def(rc_services_in_runlevel_stacked)
RC_STRINGLIST *
rc_services_in_state(RC_SERVICE state)
@@ -1038,7 +1016,6 @@ rc_services_in_state(RC_SERVICE state)
rc_stringlist_free(dirs);
return list;
}
librc_hidden_def(rc_services_in_state)
bool
rc_service_add(const char *runlevel, const char *service)
@@ -1047,7 +1024,6 @@ rc_service_add(const char *runlevel, const char *service)
char *init;
char file[PATH_MAX];
char path[MAXPATHLEN] = { '\0' };
char *p = NULL;
char binit[PATH_MAX];
char *i;
@@ -1068,8 +1044,7 @@ rc_service_add(const char *runlevel, const char *service)
/* We need to ensure that only things in /etc/init.d are added
* to the boot runlevel */
if (strcmp(runlevel, RC_LEVEL_BOOT) == 0) {
p = realpath(dirname(init), path);
if (!*p) {
if (realpath(dirname(init), path) == NULL) {
free(init);
return false;
}
@@ -1086,7 +1061,6 @@ rc_service_add(const char *runlevel, const char *service)
free(init);
return retval;
}
librc_hidden_def(rc_service_add)
bool
rc_service_delete(const char *runlevel, const char *service)
@@ -1099,7 +1073,6 @@ rc_service_delete(const char *runlevel, const char *service)
return true;
return false;
}
librc_hidden_def(rc_service_delete)
RC_STRINGLIST *
rc_services_scheduled_by(const char *service)
@@ -1118,7 +1091,6 @@ rc_services_scheduled_by(const char *service)
rc_stringlist_free(dirs);
return list;
}
librc_hidden_def(rc_services_scheduled_by)
RC_STRINGLIST *
rc_services_scheduled(const char *service)
@@ -1129,4 +1101,3 @@ rc_services_scheduled(const char *service)
basename_c(service));
return ls_dir(dir, LS_INITD);
}
librc_hidden_def(rc_services_scheduled)

View File

@@ -56,67 +56,4 @@
#include "rc.h"
#include "rc-misc.h"
#include "hidden-visibility.h"
#define librc_hidden_proto(x) hidden_proto(x)
#define librc_hidden_def(x) hidden_def(x)
librc_hidden_proto(rc_conf_value)
librc_hidden_proto(rc_config_list)
librc_hidden_proto(rc_config_load)
librc_hidden_proto(rc_config_value)
librc_hidden_proto(rc_deptree_depend)
librc_hidden_proto(rc_deptree_depends)
librc_hidden_proto(rc_deptree_free)
librc_hidden_proto(rc_deptree_load)
librc_hidden_proto(rc_deptree_load_file)
librc_hidden_proto(rc_deptree_order)
librc_hidden_proto(rc_deptree_update)
librc_hidden_proto(rc_deptree_update_needed)
librc_hidden_proto(rc_find_pids)
librc_hidden_proto(rc_getfile)
librc_hidden_proto(rc_getline)
librc_hidden_proto(rc_newer_than)
librc_hidden_proto(rc_proc_getent)
librc_hidden_proto(rc_older_than)
librc_hidden_proto(rc_runlevel_exists)
librc_hidden_proto(rc_runlevel_get)
librc_hidden_proto(rc_runlevel_list)
librc_hidden_proto(rc_runlevel_set)
librc_hidden_proto(rc_runlevel_stack)
librc_hidden_proto(rc_runlevel_stacks)
librc_hidden_proto(rc_runlevel_starting)
librc_hidden_proto(rc_runlevel_stopping)
librc_hidden_proto(rc_runlevel_unstack)
librc_hidden_proto(rc_service_add)
librc_hidden_proto(rc_service_daemons_crashed)
librc_hidden_proto(rc_service_daemon_set)
librc_hidden_proto(rc_service_delete)
librc_hidden_proto(rc_service_description)
librc_hidden_proto(rc_service_exists)
librc_hidden_proto(rc_service_extra_commands)
librc_hidden_proto(rc_service_in_runlevel)
librc_hidden_proto(rc_service_mark)
librc_hidden_proto(rc_service_resolve)
librc_hidden_proto(rc_service_schedule_clear)
librc_hidden_proto(rc_service_schedule_start)
librc_hidden_proto(rc_services_in_runlevel)
librc_hidden_proto(rc_services_in_runlevel_stacked)
librc_hidden_proto(rc_services_in_state)
librc_hidden_proto(rc_services_scheduled)
librc_hidden_proto(rc_services_scheduled_by)
librc_hidden_proto(rc_service_started_daemon)
librc_hidden_proto(rc_service_state)
librc_hidden_proto(rc_service_value_get)
librc_hidden_proto(rc_service_value_set)
librc_hidden_proto(rc_stringlist_add)
librc_hidden_proto(rc_stringlist_addu)
librc_hidden_proto(rc_stringlist_delete)
librc_hidden_proto(rc_stringlist_find)
librc_hidden_proto(rc_stringlist_free)
librc_hidden_proto(rc_stringlist_new)
librc_hidden_proto(rc_stringlist_split)
librc_hidden_proto(rc_stringlist_sort)
librc_hidden_proto(rc_sys)
librc_hidden_proto(rc_yesno)
#endif

33
src/librc/meson.build Normal file
View File

@@ -0,0 +1,33 @@
rc_h_conf_data = configuration_data()
if rootprefix == '/'
rc_h_conf_data.set('PREFIX', '')
else
rc_h_conf_data.set('PREFIX', rootprefix)
endif
rc_h_conf_data.set('LIB', libname)
rc_h_conf_data.set('LIBEXECDIR', rc_libexecdir)
rc_h_conf_data.set('LOCAL_PREFIX', local_prefix)
rc_h_conf_data.set('PKG_PREFIX', pkg_prefix)
rc_h_conf_data.set('SYSCONFDIR', get_option('sysconfdir'))
librc_version = '1'
librc_sources = [
'librc.c',
'librc-daemon.c',
'librc-depend.c',
'librc-misc.c',
'librc-stringlist.c',
]
rc_h = configure_file(input : 'rc.h.in', output : 'rc.h',
configuration : rc_h_conf_data)
librc = library('rc', librc_sources,
include_directories : [incdir, einfo_incdir],
link_depends : 'rc.map',
version : librc_version,
install : true,
install_dir : libdir)
install_headers(rc_h)

4
src/meson.build Normal file
View File

@@ -0,0 +1,4 @@
subdir('common')
subdir('libeinfo')
subdir('librc')
subdir('rc')

View File

@@ -14,7 +14,8 @@ SRCS+= rc-selinux.c
endif
ifeq (${OS},Linux)
SRCS+= kill_all.c openrc-init.c openrc-shutdown.c broadcast.c rc-wtmp.c
SRCS+= kill_all.c openrc-init.c openrc-shutdown.c rc-sysvinit.c broadcast.c \
rc-wtmp.c
endif
CLEANFILES= version.h rc-selinux.o
@@ -112,7 +113,7 @@ veinfo vewarn vebegin veend vewend veindent veoutdent: do_e.o rc-misc.o
fstabinfo: fstabinfo.o _usage.o rc-misc.o
${CC} ${LOCAL_CFLAGS} ${LOCAL_LDFLAGS} ${CFLAGS} ${LDFLAGS} -o $@ $^ ${LDADD}
openrc-init: openrc-init.o rc-wtmp.o
openrc-init: openrc-init.o rc-plugin.o rc-wtmp.o
${CC} ${LOCAL_CFLAGS} ${LOCAL_LDFLAGS} ${CFLAGS} ${LDFLAGS} -o $@ $^ ${LDADD}
is_newer_than: is_newer_than.o rc-misc.o
@@ -134,7 +135,7 @@ mountinfo: mountinfo.o _usage.o rc-misc.o
openrc rc: rc.o rc-logger.o rc-misc.o rc-plugin.o _usage.o
${CC} ${LOCAL_CFLAGS} ${LOCAL_LDFLAGS} ${CFLAGS} ${LDFLAGS} -o $@ $^ ${LDADD}
openrc-shutdown: openrc-shutdown.o rc-misc.o _usage.o broadcast.o rc-wtmp.o
openrc-shutdown: openrc-shutdown.o rc-misc.o _usage.o broadcast.o rc-wtmp.o rc-sysvinit.o
${CC} ${LOCAL_CFLAGS} ${LOCAL_LDFLAGS} ${CFLAGS} ${LDFLAGS} -o $@ $^ ${LDADD}
openrc-run runscript: openrc-run.o _usage.o rc-misc.o rc-plugin.o

View File

@@ -22,6 +22,7 @@
#include <time.h>
#include <unistd.h>
#include <stdio.h>
#include <utmp.h>
#include <utmpx.h>
#include <pwd.h>
#include <fcntl.h>
@@ -37,10 +38,6 @@
# define _PATH_DEV "/dev/"
#endif
#ifndef UT_LINESIZE
#define UT_LINESIZE __UT_LINESIZE
#endif
static sigjmp_buf jbuf;
/*
@@ -62,7 +59,7 @@ static void getuidtty(char **userp, char **ttyp)
uid_t uid;
char *tty;
static char uidbuf[32];
static char ttynm[UT_LINESIZE + 4];
char *ttynm = NULL;
uid = getuid();
if ((pwd = getpwuid(uid)) != NULL) {
@@ -82,10 +79,8 @@ static void getuidtty(char **userp, char **ttyp)
if (tty[0] == '/')
tty++;
}
snprintf(ttynm, sizeof(ttynm), "(%.*s) ",
UT_LINESIZE, tty);
} else
ttynm[0] = 0;
xasprintf(&ttynm, "(%s) ", tty);
}
*userp = uidbuf;
*ttyp = ttynm;
@@ -156,6 +151,7 @@ void broadcast(char *text)
xasprintf(&line, "\007\r\nBroadcast message from %s@%s %s(%s):\r\n\r\n",
user, name.nodename, tty, date);
free(tty);
/*
* Fork to avoid hanging in a write()

View File

@@ -16,6 +16,7 @@
* except according to the terms contained in the LICENSE file.
*/
#define _GNU_SOURCE
#include <sys/types.h>
#include <sys/stat.h>
@@ -23,6 +24,7 @@
#include <fcntl.h>
#include <getopt.h>
#include <grp.h>
#include <libgen.h>
#include <pwd.h>
#include <stdio.h>
#include <stdlib.h>
@@ -44,7 +46,7 @@ typedef enum {
const char *applet = NULL;
const char *extraopts ="path1 [path2] [...]";
const char *getoptstring = "dDfFpm:o:W" getoptstring_COMMON;
const char *getoptstring = "dDfFpm:o:sW" getoptstring_COMMON;
const struct option longopts[] = {
{ "directory", 0, NULL, 'd'},
{ "directory-truncate", 0, NULL, 'D'},
@@ -53,6 +55,7 @@ const struct option longopts[] = {
{ "pipe", 0, NULL, 'p'},
{ "mode", 1, NULL, 'm'},
{ "owner", 1, NULL, 'o'},
{ "symlinks", 0, NULL, 's'},
{ "writable", 0, NULL, 'W'},
longopts_COMMON
};
@@ -64,15 +67,120 @@ const char * const longopts_help[] = {
"Create a named pipe (FIFO) if not exists",
"Mode to check",
"Owner to check (user:group)",
"follow symbolic links (irrelivent on linux)",
"Check whether the path is writable or not",
longopts_help_COMMON
};
const char *usagestring = NULL;
static int get_dirfd(char *path, bool symlinks)
{
char *ch;
char *item;
char *linkpath = NULL;
char *path_dupe;
char *str;
int components = 0;
int dirfd;
int flags = 0;
int new_dirfd;
struct stat st;
ssize_t linksize;
if (!path || *path != '/')
eerrorx("%s: empty or relative path", applet);
dirfd = openat(dirfd, "/", O_RDONLY);
if (dirfd == -1)
eerrorx("%s: unable to open the root directory: %s",
applet, strerror(errno));
ch = path;
while (*ch) {
if (*ch == '/')
components++;
ch++;
}
path_dupe = xstrdup(path);
item = strtok(path_dupe, "/");
#ifdef O_PATH
flags |= O_PATH;
#endif
if (!symlinks)
flags |= O_NOFOLLOW;
flags |= O_RDONLY;
while (dirfd > 0 && item && components > 1) {
str = xstrdup(linkpath ? linkpath : item);
new_dirfd = openat(dirfd, str, flags);
if (new_dirfd == -1)
eerrorx("%s: %s: could not open %s: %s", applet, path, str,
strerror(errno));
if (fstat(new_dirfd, &st) == -1)
eerrorx("%s: %s: unable to stat %s: %s", applet, path, item,
strerror(errno));
if (S_ISLNK(st.st_mode) ) {
if (st.st_uid != 0)
eerrorx("%s: %s: symbolic link %s not owned by root",
applet, path, str);
linksize = st.st_size+1;
if (linkpath)
free(linkpath);
linkpath = xmalloc(linksize);
memset(linkpath, 0, linksize);
if (readlinkat(new_dirfd, "", linkpath, linksize) != st.st_size)
eerrorx("%s: symbolic link destination changed", applet);
/*
* now follow the symlink.
*/
close(new_dirfd);
} else {
/* now walk down the directory path */
close(dirfd);
dirfd = new_dirfd;
free(linkpath);
linkpath = NULL;
item = strtok(NULL, "/");
components--;
}
}
free(path_dupe);
free(linkpath);
return dirfd;
}
static char *clean_path(char *path)
{
char *ch;
char *ch2;
char *str;
str = xmalloc(strlen(path) + 1);
ch = path;
ch2 = str;
while (true) {
*ch2 = *ch;
ch++;
ch2++;
if (!*(ch-1))
break;
while (*(ch - 1) == '/' && *ch == '/')
ch++;
}
/* get rid of trailing / characters */
while ((ch = strrchr(str, '/'))) {
if (ch == str)
break;
if (!*(ch+1))
*ch = 0;
else
break;
}
return str;
}
static int do_check(char *path, uid_t uid, gid_t gid, mode_t mode,
inode_t type, bool trunc, bool chowner, bool selinux_on)
inode_t type, bool trunc, bool chowner, bool symlinks, bool selinux_on)
{
struct stat st;
char *name = NULL;
int dirfd;
int fd;
int flags;
int r;
@@ -93,14 +201,16 @@ static int do_check(char *path, uid_t uid, gid_t gid, mode_t mode,
#endif
if (trunc)
flags |= O_TRUNC;
readfd = open(path, readflags);
xasprintf(&name, "%s", basename_c(path));
dirfd = get_dirfd(path, symlinks);
readfd = openat(dirfd, name, readflags);
if (readfd == -1 || (type == inode_file && trunc)) {
if (type == inode_file) {
einfo("%s: creating file", path);
if (!mode) /* 664 */
mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH;
u = umask(0);
fd = open(path, flags, mode);
fd = openat(dirfd, name, flags, mode);
umask(u);
if (fd == -1) {
eerror("%s: open: %s", applet, strerror(errno));
@@ -115,14 +225,14 @@ static int do_check(char *path, uid_t uid, gid_t gid, mode_t mode,
mode = S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH;
u = umask(0);
/* We do not recursively create parents */
r = mkdir(path, mode);
r = mkdirat(dirfd, name, mode);
umask(u);
if (r == -1 && errno != EEXIST) {
eerror("%s: mkdir: %s", applet,
eerror("%s: mkdirat: %s", applet,
strerror (errno));
return -1;
}
readfd = open(path, readflags);
readfd = openat(dirfd, name, readflags);
if (readfd == -1) {
eerror("%s: unable to open directory: %s", applet,
strerror(errno));
@@ -140,7 +250,7 @@ static int do_check(char *path, uid_t uid, gid_t gid, mode_t mode,
strerror (errno));
return -1;
}
readfd = open(path, readflags);
readfd = openat(dirfd, name, readflags);
if (readfd == -1) {
eerror("%s: unable to open fifo: %s", applet,
strerror(errno));
@@ -167,7 +277,7 @@ static int do_check(char *path, uid_t uid, gid_t gid, mode_t mode,
if (mode && (st.st_mode & 0777) != mode) {
if ((type != inode_dir) && (st.st_nlink > 1)) {
eerror("%s: chmod: %s %s", applet, "Too many hard links to", path);
eerror("%s: chmod: Too many hard links to %s", applet, path);
close(readfd);
return -1;
}
@@ -259,8 +369,10 @@ int main(int argc, char **argv)
int retval = EXIT_SUCCESS;
bool trunc = false;
bool chowner = false;
bool symlinks = false;
bool writable = false;
bool selinux_on = false;
char *path = NULL;
applet = basename_c(argv[0]);
while ((opt = getopt_long(argc, argv, getoptstring,
@@ -293,6 +405,11 @@ int main(int argc, char **argv)
eerrorx("%s: owner `%s' not found",
applet, optarg);
break;
case 's':
#ifndef O_PATH
symlinks = true;
#endif
break;
case 'W':
writable = true;
break;
@@ -318,11 +435,14 @@ int main(int argc, char **argv)
selinux_on = true;
while (optind < argc) {
path = clean_path(argv[optind]);
if (writable)
exit(!is_writable(argv[optind]));
if (do_check(argv[optind], uid, gid, mode, type, trunc, chowner, selinux_on))
exit(!is_writable(path));
if (do_check(path, uid, gid, mode, type, trunc, chowner,
symlinks, selinux_on))
retval = EXIT_FAILURE;
optind++;
free(path);
}
if (selinux_on)

View File

@@ -35,9 +35,9 @@
const char *applet = NULL;
static int syslog_decode(char *name, CODE *codetab)
static int syslog_decode(char *name, const CODE *codetab)
{
CODE *c;
const CODE *c;
if (isdigit((unsigned char)*name))
return atoi(name);

300
src/rc/meson.build Normal file
View File

@@ -0,0 +1,300 @@
rc_misc_c = files([
'rc-misc.c',
])
rc_plugin_c = files([
'rc-plugin.c',
])
rc_schedules_c = files([
'rc-schedules.c',
])
usage_c = files([
'_usage.c',
])
if selinux_dep.found()
rc_selinux_c = files([
'rc-selinux.c',
])
else
rc_selinux_c = []
endif
rc_wtmp_c = files([
'rc-wtmp.c',
])
executable('rc-status',
['rc-status.c', rc_misc_c, usage_c, version_h],
c_args : cc_branding_flags,
link_with: [libeinfo, librc],
dependencies: [util_dep],
include_directories: [incdir, einfo_incdir, rc_incdir],
install: true,
install_dir: bindir)
executable('openrc',
['rc.c', 'rc-logger.c', rc_misc_c, rc_plugin_c, usage_c,
version_h],
c_args : cc_branding_flags,
link_with: [libeinfo, librc],
dependencies: [dl_dep, util_dep],
include_directories: [incdir, einfo_incdir, rc_incdir],
install: true,
install_dir: sbindir)
executable('openrc-run',
['openrc-run.c', rc_misc_c, rc_plugin_c, usage_c,
rc_selinux_c, version_h],
c_args : [cc_audit_flags, cc_branding_flags, cc_pam_flags, cc_selinux_flags],
link_with: [libeinfo, librc],
dependencies: [audit_dep, dl_dep, pam_dep, pam_misc_dep, selinux_dep, util_dep, crypt_dep],
include_directories: [incdir, einfo_incdir, rc_incdir],
install: true,
install_dir: sbindir)
executable('rc',
['rc.c', 'rc-logger.c', rc_misc_c, rc_plugin_c, usage_c, version_h],
c_args : cc_branding_flags,
link_with: [libeinfo, librc],
dependencies: [dl_dep, util_dep],
include_directories: [incdir, einfo_incdir, rc_incdir],
install: true,
install_dir: sbindir)
executable('rc-service',
['rc-service.c', rc_misc_c, usage_c, version_h],
c_args : cc_branding_flags,
link_with: [libeinfo, librc],
include_directories: [incdir, einfo_incdir, rc_incdir],
install: true,
install_dir: sbindir)
executable('rc-update',
['rc-update.c', rc_misc_c, usage_c, version_h],
c_args : cc_branding_flags,
link_with: [libeinfo, librc],
include_directories: [incdir, einfo_incdir, rc_incdir],
install: true,
install_dir: sbindir)
executable('runscript',
['openrc-run.c', rc_misc_c, usage_c, 'rc-plugin.c',
rc_selinux_c, version_h],
c_args : [cc_audit_flags, cc_branding_flags, cc_pam_flags, cc_selinux_flags],
link_with: [libeinfo, librc],
dependencies: [audit_dep, dl_dep, pam_dep, pam_misc_dep, util_dep, selinux_dep, crypt_dep],
include_directories: [incdir, einfo_incdir, rc_incdir],
install: true,
install_dir: sbindir)
executable('start-stop-daemon',
['start-stop-daemon.c', 'rc-pipes.c', rc_misc_c, rc_schedules_c,
rc_selinux_c, usage_c, version_h],
c_args : [cc_audit_flags, cc_branding_flags, cc_pam_flags, cc_selinux_flags],
link_with: [libeinfo, librc],
dependencies: [audit_dep, dl_dep, pam_dep, pam_misc_dep, util_dep, selinux_dep, crypt_dep],
include_directories: [incdir, einfo_incdir, rc_incdir],
install: true,
install_dir: sbindir)
executable('supervise-daemon',
['supervise-daemon.c', rc_misc_c, rc_plugin_c, rc_schedules_c,
usage_c, version_h],
c_args : [cc_branding_flags, cc_pam_flags, cc_selinux_flags],
link_with: [libeinfo, librc],
dependencies: [dl_dep, pam_dep, util_dep, selinux_dep],
include_directories: [incdir, einfo_incdir, rc_incdir],
install: true,
install_dir: sbindir)
if os == 'Linux'
executable('openrc-init',
['openrc-init.c', rc_plugin_c, rc_wtmp_c, version_h],
c_args : cc_selinux_flags,
include_directories: [incdir, einfo_incdir, rc_incdir],
link_with: [libeinfo, librc],
dependencies: [dl_dep, selinux_dep],
install: true,
install_dir: sbindir)
executable('openrc-shutdown',
['openrc-shutdown.c', 'broadcast.c', 'rc-sysvinit.c', rc_misc_c,
usage_c, rc_wtmp_c, version_h],
c_args : cc_branding_flags,
include_directories: [incdir, einfo_incdir, rc_incdir],
link_with: [libeinfo, librc],
install: true,
install_dir: sbindir)
endif
einfo_execs = [
'einfon',
'einfo',
'ewarnn',
'ewarn',
'eerrorn',
'eerror',
'ebegin',
'eend',
'ewend',
'eindent',
'eoutdent',
'esyslog',
'eval_ecolors',
'ewaitfile',
'veinfo',
'vewarn',
'vebegin',
'veend',
'vewend',
'veindent',
'veoutdent',
]
foreach exec: einfo_execs
executable(exec,
['do_e.c', rc_misc_c, version_h],
include_directories: [incdir, einfo_incdir, rc_incdir],
link_with: [libeinfo, librc],
install: true,
install_dir: rc_bindir)
endforeach
executable('checkpath',
['checkpath.c', rc_misc_c, usage_c, rc_selinux_c,
version_h],
c_args : [cc_audit_flags, cc_branding_flags, cc_pam_flags, cc_selinux_flags],
include_directories: [incdir, einfo_incdir, rc_incdir],
link_with: [libeinfo, librc],
dependencies: [audit_dep, pam_dep, pam_misc_dep, selinux_dep, crypt_dep],
install: true,
install_dir: rc_bindir)
executable('fstabinfo',
['fstabinfo.c', rc_misc_c, usage_c, version_h],
c_args : cc_branding_flags,
include_directories: [incdir, einfo_incdir, rc_incdir],
link_with: [libeinfo, librc],
install: true,
install_dir: rc_bindir)
executable('mountinfo',
['mountinfo.c', rc_misc_c, usage_c, version_h],
c_args : cc_branding_flags,
include_directories: [incdir, einfo_incdir, rc_incdir],
link_with: [libeinfo, librc],
install: true,
install_dir: rc_bindir)
executable('rc-depend',
['rc-depend.c', rc_misc_c, usage_c, version_h],
c_args : cc_branding_flags,
include_directories: [incdir, einfo_incdir, rc_incdir],
link_with: [libeinfo, librc],
install: true,
install_dir: rc_bindir)
executable('is_newer_than',
['is_newer_than.c', rc_misc_c, version_h],
include_directories: [incdir, einfo_incdir, rc_incdir],
link_with: [libeinfo, librc],
install: true,
install_dir: rc_bindir)
executable('is_older_than',
['is_older_than.c', rc_misc_c, version_h],
include_directories: [incdir, einfo_incdir, rc_incdir],
link_with: [libeinfo, librc],
install: true,
install_dir: rc_bindir)
service_execs = [
'service_starting',
'service_started',
'service_stopping',
'service_stopped',
'service_inactive',
'service_wasinactive',
'service_hotplugged',
'service_started_daemon',
'service_crashed',
]
foreach exec : service_execs
executable(exec,
['do_service.c', rc_misc_c, version_h],
include_directories: [incdir, einfo_incdir, rc_incdir],
link_with: [libeinfo, librc],
install: true,
install_dir: rc_bindir)
endforeach
value_execs = [
'service_get_value',
'service_set_value',
'get_options',
'save_options',
]
foreach exec : value_execs
executable(exec,
['do_value.c', rc_misc_c, version_h],
include_directories: [incdir, einfo_incdir, rc_incdir],
link_with: [libeinfo, librc],
install: true,
install_dir: rc_bindir)
endforeach
if os == 'Linux'
executable('kill_all',
['kill_all.c', usage_c, version_h],
c_args : cc_branding_flags,
include_directories: [incdir, einfo_incdir, rc_incdir],
link_with: [libeinfo,librc],
install: true,
install_dir: rc_bindir)
endif
executable('shell_var',
['shell_var.c'],
install: true,
install_dir: rc_bindir)
mark_service_execs = [
'mark_service_starting',
'mark_service_started',
'mark_service_stopping',
'mark_service_stopped',
'mark_service_inactive',
'mark_service_wasinactive',
'mark_service_hotplugged',
'mark_service_failed',
'mark_service_crashed',
]
foreach exec : mark_service_execs
executable(exec,
['do_mark_service.c', rc_misc_c, version_h],
include_directories: [incdir, einfo_incdir, rc_incdir],
link_with: [libeinfo,librc],
install: true,
install_dir: rc_sbindir)
endforeach
executable('rc-abort',
'rc-abort.c',
include_directories: [einfo_incdir],
link_with: [libeinfo],
install: true,
install_dir: rc_sbindir)
executable('swclock',
['swclock.c', rc_misc_c, usage_c, version_h],
c_args : cc_branding_flags,
include_directories: [incdir, einfo_incdir, rc_incdir],
link_with: [libeinfo,librc],
install: true,
install_dir: rc_sbindir)

View File

@@ -19,6 +19,7 @@
*/
#include <errno.h>
#include <pwd.h>
#include <signal.h>
#include <stdbool.h>
#include <stdio.h>
@@ -37,46 +38,52 @@
#include "helpers.h"
#include "rc.h"
#include "rc-plugin.h"
#include "rc-wtmp.h"
#include "version.h"
static const char *path_default = "/sbin:/usr/sbin:/bin:/usr/bin";
static const char *rc_default_runlevel = "default";
static pid_t do_openrc(const char *runlevel)
static void do_openrc(const char *runlevel)
{
pid_t pid;
sigset_t signals;
sigset_t all_signals;
sigset_t our_signals;
sigfillset(&all_signals);
/* block all signals */
sigprocmask(SIG_BLOCK, &all_signals, &our_signals);
pid = fork();
switch (pid) {
case -1:
perror("fork");
exit(1);
break;
case 0:
setsid();
/* unblock all signals */
sigemptyset(&signals);
sigprocmask(SIG_SETMASK, &signals, NULL);
sigprocmask(SIG_UNBLOCK, &all_signals, NULL);
printf("Starting %s runlevel\n", runlevel);
execlp("openrc", "openrc", runlevel, NULL);
perror("exec");
exit(1);
break;
default:
/* restore our signal mask */
sigprocmask(SIG_SETMASK, &our_signals, NULL);
while (waitpid(pid, NULL, 0) != pid)
if (errno == ECHILD)
break;
break;
}
return pid;
}
static void init(const char *default_runlevel)
{
const char *runlevel = NULL;
pid_t pid;
pid = do_openrc("sysinit");
waitpid(pid, NULL, 0);
pid = do_openrc("boot");
waitpid(pid, NULL, 0);
do_openrc("sysinit");
do_openrc("boot");
if (default_runlevel)
runlevel = default_runlevel;
else
@@ -87,8 +94,7 @@ static void init(const char *default_runlevel)
printf("%s is an invalid runlevel\n", runlevel);
runlevel = rc_default_runlevel;
}
pid = do_openrc(runlevel);
waitpid(pid, NULL, 0);
do_openrc(runlevel);
log_wtmp("reboot", "~~", 0, RUN_LVL, "~~");
}
@@ -100,11 +106,9 @@ static void handle_reexec(char *my_name)
static void handle_shutdown(const char *runlevel, int cmd)
{
pid_t pid;
struct timespec ts;
pid = do_openrc(runlevel);
while (waitpid(pid, NULL, 0) != pid);
do_openrc(runlevel);
printf("Sending the final term signal\n");
kill(-1, SIGTERM);
ts.tv_sec = 3;
@@ -116,12 +120,68 @@ static void handle_shutdown(const char *runlevel, int cmd)
reboot(cmd);
}
static void handle_single(void)
static void run_program(const char *prog)
{
sigset_t full;
sigset_t old;
pid_t pid;
pid = do_openrc("single");
while (waitpid(pid, NULL, 0) != pid);
/* We need to block signals until we have forked */
sigfillset(&full);
sigprocmask(SIG_SETMASK, &full, &old);
pid = fork();
if (pid == -1) {
perror("init");
return;
}
if (pid == 0) {
/* Unmask signals */
sigprocmask(SIG_SETMASK, &old, NULL);
execl(prog, prog, (char *)NULL);
perror("init");
exit(1);
}
/* Unmask signals and wait for child */
sigprocmask(SIG_SETMASK, &old, NULL);
if (rc_waitpid(pid) == -1)
perror("init");
}
static void open_shell(void)
{
const char *shell;
struct passwd *pw;
#ifdef __linux__
const char *sys = rc_sys();
/* VSERVER systems cannot really drop to shells */
if (sys && strcmp(sys, RC_SYS_VSERVER) == 0)
{
execlp("halt", "halt", "-f", (char *) NULL);
perror("init");
return;
}
#endif
shell = rc_conf_value("rc_shell");
/* No shell set, so obey env, then passwd, then default to /bin/sh */
if (!shell) {
shell = getenv("SHELL");
if (!shell) {
pw = getpwuid(getuid());
if (pw)
shell = pw->pw_shell;
if (!shell)
shell = "/bin/sh";
}
}
run_program(shell);
}
static void handle_single(void)
{
do_openrc("single");
}
static void reap_zombies(void)
@@ -147,6 +207,12 @@ static void signal_handler(int sig)
case SIGINT:
handle_shutdown("reboot", RB_AUTOBOOT);
break;
case SIGTERM:
#ifdef SIGPWR
case SIGPWR:
#endif
handle_shutdown("shutdown", RB_HALT_SYSTEM);
break;
case SIGCHLD:
reap_zombies();
break;
@@ -209,6 +275,10 @@ int main(int argc, char **argv)
sigfillset(&signals);
sigdelset(&signals, SIGCHLD);
sigdelset(&signals, SIGINT);
sigdelset(&signals, SIGTERM);
#ifdef SIGPWR
sigdelset(&signals, SIGPWR);
#endif
sigprocmask(SIG_SETMASK, &signals, NULL);
/* install signal handler */
@@ -216,6 +286,10 @@ int main(int argc, char **argv)
sa.sa_handler = signal_handler;
sigaction(SIGCHLD, &sa, NULL);
sigaction(SIGINT, &sa, NULL);
sigaction(SIGTERM, &sa, NULL);
#ifdef SIGPWR
sigaction(SIGPWR, &sa, NULL);
#endif
reboot(RB_DISABLE_CAD);
/* set default path */
@@ -249,8 +323,11 @@ int main(int argc, char **argv)
handle_shutdown("reboot", RB_AUTOBOOT);
else if (strcmp(buf, "reexec") == 0)
handle_reexec(argv[0]);
else if (strcmp(buf, "single") == 0)
else if (strcmp(buf, "single") == 0) {
handle_single();
open_shell();
init(default_runlevel);
}
}
return 0;
}

View File

@@ -1120,7 +1120,7 @@ int main(int argc, char **argv)
char *dir, *save = NULL, *saveLnk = NULL;
char *pidstr = NULL;
size_t l = 0, ll;
const char *file;
const char *file;
struct stat stbuf;
/* Show help if insufficient args */
@@ -1152,7 +1152,7 @@ int main(int argc, char **argv)
}
lnk = xmalloc(4096);
memset(lnk, 0, 4096);
if (readlink(argv[1], lnk, 4096)) {
if (readlink(argv[1], lnk, 4096-1)) {
dir = dirname(path);
if (strchr(lnk, '/')) {
save = xstrdup(dir);
@@ -1223,7 +1223,6 @@ int main(int argc, char **argv)
/* Make our prefix string */
prefix = xmalloc(sizeof(char) * l + 1);
ll = strlen(applet);
memcpy(prefix, applet, ll);
memset(prefix + ll, ' ', l - ll);
memset(prefix + l, 0, 1);

View File

@@ -35,8 +35,9 @@
#include "rc.h"
#include "helpers.h"
#include "rc-misc.h"
#include "_usage.h"
#include "rc-sysvinit.h"
#include "rc-wtmp.h"
#include "_usage.h"
const char *applet = NULL;
const char *extraopts = NULL;
@@ -67,7 +68,15 @@ const char * const longopts_help[] = {
"write wtmp boot record and exit",
longopts_help_COMMON
};
const char *usagestring = NULL;
const char *usagestring = "" \
"Usage: openrc-shutdown -c | --cancel\n" \
" or: openrc-shutdown -R | --reexec\n" \
" or: openrc-shutdown -w | --write-only\n" \
" or: openrc-shutdown -H | --halt time\n" \
" or: openrc-shutdown -K | --kexec time\n" \
" or: openrc-shutdown -p | --poweroff time\n" \
" or: openrc-shutdown -r | --reboot time\n" \
" or: openrc-shutdown -s | --single time";
const char *exclusive = "Select one of "
"--cancel, --halt, --kexec, --poweroff, --reexec, --reboot, --single or \n"
"--write-only";
@@ -111,8 +120,8 @@ static void create_nologin(int mins)
t += 60 * mins;
if ((fp = fopen(nologin_file, "w")) != NULL) {
fprintf(fp, "\rThe system is going down on %s\r\n", ctime(&t));
fclose(fp);
fprintf(fp, "\rThe system is going down on %s\r\n", ctime(&t));
fclose(fp);
}
}
@@ -122,7 +131,7 @@ static void create_nologin(int mins)
static void send_cmd(const char *cmd)
{
FILE *fifo;
size_t ignored;
size_t ignored;
if (do_dryrun) {
einfo("Would send %s to init", cmd);
@@ -320,15 +329,30 @@ int main(int argc, char **argv)
syslog(LOG_NOTICE, "The system will %s now", state);
unlink(nologin_file);
unlink(shutdown_pid);
if (do_halt)
send_cmd("halt");
else if (do_kexec)
if (do_halt) {
if (exists("/run/initctl")) {
sysvinit_setenv("INIT_HALT", "HALT");
sysvinit_runlevel('0');
} else
send_cmd("halt");
} else if (do_kexec)
send_cmd("kexec");
else if (do_poweroff)
send_cmd("poweroff");
else if (do_reboot)
send_cmd("reboot");
else if (do_single)
send_cmd("single");
else if (do_poweroff) {
if (exists("/run/initctl")) {
sysvinit_setenv("INIT_HALT", "POWEROFF");
sysvinit_runlevel('0');
} else
send_cmd("poweroff");
} else if (do_reboot) {
if (exists("/run/initctl"))
sysvinit_runlevel('6');
else
send_cmd("reboot");
} else if (do_single) {
if (exists("/run/initctl"))
sysvinit_runlevel('S');
else
send_cmd("single");
}
return 0;
}

Some files were not shown because too many files have changed in this diff Show More