|
root / tools / sysv-wrapper
sysv-wrapper Plain Text 177 lines 21.0 KB
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
# sysv-wrapper Makefile.
#
# Build:    make
# Install:  make install DESTDIR=<root>      (defaults to /)
# Clean:    make clean
#
# Installs the wrapper at /sbin/sysv-wrapper and symlinks the legacy
# tool names to it. /sbin/init is NOT symlinked here — that path is
# the zyginit daemon binary. If you want sysv-wrapper to handle
# `init <N>` too, move zyginit aside (e.g. to /sbin/zyginit) and
# symlink /sbin/init -> sysv-wrapper instead.

CC      ?= gcc
CFLAGS  ?= -O2 -Wall
DESTDIR ?=
SBIN     = $(DESTDIR)/sbin
WRAPPER  = $(SBIN)/sysv-wrapper

all: sysv-wrapper

sysv-wrapper: wrapper.c version.h
	$(CC) $(CFLAGS) -o $@ wrapper.c

install: sysv-wrapper
	install -d $(SBIN)
	install -m 0755 sysv-wrapper $(WRAPPER)
	ln -sf sysv-wrapper $(SBIN)/halt
	ln -sf sysv-wrapper $(SBIN)/reboot
	ln -sf sysv-wrapper $(SBIN)/poweroff
	ln -sf sysv-wrapper $(SBIN)/telinit

clean:
	rm -f sysv-wrapper

