aboutsummaryrefslogtreecommitdiffstats
path: root/src/mds-vt.c
diff options
context:
space:
mode:
authorMattias Andrée <maandree@operamail.com>2014-08-23 16:22:09 +0200
committerMattias Andrée <maandree@operamail.com>2014-08-23 16:22:09 +0200
commite4e21cae006d605387a424c005ce759902cec7f0 (patch)
treeee8c89a15a082f7673a7e2d042175246c0e1b8ce /src/mds-vt.c
parentfull_read returns length (diff)
downloadmds-e4e21cae006d605387a424c005ce759902cec7f0.tar.gz
mds-e4e21cae006d605387a424c005ce759902cec7f0.tar.bz2
mds-e4e21cae006d605387a424c005ce759902cec7f0.tar.xz
read and write vtfile
Signed-off-by: Mattias Andrée <maandree@operamail.com>
Diffstat (limited to 'src/mds-vt.c')
-rw-r--r--src/mds-vt.c62
1 files changed, 60 insertions, 2 deletions
diff --git a/src/mds-vt.c b/src/mds-vt.c
index 57959ba..4c4894a 100644
--- a/src/mds-vt.c
+++ b/src/mds-vt.c
@@ -119,6 +119,64 @@ int __attribute__((const)) preinitialise_server(void)
/**
+ * Write persistent data about the VT and TTY to a file
+ *
+ * @return Zero on success, -1 on error
+ */
+static int write_vt_file(void)
+{
+ char buf[(sizeof(int) + sizeof(struct stat)) / sizeof(char)];
+ int fd, r, old_errno;
+ int* intbuf = (int*)buf;
+
+ *intbuf = display_vt;
+ *(struct stat*)(buf + sizeof(int) / sizeof(char)) = old_vt_stat;
+
+ fd = open(vtfile_path, O_WRONLY | O_CREAT);
+ if (fd < 0)
+ return -1;
+
+ r = full_write(fd, buf, sizeof(buf));
+ old_errno = errno;
+ close(fd);
+ errno = old_errno;
+ return r;
+}
+
+
+/**
+ * Read persistent data about the VT and TTY from a file
+ *
+ * @return Zero on success, -1 on error
+ */
+static int read_vt_file(void)
+{
+ char* buf;
+ size_t len;
+ int fd;
+
+ fd = open(vtfile_path, O_RDONLY);
+ if (fd < 0)
+ return -1;
+
+ buf = full_read(fd, &len);
+ if (buf == NULL)
+ return -1;
+
+ if (len != sizeof(int) + sizeof(struct stat))
+ {
+ eprint("VT file is of wrong size.");
+ errno = 0;
+ return -1;
+ }
+
+ display_vt = *(int*)buf;
+ old_vt_stat = *(struct stat*)(buf + sizeof(int) / sizeof(char));
+ return 0;
+}
+
+
+/**
* This function should initialise the server,
* and it not invoked after a re-exec.
*
@@ -155,12 +213,12 @@ int initialise_server(void)
else if (display_vt < 0)
goto pfail;
display_tty_fd = vt_open(display_vt, &old_vt_stat);
- /* TODO write display_vt and old_vt_stat to vtfile_path */
+ fail_if (write_vt_file() < 0);
fail_if (vt_set_active(display_vt) < 0);
}
else
{
- /* TODO read display_vt and old_vt_stat from vtfile_path */
+ fail_if (read_vt_file() < 0);
vt_is_active = (display_vt == vt_get_active());
fail_if (vt_is_active < 0);
}