int main(int argc, char *argv[]) { int r = EXIT_SUCCESS; if (argc > 1 && argc != 4) { log_error("This program takes three or no arguments."); return EXIT_FAILURE; } if (argc > 1) arg_dest = argv[1]; log_set_target(LOG_TARGET_SAFE); log_parse_environment(); log_open(); umask(0022); if (access(RC_LOCAL_SCRIPT_PATH_START, X_OK) >= 0) { log_debug("Automatically adding rc-local.service."); if (add_symlink("rc-local.service", "multi-user.target") < 0) r = EXIT_FAILURE; } if (access(RC_LOCAL_SCRIPT_PATH_STOP, X_OK) >= 0) { log_debug("Automatically adding halt-local.service."); if (add_symlink("halt-local.service", "final.target") < 0) r = EXIT_FAILURE; } return r; }
static int add_container_getty(const char *tty) { _cleanup_free_ char *n = NULL; int r; assert(tty); log_debug("Automatically adding container getty for /dev/pts/%s.", tty); r = unit_name_from_path_instance("container-getty", tty, ".service", &n); if (r < 0) return log_error_errno(r, "Failed to generate service name: %m"); return add_symlink("[email protected]", n); }
static int add_serial_getty(const char *tty) { char *n; int r; assert(tty); log_debug("Automatically adding serial getty for /dev/%s.", tty); n = unit_name_replace_instance("[email protected]", tty); if (!n) return log_oom(); r = add_symlink("[email protected]", n); free(n); return r; }
int main(int argc, char *argv[]) { static const char virtualization_consoles[] = "hvc0\0" "xvc0\0" "hvsi0\0" "sclp_line0\0" "ttysclp0\0" "3270!tty1\0"; _cleanup_free_ char *active = NULL; const char *j; int r; if (argc > 1 && argc != 4) { log_error("This program takes three or no arguments."); return EXIT_FAILURE; } if (argc > 1) arg_dest = argv[1]; log_set_target(LOG_TARGET_SAFE); log_parse_environment(); log_open(); umask(0022); if (detect_container() > 0) { _cleanup_free_ char *container_ttys = NULL; log_debug("Automatically adding console shell."); if (add_symlink("console-getty.service", "console-getty.service") < 0) return EXIT_FAILURE; /* When $container_ttys is set for PID 1, spawn * gettys on all ptys named therein. Note that despite * the variable name we only support ptys here. */ r = getenv_for_pid(1, "container_ttys", &container_ttys); if (r > 0) { const char *word, *state; size_t l; FOREACH_WORD(word, l, container_ttys, state) { const char *t; char tty[l + 1]; memcpy(tty, word, l); tty[l] = 0; /* First strip off /dev/ if it is specified */ t = path_startswith(tty, "/dev/"); if (!t) t = tty; /* Then, make sure it's actually a pty */ t = path_startswith(t, "pts/"); if (!t) continue; if (add_container_getty(t) < 0) return EXIT_FAILURE; } } /* Don't add any further magic if we are in a container */ return EXIT_SUCCESS; }
int main(int argc, char *argv[]) { static const char virtualization_consoles[] = "hvc0\0" "xvc0\0" "hvsi0\0"; int r = EXIT_SUCCESS; char *active; const char *j; if (argc > 1 && argc != 4) { log_error("This program takes three or no arguments."); return EXIT_FAILURE; } if (argc > 1) arg_dest = argv[1]; log_set_target(LOG_TARGET_SAFE); log_parse_environment(); log_open(); umask(0022); if (detect_container(NULL) > 0) { log_debug("Automatically adding console shell."); if (add_symlink("console-getty.service", "console-getty.service") < 0) r = EXIT_FAILURE; /* Don't add any further magic if we are in a container */ goto finish; } if (read_one_line_file("/sys/class/tty/console/active", &active) >= 0) { const char *tty; tty = strrchr(active, ' '); if (tty) tty ++; else tty = active; /* Automatically add in a serial getty on the kernel * console */ if (isempty(tty) || tty_is_vc(tty)) free(active); else { int k; /* We assume that gettys on virtual terminals are * started via manual configuration and do this magic * only for non-VC terminals. */ k = add_serial_getty(tty); free(active); if (k < 0) { r = EXIT_FAILURE; goto finish; } } } /* Automatically add in a serial getty on the first * virtualizer console */ NULSTR_FOREACH(j, virtualization_consoles) { char *p; int k; if (asprintf(&p, "/sys/class/tty/%s", j) < 0) { log_oom(); r = EXIT_FAILURE; goto finish; } k = access(p, F_OK); free(p); if (k < 0) continue; k = add_serial_getty(j); if (k < 0) { r = EXIT_FAILURE; goto finish; } }