--- lightdm-1.19.3/src/session-child.c.~6~ 2016-08-12 20:29:20.896781907 +0300 +++ lightdm-1.19.3/src/session-child.c 2016-08-12 20:34:18.800499967 +0300 @@ -17,6 +17,7 @@ #include #include #include +#include #if HAVE_LIBAUDIT #include @@ -32,6 +33,8 @@ #include "x-authority.h" #include "configuration.h" +#define MAX_HOSTNAME 256 + /* Child process being run */ static GPid child_pid = 0; @@ -113,6 +113,82 @@ privileges_reclaim (); } +/* + /usr/bin/audioctl save-controls -d $AUDIOCTL_SAVE_DEVICE \ + -f $AUDIOCTL_SAVE_DIR/audioctl-$AUDIOCTL_SAVE_HOSTNAME-$AUDIOCTL_SAVE_DEVICE +*/ +#define AUDIO_SETTINGS_SAVE "/usr/bin/audioctl save-controls -d %s -f \"%s/audioctl-%s-%s\"" + +static void +save_audio_settings(User *user) +{ + char hostname[MAX_HOSTNAME]; + char *user_name,*save_dir; + struct passwd *pwd; + struct stat st,st_sd; + + if(gethostname(hostname,MAX_HOSTNAME)) + return; + + user_name=user_get_name(user); + pwd=getpwnam(user_name); + if(pwd == NULL || pwd->pw_dir == NULL) + return; + + if(stat("/dev/audio", &st)) + return; + + if(st.st_uid == user_get_uid(user)) { + gboolean drop_privileges; + int fd=-1, i; + oss_sysinfo si; + + drop_privileges = geteuid () == 0; + if (drop_privileges) + privileges_drop (user_get_uid (user), user_get_gid (user)); + + save_dir=g_strdup_printf("%s/.audioctl", pwd->pw_dir); + if (!save_dir) + return; + + if(stat(save_dir, &st_sd)) { + if(mkdir(save_dir, S_IRWXU)){ + g_free(save_dir); + return; + } + } + + if ((fd = open("/dev/mixer", O_RDWR)) < 0){ + g_free(save_dir); + return; + } + + if (ioctl(fd, SNDCTL_SYSINFO, &si) < 0) { + g_free(save_dir); + return; + } + + for (i = 0; i < si.nummixers; i++) { + struct stat sbuf; + oss_mixerinfo mixer; + char *command; + + mixer.dev = i; + if (ioctl(fd, SNDCTL_MIXERINFO, &mixer) != 0) + continue; + + command=g_strdup_printf(AUDIO_SETTINGS_SAVE, mixer.name, save_dir, hostname, mixer.name); + system(command); + g_free(command); + } + + if (drop_privileges) + privileges_reclaim (); + + } + g_free(save_dir); +} + static gchar * read_string (void) { @@ -827,6 +827,9 @@ run_linc_cleanup(user); + if (g_strcmp0 (pam_getenv (pam_handle, "XDG_SESSION_CLASS"), "greeter") != 0) + save_audio_settings(user); + if (!remote_host_name && !g_strcmp0(xdisplay,":0") && (g_str_has_prefix (tty, "/dev/vt/") || !g_strcmp0(tty,"/dev/console"))){ di_devperm_logout (tty); }