Allow a path to be specified for the chansrv log
This is useful for NFS-mounted home directories, where hosts may otherwise produce colliding chansrv log file names (cherry picked from commit cfc2e362b47103bc2c786252f331bb26b6ddecb5)
This commit is contained in:
+39
-18
@@ -1694,20 +1694,32 @@ get_log_path(char *path, int bytes)
|
||||
int rv;
|
||||
|
||||
rv = 1;
|
||||
log_path = g_getenv("CHANSRV_LOG_PATH");
|
||||
if (log_path == 0)
|
||||
if (g_cfg->log_file_path != NULL && g_cfg->log_file_path[0] != '\0')
|
||||
{
|
||||
log_path = g_getenv("XDG_DATA_HOME");
|
||||
if (log_path != 0)
|
||||
char uidstr[64];
|
||||
char username[64];
|
||||
const struct info_string_tag map[] =
|
||||
{
|
||||
g_snprintf(path, bytes, "%s%s", log_path, "/xrdp");
|
||||
if (g_directory_exist(path) || (g_mkdir(path) == 0))
|
||||
{
|
||||
rv = 0;
|
||||
}
|
||||
{'u', uidstr},
|
||||
{'U', username},
|
||||
INFO_STRING_END_OF_LIST
|
||||
};
|
||||
|
||||
int uid = g_getuid();
|
||||
g_snprintf(uidstr, sizeof(uidstr), "%d", uid);
|
||||
if (g_getlogin(username, sizeof(username)) != 0)
|
||||
{
|
||||
/* Fall back to UID */
|
||||
g_strncpy(username, uidstr, sizeof(username) - 1);
|
||||
}
|
||||
|
||||
(void)g_format_info_string(path, bytes, g_cfg->log_file_path, map);
|
||||
if (g_directory_exist(path) || (g_mkdir(path) == 0))
|
||||
{
|
||||
rv = 0;
|
||||
}
|
||||
}
|
||||
else
|
||||
else if ((log_path = g_getenv("CHANSRV_LOG_PATH")) != 0)
|
||||
{
|
||||
g_snprintf(path, bytes, "%s", log_path);
|
||||
if (g_directory_exist(path) || (g_mkdir(path) == 0))
|
||||
@@ -1715,6 +1727,16 @@ get_log_path(char *path, int bytes)
|
||||
rv = 0;
|
||||
}
|
||||
}
|
||||
else if ((log_path = g_getenv("XDG_DATA_HOME")) != 0)
|
||||
{
|
||||
g_snprintf(path, bytes, "%s%s", log_path, "/xrdp");
|
||||
if (g_directory_exist(path) || (g_mkdir(path) == 0))
|
||||
{
|
||||
rv = 0;
|
||||
}
|
||||
}
|
||||
|
||||
// Always fall back to the home directory
|
||||
if (rv != 0)
|
||||
{
|
||||
log_path = g_getenv("HOME");
|
||||
@@ -1830,14 +1852,6 @@ main(int argc, char **argv)
|
||||
g_init("xrdp-chansrv"); /* os_calls */
|
||||
g_memset(g_drdynvcs, 0, sizeof(g_drdynvcs));
|
||||
|
||||
log_path[255] = 0;
|
||||
if (get_log_path(log_path, 255) != 0)
|
||||
{
|
||||
g_writeln("error reading CHANSRV_LOG_PATH and HOME environment variable");
|
||||
main_cleanup();
|
||||
return 1;
|
||||
}
|
||||
|
||||
display_text = g_getenv("DISPLAY");
|
||||
if (display_text == NULL)
|
||||
{
|
||||
@@ -1864,6 +1878,13 @@ main(int argc, char **argv)
|
||||
}
|
||||
config_dump(g_cfg);
|
||||
|
||||
if (get_log_path(log_path, sizeof(log_path)) != 0)
|
||||
{
|
||||
g_writeln("error reading CHANSRV_LOG_PATH and HOME environment variable");
|
||||
main_cleanup();
|
||||
return 1;
|
||||
}
|
||||
|
||||
pid = g_getpid();
|
||||
|
||||
/* starting logging subsystem */
|
||||
|
||||
@@ -46,6 +46,7 @@
|
||||
#define DEFAULT_NUM_SILENT_FRAMES_AAC 4
|
||||
#define DEFAULT_NUM_SILENT_FRAMES_MP3 2
|
||||
#define DEFAULT_MSEC_DO_NOT_SEND 1000
|
||||
#define DEFAULT_LOG_FILE_PATH ""
|
||||
/**
|
||||
* Type used for passing a logging function about
|
||||
*/
|
||||
@@ -243,6 +244,17 @@ read_config_chansrv(log_func_t logmsg,
|
||||
{
|
||||
cfg->msec_do_not_send = strtoul(value, NULL, 0);
|
||||
}
|
||||
else if (g_strcasecmp(name, "LogFilePath") == 0)
|
||||
{
|
||||
g_free(cfg->log_file_path);
|
||||
cfg->log_file_path = g_strdup(value);
|
||||
if (cfg->log_file_path == NULL)
|
||||
{
|
||||
logmsg(LOG_LEVEL_ERROR, "Can't alloc LogFilePath");
|
||||
error = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return error;
|
||||
@@ -259,9 +271,11 @@ new_config(void)
|
||||
/* Do all the allocations at the beginning, then check them together */
|
||||
struct config_chansrv *cfg = g_new0(struct config_chansrv, 1);
|
||||
char *fuse_mount_name = g_strdup(DEFAULT_FUSE_MOUNT_NAME);
|
||||
if (cfg == NULL || fuse_mount_name == NULL)
|
||||
char *log_file_path = g_strdup(DEFAULT_LOG_FILE_PATH);
|
||||
if (cfg == NULL || fuse_mount_name == NULL || log_file_path == NULL)
|
||||
{
|
||||
/* At least one memory allocation failed */
|
||||
g_free(log_file_path);
|
||||
g_free(fuse_mount_name);
|
||||
g_free(cfg);
|
||||
cfg = NULL;
|
||||
@@ -279,6 +293,7 @@ new_config(void)
|
||||
cfg->num_silent_frames_aac = DEFAULT_NUM_SILENT_FRAMES_AAC;
|
||||
cfg->num_silent_frames_mp3 = DEFAULT_NUM_SILENT_FRAMES_MP3;
|
||||
cfg->msec_do_not_send = DEFAULT_MSEC_DO_NOT_SEND;
|
||||
cfg->log_file_path = log_file_path;
|
||||
}
|
||||
|
||||
return cfg;
|
||||
@@ -375,6 +390,8 @@ config_dump(struct config_chansrv *config)
|
||||
g_writeln(" FileMask: 0%o", config->file_umask);
|
||||
g_writeln(" Nautilus 3 Flist Format: %s",
|
||||
g_bool2text(config->use_nautilus3_flist_format));
|
||||
g_writeln(" LogFilePath : %s",
|
||||
(config->log_file_path) ? config->log_file_path : "<default>");
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
@@ -385,6 +402,7 @@ config_free(struct config_chansrv *cc)
|
||||
{
|
||||
g_free(cc->listen_port);
|
||||
g_free(cc->fuse_mount_name);
|
||||
g_free(cc->log_file_path);
|
||||
g_free(cc);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -50,6 +50,9 @@ struct config_chansrv
|
||||
unsigned int num_silent_frames_mp3;
|
||||
/** Do net send sound data afer SNDC_CLOSE is sent. unit is millisecond, setting from sesman.ini */
|
||||
unsigned int msec_do_not_send;
|
||||
|
||||
/** LogFilePath from sesman.ini */
|
||||
char *log_file_path;
|
||||
};
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user