Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Allow a path to be specified for the chansrv log file #3345

Merged
merged 2 commits into from
Dec 16, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 27 additions & 1 deletion docs/man/sesman.ini.5.in
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,33 @@ stdout. Use for debugging only\fR

It is ignored in the [ChansrvLogging] section
since the channel server creates one log file per display and instead uses the
following log file naming convention \fIxrdp-chansrv.${DISPLAY}.log\fR
following log file naming convention \fIxrdp-chansrv.${DISPLAY}.log\fR. For
details of the chansrv log file location, see \fBLogFilePath\fR.

.TP
\fBLogFilePath\fR=\fIstring\fR
Directory for storing the chansrv log file. This setting only applies to
chansrv. The sesman log file is always created in \fI@localstatedir@/log\fR.

Created if it doesn't exist.
If first character is not a '/', this is relative to $HOME, where
chansrv is normally started.

.RS
The following substitutions are made in this string:-
%U - Username
%u - Numeric UID
%% - Percent character

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 parameter 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

.TP
\fBLogLevel\fR=\fIlevel\fR
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
54 changes: 53 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 @@ -248,6 +249,45 @@ read_config_chansrv(log_func_t logmsg,
return error;
}

/***************************************************************************//**
* Reads the config values we need from the [ChansrvLogging] section
*
* @param logmsg Function to use to log messages
* @param names List of definitions in the section
* @params values List of corresponding values for the names
* @params cfg Pointer to structure we're filling in
*
* @return 0 for success
*/
static int
read_config_chansrv_logging(log_func_t logmsg,
struct list *names, struct list *values,
struct config_chansrv *cfg)
{
int error = 0;
int index;

for (index = 0; index < names->count; ++index)
{
const char *name = (const char *)list_get_item(names, index);
const char *value = (const char *)list_get_item(values, index);

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;
}

/***************************************************************************//**
* @brief returns a config block with default values
*
Expand All @@ -259,9 +299,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 +321,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 @@ -329,6 +372,12 @@ config_read(int use_logger, const char *sesman_ini)
error = read_config_chansrv(logmsg, names, values, cfg);
}

if (!error &&
file_read_section(fd, "ChansrvLogging", names, values) == 0)
{
error = read_config_chansrv_logging(logmsg, names, values, cfg);
}

list_delete(names);
list_delete(values);
}
Expand Down Expand Up @@ -375,6 +424,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[0]) ? config->log_file_path : "<default>");
}

/******************************************************************************/
Expand All @@ -385,6 +436,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 ([ChansrvLogging]) */
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 @@ -204,6 +204,11 @@ EnableSyslog=true
#EnableConsole=false
#ConsoleLevel=INFO
#EnableProcessId=false
; 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

[ChansrvLoggingPerLogger]
; Note: per logger configuration is only used if xrdp is built with
Expand Down
Loading