I've had weird race conditions when using vlock
together with s2ram
. It
appears suspend to ram wants to switch
VTs, while
vlock
hooks into the switch requests and explicitly disables them. So some of
the time, the machine would not suspend, while at other times, vlock
wouldn't
be able to acquire the VT.
To solve this, I wrote a simple vlock
plugin, which simply clears the lock
mechanism, writes mem
to /sys/power/state
and later reinstates the locking
mechanism. This plugin is called after all
and new
. Thus, the screen will
be locked properly before suspending.
Here's my suspend.c
:
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
/* Include this header file to make sure the types of the dependencies
* and hooks are correct. */
#include "vlock_plugin.h"
#include "../src/console_switch.h"
const char *succeeds[] = { "all", "new", NULL };
const char *depends[] = { "all", "new", NULL };
bool vlock_start(void __attribute__ ((__unused__)) **ctx_ptr)
{
int fd;
unlock_console_switch();
if((fd = open("/sys/power/state", O_WRONLY)) != -1) {
if(write(fd, "mem", 3) == -1)
perror("suspend: write");
close(fd);
}
lock_console_switch();
return true;
}
Simply paste it to the vlock
modules folder, make suspend.so
and copy it to
/usr/lib/vlock/modules
. I now invoke it like this:
env VLOCK_PLUGINS="all new suspend" vlock