diff options
Diffstat (limited to '')
-rw-r--r-- | src/login.c | 200 |
1 files changed, 0 insertions, 200 deletions
diff --git a/src/login.c b/src/login.c deleted file mode 100644 index 32f118f..0000000 --- a/src/login.c +++ /dev/null @@ -1,200 +0,0 @@ -/** - * cerberus – Minimal login program - * - * Copyright © 2013 Mattias Andrée (maandree@member.fsf.org) - * - * This program 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 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - */ -#include <pwd.h> -#include <stdlib.h> -#include <stdio.h> -#include <unistd.h> -#include <string.h> - -#include "config.h" - -#include "login.h" - - -/** - * The environment variables - */ -extern char** environ; - - -/** - * Set the user gid and uid - * - * @param entry The user entry in the password file - */ -void set_user(struct passwd* entry) -{ - if (setgid(entry->pw_gid) && entry->pw_gid) - { - perror("setgid"); - _exit(1); - } - - if (setuid(entry->pw_uid) && entry->pw_uid) - { - perror("setuid"); - _exit(1); - } -} - - -/** - * Change directory to the user's home directory - * - * @param entry The user entry in the password file - */ -void chdir_home(struct passwd* entry) -{ - if (chdir(entry->pw_dir)) - { - perror("chdir"); - if (chdir(DEFAULT_HOME)) - { - perror("chdir"); - sleep(ERROR_SLEEP); - _exit(1); - } - entry->pw_dir = DEFAULT_HOME; - } -} - - -/** - * Make sure the shell to use is definied - * - * @param entry The user entry in the password file - */ -void ensure_shell(struct passwd* entry) -{ - if ((entry->pw_shell && *(entry->pw_shell)) == 0) - entry->pw_shell = DEFAULT_SHELL; -} - - -/** - * Set environment variables - * - * @param entry The user entry in the password file - * @param preserve_env Whether to preserve the environment - */ -void set_environ(struct passwd* entry, char preserve_env) -{ - char* _term = getenv("TERM"); - char* term = NULL; - if (_term) - { - int n = 0, i; - while (*(_term + n++)) - ; - term = malloc(n * sizeof(char)); - if (term == NULL) - { - perror("malloc"); - sleep(ERROR_SLEEP); - _exit(1); - } - for (i = 0; i < n; i++) - *(term + i) = *(_term + i); - } - - if (preserve_env == 0) - { - environ = malloc(sizeof(char*)); - if (environ == NULL) - { - perror("malloc"); - sleep(ERROR_SLEEP); - _exit(1); - } - *environ = NULL; - } - - setenv("HOME", entry->pw_dir, 1); - setenv("USER", entry->pw_name, 1); - setenv("LOGUSER", entry->pw_name, 1); - setenv("SHELL", entry->pw_shell, 1); - setenv("TERM", term ?: DEFAULT_TERM, 1); - setenv("PATH", entry->pw_uid ? PATH : PATH_ROOT, 1); - - if (term) - free(term); -} - - -/** - * Replace the current image with the user's login shell - * - * @param entry The user entry in the password file - */ -void exec_shell(struct passwd* entry) -{ - int child_argc = 0; - char** child_argv = malloc(5 * sizeof(char*)); - long n = 0; - char* sh = entry->pw_shell; - char* login_sh; - - while (*(sh + n++)) - ; - - login_sh = malloc((n + (strchr(sh, ' ') ? 5 : 1)) * sizeof(char)); - if (login_sh == NULL) - { - perror("malloc"); - sleep(ERROR_SLEEP); - _exit(1); - } - - if (strchr(sh, ' ')) - { - login_sh += 5; - strcpy(login_sh, "exec "); - *(login_sh + n) = 0; - - *(child_argv + child_argc++) = DEFAULT_SHELL; - *(child_argv + child_argc++) = "-" DEFAULT_SH; - *(child_argv + child_argc++) = "-c"; - *(child_argv + child_argc++) = login_sh - 5; - } - else - { - int i; - for (i = n - 1; i >= 0; i--) - if (*(sh + i) == '/') - { - i++; - break; - } - - login_sh = malloc((n + 1) * sizeof(char)); - *login_sh++ = '-'; - strcpy(login_sh, sh + i); - *(login_sh + n) = 0; - - *(child_argv + child_argc++) = sh; - *(child_argv + child_argc++) = login_sh - 1; - } - - *(child_argv + child_argc) = NULL; - execvp(*child_argv, child_argv + 1); - perror("execvp"); - sleep(ERROR_SLEEP); - _exit(1); -} - |