]> git.proxmox.com Git - mirror_lxc.git/blob - src/lxc/console.c
autoassign tty number
[mirror_lxc.git] / src / lxc / console.c
1 /*
2 * lxc: linux Container library
3 *
4 * (C) Copyright IBM Corp. 2007, 2008
5 *
6 * Authors:
7 * Daniel Lezcano <dlezcano at fr.ibm.com>
8 *
9 * This library is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Lesser General Public
11 * License as published by the Free Software Foundation; either
12 * version 2.1 of the License, or (at your option) any later version.
13 *
14 * This library is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * Lesser General Public License for more details.
18 *
19 * You should have received a copy of the GNU Lesser General Public
20 * License along with this library; if not, write to the Free Software
21 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 */
23
24 #include <stdio.h>
25 #include <unistd.h>
26 #include <errno.h>
27 #include <sys/types.h>
28 #include <sys/un.h>
29
30 #include "af_unix.h"
31 #include "error.h"
32
33 #include <lxc/log.h>
34
35 lxc_log_define(lxc_console, lxc);
36
37 extern int lxc_console(const char *name, int ttynum, int *fd)
38 {
39 struct sockaddr_un addr = { 0 };
40 int sock, ret = -LXC_ERROR_TTY_EAGAIN;
41
42 snprintf(addr.sun_path, sizeof(addr.sun_path), "@%s", name);
43 addr.sun_path[0] = '\0';
44
45 sock = lxc_af_unix_connect(addr.sun_path);
46 if (sock < 0) {
47 ERROR("failed to connect to the tty service");
48 goto out;
49 }
50
51 ret = lxc_af_unix_send_credential(sock, &ttynum, sizeof(ttynum));
52 if (ret < 0) {
53 SYSERROR("failed to send credentials");
54 goto out_close;
55 }
56
57 ret = lxc_af_unix_recv_fd(sock, fd, &ttynum, sizeof(ttynum));
58 if (ret < 0) {
59 ERROR("failed to connect to the tty");
60 goto out_close;
61 }
62
63 INFO("tty %d allocated", ttynum);
64
65 if (!ret) {
66 ERROR("console denied by '%s'", name);
67 ret = -LXC_ERROR_TTY_DENIED;
68 goto out_close;
69 }
70
71 ret = 0;
72
73 out:
74 return ret;
75 out_close:
76 close(sock);
77 goto out;
78 }