[e16e8f2] | 1 | /* ----------------------------------------------------------------------- * |
---|
| 2 | * |
---|
| 3 | * Copyright 2008-2009 Gene Cumm - All Rights Reserved |
---|
| 4 | * |
---|
| 5 | * This program is free software; you can redistribute it and/or modify |
---|
| 6 | * it under the terms of the GNU General Public License as published by |
---|
| 7 | * the Free Software Foundation, Inc., 53 Temple Place Ste 330, |
---|
| 8 | * Boston MA 02111-1307, USA; either version 2 of the License, or |
---|
| 9 | * (at your option) any later version; incorporated herein by reference. |
---|
| 10 | * |
---|
| 11 | * ----------------------------------------------------------------------- */ |
---|
| 12 | |
---|
| 13 | /* |
---|
| 14 | * rosh.h |
---|
| 15 | * |
---|
| 16 | * Read-Only shell; Header |
---|
| 17 | */ |
---|
| 18 | |
---|
| 19 | /* |
---|
| 20 | * History |
---|
| 21 | * b034 Improve debug functions to simpler code |
---|
| 22 | * b021 Move much PreProcessing stuff to rosh.h |
---|
| 23 | * b018 Create rosh_debug() macro |
---|
| 24 | * b012 Version of rosh.c at time of creating this file. |
---|
| 25 | */ |
---|
| 26 | |
---|
| 27 | #ifndef ROSH_H |
---|
| 28 | #define ROSH_H |
---|
| 29 | |
---|
| 30 | #include <stdio.h> |
---|
| 31 | #include <stdlib.h> |
---|
| 32 | #include <stdbool.h> /* macro: true false */ |
---|
| 33 | #include <string.h> /* strcpy() strlen() memcpy() strchr() */ |
---|
| 34 | #include <sys/types.h> |
---|
| 35 | #include <limits.h> |
---|
| 36 | #include <sys/stat.h> /* fstat() */ |
---|
| 37 | #include <fcntl.h> /* open(); open mode macros */ |
---|
| 38 | #include <dirent.h> /* fdopendir() opendir() readdir() closedir() DIR */ |
---|
| 39 | #include <unistd.h> /* getcwd() getopt() */ |
---|
| 40 | #include <errno.h> /* errno; error macros */ |
---|
| 41 | #include <netinet/in.h> /* For htonl/ntohl/htons/ntohs */ |
---|
| 42 | #include <ctype.h> /* isspace() */ |
---|
| 43 | |
---|
| 44 | #include <getkey.h> |
---|
| 45 | #include <consoles.h> /* console_ansi_raw() console_ansi_std() */ |
---|
| 46 | // #include <getopt.h> /* getopt_long() */ |
---|
| 47 | |
---|
| 48 | #ifdef DO_DEBUG |
---|
| 49 | # define ROSH_DEBUG printf |
---|
| 50 | # define ROSH_DEBUG_ARGV_V rosh_pr_argv_v |
---|
| 51 | /* define ROSH_DEBUG(f, ...) printf (f, ## __VA_ARGS__) */ |
---|
| 52 | # ifdef DO_DEBUG2 |
---|
| 53 | # define ROSH_DEBUG2 printf |
---|
| 54 | # define ROSH_DEBUG2_ARGV_V rosh_pr_argv_v |
---|
| 55 | # else /* DO_DEBUG2 */ |
---|
| 56 | /* This forces a format argument into the function call */ |
---|
| 57 | # define ROSH_DEBUG2(f, ...) ((void)0) |
---|
| 58 | # define ROSH_DEBUG2_ARGV_V(argc, argv) ((void)0) |
---|
| 59 | # endif /* DO_DEBUG2 */ |
---|
| 60 | #else /* DO_DEBUG */ |
---|
| 61 | # define ROSH_DEBUG(f, ...) ((void)0) |
---|
| 62 | # define ROSH_DEBUG_ARGV_V(argc, argv) ((void)0) |
---|
| 63 | # define ROSH_DEBUG2(f, ...) ((void)0) |
---|
| 64 | # define ROSH_DEBUG2_ARGV_V(argc, argv) ((void)0) |
---|
| 65 | #endif /* DO_DEBUG */ |
---|
| 66 | #define ROSH_DEBUG2_STAT(f, ...) ((void)0) |
---|
| 67 | // #define ROSH_DEBUG2_STAT ROSH_DEBUG2 |
---|
| 68 | |
---|
| 69 | #ifdef __COM32__ |
---|
| 70 | #define ROSH_IS_COM32 1 |
---|
| 71 | #include <console.h> /* openconsole() */ |
---|
| 72 | #include <syslinux/config.h> /* Has info on the SYSLINUX variant */ |
---|
| 73 | #include <syslinux/boot.h> /* syslinux_run_command() */ |
---|
| 74 | #include <syslinux/reboot.h> |
---|
| 75 | #define ROSH_COM32(f, ...) printf (f, ## __VA_ARGS__) |
---|
| 76 | #define rosh_console_std() console_ansi_std() |
---|
| 77 | #define rosh_console_raw() console_ansi_raw() |
---|
| 78 | |
---|
| 79 | int stat(const char *pathname, struct stat *buf) |
---|
| 80 | { |
---|
| 81 | int fd, status, ret = -1; |
---|
| 82 | DIR *d; |
---|
| 83 | |
---|
| 84 | ROSH_DEBUG2_STAT("stat:opendir(%s) ", pathname); |
---|
| 85 | d = opendir(pathname); |
---|
| 86 | if (d != NULL) { |
---|
| 87 | ROSH_DEBUG2_STAT("stat:closedir() "); |
---|
| 88 | closedir(d); |
---|
| 89 | ret = 0; |
---|
| 90 | buf->st_mode = S_IFDIR | 0555; |
---|
| 91 | buf->st_size = 0; |
---|
| 92 | } else if ((errno == 0) || (errno == ENOENT) || (errno == ENOTDIR)) { |
---|
| 93 | ROSH_DEBUG2_STAT("(%d)stat:open() ", errno); |
---|
| 94 | fd = open(pathname, O_RDONLY); |
---|
| 95 | if (fd != -1) { |
---|
| 96 | ROSH_DEBUG2_STAT("(%d)stat:fstat() ", fd); |
---|
| 97 | status = fstat(fd, buf); |
---|
| 98 | (void)status; |
---|
| 99 | ROSH_DEBUG2_STAT("stat:close() "); |
---|
| 100 | close(fd); |
---|
| 101 | ret = 0; |
---|
| 102 | } |
---|
| 103 | } |
---|
| 104 | return ret; |
---|
| 105 | } |
---|
| 106 | |
---|
| 107 | int rosh_get_env_ver(char *dest, size_t n) |
---|
| 108 | { |
---|
| 109 | const struct syslinux_version *slv = syslinux_version(); |
---|
| 110 | strncpy(dest, slv->version_string, n); |
---|
| 111 | return 0; |
---|
| 112 | } |
---|
| 113 | |
---|
| 114 | #else |
---|
| 115 | # include <termios.h> |
---|
| 116 | # include <sys/ioctl.h> |
---|
| 117 | # include <sys/utsname.h> |
---|
| 118 | # define ROSH_IS_COM32 0 |
---|
| 119 | |
---|
| 120 | static inline char *syslinux_config_file(void) |
---|
| 121 | { |
---|
| 122 | return ""; |
---|
| 123 | } |
---|
| 124 | |
---|
| 125 | int rosh_get_env_ver(char *dest, size_t n) |
---|
| 126 | { |
---|
| 127 | int ret, len; |
---|
| 128 | struct utsname env; |
---|
| 129 | ret= uname(&env); |
---|
| 130 | if (ret >= 0) { |
---|
| 131 | strncpy(dest, env.sysname, n); |
---|
| 132 | len = strlen(dest); |
---|
| 133 | strncpy(dest + len, " ", (n - len)); |
---|
| 134 | len = strlen(dest); |
---|
| 135 | strncpy(dest + len, env.release, (n - len)); |
---|
| 136 | } |
---|
| 137 | return ret; |
---|
| 138 | } |
---|
| 139 | |
---|
| 140 | static inline int getscreensize(int fd, int *rows, int *cols) |
---|
| 141 | { |
---|
| 142 | char *str; |
---|
| 143 | int rv; |
---|
| 144 | struct winsize ws; |
---|
| 145 | if (rows) |
---|
| 146 | *rows = 0; |
---|
| 147 | if (cols) |
---|
| 148 | *cols = 0; |
---|
| 149 | str = NULL; |
---|
| 150 | if (fd == 1) { |
---|
| 151 | ioctl(0, TIOCGWINSZ, &ws); |
---|
| 152 | if (rows) |
---|
| 153 | *rows = ws.ws_row; |
---|
| 154 | if (cols) |
---|
| 155 | *cols = ws.ws_col; |
---|
| 156 | if (rows && !*rows) { |
---|
| 157 | str = getenv("LINES"); |
---|
| 158 | if (str) |
---|
| 159 | *rows = atoi(str); |
---|
| 160 | } |
---|
| 161 | if (cols && !*cols) { |
---|
| 162 | str = getenv("COLUMNS"); |
---|
| 163 | if (str) |
---|
| 164 | *cols = atoi(str); |
---|
| 165 | } |
---|
| 166 | } |
---|
| 167 | if (!rows || !cols) |
---|
| 168 | rv = -1; |
---|
| 169 | else if (!*rows || !*cols) |
---|
| 170 | rv = -2; |
---|
| 171 | else |
---|
| 172 | rv = 0; |
---|
| 173 | return rv; |
---|
| 174 | } |
---|
| 175 | |
---|
| 176 | /* |
---|
| 177 | * Switches console over to raw input mode. Allows get_key to get just |
---|
| 178 | * 1 key sequence (without delay or display) |
---|
| 179 | */ |
---|
| 180 | void rosh_console_raw(void) |
---|
| 181 | { |
---|
| 182 | struct termios tio; |
---|
| 183 | |
---|
| 184 | console_ansi_raw(); /* Allows get_key to get just 1 key sequence |
---|
| 185 | (w/o delay or display */ |
---|
| 186 | /* Deal with the changes that haven't been replicated to ansiraw.c */ |
---|
| 187 | tcgetattr(0, &tio); |
---|
| 188 | tio.c_iflag &= ~IGNCR; |
---|
| 189 | tcsetattr(0, TCSAFLUSH, &tio); |
---|
| 190 | } |
---|
| 191 | |
---|
| 192 | /* |
---|
| 193 | * Switches back to standard getline mode. |
---|
| 194 | */ |
---|
| 195 | void rosh_console_std(void) |
---|
| 196 | { |
---|
| 197 | struct termios tio; |
---|
| 198 | |
---|
| 199 | console_ansi_std(); |
---|
| 200 | tcgetattr(0, &tio); |
---|
| 201 | tio.c_iflag |= ICRNL; |
---|
| 202 | tio.c_iflag &= ~IGNCR; |
---|
| 203 | tcsetattr(0, TCSANOW, &tio); |
---|
| 204 | } |
---|
| 205 | |
---|
| 206 | void syslinux_reboot(int warm) |
---|
| 207 | { |
---|
| 208 | printf("Test Reboot(%d)\n", warm); |
---|
| 209 | } |
---|
| 210 | |
---|
| 211 | #define ROSH_COM32(f, ...) ((void)0) |
---|
| 212 | #define syslinux_run_command(f) ((void)0) |
---|
| 213 | #endif /* __COM32__ */ |
---|
| 214 | |
---|
| 215 | #define SEP '/' |
---|
| 216 | |
---|
| 217 | /* Size of buffer string */ |
---|
| 218 | #define ROSH_BUF_SZ 16384 |
---|
| 219 | /* Size of screen output buffer (80*40) //HERE */ |
---|
| 220 | #define ROSH_SBUF_SZ ((80 + 2) * 40) |
---|
| 221 | |
---|
| 222 | /* Size of command buffer string */ |
---|
| 223 | #ifdef MAX_CMDLINE_LEN |
---|
| 224 | # define ROSH_CMD_SZ MAX_CMDLINE_LEN |
---|
| 225 | #elif COMMAND_LINE_SIZE |
---|
| 226 | # define ROSH_CMD_SZ COMMAND_LINE_SIZE |
---|
| 227 | #else |
---|
| 228 | # define ROSH_CMD_SZ_LG2 12 |
---|
| 229 | # define ROSH_CMD_SZ (1 << ROSH_CMD_SZ_LG2) |
---|
| 230 | #endif /* MAX_CMDLINE_LEN */ |
---|
| 231 | |
---|
| 232 | /* Size of path buffer string */ |
---|
| 233 | #ifdef PATH_MAX |
---|
| 234 | # define ROSH_PATH_SZ PATH_MAX |
---|
| 235 | #elif NAME_MAX |
---|
| 236 | # define ROSH_PATH_SZ NAME_MAX |
---|
| 237 | #elif FILENAME_MAX |
---|
| 238 | # define ROSH_PATH_SZ FILENAME_MAX |
---|
| 239 | #else |
---|
| 240 | # define ROSH_PATH_SZ_LG2 8 |
---|
| 241 | # define ROSH_PATH_SZ (1 << ROSH_PATH_SZ_LG2) |
---|
| 242 | #endif /* PATH_MAX */ |
---|
| 243 | |
---|
| 244 | #define ROSH_OPT_SZ 8 |
---|
| 245 | |
---|
| 246 | const char rosh_beta_str[] = |
---|
| 247 | " ROSH is currently beta. Constructive feedback is appreciated"; |
---|
| 248 | |
---|
| 249 | const char rosh_cd_norun_str[] = |
---|
| 250 | " -- cd (Change Directory) not implemented for use with run and exit.\n"; |
---|
| 251 | |
---|
| 252 | const char rosh_help_cd_str[] = "cd Change directory\n\ |
---|
| 253 | with no argument, return to original directory from entry to rosh\n\ |
---|
| 254 | with one argument, change to that directory"; |
---|
| 255 | |
---|
| 256 | const char rosh_help_ls_str[] = "ls List contents of current directory\n\ |
---|
| 257 | -l Long format\n\ |
---|
| 258 | -i Inode; print Inode of file\n\ |
---|
| 259 | -F Classify; Add a 1-character suffix to classify files"; |
---|
| 260 | |
---|
| 261 | const char rosh_help_str1[] = |
---|
| 262 | "Commands: ? cat cd cfg dir exit help less ls man more pwd run quit ver"; |
---|
| 263 | |
---|
| 264 | const char rosh_help_str2[] = |
---|
| 265 | "Commands: (short generally non-ambiguous abreviations are also allowed)\n\ |
---|
| 266 | h HELP\n ALSO ? help man\n ALSO help <command>\n\ |
---|
| 267 | cat Concatenate file to console\n cat <file>\n\ |
---|
| 268 | cd Change to directory <dir>\n cd <dir>\n\ |
---|
| 269 | less Page a file with rewind\n\ |
---|
| 270 | ls List contents of current directory\n ls <dir>\n\ |
---|
| 271 | ALSO l dir\n\ |
---|
| 272 | more Page a file\n\ |
---|
| 273 | pwd display Present Working Directory\n\ |
---|
| 274 | run Run a program/kernel with options\n\ |
---|
| 275 | r Reboot (if COM32)\n Also reboot\n\ |
---|
| 276 | exit Exit to previous environment\n ALSO quit"; |
---|
| 277 | |
---|
| 278 | const char rosh_help_str_adv[] = "No additional help available for '%s'"; |
---|
| 279 | |
---|
| 280 | const char rosh_ls_opt_str[] = "lFi"; |
---|
| 281 | |
---|
| 282 | #endif /* Not ROSH_H */ |
---|