Skip to content

Commit

Permalink
Allow a path to be specified for the chansrv log
Browse files Browse the repository at this point in the history
This is useful for NFS-mounted home directories, where hosts
may otherwise produce colliding chansrv log file names

(cherry picked from commit cfc2e36)
  • Loading branch information
matt335672 committed Dec 16, 2024
1 parent e07cc72 commit 2f7be3f
Show file tree
Hide file tree
Showing 5 changed files with 88 additions and 19 deletions.
22 changes: 22 additions & 0 deletions docs/man/sesman.ini.5.in
Original file line number Diff line number Diff line change
Expand Up @@ -409,6 +409,28 @@ Sets the duration(msec). Sound data is not send to client during \fInumber\fR
millisecond(s) after close message is sent, when AAC/MP3 is selected.
If set to 0, all the data is sent. If not specified, defaults to \fI1000\fR.

.TP
\fBLogFilePath\fR=\fIstring\fR
Directory for storing the chansrv log file
Created if it doesn't exist.
If first character is not a '/', this is relative to $HOME.
.P
.RS
The following substitutions are made in this string:-
%U - Username
%u - Numeric UID
%% - Percent character
.P
This is most useful if you are using NFS-mounted home directories, and
wish to move the chansrv log file to the local disk.

If this isn't specified, the log file is stored in one of the following
locations :-
- $CHANSRV_LOG_PATH
- $XDG_DATA_HOME/xrdp
- $HOME/.local/share/xrdp
.RE

.SH "SESSIONS VARIABLES"
All entries in the \fB[SessionVariables]\fR section are set as
environment variables in the user's session.
Expand Down
57 changes: 39 additions & 18 deletions sesman/chansrv/chansrv.c
Original file line number Diff line number Diff line change
Expand Up @@ -1694,27 +1694,49 @@ 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))
{
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");
Expand Down Expand Up @@ -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)
{
Expand All @@ -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 */
Expand Down
20 changes: 19 additions & 1 deletion sesman/chansrv/chansrv_config.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
*/
Expand Down Expand Up @@ -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;
Expand All @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -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>");
}

/******************************************************************************/
Expand All @@ -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);
}
}
3 changes: 3 additions & 0 deletions sesman/chansrv/chansrv_config.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
};


Expand Down
5 changes: 5 additions & 0 deletions sesman/sesman.ini.in
Original file line number Diff line number Diff line change
Expand Up @@ -191,6 +191,11 @@ FileUmask=077
#SoundNumSilentFramesAAC=4
#SoundNumSilentFramesMP3=2
#SoundMsecDoNotSend=1000
; Log file path
; Set this to move the log file away from its default location. You may want
; to do this for (e.g.) NFS-mounted home directories
; See sesman.ini(5) for the format of this parameter
#LogFilePath=/run/user/%u/xrdp

[ChansrvLogging]
; Note: one log file is created per display and the LogFile config value
Expand Down

0 comments on commit 2f7be3f

Please sign in to comment.