source: bootcd/isolinux/syslinux-6.03/com32/rosh/rosh.h

Last change on this file was e16e8f2, checked in by Edwin Eefting <edwin@datux.nl>, 3 years ago

bootstuff

  • Property mode set to 100644
File size: 7.5 KB
Line 
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
79int 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
107int 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
120static inline char *syslinux_config_file(void)
121{
122    return "";
123}
124
125int 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
140static 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 */
180void 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 */
195void 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
206void 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
246const char rosh_beta_str[] =
247    "  ROSH is currently beta.  Constructive feedback is appreciated";
248
249const char rosh_cd_norun_str[] =
250    " -- cd (Change Directory) not implemented for use with run and exit.\n";
251
252const 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
256const 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
261const char rosh_help_str1[] =
262    "Commands: ? cat cd cfg dir exit help less ls man more pwd run quit ver";
263
264const 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
278const char rosh_help_str_adv[] = "No additional help available for '%s'";
279
280const char rosh_ls_opt_str[] = "lFi";
281
282#endif /* Not ROSH_H */
Note: See TracBrowser for help on using the repository browser.