summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sesman/sesman.c61
-rwxr-xr-xsesman/startwm.sh3
2 files changed, 46 insertions, 18 deletions
diff --git a/sesman/sesman.c b/sesman/sesman.c
index a4d5d8d1..3b1dae5e 100644
--- a/sesman/sesman.c
+++ b/sesman/sesman.c
@@ -21,18 +21,19 @@
*/
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <sys/socket.h>
+#include <sys/stat.h>
+#include <netinet/in.h>
+#include <netinet/tcp.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pwd.h>
#include <signal.h>
-#include <sys/types.h>
-#include <sys/wait.h>
-#include <netinet/in.h>
-#include <netinet/tcp.h>
-#include <sys/socket.h>
-#include <sys/stat.h>
+#include <grp.h>
#include "d3des.h"
@@ -223,13 +224,16 @@ int start_session(int width, int height, int bpp, char* username,
int uid;
int wmpid;
int xpid;
+ int error;
struct passwd* pwd_1;
char text[256];
char passwd_file[256];
char geometry[32];
char depth[32];
char screen[32];
+ char cur_dir[256];
+ getcwd(cur_dir, 255);
display = 10;
while (x_server_running(display) && display < 50)
{
@@ -249,26 +253,33 @@ int start_session(int width, int height, int bpp, char* username,
pwd_1 = getpwnam(username);
if (pwd_1 != 0)
{
- setgid(pwd_1->pw_gid);
- uid = pwd_1->pw_uid;
- if (setuid(uid) == 0)
+ /* set uid and groups */
+ error = initgroups(pwd_1->pw_name, pwd_1->pw_gid);
+ if (error == 0)
{
+ error = setgid(pwd_1->pw_gid);
+ }
+ if (error == 0)
+ {
+ uid = pwd_1->pw_uid;
+ error = setuid(uid);
+ }
+ if (error == 0)
+ {
+ clearenv();
+ setenv("PATH", "/bin:/usr/bin:/usr/X11R6/bin:/usr/local/bin", 1);
setenv("USER", username, 1);
g_sprintf(text, "%d", uid);
setenv("UID", text, 1);
setenv("HOME", pwd_1->pw_dir, 1);
chdir(pwd_1->pw_dir);
- if (access(".bash_profile", F_OK) == 0)
- {
- system("sh .bash_profile");
- }
g_sprintf(text, ":%d.0", display);
setenv("DISPLAY", text, 1);
g_sprintf(geometry, "%dx%d", width, height);
g_sprintf(depth, "%d", bpp);
g_sprintf(screen, ":%d", display);
mkdir(".vnc", S_IRWXU);
- g_sprintf(passwd_file, "%s/.vnc/.sesman_passwd", pwd_1->pw_dir);
+ g_sprintf(passwd_file, "%s/.vnc/sesman_passwd", pwd_1->pw_dir);
check_password_file(passwd_file, password);
wmpid = fork();
if (wmpid == -1)
@@ -280,8 +291,8 @@ int start_session(int width, int height, int bpp, char* username,
g_sleep(500);
if (x_server_running(display))
{
- execlp("startkde", NULL);
- //execlp("blackbox", NULL);
+ g_sprintf(text, "%s/startwm.sh", cur_dir);
+ execlp(text, "startwm.sh", NULL);
// should not get here
}
g_printf("error\n");
@@ -340,6 +351,7 @@ int main(int argc, char** argv)
int height;
int bpp;
int display;
+ int error;
struct stream* in_s;
struct stream* out_s;
char* username;
@@ -365,11 +377,19 @@ start session\n");
init_stream(out_s, 8192);
g_printf("listening\n");
sck = g_tcp_socket();
- if (g_tcp_bind(sck, "3350") == 0)
+ g_tcp_set_non_blocking(sck);
+ error = g_tcp_bind(sck, "3350");
+ if (error == 0)
{
- if (g_tcp_listen(sck) == 0)
+ error = g_tcp_listen(sck);
+ if (error == 0)
{
in_sck = g_tcp_accept(sck);
+ while (in_sck == -1 && g_tcp_last_error_would_block(sck))
+ {
+ g_sleep(1000);
+ in_sck = g_tcp_accept(sck);
+ }
while (in_sck > 0)
{
init_stream(in_s, 8192);
@@ -430,6 +450,11 @@ start session\n");
}
close(in_sck);
in_sck = g_tcp_accept(sck);
+ while (in_sck == -1 && g_tcp_last_error_would_block(sck))
+ {
+ g_sleep(1000);
+ in_sck = g_tcp_accept(sck);
+ }
}
}
else
diff --git a/sesman/startwm.sh b/sesman/startwm.sh
new file mode 100755
index 00000000..054b3e74
--- /dev/null
+++ b/sesman/startwm.sh
@@ -0,0 +1,3 @@
+#!/bin/sh
+startkde
+#blackbox