.PHONY: all install clean
ELF>@@�8@8@ @@@���pp--   ���-�=�=���-�=�=��PPP  ppp$$###��S�tdPPP  P�td�!�!�!44Q�tdR�td�-�=�=88GNU��GNU-A���Tb���䎸��n��/lib64/ld-linux-x86-64.so.2��e�mi� <b;� 
[� R.4C"freestrdup__xpg_basename__libc_start_mainexeclstderrfprintf__cxa_finalizestrerrorfwritestrcmp__errno_locationlibc.so.6GLIBC_2.34GLIBC_2.2.5_ITM_deregisterTMCloneTable__gmon_start___ITM_registerTMCloneTablez����ui	��= �=�X@X@�?�?�?�?�?�?@@@@ @(@	0@
8@@@
H@��H��H��/H��t��H����5�/�%�/@�%�/h������%�/h������%�/h������%�/h������%�/h������%�/h������%�/h������%�/h�p����%�/h�`����%�/h	�P����%/f�AVSPH��H��H�5�H��1�1������H��.L�0�0����8�����H�5�H��L��H��I��1�H��[A^�4���@��1�I��^H��H���PTE1�1�H�=��S.�f.�H�=�.H��.H9�tH�6.H��t	�����H�=�.H�5�.H)�H��H��?H��H�H��tH�.H��t��fD�����=u.u+UH�=�-H��tH�=V.������d����M.]������w����UAWAVATSI����H�>�[���H����I��H���'���H�Ã�|UM�fH�5�L���������tA�<$-u7A�|$Vu/A�|$u'H�=�H��1�H��1������L�������_H�5�H���������tH�5jH���������u~��EH��,H�8I�H�5�1��t����H��,H�H�=���o�����I�N���Ѓ�C��H��Hc�H���H�=D�������H�5�
H���������uH�=�
�g�����H�5�
H���������u*H�=�
�C����qH�=�
�5����cH�=�
�'����UH�5�
H���������uH�=y
�����4H��+H�8H�5j
H������H��+H�8I�H�5�
1��`������[A\A^A_]���H��H���i���E���������������������������������������������������������������������������������������������������������������������������������������E�������������������������������������������������������������������������������������������������������������������������������E���out of memory
--version%s %s
0.1.2telinithaltrebootpoweroffsysv-wrapper: unknown invocation '%s'
usage: %s <runlevel>
singlemultireload%s: unknown runlevel '%s'
/sbin/zygctl%s: cannot exec %s: %s
sysv-wrapper;4(���h����������H���P8����zRx�����&D$4�����FJw�?;*3$"\@���8t�����ABB B(A0������(B BBA$�����\BAA ��PABGNU`~��FDO{"type":"deb","os":"ubuntu","name":"glibc","version":"2.42-0ubuntu3.1","architecture":"amd64"} �z
 �=�=���o�p�
��?����	���o���ox���o���oP���o�=6FVfv�����X@GCC: (Ubuntu 15.2.0-4ubuntu4) 15.2.0Ubuntu clang version 21.1.2 (2ubuntu6)��	# ���\(��3p5�H�^`@j�=� ��=(���#����=��!��?�
*G r P@c`@j �pP@}�� �X@� ��h@v@&�`@�0�`@ 9Las"��Scrt1.o__abi_tagwrapper.crun_zygctlcrtstuff.cderegister_tm_clones__do_global_dtors_auxcompleted.0__do_global_dtors_aux_fini_array_entryframe_dummy__frame_dummy_init_array_entry__FRAME_END___DYNAMIC__GNU_EH_FRAME_HDR_GLOBAL_OFFSET_TABLE_free@GLIBC_2.2.5__libc_start_main@GLIBC_2.34__errno_location@GLIBC_2.2.5_ITM_deregisterTMCloneTable_edata_fini__data_startstrcmp@GLIBC_2.2.5fprintf@GLIBC_2.2.5__gmon_start____dso_handle_IO_stdin_used__xpg_basename@GLIBC_2.2.5_end__bss_startmainfwrite@GLIBC_2.2.5__TMC_END___ITM_registerTMCloneTablestrdup@GLIBC_2.2.5strerror@GLIBC_2.2.5execl@GLIBC_2.2.5__cxa_finalize@GLIBC_2.2.5_initstderr@GLIBC_2.2.5.symtab.strtab.shstrtab.note.gnu.property.note.gnu.build-id.interp.gnu.hash.dynsym.dynstr.gnu.version.gnu.version_r.rela.dyn.rela.plt.init.plt.got.text.fini.rodata.eh_frame_hdr.eh_frame.note.ABI-tag.note.package.init_array.fini_array.dynamic.got.plt.data.bss.commentPP .pp$A��I���o��$S���[pp�c���oPP"p���oxx0����B�����  �������@�  
�  ���!�!4�0"0"��## �(#(#p��=�-��=�-�=�-���?�/0�?�/hP@P0`@`00`0L�0h	5��7(/******************************************************************************
                __               ____                __
               / /   ___  ____ _/ __/_____________ _/ /__
              / /   / _ \/ __ `/ /_/ ___/ ___/ __ `/ / _ \
             / /___/  __/ /_/ / __(__  ) /__/ /_/ / /  __/
            /_____/\___/\__,_/_/ /____/\___/\__,_/_/\___/

    (C)opyright 2025-2026, Leafscale, LLC -  https://www.leafscale.com

    Project: zyginit
   Filename: version.h
    Authors: Chris Tusa <chris.tusa@leafscale.com>
    License: <see LICENSE file included with this source code>
Description: Generated version constant. Do not edit by hand — regenerated
             by scripts/bump-version.sh.

******************************************************************************/

#ifndef ZYGINIT_VERSION_H
#define ZYGINIT_VERSION_H
#define ZYGINIT_VERSION "0.2.7"
#endif
/*
 * sysv-wrapper — translate traditional sysv-init commands to zygctl calls.
 *
 * Installed as multiple symlinks pointing at the same binary; we dispatch
 * on argv[0] (basename) so each link behaves like the legacy tool.
 *
 *   /sbin/init <runlevel>     map runlevel char to a zygctl verb
 *   /sbin/telinit <runlevel>  same; telinit is the historical client name
 *   /sbin/halt                zygctl halt
 *   /sbin/reboot              zygctl reboot
 *   /sbin/poweroff            zygctl poweroff
 *
 * The wrapper itself does not connect to zyginit's socket — it just exec's
 * /sbin/zygctl with the right verb. zygctl handles the socket protocol.
 *
 * Note: when /sbin/init is run by the kernel as PID 1, it is the zyginit
 * daemon binary, NOT this wrapper. This wrapper lives at a different path
 * (or replaces /sbin/init only on systems where zyginit is at /sbin/zyginit).
 * On the current Hammerhead deploy /sbin/init IS zyginit; the wrapper
 * is therefore meant for /sbin/halt, /sbin/reboot, /sbin/poweroff,
 * /sbin/telinit. If you DO want /sbin/init to be this wrapper, install
 * zyginit at /sbin/zyginit and point the kernel boot path there.
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <libgen.h>
#include <errno.h>
#include "version.h"

#define ZYGCTL "/sbin/zygctl"

static int
run_zygctl(const char *verb)
{
	execl(ZYGCTL, "zygctl", verb, (char *)NULL);
	/* execl returns only on failure */
	(void) fprintf(stderr, "%s: cannot exec %s: %s\n",
	    "sysv-wrapper", ZYGCTL, strerror(errno));
	return (1);
}

static int
init_dispatch(int argc, char **argv)
{
	if (argc < 2) {
		(void) fprintf(stderr, "usage: %s <runlevel>\n", argv[0]);
		return (1);
	}

	switch (argv[1][0]) {
	case '0':
		return (run_zygctl("halt"));
	case '5':
		return (run_zygctl("poweroff"));
	case '6':
		return (run_zygctl("reboot"));
	case '1':
	case 's':
	case 'S':
		return (run_zygctl("single"));
	case '2':
	case '3':
	case '4':
		return (run_zygctl("multi"));
	case 'q':
	case 'Q':
		return (run_zygctl("reload"));
	default:
		(void) fprintf(stderr,
		    "%s: unknown runlevel '%s'\n", argv[0], argv[1]);
		return (1);
	}
}

int
main(int argc, char **argv)
{
	const char *me;
	char *argv0_copy;

	/* basename(3) on illumos modifies its argument, so duplicate first */
	argv0_copy = strdup(argv[0]);
	if (argv0_copy == NULL) {
		(void) fprintf(stderr, "out of memory\n");
		return (1);
	}
	me = basename(argv0_copy);

	if (argc >= 2 &&
	    (strcmp(argv[1], "--version") == 0 ||
	     strcmp(argv[1], "-V") == 0)) {
		(void) printf("%s %s\n", me, ZYGINIT_VERSION);
		free(argv0_copy);
		return (0);
	}

	if (strcmp(me, "init") == 0 || strcmp(me, "telinit") == 0)
		return (init_dispatch(argc, argv));
	if (strcmp(me, "halt") == 0)
		return (run_zygctl("halt"));
	if (strcmp(me, "reboot") == 0)
		return (run_zygctl("reboot"));
	if (strcmp(me, "poweroff") == 0)
		return (run_zygctl("poweroff"));

	(void) fprintf(stderr, "sysv-wrapper: unknown invocation '%s'\n", me);
	return (1);
}