* Europagate, 1995
*
* $Log: urp.c,v $
- * Revision 1.32 1995/05/03 07:37:46 adam
+ * Revision 1.33 1995/05/03 16:34:19 adam
+ * CCL def command, i.e. user definitions - saved as resource files.
+ *
+ * Revision 1.32 1995/05/03 07:37:46 adam
* CCL commands stop/continue implemented. New functions gw_res_{int,bool}
* are used when possible.
*
/*
Todo:
- stop/continue commands
info/status (other name?)
- per-user definitions
better persistence diagnostics
- show - position continuation
resource gw.path - use chdir call instead
Optional:
return 0;
}
-
-static struct command_word {
+struct command_word {
char *default_value;
char *resource_suffix;
-} command_tab [] =
-{
-{ "find", "find"},
-{ "show", "show"},
-{ "base", "base" },
-{ "help", "help" },
-{ "info", "info" },
-{ "continue", "continue" },
-{ "status", "status" },
-{ "stop", "stop" },
-{ "target", "target" },
-{ "cancel", "cancel" },
-{ "account", "account" },
-{ NULL, NULL }
};
static int command_search (struct command_word *tab, struct ccl_token *cmd,
return 0;
}
-struct command_word show_tab [] =
-{
-{ "f", "format"},
-{ "p", "position"},
-{ NULL, NULL }
-};
-
static void present (const char *set, int offset, int number,
struct ccl_token *format_token)
{
static int exec_show (struct ccl_token *list)
{
+ static struct command_word show_tab [] =
+ {
+ { "f", "format"},
+ { "p", "position"},
+ { NULL, NULL }
+ };
char tmp_str[20];
struct ccl_token *set_token = NULL;
struct ccl_token *format_token = NULL;
return 0;
}
+static int exec_def (struct ccl_token *list)
+{
+ const char *name = NULL;
+ char value[128];
+ char fname[256];
+ static struct command_word def_tab [] =
+ {
+ { "reset", "reset" },
+ { "f", "format"},
+ { "maxshow", "maxshow" },
+ { "defaultshow", "defaultshow" },
+ { "lang", "language" },
+ { NULL, NULL }
+ };
+
+ if (info.userid < 0)
+ return -1;
+ sprintf (fname, "%s/user.%d.r", gw_res_get (info.kernel_res,
+ "gw.path", "."),
+ info.userid);
+
+ if (list->kind == CCL_TOK_EOL)
+ {
+ fprintf (reply_fd, "format %s\n", gw_res_get
+ (info.kernel_res, "gw.display.format", ""));
+ fprintf (reply_fd, "maxshow %s\n", gw_res_get
+ (info.kernel_res, "gw.max.show", ""));
+ fprintf (reply_fd, "default-show %s\n", gw_res_get
+ (info.kernel_res, "gw.default.show", ""));
+ fprintf (reply_fd, "language %s\n", gw_res_get
+ (info.kernel_res, "gw.language", ""));
+ }
+ else
+ {
+ int setting_no = command_search (def_tab, list, "ccl.token.");
+
+ if (!setting_no)
+ {
+ fprintf (reply_fd, "Unknown setting in def\n");
+ return -1;
+ }
+ if (setting_no == 1)
+ {
+ unlink (fname);
+ read_kernel_res ();
+ return 0;
+ }
+ list = list->next;
+ if (list->kind == CCL_TOK_EOL)
+ {
+ fprintf (reply_fd, "Missing value\n");
+ return -1;
+ }
+ strncpy (value, list->name, 127);
+ value[(size_t) list->len] = '\0';
+ switch (setting_no)
+ {
+ case 2:
+ name = "gw.display.format";
+ break;
+ case 3:
+ name = "gw.max.show";
+ break;
+ case 4:
+ name = "gw.default.show";
+ break;
+ case 5:
+ name = "gw.language";
+ break;
+ default:
+ return 0;
+ }
+ gw_log (GW_LOG_DEBUG, KERNEL_LOG, "update file %s with %s=%s",
+ fname, name, value);
+ gw_res_put (info.kernel_res, "gw.username", info.from_str, fname);
+ gw_res_put (info.kernel_res, name, value, fname);
+ gw_res_commit (info.kernel_res, fname);
+ if (setting_no == 5)
+ read_kernel_res ();
+ }
+ return 0;
+}
+
+
/*
* exec_command: parse and execute ccl command in str.
* str: ccl command string
*/
static int exec_command (const char *str, int *stop_flag)
{
+ static struct command_word command_tab [] =
+ {
+ { "find", "find"},
+ { "show", "show"},
+ { "base", "base" },
+ { "help", "help" },
+ { "info", "info" },
+ { "continue", "continue" },
+ { "status", "status" },
+ { "stop", "stop" },
+ { "target", "target" },
+ { "def", "def" },
+ { "account", "account" },
+ { NULL, NULL }
+ };
+
struct ccl_token *cmd = ccl_tokenize (str);
int no;
if (cmd->kind != CCL_TOK_EOL &&
(no = command_search (command_tab, cmd, "ccl.command.")))
{
- if (!info.zass && no != 9 && no != 4 && no != 11 && no != 7)
- reopen_target ();
- fprintf (reply_fd, "\n> %s\n", str);
- if (!info.zass && (no == 1 || no == 2 || no == 3))
+ if (no == 1 || no == 2 || no == 3) /* find/show/base? */
{
- fprintf (reply_fd, "%s\n",
- gw_res_get (info.kernel_res, "gw.err.no.target",
- "No connection established - "
- "command ignored"));
- return 0;
+ if (!info.zass) /* open if not already opened */
+ reopen_target ();
+ fprintf (reply_fd, "\n> %s\n", str);
+ if (!info.zass) /* fail? */
+ {
+ fprintf (reply_fd, "%s\n",
+ gw_res_get (info.kernel_res, "gw.err.no.target",
+ "No connection established - "
+ "command ignored"));
+ return 0;
+ }
}
+ else
+ fprintf (reply_fd, "\n> %s\n", str);
#if 0
ccl_token_and = gw_res_get (info.kernel_res, "ccl.token.and", "and");
ccl_token_or = gw_res_get (info.kernel_res, "ccl.token.or", "or");
case 3:
return exec_base (cmd->next);
case 4:
+ fprintf (reply_fd, "\n> %s\n", str);
return exec_help (cmd->next);
case 6: /* continue */
*stop_flag = 2;
return 0;
case 9:
return exec_target (cmd->next);
+ case 10:
+ return exec_def (cmd->next);
case 11:
return exec_account (cmd->next);
default: