diff --git a/Makefile.am b/Makefile.am index 8d34dab8d9..4caa2433b1 100644 --- a/Makefile.am +++ b/Makefile.am @@ -84,6 +84,12 @@ AM_CPPFLAGS += \ -DKBD_SETFONT=\"/usr/bin/setfont\" \ -DDEFAULT_FONT=\"LatArCyrHeb-16\" else +if TARGET_MANDRIVA +AM_CPPFLAGS += \ + -DKBD_LOADKEYS=\"/bin/loadkeys\" \ + -DKBD_SETFONT=\"/bin/setfont\" \ + -DDEFAULT_FONT=\"LatArCyrHeb-16\" +else AM_CPPFLAGS += \ -DKBD_LOADKEYS=\"/bin/loadkeys\" \ -DKBD_SETFONT=\"/bin/setfont\" \ @@ -91,6 +97,7 @@ AM_CPPFLAGS += \ endif endif endif +endif rootbin_PROGRAMS = \ systemd \ @@ -337,6 +344,13 @@ dist_systemunit_DATA += \ units/fedora/halt-local.service endif +if TARGET_MANDRIVA +dist_systemunit_DATA += \ + units/mandriva/prefdm.service \ + units/fedora/rc-local.service \ + units/fedora/halt-local.service +endif + if HAVE_PLYMOUTH dist_systemunit_DATA += \ units/plymouth-start.service \ @@ -1357,6 +1371,23 @@ if TARGET_FEDORA rm -f display-manager.service && \ $(LN_S) $(systemunitdir)/display-manager.service display-manager.service ) endif + +if TARGET_MANDRIVA + $(MKDIR_P) -m 0755 $(DESTDIR)$(systemunitdir)/final.target.wants + ( cd $(DESTDIR)$(systemunitdir)/multi-user.target.wants && \ + rm -f rc-local.service && \ + $(LN_S) $(systemunitdir)/rc-local.service rc-local.service ) + ( cd $(DESTDIR)$(systemunitdir)/final.target.wants && \ + rm -f halt-local.service && \ + $(LN_S) $(systemunitdir)/halt-local.service halt-local.service ) + ( cd $(DESTDIR)$(systemunitdir) && \ + rm -f display-manager.service && \ + $(LN_S) prefdm.service display-manager.service ) + ( cd $(DESTDIR)$(systemunitdir)/graphical.target.wants && \ + rm -f display-manager.service && \ + $(LN_S) $(systemunitdir)/display-manager.service display-manager.service ) +endif + if TARGET_DEBIAN_OR_UBUNTU ( cd $(DESTDIR)$(systemunitdir) && \ rm -f runlevel5.target && \ diff --git a/configure.ac b/configure.ac index 097718eec1..cae2dce367 100644 --- a/configure.ac +++ b/configure.ac @@ -282,6 +282,7 @@ if test "z$with_distro" = "z"; then test -f "/etc/slackware-version" && with_distro="slackware" test -f "/etc/frugalware-release" && with_distro="frugalware" test -f "/etc/altlinux-release" && with_distro="altlinux" + test -f "/etc/mandriva-release" && with_distro="mandriva" if test "x`lsb_release -is 2>/dev/null`" = "xUbuntu"; then with_distro="ubuntu" fi @@ -373,6 +374,14 @@ case $with_distro in M4_DISTRO_FLAG=-DTARGET_ALTLINUX=1 have_plymouth=true ;; + mandriva) + SYSTEM_SYSVINIT_PATH=/etc/rc.d/init.d + SYSTEM_SYSVRCND_PATH=/etc/rc.d + SPECIAL_SYSLOG_SERVICE=rsyslog.service + AC_DEFINE(TARGET_MANDRIVA, [], [Target is Mandriva]) + M4_DISTRO_FLAG=-DTARGET_MANDRIVA=1 + have_plymouth=true + ;; other) AS_IF([test "x$with_syslog_service" = "x"], [AC_MSG_ERROR([With --distro=other, you must pass --with-syslog-service= to configure])]) @@ -430,6 +439,7 @@ AM_CONDITIONAL(TARGET_GENTOO, test x"$with_distro" = xgentoo) AM_CONDITIONAL(TARGET_SLACKWARE, test x"$with_distro" = xslackware) AM_CONDITIONAL(TARGET_FRUGALWARE, test x"$with_distro" = xfrugalware) AM_CONDITIONAL(TARGET_ALTLINUX, test x"$with_distro" = xaltlinux) +AM_CONDITIONAL(TARGET_MANDRIVA, test x"$with_distro" = xmandriva) AM_CONDITIONAL(HAVE_PLYMOUTH, test -n "$have_plymouth") diff --git a/src/fsck.c b/src/fsck.c index 7855f3ac07..dbfb47517f 100644 --- a/src/fsck.c +++ b/src/fsck.c @@ -121,7 +121,7 @@ static int parse_proc_cmdline(void) { arg_skip = true; else if (startswith(w, "fsck.mode")) log_warning("Invalid fsck.mode= parameter. Ignoring."); -#ifdef TARGET_FEDORA +#if defined(TARGET_FEDORA) || defined(TARGET_MANDRIVA) else if (strneq(w, "fastboot", l)) arg_skip = true; else if (strneq(w, "forcefsck", l)) diff --git a/src/hostname-setup.c b/src/hostname-setup.c index 8b0ff79384..ef68d78395 100644 --- a/src/hostname-setup.c +++ b/src/hostname-setup.c @@ -30,7 +30,7 @@ #include "util.h" #include "log.h" -#if defined(TARGET_FEDORA) || defined(TARGET_ALTLINUX) +#if defined(TARGET_FEDORA) || defined(TARGET_ALTLINUX) || defined(TARGET_MANDRIVA) #define FILENAME "/etc/sysconfig/network" #elif defined(TARGET_SUSE) || defined(TARGET_SLACKWARE) || defined(TARGET_FRUGALWARE) #define FILENAME "/etc/HOSTNAME" @@ -87,7 +87,7 @@ static int read_and_strip_hostname(const char *path, char **hn) { static int read_distro_hostname(char **hn) { -#if defined(TARGET_FEDORA) || defined(TARGET_ARCH) || defined(TARGET_GENTOO) || defined(TARGET_ALTLINUX) +#if defined(TARGET_FEDORA) || defined(TARGET_ARCH) || defined(TARGET_GENTOO) || defined(TARGET_ALTLINUX) || defined(TARGET_MANDRIVA) int r; FILE *f; diff --git a/src/locale-setup.c b/src/locale-setup.c index 2360cea85b..7684681cca 100644 --- a/src/locale-setup.c +++ b/src/locale-setup.c @@ -181,6 +181,28 @@ int locale_setup(void) { if (r != -ENOENT) log_warning("Failed to read /etc/profile.env: %s", strerror(-r)); } +#elif defined(TARGET_MANDRIVA) + if (r <= 0 && + (r = parse_env_file("/etc/sysconfig/i18n", NEWLINE, + "LANG", &variables[VARIABLE_LANG], + "LC_CTYPE", &variables[VARIABLE_LC_CTYPE], + "LC_NUMERIC", &variables[VARIABLE_LC_NUMERIC], + "LC_TIME", &variables[VARIABLE_LC_TIME], + "LC_COLLATE", &variables[VARIABLE_LC_COLLATE], + "LC_MONETARY", &variables[VARIABLE_LC_MONETARY], + "LC_MESSAGES", &variables[VARIABLE_LC_MESSAGES], + "LC_PAPER", &variables[VARIABLE_LC_PAPER], + "LC_NAME", &variables[VARIABLE_LC_NAME], + "LC_ADDRESS", &variables[VARIABLE_LC_ADDRESS], + "LC_TELEPHONE", &variables[VARIABLE_LC_TELEPHONE], + "LC_MEASUREMENT", &variables[VARIABLE_LC_MEASUREMENT], + "LC_IDENTIFICATION", &variables[VARIABLE_LC_IDENTIFICATION], + NULL)) < 0) { + + if (r != -ENOENT) + log_warning("Failed to read /etc/sysconfig/i18n: %s", strerror(-r)); + } + #endif if (!variables[VARIABLE_LANG]) { diff --git a/src/quotacheck.c b/src/quotacheck.c index 5d61146d93..5ced93318e 100644 --- a/src/quotacheck.c +++ b/src/quotacheck.c @@ -50,7 +50,7 @@ static int parse_proc_cmdline(void) { arg_skip = true; else if (startswith(w, "quotacheck.mode")) log_warning("Invalid quotacheck.mode= parameter. Ignoring."); -#ifdef TARGET_FEDORA +#if defined(TARGET_FEDORA) || defined(TARGET_MANDRIVA) else if (strneq(w, "forcequotacheck", l)) arg_force = true; #endif @@ -61,8 +61,8 @@ static int parse_proc_cmdline(void) { } static void test_files(void) { -#ifdef TARGET_FEDORA - /* This exists only on Fedora */ +#if defined(TARGET_FEDORA) || defined(TARGET_MANDRIVA) + /* This exists only on Fedora or Mandriva */ if (access("/forcequotacheck", F_OK) >= 0) arg_force = true; #endif diff --git a/src/service.c b/src/service.c index e99dfcd4a2..70999f3545 100644 --- a/src/service.c +++ b/src/service.c @@ -275,7 +275,13 @@ static int sysv_translate_facility(const char *name, const char *filename, char static const char * const table[] = { /* LSB defined facilities */ "local_fs", SPECIAL_LOCAL_FS_TARGET, +#ifndef TARGET_MANDRIVA + /* Due to unfortunate name selection in Mandriva, + * $network is provided by network-up which is ordered + * after network which actually starts interfaces. + * To break the loop, just ignore it */ "network", SPECIAL_NETWORK_TARGET, +#endif "named", SPECIAL_NSS_LOOKUP_TARGET, "portmap", SPECIAL_RPCBIND_TARGET, "remote_fs", SPECIAL_REMOTE_FS_TARGET, diff --git a/src/systemctl.c b/src/systemctl.c index 23e659756f..63e74d904a 100644 --- a/src/systemctl.c +++ b/src/systemctl.c @@ -4042,7 +4042,7 @@ static int install_info_apply(const char *verb, LookupPaths *paths, InstallInfo } if (!f) { -#if defined(TARGET_FEDORA) && defined (HAVE_SYSV_COMPAT) +#if (defined(TARGET_FEDORA) || defined(TARGET_MANDRIVA)) && defined (HAVE_SYSV_COMPAT) if (endswith(i->name, ".service")) { char *sysv; diff --git a/src/util.c b/src/util.c index b02a77eed8..96cf6605f3 100644 --- a/src/util.c +++ b/src/util.c @@ -3252,6 +3252,32 @@ void status_welcome(void) { if (!ansi_color) const_color = "0;33"; /* Orange/Brown for Ubuntu */ +#elif defined(TARGET_MANDRIVA) + + if (!pretty_name) { + char *s, *p; + + if ((r = read_one_line_file("/etc/mandriva-release", &s) < 0)) { + if (r != -ENOENT) + log_warning("Failed to read /etc/mandriva-release: %s", strerror(-r)); + } else { + p = strstr(s, " release "); + if (p) { + *p = '\0'; + p += 9; + p[strcspn(p, " ")] = '\0'; + + /* This corresponds to standard rc.sysinit */ + if (asprintf(&pretty_name, "%s\x1B[0;39m %s", s, p) > 0) + const_color = "1;36"; + else + log_warning("Failed to allocate Mandriva version string."); + } else + log_warning("Failed to parse /etc/mandriva-release"); + free(s); + } + } + #endif if (!pretty_name && !const_pretty) diff --git a/src/vconsole-setup.c b/src/vconsole-setup.c index 1952dfb0f1..5b977126fa 100644 --- a/src/vconsole-setup.c +++ b/src/vconsole-setup.c @@ -146,6 +146,9 @@ int main(int argc, char **argv) { char *vc_font_unimap = NULL; #ifdef TARGET_GENTOO char *vc_unicode = NULL; +#endif +#ifdef TARGET_MANDRIVA + char *vc_keytable = NULL; #endif int fd = -1; bool utf8; @@ -345,6 +348,64 @@ int main(int argc, char **argv) { if (r != -ENOENT) log_warning("Failed to read /etc/conf.d/keymaps: %s", strerror(-r)); } + +#elif defined(TARGET_MANDRIVA) + + if ((r = parse_env_file("/etc/sysconfig/i18n", NEWLINE, + "SYSFONT", &vc_font, + "SYSFONTACM", &vc_font_map, + "UNIMAP", &vc_font_unimap, + NULL)) < 0) { + + if (r != -ENOENT) + log_warning("Failed to read /etc/sysconfig/i18n: %s", strerror(-r)); + } + + if ((r = parse_env_file("/etc/sysconfig/keyboard", NEWLINE, + "KEYTABLE", &vc_keytable, + "KEYMAP", &vc_keymap, + "UNIKEYTABLE", &vc_keymap, + "GRP_TOGGLE", &vc_keymap_toggle, + NULL)) < 0) { + + if (r != -ENOENT) + log_warning("Failed to read /etc/sysconfig/i18n: %s", strerror(-r)); + } + + if (vc_keytable) { + if (vc_keymap) + free(vc_keymap); + if (utf8) { + if (endswith(vc_keytable, ".uni") || strstr(vc_keytable, ".uni.")) + vc_keymap = strdup(vc_keytable); + else { + char *s; + if ((s = strstr(vc_keytable, ".map"))) + vc_keytable[s-vc_keytable+1] = '\0'; + vc_keymap = strappend(vc_keytable, ".uni"); + } + } else + vc_keymap = strdup(vc_keytable); + + free(vc_keytable); + + if (!vc_keymap) { + log_error("Out of memory."); + goto finish; + } + } + + if (access("/etc/sysconfig/console/default.kmap", F_OK) >= 0) { + char *t; + + if (!(t = strdup("/etc/sysconfig/console/default.kmap"))) { + log_error("Out of memory."); + goto finish; + } + + free(vc_keymap); + vc_keymap = t; + } #endif } diff --git a/units/getty@.service.m4 b/units/getty@.service.m4 index d282912274..8e1f250ad0 100644 --- a/units/getty@.service.m4 +++ b/units/getty@.service.m4 @@ -21,6 +21,9 @@ After=local.service m4_ifdef(`TARGET_ALTLINUX', After=rc-local.service )m4_dnl +m4_ifdef(`TARGET_MANDRIVA', +After=rc-local.service +)m4_dnl # If additional gettys are spawned during boot then we should make # sure that this is synchronized before getty.target, even though diff --git a/units/graphical.target.m4 b/units/graphical.target.m4 index e2750c8640..1931d7f986 100644 --- a/units/graphical.target.m4 +++ b/units/graphical.target.m4 @@ -23,6 +23,9 @@ Names=runlevel5.target m4_ifdef(`TARGET_ALTLINUX', Names=runlevel5.target )m4_dnl +m4_ifdef(`TARGET_MANDRIVA', +Names=runlevel5.target +)m4_dnl AllowIsolate=yes [Install] diff --git a/units/mandriva/prefdm.service b/units/mandriva/prefdm.service new file mode 100644 index 0000000000..43b505db89 --- /dev/null +++ b/units/mandriva/prefdm.service @@ -0,0 +1,24 @@ +# This file is part of systemd. +# +# systemd is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. + +[Unit] +Description=Display Manager +After=syslog.target livesys-late.service rc-local.service systemd-user-sessions.service +After=network.target acpid.service fs.service haldaemon.service + +# Do not stop plymouth, it is done in prefdm if required +Conflicts=plymouth-quit.service +After=plymouth-quit.service + +# Hide SysV script +Names=dm.service + +[Service] +ExecStart=/etc/X11/prefdm +Type=forking +Restart=always +RestartSec=0 diff --git a/units/multi-user.target.m4 b/units/multi-user.target.m4 index 9df0142446..51e7b6664c 100644 --- a/units/multi-user.target.m4 +++ b/units/multi-user.target.m4 @@ -29,6 +29,9 @@ m4_dnl On Debian/Ubuntu Runlevel 2, 3, 4 and 5 are multi-user Names=runlevel2.target runlevel3.target runlevel4.target runlevel5.target )m4_dnl )m4_dnl +m4_ifdef(`TARGET_MANDRIVA', +Names=runlevel3.target +)m4_dnl AllowIsolate=yes [Install] diff --git a/units/rescue.service.m4 b/units/rescue.service.m4 index 2a0d3280ec..8b42e9f690 100644 --- a/units/rescue.service.m4 +++ b/units/rescue.service.m4 @@ -13,6 +13,9 @@ DefaultDependencies=no Conflicts=shutdown.target After=basic.target Before=shutdown.target +m4_ifdef(`TARGET_MANDRIVA', +`# Hide SysV script +Names=single.service') [Service] Environment=HOME=/root @@ -22,7 +25,10 @@ ExecStartPre=-/bin/echo 'Welcome to rescue mode. Use "systemctl default" or ^D t m4_ifdef(`TARGET_FEDORA', `EnvironmentFile=/etc/sysconfig/init ExecStart=-/bin/bash -c "exec ${SINGLE}"', -`ExecStart=-/sbin/sulogin') +m4_ifdef(`TARGET_MANDRIVA', +`EnvironmentFile=/etc/sysconfig/init +ExecStart=-/bin/bash -c "exec ${SINGLE}"', +`ExecStart=-/sbin/sulogin')) ExecStopPost=-/bin/systemctl --fail default StandardInput=tty-force KillMode=process-group diff --git a/units/serial-getty@.service.m4 b/units/serial-getty@.service.m4 index 2b3c8edd57..d42330a1ad 100644 --- a/units/serial-getty@.service.m4 +++ b/units/serial-getty@.service.m4 @@ -21,6 +21,9 @@ After=local.service m4_ifdef(`TARGET_ALTLINUX', After=rc-local.service )m4_dnl +m4_ifdef(`TARGET_MANDRIVA', +After=rc-local.service +)m4_dnl # If additional gettys are spawned during boot then we should make # sure that this is synchronized before getty.target, even though