* Europagate, 1995
*
* $Log: urp.c,v $
- * Revision 1.41 1995/07/03 08:20:18 adam
+ * Revision 1.50 1996/03/01 16:09:30 adam
+ * New setting: gw.msg.replyto that sets Reply-To in user response.
+ *
+ * Revision 1.49 1996/03/01 14:25:28 adam
+ * Email gateway obeys 'Reply-To:' in header.
+ *
+ * Revision 1.48 1996/02/12 10:04:57 adam
+ * The gateway doesn't try to reconnect if it is already known that
+ * it will fail (connect_fail flag introduced).
+ *
+ * Revision 1.47 1996/01/18 13:54:48 adam
+ * Help <command> gives help information about individual commands.
+ * Status without arguments gives list of available predefined targets.
+ *
+ * Revision 1.46 1995/07/28 10:51:09 adam
+ * Bug fix: account from previous session had effect when new target command
+ * was executed.
+ *
+ * Revision 1.45 1995/07/20 08:20:24 adam
+ * Minor changes.
+ *
+ * Revision 1.44 1995/07/11 12:28:53 adam
+ * New functions ccl_token_simple and ccl_token_del used.
+ *
+ * Revision 1.43 1995/07/11 11:49:13 adam
+ * LINE_MAX renamed to STR_LINE_MAX.
+ *
+ * Revision 1.42 1995/07/03 12:59:29 adam
+ * New option for eti: -c dir to chdir before start.
+ * Setting change: gw.max.show defaults to 100.
+ *
+ * Revision 1.41 1995/07/03 08:20:18 adam
* More help information and better diagnostics.
*
* Revision 1.40 1995/05/23 08:13:00 adam
static void present (const char *set, int offset, int number,
struct ccl_token *format_token);
-static char line_buf[LINE_MAX+1];
+static char line_buf[STR_LINE_MAX+1];
static void put_esc_str (const char *s)
{
gw_res_get (info.kernel_res, "gw.err.connect",
"Cannot connect to target"),
info.hostname, info.port);
+ info.connect_failed = 1;
return -1;
}
v = gw_res_get (info.kernel_res, "gw.description", NULL);
char *resource_suffix;
};
-static int command_search (struct command_word *tab, struct ccl_token *cmd,
-const char *resource_prefix)
+static int command_search_str (struct command_word *tab, const char *cmd_name,
+ int cmd_len, const char *resource_prefix)
{
int no = 1;
assert (resource_prefix);
assert (tab);
- assert (cmd);
while (tab->default_value)
{
char *cp, command_names[60];
if ((split = strchr (cp, ' ')))
*split = '\0';
- if (cmd->len == strlen(cp) &&
- !memcmp (cmd->name, cp, cmd->len))
+ if (cmd_len == strlen(cp) &&
+ !memcmp (cmd_name, cp, cmd_len))
return no;
if (!split)
break;
return 0;
}
+static int command_search (struct command_word *tab, struct ccl_token *cmd,
+ const char *resource_prefix)
+{
+ return command_search_str (tab, cmd->name, cmd->len, resource_prefix);
+}
+
static struct error_no_struct {
int no;
char *resource_name;
{
*from_str = '\0';
*subject_str = '\0';
- while (str_queue_deq (sq, line_buf, LINE_MAX))
+ while (str_queue_deq (sq, line_buf, STR_LINE_MAX))
{
if (line_buf[0] == '\n')
return 0;
if (memcmp (line_buf, "From ", 5) == 0)
sscanf (line_buf+4, "%s", from_str);
+ if (memcmp (line_buf, "Reply-To: ", 10) == 0)
+ sscanf (line_buf+10, "%s", from_str);
if (memcmp (line_buf, "Subject: ", 9) == 0 &&
sscanf (line_buf+9, "%s", subject_str+1) == 1)
strcpy (subject_str, line_buf+9);
"Commands available in this service:\n"));
}
+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 }
+};
+
+
static int exec_help (struct ccl_token *list)
{
+ int no = 0;
static char *sep = "-------------------------------\\n";
- help_general ();
+ if (list->kind != CCL_TOK_EOL)
+ no = command_search_str (command_tab, list->name, list->len,
+ "ccl.command.");
+ if (!no)
+ help_general ();
- put_esc_str (sep);
- put_esc_str (gw_res_get (info.kernel_res, "gw.help.target",
- "target <name> - selects a given target\n"));
+ if (!no || no == 9)
+ {
+ put_esc_str (sep);
+ put_esc_str (gw_res_get (info.kernel_res, "gw.help.target",
+ "target <name> - selects a given target\n"));
+ }
- put_esc_str (sep);
- put_esc_str (gw_res_get (info.kernel_res, "gw.help.base",
+ if (!no || no == 3)
+ {
+ put_esc_str (sep);
+ put_esc_str (gw_res_get (info.kernel_res, "gw.help.base",
"base <base>.. - selects databases\n"));
+ }
+
+ if (!no || no == 1)
+ {
+ put_esc_str (sep);
+ put_esc_str (gw_res_get (info.kernel_res, "gw.help.find",
+ "find <query> - performs a search\n"));
+ }
+
+ if (!no || no == 2)
+ {
+ put_esc_str (sep);
+ put_esc_str (gw_res_get (info.kernel_res, "gw.help.show",
+ "show <spec> - retrieves and displays "
+ "records\n"));
+ }
+
+ if (!no || no == 10)
+ {
+ put_esc_str (sep);
+ put_esc_str (gw_res_get (info.kernel_res, "gw.help.def",
+ "def <setting> <value> user definitons\n"));
+ }
+
+ if (!no || no == 11)
+ {
+ put_esc_str (sep);
+ put_esc_str (gw_res_get (info.kernel_res, "gw.help.account",
+ "account <str> sets authentication\n"));
+ }
+
+ if (!no || no == 7)
+ {
+ put_esc_str (sep);
+ put_esc_str (gw_res_get (info.kernel_res, "gw.help.status",
+ "status status information\n"));
+ }
- put_esc_str (sep);
- put_esc_str (gw_res_get (info.kernel_res, "gw.help.find",
- "find <query> - performs a search request\n"));
-
- put_esc_str (sep);
- put_esc_str (gw_res_get (info.kernel_res, "gw.help.show",
- "show <spec> - retrieves and displays "
- "records\n"));
- put_esc_str (sep);
- put_esc_str (gw_res_get (info.kernel_res, "gw.help.def",
- "def <setting> <value> sets/gets definitons\n"));
- put_esc_str (sep);
- put_esc_str (gw_res_get (info.kernel_res, "gw.help.account",
- "account <str> sets authentication string\n"));
return 0;
}
}
else
*info.account = '\0';
+ info.account_in_session = 1;
+ return 0;
+}
+
+void handle_target_list (const char *name, const char *value)
+{
+ GwRes res;
+ const char *p;
+
+ if (strlen(name) < 10)
+ return;
+ if (memcmp (name, "gw.target.", 10))
+ return;
+ fprintf (reply_fd, "%s\n", name+10);
+ res = gw_res_init ();
+ gw_res_merge (res, value);
+ p = gw_res_get (res, "gw.description", NULL);
+ if (p)
+ {
+ put_esc_str (p);
+ put_esc_str ("\\n");
+ }
+ p = gw_res_get (res, "gw.databases", NULL);
+ if (p)
+ fprintf (reply_fd, " Databases: %s\n", p);
+ fprintf (reply_fd, "\n");
+ gw_res_close (res);
+}
+
+static int exec_target_list (void)
+{
+ gw_res_trav (info.kernel_res, NULL, handle_target_list);
+ fprintf (reply_fd, "\n");
return 0;
}
{
int len;
if (list->kind == CCL_TOK_EOL)
- return -1;
+ return exec_target_list ();
len = list->len;
memcpy (info.target, list->name, len);
info.target [len] = '\0';
-
+
+ if (!info.account_in_session)
+ *info.account = '\0';
+ info.account_in_session = 0;
read_kernel_res ();
+ info.connect_failed = 0;
return reopen_target ();
}
int max_number;
char format_str[16];
- max_number = gw_res_int (info.kernel_res, "gw.max.show", 200);
+ max_number = gw_res_int (info.kernel_res, "gw.max.show", 100);
if (number > max_number)
number = max_number;
gw_log (GW_LOG_DEBUG, KERNEL_LOG, "present in set %s", set);
*/
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);
+ struct ccl_token *cmd;
+ const char *cp = str;
int no;
+ while (*cp && *cp != ' ' && *cp != '\n' && *cp != '\t' && *cp != '\r')
+ cp++;
+
*stop_flag = 0;
- if (cmd->kind != CCL_TOK_EOL &&
- (no = command_search (command_tab, cmd, "ccl.command.")))
+ no = command_search_str (command_tab, str, cp-str, "ccl.command.");
+ if (no)
{
if (no == 1 || no == 2 || no == 3) /* find/show/base? */
{
- if (!info.zass) /* open if not already opened */
+ if (!info.connect_failed && !info.zass)
+ /* open if not already opened */
reopen_target ();
fprintf (reply_fd, "\n> %s\n", str);
- if (!info.zass) /* fail? */
+ if (!info.zass) /* fail? */
{
fprintf (reply_fd, "\n%s\n",
gw_res_get (info.kernel_res, "gw.err.no.target",
fprintf (reply_fd, "\n> %s\n", str);
switch (no)
{
- case 1:
- return exec_find (cmd->next, str);
- case 2:
- return exec_show (cmd->next);
- case 3:
- return exec_base (cmd->next);
- case 4:
- return exec_help (cmd->next);
+ case 1: /* find */
+ cmd = ccl_tokenize (cp);
+ exec_find (cmd, str);
+ break;
+ case 2: /* show */
+ cmd = ccl_tokenize (cp);
+ exec_show (cmd);
+ break;
+ case 3: /* base */
+ cmd = ccl_token_simple (cp);
+ exec_base (cmd);
+ break;
+ case 4: /* help */
+ cmd = ccl_token_simple (cp);
+ exec_help (cmd);
+ break;
case 6: /* continue */
*stop_flag = 2;
return 0;
case 7: /* status */
- return exec_status (cmd->next);
+ exec_status (cmd);
+ return 0;
case 8: /* stop */
*stop_flag = 1;
return 0;
case 9: /* target */
- return exec_target (cmd->next);
+ cmd = ccl_token_simple (cp);
+ exec_target (cmd);
+ break;
case 10: /* def */
- return exec_def (cmd->next);
- case 11:
- return exec_account (cmd->next);
+ cmd = ccl_token_simple (cp);
+ exec_def (cmd);
+ break;
+ case 11: /* account */
+ cmd = ccl_token_simple (cp);
+ exec_account (cmd);
+ break;
default:
+ cmd = NULL;
fprintf (reply_fd, "%s\n",
gw_res_get (info.kernel_res, "gw.err.unimplemented",
"Not implemented yet"));
}
+ ccl_token_del (cmd);
}
else
{
int urp_start (int continuation, struct str_queue *queue)
{
char subject_str[128];
+ const char *cp;
info.command_no = 0;
info.reply_fname = NULL;
}
tty_init (reply_fd, 0, 0);
fprintf (reply_fd, "From: %s\n",
- gw_res_get (info.kernel_res, "gw.msg.from","Email-gateway"));
+ gw_res_get (info.kernel_res, "gw.msg.from",
+ "Email-Z39.50 gateway"));
+ cp = gw_res_get (info.kernel_res, "gw.msg.replyto", NULL);
+ if (cp)
+ fprintf (reply_fd, "Reply-To: %s\n", cp);
fprintf (reply_fd, "Subject: ");
if (*subject_str)
fprintf (reply_fd, "Z39.50 Re: %s", subject_str);
char *cp;
int stop_flag;
- while (str_queue_deq (queue, line_buf, LINE_MAX))
+ while (str_queue_deq (queue, line_buf, STR_LINE_MAX))
{
if (line_buf[0] == '\n')
if (info.command_no)
if (stop_flag)
{
info.command_no++; /* prevent help! */
- while (str_queue_deq (queue, line_buf, LINE_MAX))
+ while (str_queue_deq (queue, line_buf, STR_LINE_MAX))
;
return stop_flag;
}