libbarrelfish: Adjust libbarrelfish to new terminal API and remove old API.
[barrelfish] / lib / barrelfish / terminal.c
1 /**
2  * \file
3  * \brief Terminal emulator.
4  */
5
6 /*
7  * Copyright (c) 2007, 2008, 2010, 2012, ETH Zurich.
8  * All rights reserved.
9  *
10  * This file is distributed under the terms in the attached LICENSE file.
11  * If you do not find this file, copies can be found by writing to:
12  * ETH Zurich D-INFK, CAB F.78, Universitaetstr. 6, CH-8092 Zurich,
13  * Attn: Systems Group.
14  */
15
16 #include <stdbool.h>
17
18 #include <barrelfish/barrelfish.h>
19 #include <barrelfish/terminal.h>
20 #include <term/client/client_blocking.h>
21
22 struct terminal_state {
23     /**
24      * Is domain part of a session or a daemon?
25      */
26     bool session_domain;
27
28     /**
29      * Terminal device used from stdin, stdout and stderr.
30      */
31     struct term_client client;
32 };
33
34 size_t terminal_write(const char *data, size_t length)
35 {
36     errval_t err;
37     size_t written = 0;
38     struct terminal_state *state = get_terminal_state();
39
40     if (state != NULL && state->session_domain) {
41         err = term_client_blocking_write(&state->client, data, length,
42                                          &written);
43         assert(err_is_ok(err));
44         return written;
45     } else {
46         sys_print(data, length);
47         return length;
48     }
49 }
50
51 size_t terminal_read(char *data, size_t count)
52 {
53     errval_t err;
54     size_t read = 0;
55     struct terminal_state *state = get_terminal_state();
56
57     if (state->session_domain) {
58         err = term_client_blocking_read(&state->client, data, count, &read);
59         assert(err_is_ok(err));
60         return read;
61     } else {
62         /**
63          * Only domains that are part of a session can read from a terminal
64          * device.
65          */
66         assert(!"Daemons can't read from a terminal.");
67     }
68 }
69
70 errval_t terminal_init(void)
71 {
72     errval_t err;
73     struct capability cap;
74
75     /* Allocate and initialize dispatcher-specific state. */
76     struct terminal_state *state = malloc(sizeof(struct terminal_state));
77     if (!state) {
78         return LIB_ERR_MALLOC_FAIL;
79     }
80     set_terminal_state(state);
81
82     /* Check if domain is part of a session. */
83     err = debug_cap_identify(cap_sessionid, &cap);
84     if (err_is_ok(err)) {
85         /* Initialize libterm_client. */
86         err = term_client_blocking_init(&state->client, cap_sessionid);
87         if (err_is_fail(err)) {
88             return err;
89         }
90
91         state->session_domain = true;
92         return SYS_ERR_OK;
93     } else {
94         state->session_domain = false;
95         return SYS_ERR_OK;
96     }
97 }
98
99 void terminal_exit(void)
100 {
101     struct terminal_state *state = get_terminal_state();
102
103     if (state != NULL && state->session_domain) {
104         term_client_blocking_exit(&state->client);
105     }
106 }