X-Git-Url: http://lists.indexdata.dk/cgi-bin?a=blobdiff_plain;f=kernel%2Furp.c;h=c2c40100d5b0a2644ac0ce393a9764af173e75ac;hb=d7566a5302886d8eff2c9cf6c1609cfc8e012bf3;hp=0e5ed8d05817da31b261580a282e069baac30b64;hpb=f933e3fe27e52c53ff9e453ab81f8d5d891a4512;p=egate.git diff --git a/kernel/urp.c b/kernel/urp.c index 0e5ed8d..c2c4010 100644 --- a/kernel/urp.c +++ b/kernel/urp.c @@ -1,8 +1,85 @@ +/* + * Copyright (c) 1995, the EUROPAGATE consortium (see below). + * + * The EUROPAGATE consortium members are: + * + * University College Dublin + * Danmarks Teknologiske Videnscenter + * An Chomhairle Leabharlanna + * Consejo Superior de Investigaciones Cientificas + * + * Permission to use, copy, modify, distribute, and sell this software and + * its documentation, in whole or in part, for any purpose, is hereby granted, + * provided that: + * + * 1. This copyright and permission notice appear in all copies of the + * software and its documentation. Notices of copyright or attribution + * which appear at the beginning of any file must remain unchanged. + * + * 2. The names of EUROPAGATE or the project partners may not be used to + * endorse or promote products derived from this software without specific + * prior written permission. + * + * 3. Users of this software (implementors and gateway operators) agree to + * inform the EUROPAGATE consortium of their use of the software. This + * information will be used to evaluate the EUROPAGATE project and the + * software, and to plan further developments. The consortium may use + * the information in later publications. + * + * 4. Users of this software agree to make their best efforts, when + * documenting their use of the software, to acknowledge the EUROPAGATE + * consortium, and the role played by the software in their work. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND, + * EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY + * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + * IN NO EVENT SHALL THE EUROPAGATE CONSORTIUM OR ITS MEMBERS BE LIABLE + * FOR ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF + * ANY KIND, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA + * OR PROFITS, WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND + * ON ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE + * USE OR PERFORMANCE OF THIS SOFTWARE. + * + */ /* Gateway kernel - User Request Processor * Europagate, 1995 * * $Log: urp.c,v $ - * Revision 1.34 1995/05/04 10:40:08 adam + * 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 + * Minor changes. + * + * Revision 1.39 1995/05/22 14:57:30 adam + * Next default record position also set by last p=... in show. + * + * Revision 1.38 1995/05/19 13:26:00 adam + * Bug fixes. Better command line options. + * + * Revision 1.37 1995/05/18 12:03:09 adam + * Bug fixes and minor improvements. + * + * Revision 1.36 1995/05/17 10:51:33 adam + * Added a few more error checks to the show command. + * + * Revision 1.35 1995/05/16 09:40:43 adam + * LICENSE. Setting of CCL token names (and/or/not/set) in read_kernel_res. + * + * Revision 1.34 1995/05/04 10:40:08 adam * More work on Def-settings. * * Revision 1.33 1995/05/03 16:34:19 adam @@ -120,7 +197,6 @@ Todo: info/status (other name?) better persistence diagnostics - resource gw.path - use chdir call instead Optional: automatic information about target-aliases: name, query-support, etc. @@ -142,7 +218,7 @@ 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) { @@ -200,14 +276,13 @@ struct command_word { 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]; @@ -226,8 +301,8 @@ const char *resource_prefix) 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; @@ -239,6 +314,12 @@ const char *resource_prefix) 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; @@ -276,7 +357,7 @@ static int email_header (struct str_queue *sq, { *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; @@ -316,6 +397,12 @@ static int exec_help (struct ccl_token *list) put_esc_str (gw_res_get (info.kernel_res, "gw.help.show", "show - retrieves and displays " "records\n")); + put_esc_str (sep); + put_esc_str (gw_res_get (info.kernel_res, "gw.help.def", + "def sets/gets definitons\n")); + put_esc_str (sep); + put_esc_str (gw_res_get (info.kernel_res, "gw.help.account", + "account sets authentication string\n")); return 0; } @@ -386,7 +473,7 @@ static int exec_find (struct ccl_token *list, const char *search_str) { fprintf (reply_fd, "%s\n", gw_res_get (info.kernel_res, "gw.err.search.fail", - "Search fail. Connection closed")); + "Search fail.")); return -1; } if (p->errcode != -1) @@ -501,7 +588,7 @@ static void present (const char *set, int offset, int number, 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); @@ -512,7 +599,6 @@ static void present (const char *set, int offset, int number, { int i; zass_record *pp; - char path[128]; int record_log_fd = -1; const char *record_log_name; @@ -520,12 +606,11 @@ static void present (const char *set, int offset, int number, NULL); if (record_log_name) { - sprintf (path, "%s/%s", gw_res_get (info.kernel_res, - "gw.path", "."), - record_log_name ); - record_log_fd = open (path, O_WRONLY|O_CREAT|O_APPEND, 0666); + record_log_fd = open (record_log_name, + O_WRONLY|O_CREAT|O_APPEND, 0666); if (record_log_fd == -1) - gw_log (GW_LOG_WARN|GW_LOG_ERRNO, "Cannot open %s", path); + gw_log (GW_LOG_WARN|GW_LOG_ERRNO, "Cannot open %s", + record_log_name); } fprintf (reply_fd, gw_res_get (info.kernel_res, "gw.msg.records", @@ -649,7 +734,19 @@ static int exec_show (struct ccl_token *list) li = li->next; } else + { + int len = li->len; + memcpy (tmp_str, li->name, len); + tmp_str[len] = '\0'; + if (atoi(tmp_str) <= 0) + { + fprintf (reply_fd, "%s\n", + gw_res_get (info.kernel_res, "gw.err.bad.show", + "Syntax error")); + return -3; + } li = li->next; + } } if (set_token) gw_log (GW_LOG_DEBUG, KERNEL_LOG, "Got set=%.*s", set_token->len, @@ -685,6 +782,15 @@ static int exec_show (struct ccl_token *list) memcpy (tmp_str, li->name, len); tmp_str [len] = '\0'; number = atoi (tmp_str) - offset + 1; + if (number <= 0) + { + fprintf (reply_fd, "%s\n", + gw_res_get (info.kernel_res, + "gw.err.pos.show", + "Starting position " + "greater than ending position")); + return -3; + } } else { @@ -697,7 +803,7 @@ static int exec_show (struct ccl_token *list) } li = li->next; } - else + else if (li->kind == CCL_TOK_TERM) { len = li->len; memcpy (tmp_str, li->name, len); @@ -726,6 +832,7 @@ static int exec_show (struct ccl_token *list) if (offset+number-1 > us->hits) number = us->hits - offset+1; present (us->name, offset, number, format_token); + info.next_position = offset+number; } } else if (!no_of_present) /* display error message once! */ @@ -801,9 +908,7 @@ static int exec_def (struct ccl_token *list) if (info.userid < 0) return -1; - sprintf (fname, "%s/user.%d.r", gw_res_get (info.kernel_res, - "gw.path", "."), - info.userid); + sprintf (fname, "user.%d.r", info.userid); if (list->kind == CCL_TOK_EOL) show_def (); @@ -886,12 +991,16 @@ static int exec_command (const char *str, int *stop_flag) { 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? */ { @@ -900,7 +1009,7 @@ static int exec_command (const char *str, int *stop_flag) fprintf (reply_fd, "\n> %s\n", str); if (!info.zass) /* fail? */ { - fprintf (reply_fd, "%s\n", + fprintf (reply_fd, "\n%s\n", gw_res_get (info.kernel_res, "gw.err.no.target", "No connection established - " "command ignored")); @@ -909,42 +1018,52 @@ static int exec_command (const char *str, int *stop_flag) } 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"); - ccl_token_not = gw_res_get (info.kernel_res, "ccl.token.not", "not"); - ccl_token_set = gw_res_get (info.kernel_res, "ccl.token.set", "set"); -#endif 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: - fprintf (reply_fd, "\n> %s\n", str); - return exec_help (cmd->next); - case 6: /* continue */ + 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: - return exec_status (cmd->next); - case 8: /* stop */ + case 7: /* status */ + exec_status (cmd); + return 0; + case 8: /* stop */ *stop_flag = 1; return 0; - case 9: - return exec_target (cmd->next); - case 10: - return exec_def (cmd->next); - case 11: - return exec_account (cmd->next); + case 9: /* target */ + cmd = ccl_token_simple (cp); + exec_target (cmd); + break; + case 10: /* def */ + 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 { @@ -1013,7 +1132,7 @@ int urp_command (struct str_queue *queue) 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) @@ -1033,7 +1152,7 @@ int urp_command (struct str_queue *queue) 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; } @@ -1064,7 +1183,6 @@ void urp_end (void) mta = gw_res_get (info.kernel_res, "gw.reply.mta", "/usr/lib/sendmail"); sprintf (cmd, "%s %s < %s", mta, info.from_str, info.reply_fname); - mta_code = system (cmd); if (mta_code) gw_log (GW_LOG_FATAL, KERNEL_LOG,