diff --git a/sesman/libscp_types.h b/sesman/libscp_types.h index 27ff9751..c7b1dea0 100644 --- a/sesman/libscp_types.h +++ b/sesman/libscp_types.h @@ -34,6 +34,7 @@ #include "os_calls.h" #include "parse.h" #include "arch.h" +#include "log.h" //#warning sesman requires its own tcp streaming functions for threading safety #include "tcp.h" @@ -57,6 +58,8 @@ #define SCP_COMMAND_SET_MANAGE 0x0001 #define SCP_COMMAND_SET_RSR 0x0002 +#define free_session(s) {g_free((s)->username); g_free((s)->password); g_free((s)->hostname); g_free(s);} + struct SCP_CONNECTION { int in_sck; @@ -98,7 +101,15 @@ struct SCP_DISCONNECTED_SESSION enum SCP_CLIENT_STATES_E { SCP_CLIENT_STATE_OK, - SCP_CLIENT_STATE_NETWORK_ERR + SCP_CLIENT_STATE_NETWORK_ERR, + SCP_CLIENT_STATE_VERSION_ERR, + SCP_CLIENT_STATE_SEQUENCE_ERR, + SCP_CLIENT_STATE_INTERNAL_ERR, + SCP_CLIENT_STATE_SESSION_LIST, + SCP_CLIENT_STATE_RESEND_CREDENTIALS, + SCP_CLIENT_STATE_CONNECTION_DENIED, + SCP_CLIENT_STATE_PWD_CHANGE_REQ, + SCP_CLIENT_STATE_RECONNECT }; enum SCP_SERVER_STATES_E @@ -115,3 +126,4 @@ enum SCP_SERVER_STATES_E }; #endif + diff --git a/sesman/session.c b/sesman/session.c index 5fe72555..99ff2300 100644 --- a/sesman/session.c +++ b/sesman/session.c @@ -26,6 +26,7 @@ */ #include "sesman.h" +#include "libscp_types.h" extern unsigned char g_fixedkey[8]; extern struct config_sesman g_cfg; /* config.h */ @@ -468,3 +469,73 @@ session_get_bypid(int pid) return 0; } +/******************************************************************************/ +struct SCP_DISCONNECTED_SESSION* +session_get_byuser(char* user, int* cnt) +{ + struct session_chain* tmp; + struct SCP_DISCONNECTED_SESSION* sess; + int count; + int index; + + count=0; + + /*THREAD-FIX require chain lock */ + lock_chain_acquire(); + + tmp = g_sessions; + while (tmp != 0) + { +#warning FIXME: we should get only disconnected sessions! + if (!g_strncasecmp(user, tmp->item->name, 256)) + { + count++; + } + + /* go on */ + tmp=tmp->next; + } + + if (count==0) + { + (*cnt)=0; + /*THREAD-FIX release chain lock */ + lock_chain_release(); + return 0; + } + + /* malloc() an array of disconnected sessions */ + sess=g_malloc(count * sizeof(struct SCP_DISCONNECTED_SESSION),1); + if (sess==0) + { + (*cnt)=0; + /*THREAD-FIX release chain lock */ + lock_chain_release(); + return 0; + } + + tmp = g_sessions; + index = 0; + while (tmp != 0) + { + (sess[index]).SID=tmp->item->pid; + (sess[index]).type=tmp->item->type; + (sess[index]).height=tmp->item->height; + (sess[index]).width=tmp->item->width; + (sess[index]).bpp=tmp->item->bpp; +#warning FIXME: setting idle times and such + (sess[index]).idle_days=0; + (sess[index]).idle_hours=0; + (sess[index]).idle_minutes=0; + + /* go on */ + tmp=tmp->next; + index++; + } + + /*THREAD-FIX release chain lock */ + lock_chain_release(); + (*cnt)=count; + return sess; +} + diff --git a/sesman/session.h b/sesman/session.h index bc499d97..8c3a2b6f 100644 --- a/sesman/session.h +++ b/sesman/session.h @@ -29,6 +29,8 @@ #ifndef SESSION_H #define SESSION_H +#include "libscp_types.h" + #define SESMAN_SESSION_TYPE_XRDP 1 #define SESMAN_SESSION_TYPE_XVNC 2 @@ -111,5 +113,15 @@ session_kill(int pid); struct session_item* DEFAULT_CC session_get_bypid(int pid); +/** + * + * @brief retrieves a session's descriptor + * @param pid the session pid + * @return a pointer to the session descriptor on success, NULL otherwise + * + */ +struct SCP_DISCONNECTED_SESSION* +session_get_byuser(char* user, int* cnt); + #endif diff --git a/sesman/tcp.c b/sesman/tcp.c index 372ec491..3bb1ed09 100644 --- a/sesman/tcp.c +++ b/sesman/tcp.c @@ -32,9 +32,11 @@ int DEFAULT_CC tcp_force_recv(int sck, char* data, int len) { int rcvd; - int block; +#ifndef LIBSCP_CLIENT + int block; block = lock_fork_critical_section_start(); +#endif while (len > 0) { @@ -61,7 +63,9 @@ tcp_force_recv(int sck, char* data, int len) } } +#ifndef LIBSCP_CLIENT lock_fork_critical_section_end(block); +#endif return 0; } @@ -71,9 +75,11 @@ int DEFAULT_CC tcp_force_send(int sck, char* data, int len) { int sent; - int block; +#ifndef LIBSCP_CLIENT + int block; block = lock_fork_critical_section_start(); +#endif while (len > 0) { @@ -100,7 +106,9 @@ tcp_force_send(int sck, char* data, int len) } } +#ifndef LIBSCP_CLIENT lock_fork_critical_section_end(block); +#endif return 0; }