summaryrefslogtreecommitdiffstats
path: root/sesman
diff options
context:
space:
mode:
authorilsimo <ilsimo>2005-10-23 21:47:17 +0000
committerilsimo <ilsimo>2005-10-23 21:47:17 +0000
commite7dbdea767e3478c9255b15c3fe6f928f253c438 (patch)
treed42b4ae832f1cdbacf0ac510b52a1065b4ee0b37 /sesman
parent4e8b16669ec451ec73d05c51defc3982267da892 (diff)
downloadxrdp-proprietary-e7dbdea767e3478c9255b15c3fe6f928f253c438.tar.gz
xrdp-proprietary-e7dbdea767e3478c9255b15c3fe6f928f253c438.zip
Adding logging functions and adding log options in config files
Diffstat (limited to 'sesman')
-rw-r--r--sesman/Makefile6
-rw-r--r--sesman/config.c120
-rw-r--r--sesman/config.h54
-rw-r--r--sesman/env.c18
-rw-r--r--sesman/sesman.c37
-rw-r--r--sesman/sesman.h1
-rw-r--r--sesman/sesman.ini6
-rw-r--r--sesman/sesrun.c2
-rw-r--r--sesman/session.c13
-rw-r--r--sesman/sig.c22
10 files changed, 205 insertions, 74 deletions
diff --git a/sesman/Makefile b/sesman/Makefile
index 38255c7e..a9b4ef04 100644
--- a/sesman/Makefile
+++ b/sesman/Makefile
@@ -3,13 +3,15 @@ SESMANOBJ = sesman.o config.o tcp.o sig.o session.o env.o \
../common/os_calls.o \
../common/d3des.o \
../common/list.o \
- ../common/file.o
+ ../common/file.o \
+ ../common/log.o
SESRUNOBJ = sesrun.o config.o tcp.o \
../common/os_calls.o \
../common/d3des.o \
../common/list.o \
- ../common/file.o
+ ../common/file.o \
+ ../common/log.o
CFLAGS = -Wall -O2 -I../common
LDFLAGS = -L /usr/gnu/lib
diff --git a/sesman/config.c b/sesman/config.c
index a42e3d03..c58daed1 100644
--- a/sesman/config.c
+++ b/sesman/config.c
@@ -24,16 +24,26 @@
#include "sesman.h"
/******************************************************************************/
+static int text2bool(char* s)
+{
+ if (0 == g_strncasecmp(s, "1", 1) ||
+ 0 == g_strncasecmp(s, "true", 4) ||
+ 0 == g_strncasecmp(s, "yes", 3))
+ {
+ return 1;
+ }
+ return 0;
+}
+
+/******************************************************************************/
/* returns error */
int DEFAULT_CC
-config_read(struct sesman_config* cfg)
+config_read(struct config_sesman* cfg)
{
- int i;
int fd;
struct list* sec;
struct list* param_n;
struct list* param_v;
- char* buf;
fd = g_file_open(SESMAN_CFG_FILE);
if (-1 == fd)
@@ -41,7 +51,7 @@ config_read(struct sesman_config* cfg)
g_printf("sesman: error reading config: %s\n\r", SESMAN_CFG_FILE);
return 1;
}
- g_memset(cfg, 0, sizeof(struct sesman_config));
+ g_memset(cfg, 0, sizeof(struct config_sesman));
sec = list_create();
sec->auto_free = 1;
file_read_sections(fd, sec);
@@ -49,41 +59,105 @@ config_read(struct sesman_config* cfg)
param_n->auto_free = 1;
param_v = list_create();
param_v->auto_free = 1;
- file_read_section(fd, SESMAN_CFG_GLOBALS, param_n, param_v);
+
+ /* read global config */
+ config_read_globals(fd, cfg, param_n, param_v);
+
+ /* read logging config */
+ config_read_logging(fd, &(cfg->log), param_n, param_v);
+
+ /* cleanup */
+ list_delete(sec);
+ list_delete(param_v);
+ list_delete(param_n);
+ return 0;
+}
+
+int DEFAULT_CC
+config_read_globals(int file, struct config_sesman* cf, struct list* param_n, struct list* param_v)
+{
+ int i;
+ char* buf;
+
+ list_clear(param_v);
+ list_clear(param_n);
+
+ file_read_section(file, SESMAN_CFG_GLOBALS, param_n, param_v);
for (i = 0; i < param_n->count; i++)
{
buf = (char*)list_get_item(param_n, i);
if (0 == g_strncasecmp(buf, SESMAN_CFG_DEFWM, 20))
{
- g_strncpy(cfg->default_wm, (char*)list_get_item(param_v, i), 31);
+ g_strncpy(cf->default_wm, (char*)list_get_item(param_v, i), 31);
}
else if (0 == g_strncasecmp(buf, SESMAN_CFG_USERWM, 20))
{
- g_strncpy(cfg->user_wm, (char*)list_get_item(param_v, i), 31);
+ g_strncpy(cf->user_wm, (char*)list_get_item(param_v, i), 31);
}
else if (0 == g_strncasecmp(buf, SESMAN_CFG_ENABLE_USERWM, 20))
{
- buf = (char*)list_get_item(param_v, i);
- if (0 == g_strncasecmp(buf, "1", 1) ||
- 0 == g_strncasecmp(buf, "true", 4) ||
- 0 == g_strncasecmp(buf, "yes", 3))
- {
- cfg->enable_user_wm = 1;
- }
+ cf->enable_user_wm = text2bool((char*) list_get_item(param_v, i));
}
else if (0 == g_strncasecmp(buf, SESMAN_CFG_PORT, 20))
{
- g_strncpy(cfg->listen_port, (char*)list_get_item(param_v, i), 15);
+ g_strncpy(cf->listen_port, (char*)list_get_item(param_v, i), 15);
}
}
+
g_printf("sesman config:\n\r");
- g_printf("\tListenPort: %s\n\r", cfg->listen_port);
- g_printf("\tEnableUserWindowManager: %i\n\r", cfg->enable_user_wm);
- g_printf("\tUserWindowManager: %s\n\r", cfg->user_wm);
- g_printf("\tDefaultWindowManager: %s\n\r", cfg->default_wm);
- /* cleanup */
- list_delete(sec);
- list_delete(param_v);
- list_delete(param_n);
+ g_printf("\tListenPort: %s\n\r", cf->listen_port);
+ g_printf("\tEnableUserWindowManager: %i\n\r", cf->enable_user_wm);
+ g_printf("\tUserWindowManager: %s\n\r", cf->user_wm);
+ g_printf("\tDefaultWindowManager: %s\n\r", cf->default_wm);
+
+ return 0;
+}
+
+int DEFAULT_CC
+config_read_logging(int file, struct log_config* lc, struct list* param_n, struct list* param_v)
+{
+ int i;
+ char* buf;
+
+ list_clear(param_v);
+ list_clear(param_n);
+
+ /* setting defaults */
+ lc->program_name = g_strdup("sesman");
+ lc->log_file = 0;
+ lc->fd = 0;
+ lc->log_level = LOG_LEVEL_DEBUG;
+ lc->enable_syslog = 0;
+ lc->syslog_level = LOG_LEVEL_DEBUG;
+
+ file_read_section(file, SESMAN_CFG_LOGGING, param_n, param_v);
+ for (i = 0; i < param_n->count; i++)
+ {
+ buf = (char*)list_get_item(param_n, i);
+ if (0 == g_strncasecmp(buf, SESMAN_CFG_LOG_FILE, 20))
+ {
+ lc->log_file = g_strdup((char*)list_get_item(param_v, i));
+ }
+ if (0 == g_strncasecmp(buf, SESMAN_CFG_LOG_LEVEL, 20))
+ {
+ lc->log_level = log_text2level((char*)list_get_item(param_v, i));
+ }
+ if (0 == g_strncasecmp(buf, SESMAN_CFG_LOG_ENABLE_SYSLOG, 20))
+ {
+ lc->enable_syslog = text2bool((char*)list_get_item(param_v, i));
+ }
+ if (0 == g_strncasecmp(buf, SESMAN_CFG_LOG_SYSLOG_LEVEL, 20))
+ {
+ lc->syslog_level = log_text2level((char*)list_get_item(param_v, i));
+ }
+ }
+
+ g_printf("logging configuration:\n\r");
+ g_printf("\tLogFile: %s\n\r",lc->log_file);
+ g_printf("\tLogLevel: %i\n\r", lc->log_level);
+ g_printf("\tEnableSyslog: %i\n\r", lc->enable_syslog);
+ g_printf("\tSyslogLevel: %i\n\r", lc->syslog_level);
+
return 0;
}
+
diff --git a/sesman/config.h b/sesman/config.h
index 4281b287..af7b798f 100644
--- a/sesman/config.h
+++ b/sesman/config.h
@@ -22,19 +22,31 @@
#ifndef CONFIG_H
#define CONFIG_H
-#define SESMAN_CFG_FILE "./sesman.ini"
-#define SESMAN_CFG_GLOBALS "Globals"
-#define SESMAN_CFG_DEFWM "DefaultWindowManager"
-#define SESMAN_CFG_PORT "ListenPort"
-#define SESMAN_CFG_ENABLE_USERWM "EnableUserWindowManager"
-#define SESMAN_CFG_USERWM "UserWindowManager"
-
-struct sesman_config
+#include "arch.h"
+#include "list.h"
+#include "log.h"
+
+#define SESMAN_CFG_FILE "./sesman.ini"
+
+#define SESMAN_CFG_GLOBALS "Globals"
+#define SESMAN_CFG_DEFWM "DefaultWindowManager"
+#define SESMAN_CFG_PORT "ListenPort"
+#define SESMAN_CFG_ENABLE_USERWM "EnableUserWindowManager"
+#define SESMAN_CFG_USERWM "UserWindowManager"
+
+#define SESMAN_CFG_LOGGING "Logging"
+#define SESMAN_CFG_LOG_FILE "LogFile"
+#define SESMAN_CFG_LOG_LEVEL "LogLevel"
+#define SESMAN_CFG_LOG_ENABLE_SYSLOG "EnableSyslog"
+#define SESMAN_CFG_LOG_SYSLOG_LEVEL "SyslogLevel"
+
+struct config_sesman
{
char listen_port[16];
int enable_user_wm;
char default_wm[32];
char user_wm[32];
+ struct log_config log;
};
/**
@@ -47,6 +59,30 @@ struct sesman_config
*
*/
int DEFAULT_CC
-config_read(struct sesman_config* cfg);
+config_read(struct config_sesman* cfg);
+
+/**
+ *
+ * Reads sesman configuration
+ *
+ * @param cfg pointer to configuration object to be replaced
+ *
+ * @return 0 on success, 1 on failure
+ *
+ */
+int DEFAULT_CC
+config_read_globals(int file, struct config_sesman* cf, struct list* param_n, struct list* param_v);
+
+/**
+ *
+ * Reads sesman configuration
+ *
+ * @param cfg pointer to configuration object to be replaced
+ *
+ * @return 0 on success, 1 on failure
+ *
+ */
+int DEFAULT_CC
+config_read_logging(int file, struct log_config* lc, struct list* param_n, struct list* param_v);
#endif
diff --git a/sesman/env.c b/sesman/env.c
index 9ea5d6bd..1049d6a5 100644
--- a/sesman/env.c
+++ b/sesman/env.c
@@ -23,22 +23,9 @@
*/
-//#include "d3des.h"
-//#include "arch.h"
-//#include "parse.h"
-//#include "os_calls.h"
#include "sesman.h"
-//#include "config.h"
-//#include "tcp.h"
-//#include "sig.h"
-//#include "session.h"
-//#include "env.h"
-//int g_sck;
-//extern int g_pid;
extern unsigned char g_fixedkey[8];
-//struct session_item g_session_items[100]; /* sesman.h */
-//struct sesman_config g_cfg; /* config.h */
/******************************************************************************/
int DEFAULT_CC
@@ -54,6 +41,7 @@ env_check_password_file(char* filename, char* password)
fd = g_file_open(filename);
if (fd == 0)
{
+ log_message(LOG_LEVEL_WARNING, "can't read vnc password file - %s", filename);
return 1;
}
g_file_write(fd, encryptedPasswd, 8);
@@ -104,5 +92,9 @@ env_set_user(char* username, char* passwd_file, int display)
}
}
}
+ else
+ {
+ log_message(LOG_LEVEL_ERROR, "error getting user info for user %s", username);
+ }
return error;
}
diff --git a/sesman/sesman.c b/sesman/sesman.c
index c13cea16..e6bcf295 100644
--- a/sesman/sesman.c
+++ b/sesman/sesman.c
@@ -28,7 +28,7 @@ int g_sck;
int g_pid;
unsigned char g_fixedkey[8] = { 23, 82, 107, 6, 35, 78, 88, 7 };
struct session_item g_session_items[100]; /* sesman.h */
-struct sesman_config g_cfg; /* config.h */
+struct config_sesman g_cfg; /* config.h */
/******************************************************************************/
static void DEFAULT_CC
@@ -75,6 +75,27 @@ main(int argc, char** argv)
struct session_item* s_item;
long data;
+ if (0 != config_read(&g_cfg))
+ {
+ g_printf("error reading config. quitting.\n\r");
+ return 1;
+ }
+
+ error = log_start(g_cfg.log.program_name, g_cfg.log.log_file, g_cfg.log.log_level,
+ g_cfg.log.enable_syslog, g_cfg.log.syslog_level);
+
+ if (error != LOG_STARTUP_OK)
+ {
+ switch (error)
+ {
+ case LOG_ERROR_MALLOC:
+ g_printf("error on malloc. cannot start logging. quitting.\n\r");
+ case LOG_ERROR_FILE_OPEN:
+ g_printf("error opening log file. quitting.\n\r");
+ }
+ return 1;
+ }
+
/* start of daemonizing code */
g_pid = g_fork();
@@ -92,12 +113,6 @@ main(int argc, char** argv)
g_file_open("/dev/null");
/* end of daemonizing code */
- if (0 != config_read(&g_cfg))
- {
- g_printf("sesman: error reading config. quitting.\n\r");
- return 1;
- }
-
g_memset(&g_session_items, 0, sizeof(g_session_items));
g_pid = g_getpid();
g_signal(1, sig_sesman_reload_cfg); /* SIGHUP */
@@ -111,7 +126,8 @@ main(int argc, char** argv)
init_stream(in_s, 8192);
make_stream(out_s);
init_stream(out_s, 8192);
- g_printf("listening\n");
+
+ log_message(LOG_LEVEL_INFO, "listening...");
g_sck = g_tcp_socket();
g_tcp_set_non_blocking(g_sck);
error = g_tcp_bind(g_sck, g_cfg.listen_port);
@@ -196,13 +212,12 @@ main(int argc, char** argv)
}
else
{
- g_printf("listen error\n");
+ log_message(LOG_LEVEL_ERROR, "listen error");
}
}
else
{
- g_printf("bind error\n");
- perror("ilbind ");
+ log_message(LOG_LEVEL_ERROR, "bind error");
}
g_tcp_close(g_sck);
free_stream(in_s);
diff --git a/sesman/sesman.h b/sesman/sesman.h
index ede6b015..d61e004c 100644
--- a/sesman/sesman.h
+++ b/sesman/sesman.h
@@ -26,6 +26,7 @@
#include "arch.h"
#include "parse.h"
#include "os_calls.h"
+#include "log.h"
#include "env.h"
#include "auth.h"
#include "config.h"
diff --git a/sesman/sesman.ini b/sesman/sesman.ini
index 079f99d5..7b26059a 100644
--- a/sesman/sesman.ini
+++ b/sesman/sesman.ini
@@ -3,3 +3,9 @@ ListenPort=3350
EnableUserWindowManager=1
UserWindowManager=startwm.sh
DefaultWindowManager=startwm.sh
+
+[Logging]
+LogFile=/usr/local/xrdp/sesman.log
+LogLevel=DEBUG
+EnableSyslog=0
+SyslogLevel=DEBUG
diff --git a/sesman/sesrun.c b/sesman/sesrun.c
index a57df485..0fc63023 100644
--- a/sesman/sesrun.c
+++ b/sesman/sesrun.c
@@ -25,7 +25,7 @@
int g_sck;
int g_pid;
-struct sesman_config g_cfg; /* config.h */
+struct config_sesman g_cfg; /* config.h */
/******************************************************************************/
int DEFAULT_CC
diff --git a/sesman/session.c b/sesman/session.c
index 572114db..b02dec69 100644
--- a/sesman/session.c
+++ b/sesman/session.c
@@ -21,16 +21,11 @@
*/
-//#include "d3des.h"
-//#include "arch.h"
-//#include "os_calls.h"
#include "sesman.h"
-//#include "config.h"
-//#include "env.h"
extern unsigned char g_fixedkey[8];
extern struct session_item g_session_items[100]; /* sesman.h */
-extern struct sesman_config g_cfg; /* config.h */
+extern struct config_sesman g_cfg; /* config.h */
/******************************************************************************/
struct session_item* DEFAULT_CC
@@ -126,11 +121,12 @@ session_start(int width, int height, int bpp, char* username, char* password,
so we try running the default window manager */
g_sprintf(text, "%s/%s", cur_dir, g_cfg.default_wm);
g_execlp3(text, g_cfg.default_wm, 0);
+
/* still a problem starting window manager just start xterm */
g_execlp3("xterm", "xterm", 0);
/* should not get here */
}
- g_printf("error starting window manager\n");
+ log_message(LOG_LEVEL_ALWAYS,"error starting window manager %s - pid %d", username, g_getpid());
g_exit(0);
}
else /* parent */
@@ -145,8 +141,9 @@ session_start(int width, int height, int bpp, char* username, char* password,
env_check_password_file(passwd_file, password);
g_execlp11("Xvnc", "Xvnc", screen, "-geometry", geometry,
"-depth", depth, "-bs", "-rfbauth", passwd_file, 0);
+
/* should not get here */
- g_printf("error\n");
+ log_message(LOG_LEVEL_ALWAYS,"error doing execve for user %s - pid %d",username,g_getpid());
g_exit(0);
}
else /* parent */
diff --git a/sesman/sig.c b/sesman/sig.c
index 6696735e..cfc101c1 100644
--- a/sesman/sig.c
+++ b/sesman/sig.c
@@ -33,7 +33,7 @@
extern int g_sck;
extern int g_pid;
-extern struct sesman_config g_cfg;
+extern struct config_sesman g_cfg;
/**
*
@@ -45,12 +45,16 @@ extern struct sesman_config g_cfg;
void DEFAULT_CC
sig_sesman_shutdown(int sig)
{
+ log_message(LOG_LEVEL_INFO, "shutting down sesman %d",1);
+
if (g_getpid() != g_pid)
{
+ LOG_DBG("g_getpid() [%d] differs from g_pid [%d]", (g_getpid()), g_pid);
return;
}
- g_printf("shutting down\n\r");
- g_printf("signal %d pid %d\n\r", sig, g_getpid());
+
+ LOG_DBG(" - getting signal %d pid %d", sig, g_getpid());
+
g_tcp_close(g_sck);
}
@@ -64,19 +68,23 @@ sig_sesman_shutdown(int sig)
void DEFAULT_CC
sig_sesman_reload_cfg(int sig)
{
- struct sesman_config cfg;
+ struct config_sesman cfg;
+
+ log_message(LOG_LEVEL_WARNING, "receiving SIGHUP %d", 1);
if (g_getpid() != g_pid)
{
+ LOG_DBG("g_getpid() [%d] differs from g_pid [%d]", g_getpid(), g_pid);
return;
}
- g_printf("sesman: received SIGHUP\n\r");
+
if (config_read(&cfg) != 0)
{
- g_printf("sesman: error reading config. keeping old cfg.\n\r");
+ log_message(LOG_LEVEL_ERROR, "error reading config - keeping old cfg");
return;
}
g_cfg = cfg;
- g_printf("sesman: configuration reloaded\n\r");
+
+ log_message(LOG_LEVEL_INFO, "configuration reloaded");
}