aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorFranklin Wei <git@fwei.tk>2015-05-24 20:43:27 -0400
committerFranklin Wei <git@fwei.tk>2015-05-24 20:43:27 -0400
commit5b23089915079c634d260aa01d8eff1dd025fa31 (patch)
treeb5a37481fc0170712ffb55c280d13ff738c0a4dc /src
parentb307e719416e39ed525a1c51d7df61ae55b35eec (diff)
downloadmarket-sim-5b23089915079c634d260aa01d8eff1dd025fa31.zip
market-sim-5b23089915079c634d260aa01d8eff1dd025fa31.tar.gz
market-sim-5b23089915079c634d260aa01d8eff1dd025fa31.tar.bz2
market-sim-5b23089915079c634d260aa01d8eff1dd025fa31.tar.xz
enable restricted mode
Diffstat (limited to 'src')
-rw-r--r--src/globals.h29
-rw-r--r--src/help.c4
-rw-r--r--src/load.c5
-rw-r--r--src/main.c10
-rw-r--r--src/save.c5
-rw-r--r--src/util.c27
6 files changed, 64 insertions, 16 deletions
diff --git a/src/globals.h b/src/globals.h
index 0dbd723..bf37e8b 100644
--- a/src/globals.h
+++ b/src/globals.h
@@ -15,7 +15,7 @@
#include <unistd.h>
#include <curl/curl.h>
-#include <ncurses.h>
+#include <curses.h>
#define ARRAYLEN(x) (sizeof(x) / sizeof(x[0]))
@@ -26,6 +26,8 @@
#define ARG_FAILURE (1<<1)
#define ARG_VERBOSE (1<<2)
#define ARG_NOCURSES (1<<3)
+#define ARG_BATCHMODE (1<<4)
+#define ARG_RESTRICTED (1<<5)
/* don't change this, it will corrupt existing saves */
#define EPOCH_YEAR 2000
@@ -93,13 +95,22 @@ struct command_t {
extern bool have_color;
-void do_menu(struct player_t*, const struct command_t*, uint, const char*);
+/* restricted mode disables things that would be considered "dangerous" when
+ used in a web-facing script such as interactive loading/saving */
+extern bool restricted;
+
+#define COL_NORM 0
+#define COL_RED 1
+#define COL_GREEN 2
+
bool get_stock_info(char *sym, struct money_t*, char **name);
-char *csv_read(char**);
char *(*read_string)(void);
+char *csv_read(char**);
char *read_ticker(void);
+extern int (*output)(const char*, ...);
+extern void (*heading)(const char *text, ...);
+extern void (*horiz_line)(void);
int compare_stocks(const void*, const void*);
-void fail(const char*, ...);;
struct stock_t *find_stock(struct player_t*, char*);
uint parse_args(int argc, char *argv[], char**);
uint16_t to_be16(uint16_t);
@@ -112,20 +123,16 @@ ullong read_int(void);
void add_hist(struct stock_t*, enum history_action, ullong count);
void all_lower(char*);
void all_upper(char*);
+void batch_init(void);
void cleanup(void);
void curses_init(void);
+void do_menu(struct player_t*, const struct command_t*, uint, const char*);
+void fail(const char*, ...);;
void load_portfolio(struct player_t*, const char*);
void print_history(struct stock_t*);
void print_usage(int argc, char *argv[]);
void print_version(void);
void sig_handler(int);
-extern int (*output)(const char*, ...);
-extern void (*heading)(const char *text, ...);
-extern void (*horiz_line)(void);
-
-#define COL_NORM 0
-#define COL_RED 1
-#define COL_GREEN 2
void use_color(int);
void stop_color(int);
diff --git a/src/help.c b/src/help.c
index b071fa0..f4de6bb 100644
--- a/src/help.c
+++ b/src/help.c
@@ -5,11 +5,13 @@ void print_usage(int argc, char *argv[])
assert(argc > 1);
output("Usage: %s [OPTION] [PORTFOLIO]\n", argv[0]);
- output("Runs a simulated trading session with PORTFOLIO (creating a new one by default).\n\n");
+ output("Runs a interactive trading session with PORTFOLIO or create a new portfolio.\n\n");
output("Options:\n");
+ output(" --batch\tEnables batch operation, taking commands from standard input\n");
output(" -h, --help\tShow this help and exit\n");
output(" --nocurses\tOperate without curses\n");
+ output(" -r, --restrict\tOperate in restricted mode, suitable for use as a CGI program\n");
output(" -v, --verbose\tEnable verbose operation\n");
output(" --version\tOutput version information and exit\n");
}
diff --git a/src/load.c b/src/load.c
index a178f59..6fbd4d9 100644
--- a/src/load.c
+++ b/src/load.c
@@ -179,6 +179,11 @@ void load_portfolio(struct player_t *player, const char *filename)
void load_handler(struct player_t *player)
{
+ if(restricted)
+ {
+ output("Forbidden.\n");
+ return;
+ }
output("Enter the file to load portfolio from: ");
char *filename = read_string();
diff --git a/src/main.c b/src/main.c
index c3edb1a..b40765c 100644
--- a/src/main.c
+++ b/src/main.c
@@ -1,5 +1,7 @@
#include "globals.h"
+bool restricted = false;
+
/*** utility functions ***/
void quit_handler(struct player_t *player)
@@ -20,9 +22,12 @@ int main(int argc, char *argv[])
uint args_status = parse_args(argc, argv, save_file_p);
- if(!(args_status & ARG_NOCURSES))
+ if(!(args_status & ARG_NOCURSES) && !(args_status & ARG_BATCHMODE))
curses_init();
+ if(args_status & ARG_BATCHMODE)
+ batch_init();
+
atexit(cleanup);
const struct sigaction handler = {
@@ -36,6 +41,9 @@ int main(int argc, char *argv[])
if(args_status & ARG_FAILURE)
return EXIT_FAILURE;
+ if(args_status & ARG_RESTRICTED)
+ restricted = true;
+
if(args_status & ARG_LOADED)
load_portfolio(player, save_file);
else
diff --git a/src/save.c b/src/save.c
index 379cd57..26572dd 100644
--- a/src/save.c
+++ b/src/save.c
@@ -65,6 +65,11 @@ size_t ck_write(const char *buf, size_t sz, size_t nmemb, FILE *f)
void save_handler(struct player_t *player)
{
+ if(restricted)
+ {
+ output("Forbidden.\n");
+ return;
+ }
output("Enter the file to save your portfolio in: ");
char *filename = read_string();
diff --git a/src/util.c b/src/util.c
index 35ddf54..4d87701 100644
--- a/src/util.c
+++ b/src/util.c
@@ -302,8 +302,12 @@ uint parse_args(int argc, char *argv[], char **port_file)
{
if(arg[0] == '-')
{
- if(strcmp(arg, "--help") == 0 ||
- strcmp(arg, "-h") == 0)
+ if(strcmp(arg, "--batch") == 0)
+ {
+ ret |= ARG_BATCHMODE;
+ }
+ else if(strcmp(arg, "--help") == 0 ||
+ strcmp(arg, "-h") == 0)
{
print_usage(argc, argv);
ret |= ARG_FAILURE;
@@ -313,6 +317,11 @@ uint parse_args(int argc, char *argv[], char **port_file)
{
ret |= ARG_NOCURSES;
}
+ else if(strcmp(arg, "-r") == 0 ||
+ strcmp(arg, "--restrict") == 0)
+ {
+ ret |= ARG_RESTRICTED;
+ }
else if(strcmp(arg, "-v") == 0 ||
strcmp(arg, "--verbose") == 0)
{
@@ -330,7 +339,8 @@ uint parse_args(int argc, char *argv[], char **port_file)
}
else
{
- output("Unrecognized option '%s'\nTry %s --help for more information.\n", arg, argv[0]);
+ output("Unrecognized option '%s'\n", arg, argv[0]);
+ print_usage(argc, argv);
ret |= ARG_FAILURE;
}
}
@@ -505,3 +515,14 @@ void curses_init(void)
have_color = false;
}
}
+
+int dummy_output(const char* f, ...)
+{
+ (void) f;
+ return 0;
+}
+
+void batch_init(void)
+{
+ output = dummy_output;
+}