/* ----------------------------------------------------------------------- *
*
* 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 */