Line data Source code
1 : /* 2 : * Copyright (c) 2015 Cisco and/or its affiliates. 3 : * Licensed under the Apache License, Version 2.0 (the "License"); 4 : * you may not use this file except in compliance with the License. 5 : * You may obtain a copy of the License at: 6 : * 7 : * http://www.apache.org/licenses/LICENSE-2.0 8 : * 9 : * Unless required by applicable law or agreed to in writing, software 10 : * distributed under the License is distributed on an "AS IS" BASIS, 11 : * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 : * See the License for the specific language governing permissions and 13 : * limitations under the License. 14 : */ 15 : /* 16 : * unix.h: Unix specific main state 17 : * 18 : * Copyright (c) 2008 Eliot Dresselhaus 19 : * 20 : * Permission is hereby granted, free of charge, to any person obtaining 21 : * a copy of this software and associated documentation files (the 22 : * "Software"), to deal in the Software without restriction, including 23 : * without limitation the rights to use, copy, modify, merge, publish, 24 : * distribute, sublicense, and/or sell copies of the Software, and to 25 : * permit persons to whom the Software is furnished to do so, subject to 26 : * the following conditions: 27 : * 28 : * The above copyright notice and this permission notice shall be 29 : * included in all copies or substantial portions of the Software. 30 : * 31 : * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 32 : * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 33 : * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 34 : * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 35 : * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 36 : * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 37 : * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 38 : */ 39 : 40 : #ifndef included_unix_unix_h 41 : #define included_unix_unix_h 42 : 43 : #include <vppinfra/file.h> 44 : #include <vppinfra/socket.h> 45 : #include <termios.h> 46 : 47 : typedef struct 48 : { 49 : f64 time; 50 : clib_error_t *error; 51 : } unix_error_history_t; 52 : 53 : typedef struct 54 : { 55 : /* Back pointer to main structure. */ 56 : vlib_main_t *vlib_main; 57 : 58 : u32 flags; 59 : /* Run interactively or as daemon (background process). */ 60 : #define UNIX_FLAG_INTERACTIVE (1 << 0) 61 : #define UNIX_FLAG_NODAEMON (1 << 1) 62 : #define UNIX_FLAG_NOSYSLOG (1 << 2) 63 : #define UNIX_FLAG_NOCOLOR (1 << 3) 64 : #define UNIX_FLAG_NOBANNER (1 << 4) 65 : 66 : 67 : /* CLI listen socket. */ 68 : clib_socket_t cli_listen_socket; 69 : 70 : /* Circular buffer of last unix errors. */ 71 : unix_error_history_t error_history[128]; 72 : u32 error_history_index; 73 : u64 n_total_errors; 74 : 75 : /* startup-config filename */ 76 : u8 *startup_config_filename; 77 : 78 : /* runtime directory path */ 79 : u8 *runtime_dir; 80 : 81 : /* pidfile filename */ 82 : u8 *pidfile; 83 : 84 : /* unix config complete */ 85 : volatile int unix_config_complete; 86 : 87 : /* CLI log file. GIGO. */ 88 : u8 *log_filename; 89 : int log_fd; 90 : 91 : /* Don't put CLI connections into character mode */ 92 : int cli_line_mode; 93 : 94 : /* Maximum amount of command line history to keep per session */ 95 : u32 cli_history_limit; 96 : 97 : /* Suppress the welcome banner at CLI session start */ 98 : int cli_no_banner; 99 : 100 : /* Maximum pager buffer size */ 101 : u32 cli_pager_buffer_limit; 102 : 103 : /* Suppress the pager */ 104 : int cli_no_pager; 105 : 106 : /* Store the original state of stdin when it's a tty */ 107 : struct termios tio_stdin; 108 : int tio_isset; 109 : 110 : u32 poll_sleep_usec; 111 : 112 : } unix_main_t; 113 : 114 : /** CLI session events. */ 115 : typedef enum 116 : { 117 : UNIX_CLI_PROCESS_EVENT_READ_READY, /**< A file descriptor has data to be 118 : read. */ 119 : UNIX_CLI_PROCESS_EVENT_QUIT, /**< A CLI session wants to close. */ 120 : } unix_cli_process_event_type_t; 121 : 122 : /* Global main structure. */ 123 : extern unix_main_t unix_main; 124 : extern clib_file_main_t file_main; 125 : 126 : always_inline void 127 682857 : unix_save_error (unix_main_t * um, clib_error_t * error) 128 : { 129 682857 : unix_error_history_t *eh = um->error_history + um->error_history_index; 130 682857 : clib_error_free_vector (eh->error); 131 682857 : eh->error = error; 132 682857 : eh->time = vlib_time_now (um->vlib_main); 133 682857 : um->n_total_errors += 1; 134 682857 : if (++um->error_history_index >= ARRAY_LEN (um->error_history)) 135 5067 : um->error_history_index = 0; 136 682857 : } 137 : 138 : /* Main function for Unix VLIB. */ 139 : int vlib_unix_main (int argc, char *argv[]); 140 : 141 : /* Set prompt for CLI. */ 142 : void vlib_unix_cli_set_prompt (char *prompt); 143 : 144 : static inline unix_main_t * 145 : vlib_unix_get_main (void) 146 : { 147 : return &unix_main; 148 : } 149 : 150 : static inline char * 151 2283 : vlib_unix_get_runtime_dir (void) 152 : { 153 2283 : return (char *) unix_main.runtime_dir; 154 : } 155 : 156 : /* thread stack array; vec_len = max number of threads */ 157 : extern u8 **vlib_thread_stacks; 158 : 159 : /* utils */ 160 : 161 : clib_error_t *foreach_directory_file (char *dir_name, 162 : clib_error_t * (*f) (void *arg, 163 : u8 * path_name, 164 : u8 * file_name), 165 : void *arg, int scan_dirs); 166 : 167 : clib_error_t *vlib_unix_recursive_mkdir (char *path); 168 : 169 : clib_error_t *vlib_unix_validate_runtime_file (unix_main_t * um, 170 : const char *path, 171 : u8 ** full_path); 172 : 173 : #endif /* included_unix_unix_h */ 174 : 175 : /* 176 : * fd.io coding-style-patch-verification: ON 177 : * 178 : * Local Variables: 179 : * eval: (c-set-style "gnu") 180 : * End: 181 : */