login add
This commit is contained in:
parent
d33fe7b787
commit
f8dd93020d
5
TODO
5
TODO
|
@ -46,7 +46,7 @@ Loginutils:
|
||||||
getty
|
getty
|
||||||
|
|
||||||
Modutils (linux only):
|
Modutils (linux only):
|
||||||
modprobe
|
insmod
|
||||||
rmmod
|
rmmod
|
||||||
lsmod
|
lsmod
|
||||||
|
|
||||||
|
@ -54,9 +54,6 @@ Findutils:
|
||||||
grep
|
grep
|
||||||
find
|
find
|
||||||
|
|
||||||
Shell:
|
|
||||||
rc - run command (1 2 3 ~ | <> <<>> & * " parsing) (sig handler)
|
|
||||||
|
|
||||||
BUGS:
|
BUGS:
|
||||||
ls (unicode strlen, -l flag col)
|
ls (unicode strlen, -l flag col)
|
||||||
xargs (getopt with glibc)
|
xargs (getopt with glibc)
|
||||||
|
|
2
build.sh
2
build.sh
|
@ -26,7 +26,7 @@ for project in $projects; do
|
||||||
cd $PROJECT_DIR/$i
|
cd $PROJECT_DIR/$i
|
||||||
echo " * Compile" $i
|
echo " * Compile" $i
|
||||||
chmod -v +x build.sh
|
chmod -v +x build.sh
|
||||||
env CC=$CC CFLAGS="$CFLAGS -I$PROJECT_DIR -I$PROJECT_DIR/include/libmu -lm" OUTPUT="$PROJECT_DIR"/bin/ ./build.sh
|
env CC=$CC CFLAGS="$CFLAGS -I$PROJECT_DIR -I$PROJECT_DIR/include/libmu" OUTPUT="$PROJECT_DIR"/bin/ ./build.sh
|
||||||
cd $PROJECT_DIR
|
cd $PROJECT_DIR
|
||||||
done
|
done
|
||||||
echo
|
echo
|
||||||
|
|
|
@ -0,0 +1,21 @@
|
||||||
|
#ifndef _GET_STRING_H
|
||||||
|
#define _GET_STRING_H
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
|
int mu_get_string(const char *prog_name, char *buf, const size_t len) {
|
||||||
|
off_t rbytes = read(STDIN_FILENO, buf, len);
|
||||||
|
|
||||||
|
if (rbytes <= 0) {
|
||||||
|
fprintf(stderr, "%s: %s\n", prog_name, strerror(errno));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rbytes > 1)
|
||||||
|
buf[rbytes - 1] = '\0';
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,30 @@
|
||||||
|
#ifndef _PW_CHECK_H
|
||||||
|
#define _PW_CHECK_H
|
||||||
|
|
||||||
|
#include <pwd.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <crypt.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
int pw_check(const char *prog_name, const struct passwd *pw, const char *pass) {
|
||||||
|
if (pw->pw_passwd[0] == '\0' || pass[0] == '\0') {
|
||||||
|
fprintf(stderr, "%s: Incorrect password\n", prog_name);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pw->pw_passwd[0] == '!' || pw->pw_passwd[0] == '*') {
|
||||||
|
fprintf(stderr, "%s: Denied\n", prog_name);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
char *cryptpass = crypt(pass, pw->pw_passwd);
|
||||||
|
if (cryptpass == NULL)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
if (!strcmp(pw->pw_passwd, cryptpass))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
|
@ -179,14 +179,14 @@ int main(int argc, char **argv) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (argv[optind] == NULL) {
|
argv += optind;
|
||||||
|
argc -= optind;
|
||||||
|
|
||||||
|
if (argc < 2) {
|
||||||
fprintf(stderr, "cp: missing operand\n");
|
fprintf(stderr, "cp: missing operand\n");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
argv += optind;
|
|
||||||
argc -= optind;
|
|
||||||
|
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
if (argc == 2)
|
if (argc == 2)
|
||||||
ret = cptree(argv[0], argv[argc - 1]);
|
ret = cptree(argv[0], argv[argc - 1]);
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
#!/bin/sh
|
||||||
|
project_dir=$(pwd)
|
||||||
|
echo ./*.c $CFLAGS -o $OUTPUT$(basename $project_dir) -lcrypt | xargs $CC
|
|
@ -0,0 +1,94 @@
|
||||||
|
#include <pwd.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <limits.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <signal.h>
|
||||||
|
#include "get_string.h"
|
||||||
|
#include "pw_check.h"
|
||||||
|
|
||||||
|
void login(const struct passwd *pw) {
|
||||||
|
char *shell = pw->pw_shell[0] == '\0' ? "/bin/sh" : pw->pw_shell;
|
||||||
|
|
||||||
|
setenv("HOME", pw->pw_dir, 1);
|
||||||
|
setenv("SHELL", shell, 1);
|
||||||
|
setenv("USER", pw->pw_name, 1);
|
||||||
|
setenv("LOGNAME", pw->pw_name, 1);
|
||||||
|
|
||||||
|
if (chdir(pw->pw_dir) < 0) {
|
||||||
|
fprintf(stderr, "login: %s\n", strerror(errno));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
execlp(shell, shell, "-l", NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
struct passwd *proccess_input(char *hostname) {
|
||||||
|
static char user[512];
|
||||||
|
static char psswd[512];
|
||||||
|
|
||||||
|
/* Username */
|
||||||
|
printf("Login on %s:\n", hostname);
|
||||||
|
if (mu_get_string("login", user, sizeof(user)))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
struct passwd *pw = getpwnam(user);
|
||||||
|
if (!pw) {
|
||||||
|
fprintf(stderr, "login: Incorrent username\n");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Password */
|
||||||
|
printf("\nPassword:\n");
|
||||||
|
if (mu_get_string("login", psswd, sizeof(psswd)))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
if (pw_check("login", pw, psswd)) {
|
||||||
|
memset(psswd, '\0', sizeof(psswd));
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
memset(psswd, '\0', sizeof(psswd));
|
||||||
|
return pw;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(void) {
|
||||||
|
if ((!isatty(STDIN_FILENO) || !isatty(STDOUT_FILENO))) {
|
||||||
|
fprintf(stderr, "login: no tty\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* For prompt */
|
||||||
|
char hostname[HOST_NAME_MAX + 1];
|
||||||
|
if (gethostname(hostname, sizeof(hostname)) < 0) {
|
||||||
|
fprintf(stderr, "login: %s\n", strerror(errno));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
signal(SIGQUIT, SIG_IGN);
|
||||||
|
signal(SIGINT, SIG_IGN);
|
||||||
|
signal(SIGHUP, SIG_IGN);
|
||||||
|
|
||||||
|
|
||||||
|
struct passwd *pw = proccess_input(hostname);
|
||||||
|
if (!pw)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
/* Start */
|
||||||
|
if (setgid(pw->pw_gid) < 0) {
|
||||||
|
fprintf(stderr, "login: %s\n", strerror(errno));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (setuid(pw->pw_uid) < 0) {
|
||||||
|
fprintf(stderr, "login: %s\n", strerror(errno));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
login(pw);
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -1,3 +1,3 @@
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
project_dir=$(pwd)
|
project_dir=$(pwd)
|
||||||
echo ./*.c $CFLAGS -o $OUTPUT$(basename $project_dir) | xargs $CC
|
echo ./*.c $CFLAGS -o $OUTPUT$(basename $project_dir) -lm | xargs $CC
|
||||||
|
|
Loading…
Reference in New Issue