2012-09-12 22:10:10 -07:00
|
|
|
#include <stdlib.h>
|
2012-09-13 00:09:17 -07:00
|
|
|
#include <stdio.h>
|
2012-09-12 22:10:10 -07:00
|
|
|
#include <unistd.h>
|
|
|
|
#include <syscall.h>
|
2013-05-05 15:00:24 -07:00
|
|
|
#include <signal.h>
|
2014-04-27 01:37:33 -07:00
|
|
|
#include <sys/wait.h>
|
2012-09-12 22:10:10 -07:00
|
|
|
|
2012-10-16 20:42:48 -07:00
|
|
|
#define LINE_LEN 1024
|
|
|
|
|
|
|
|
void set_username() {
|
|
|
|
FILE * passwd = fopen("/etc/passwd", "r");
|
|
|
|
char line[LINE_LEN];
|
|
|
|
|
|
|
|
int uid = syscall_getuid();
|
|
|
|
|
|
|
|
while (fgets(line, LINE_LEN, passwd) != NULL) {
|
|
|
|
|
|
|
|
line[strlen(line)-1] = '\0';
|
|
|
|
|
|
|
|
char *p, *tokens[10], *last;
|
|
|
|
int i = 0;
|
|
|
|
for ((p = strtok_r(line, ":", &last)); p;
|
|
|
|
(p = strtok_r(NULL, ":", &last)), i++) {
|
|
|
|
if (i < 511) tokens[i] = p;
|
|
|
|
}
|
|
|
|
tokens[i] = NULL;
|
|
|
|
|
|
|
|
if (atoi(tokens[2]) == uid) {
|
|
|
|
setenv("USER", tokens[0], 1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
fclose(passwd);
|
|
|
|
}
|
|
|
|
|
|
|
|
void set_homedir() {
|
|
|
|
char * user = getenv("USER");
|
|
|
|
if (user) {
|
|
|
|
char path[512];
|
|
|
|
sprintf(path,"/home/%s", user);
|
|
|
|
setenv("HOME",path,1);
|
|
|
|
} else {
|
|
|
|
setenv("HOME","/",1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void set_path() {
|
|
|
|
setenv("PATH", "/bin", 0);
|
|
|
|
}
|
|
|
|
|
2012-09-12 22:10:10 -07:00
|
|
|
int main(int argc, char * argv[]) {
|
|
|
|
/* Starts a graphical session and then spins waiting for a kill (logout) signal */
|
|
|
|
|
2012-10-16 20:42:48 -07:00
|
|
|
/* Load some session variables */
|
|
|
|
set_username();
|
|
|
|
set_homedir();
|
|
|
|
set_path();
|
|
|
|
|
2012-09-13 00:09:17 -07:00
|
|
|
int _wallpaper_pid = fork();
|
|
|
|
if (!_wallpaper_pid) {
|
2012-09-12 22:10:10 -07:00
|
|
|
char * args[] = {"/bin/wallpaper", NULL};
|
2012-10-08 00:17:50 -07:00
|
|
|
execvp(args[0], args);
|
2012-09-12 22:10:10 -07:00
|
|
|
}
|
2012-09-13 00:09:17 -07:00
|
|
|
int _panel_pid = fork();
|
|
|
|
if (!_panel_pid) {
|
2012-09-12 22:10:10 -07:00
|
|
|
char * args[] = {"/bin/panel", NULL};
|
2012-10-08 00:17:50 -07:00
|
|
|
execvp(args[0], args);
|
2012-09-12 22:10:10 -07:00
|
|
|
}
|
2014-04-21 19:46:38 -07:00
|
|
|
int _toastd_pid = fork();
|
|
|
|
if (!_toastd_pid) {
|
|
|
|
char * args[] = {"/bin/toastd", NULL};
|
|
|
|
execvp(args[0], args);
|
|
|
|
}
|
2012-09-12 22:10:10 -07:00
|
|
|
|
2014-04-27 01:37:33 -07:00
|
|
|
wait(NULL);
|
2012-09-12 22:10:10 -07:00
|
|
|
|
2014-04-27 01:37:33 -07:00
|
|
|
while (1) {
|
|
|
|
int pid = waitpid(-1, NULL, 0);
|
|
|
|
if (pid == -1) break;
|
|
|
|
}
|
2012-09-12 22:10:10 -07:00
|
|
|
|
2014-04-27 01:37:33 -07:00
|
|
|
return 0;
|
2012-09-12 22:10:10 -07:00
|
|
|
}
|