283 lines
7.5 KiB
C
283 lines
7.5 KiB
C
/* ----------------------------------------------------------------------- *
|
|
*
|
|
* Copyright 2008-2009 Gene Cumm - All Rights Reserved
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation, Inc., 53 Temple Place Ste 330,
|
|
* Boston MA 02111-1307, USA; either version 2 of the License, or
|
|
* (at your option) any later version; incorporated herein by reference.
|
|
*
|
|
* ----------------------------------------------------------------------- */
|
|
|
|
/*
|
|
* rosh.h
|
|
*
|
|
* Read-Only shell; Header
|
|
*/
|
|
|
|
/*
|
|
* History
|
|
* b034 Improve debug functions to simpler code
|
|
* b021 Move much PreProcessing stuff to rosh.h
|
|
* b018 Create rosh_debug() macro
|
|
* b012 Version of rosh.c at time of creating this file.
|
|
*/
|
|
|
|
#ifndef ROSH_H
|
|
#define ROSH_H
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <stdbool.h> /* macro: true false */
|
|
#include <string.h> /* strcpy() strlen() memcpy() strchr() */
|
|
#include <sys/types.h>
|
|
#include <limits.h>
|
|
#include <sys/stat.h> /* fstat() */
|
|
#include <fcntl.h> /* open(); open mode macros */
|
|
#include <dirent.h> /* fdopendir() opendir() readdir() closedir() DIR */
|
|
#include <unistd.h> /* getcwd() getopt() */
|
|
#include <errno.h> /* errno; error macros */
|
|
#include <netinet/in.h> /* For htonl/ntohl/htons/ntohs */
|
|
#include <ctype.h> /* isspace() */
|
|
|
|
#include <getkey.h>
|
|
#include <consoles.h> /* console_ansi_raw() console_ansi_std() */
|
|
// #include <getopt.h> /* getopt_long() */
|
|
|
|
#ifdef DO_DEBUG
|
|
# define ROSH_DEBUG printf
|
|
# define ROSH_DEBUG_ARGV_V rosh_pr_argv_v
|
|
/* define ROSH_DEBUG(f, ...) printf (f, ## __VA_ARGS__) */
|
|
# ifdef DO_DEBUG2
|
|
# define ROSH_DEBUG2 printf
|
|
# define ROSH_DEBUG2_ARGV_V rosh_pr_argv_v
|
|
# else /* DO_DEBUG2 */
|
|
/* This forces a format argument into the function call */
|
|
# define ROSH_DEBUG2(f, ...) ((void)0)
|
|
# define ROSH_DEBUG2_ARGV_V(argc, argv) ((void)0)
|
|
# endif /* DO_DEBUG2 */
|
|
#else /* DO_DEBUG */
|
|
# define ROSH_DEBUG(f, ...) ((void)0)
|
|
# define ROSH_DEBUG_ARGV_V(argc, argv) ((void)0)
|
|
# define ROSH_DEBUG2(f, ...) ((void)0)
|
|
# define ROSH_DEBUG2_ARGV_V(argc, argv) ((void)0)
|
|
#endif /* DO_DEBUG */
|
|
#define ROSH_DEBUG2_STAT(f, ...) ((void)0)
|
|
// #define ROSH_DEBUG2_STAT ROSH_DEBUG2
|
|
|
|
#ifdef __COM32__
|
|
#define ROSH_IS_COM32 1
|
|
#include <console.h> /* openconsole() */
|
|
#include <syslinux/config.h> /* Has info on the SYSLINUX variant */
|
|
#include <syslinux/boot.h> /* syslinux_run_command() */
|
|
#include <syslinux/reboot.h>
|
|
#define ROSH_COM32(f, ...) printf (f, ## __VA_ARGS__)
|
|
#define rosh_console_std() console_ansi_std()
|
|
#define rosh_console_raw() console_ansi_raw()
|
|
|
|
int stat(const char *pathname, struct stat *buf)
|
|
{
|
|
int fd, status, ret = -1;
|
|
DIR *d;
|
|
|
|
ROSH_DEBUG2_STAT("stat:opendir(%s) ", pathname);
|
|
d = opendir(pathname);
|
|
if (d != NULL) {
|
|
ROSH_DEBUG2_STAT("stat:closedir() ");
|
|
closedir(d);
|
|
ret = 0;
|
|
buf->st_mode = S_IFDIR | 0555;
|
|
buf->st_size = 0;
|
|
} else if ((errno == 0) || (errno == ENOENT) || (errno == ENOTDIR)) {
|
|
ROSH_DEBUG2_STAT("(%d)stat:open() ", errno);
|
|
fd = open(pathname, O_RDONLY);
|
|
if (fd != -1) {
|
|
ROSH_DEBUG2_STAT("(%d)stat:fstat() ", fd);
|
|
status = fstat(fd, buf);
|
|
(void)status;
|
|
ROSH_DEBUG2_STAT("stat:close() ");
|
|
close(fd);
|
|
ret = 0;
|
|
}
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
int rosh_get_env_ver(char *dest, size_t n)
|
|
{
|
|
const struct syslinux_version *slv = syslinux_version();
|
|
strncpy(dest, slv->version_string, n);
|
|
return 0;
|
|
}
|
|
|
|
#else
|
|
# include <termios.h>
|
|
# include <sys/ioctl.h>
|
|
# include <sys/utsname.h>
|
|
# define ROSH_IS_COM32 0
|
|
|
|
static inline char *syslinux_config_file(void)
|
|
{
|
|
return "";
|
|
}
|
|
|
|
int rosh_get_env_ver(char *dest, size_t n)
|
|
{
|
|
int ret, len;
|
|
struct utsname env;
|
|
ret= uname(&env);
|
|
if (ret >= 0) {
|
|
strncpy(dest, env.sysname, n);
|
|
len = strlen(dest);
|
|
strncpy(dest + len, " ", (n - len));
|
|
len = strlen(dest);
|
|
strncpy(dest + len, env.release, (n - len));
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
static inline int getscreensize(int fd, int *rows, int *cols)
|
|
{
|
|
char *str;
|
|
int rv;
|
|
struct winsize ws;
|
|
if (rows)
|
|
*rows = 0;
|
|
if (cols)
|
|
*cols = 0;
|
|
str = NULL;
|
|
if (fd == 1) {
|
|
ioctl(0, TIOCGWINSZ, &ws);
|
|
if (rows)
|
|
*rows = ws.ws_row;
|
|
if (cols)
|
|
*cols = ws.ws_col;
|
|
if (rows && !*rows) {
|
|
str = getenv("LINES");
|
|
if (str)
|
|
*rows = atoi(str);
|
|
}
|
|
if (cols && !*cols) {
|
|
str = getenv("COLUMNS");
|
|
if (str)
|
|
*cols = atoi(str);
|
|
}
|
|
}
|
|
if (!rows || !cols)
|
|
rv = -1;
|
|
else if (!*rows || !*cols)
|
|
rv = -2;
|
|
else
|
|
rv = 0;
|
|
return rv;
|
|
}
|
|
|
|
/*
|
|
* Switches console over to raw input mode. Allows get_key to get just
|
|
* 1 key sequence (without delay or display)
|
|
*/
|
|
void rosh_console_raw(void)
|
|
{
|
|
struct termios tio;
|
|
|
|
console_ansi_raw(); /* Allows get_key to get just 1 key sequence
|
|
(w/o delay or display */
|
|
/* Deal with the changes that haven't been replicated to ansiraw.c */
|
|
tcgetattr(0, &tio);
|
|
tio.c_iflag &= ~IGNCR;
|
|
tcsetattr(0, TCSAFLUSH, &tio);
|
|
}
|
|
|
|
/*
|
|
* Switches back to standard getline mode.
|
|
*/
|
|
void rosh_console_std(void)
|
|
{
|
|
struct termios tio;
|
|
|
|
console_ansi_std();
|
|
tcgetattr(0, &tio);
|
|
tio.c_iflag |= ICRNL;
|
|
tio.c_iflag &= ~IGNCR;
|
|
tcsetattr(0, TCSANOW, &tio);
|
|
}
|
|
|
|
void syslinux_reboot(int warm)
|
|
{
|
|
printf("Test Reboot(%d)\n", warm);
|
|
}
|
|
|
|
#define ROSH_COM32(f, ...) ((void)0)
|
|
#define syslinux_run_command(f) ((void)0)
|
|
#endif /* __COM32__ */
|
|
|
|
#define SEP '/'
|
|
|
|
/* Size of buffer string */
|
|
#define ROSH_BUF_SZ 16384
|
|
/* Size of screen output buffer (80*40) //HERE */
|
|
#define ROSH_SBUF_SZ ((80 + 2) * 40)
|
|
|
|
/* Size of command buffer string */
|
|
#ifdef MAX_CMDLINE_LEN
|
|
# define ROSH_CMD_SZ MAX_CMDLINE_LEN
|
|
#elif COMMAND_LINE_SIZE
|
|
# define ROSH_CMD_SZ COMMAND_LINE_SIZE
|
|
#else
|
|
# define ROSH_CMD_SZ_LG2 12
|
|
# define ROSH_CMD_SZ (1 << ROSH_CMD_SZ_LG2)
|
|
#endif /* MAX_CMDLINE_LEN */
|
|
|
|
/* Size of path buffer string */
|
|
#ifdef PATH_MAX
|
|
# define ROSH_PATH_SZ PATH_MAX
|
|
#elif NAME_MAX
|
|
# define ROSH_PATH_SZ NAME_MAX
|
|
#elif FILENAME_MAX
|
|
# define ROSH_PATH_SZ FILENAME_MAX
|
|
#else
|
|
# define ROSH_PATH_SZ_LG2 8
|
|
# define ROSH_PATH_SZ (1 << ROSH_PATH_SZ_LG2)
|
|
#endif /* PATH_MAX */
|
|
|
|
#define ROSH_OPT_SZ 8
|
|
|
|
const char rosh_beta_str[] =
|
|
" ROSH is currently beta. Constructive feedback is appreciated";
|
|
|
|
const char rosh_cd_norun_str[] =
|
|
" -- cd (Change Directory) not implemented for use with run and exit.\n";
|
|
|
|
const char rosh_help_cd_str[] = "cd Change directory\n\
|
|
with no argument, return to original directory from entry to rosh\n\
|
|
with one argument, change to that directory";
|
|
|
|
const char rosh_help_ls_str[] = "ls List contents of current directory\n\
|
|
-l Long format\n\
|
|
-i Inode; print Inode of file\n\
|
|
-F Classify; Add a 1-character suffix to classify files";
|
|
|
|
const char rosh_help_str1[] =
|
|
"Commands: ? cat cd cfg dir exit help less ls man more pwd run quit ver";
|
|
|
|
const char rosh_help_str2[] =
|
|
"Commands: (short generally non-ambiguous abreviations are also allowed)\n\
|
|
h HELP\n ALSO ? help man\n ALSO help <command>\n\
|
|
cat Concatenate file to console\n cat <file>\n\
|
|
cd Change to directory <dir>\n cd <dir>\n\
|
|
less Page a file with rewind\n\
|
|
ls List contents of current directory\n ls <dir>\n\
|
|
ALSO l dir\n\
|
|
more Page a file\n\
|
|
pwd display Present Working Directory\n\
|
|
run Run a program/kernel with options\n\
|
|
r Reboot (if COM32)\n Also reboot\n\
|
|
exit Exit to previous environment\n ALSO quit";
|
|
|
|
const char rosh_help_str_adv[] = "No additional help available for '%s'";
|
|
|
|
const char rosh_ls_opt_str[] = "lFi";
|
|
|
|
#endif /* Not ROSH_H */
|