Home | History | Annotate | Download | only in rosh
      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 */
    283