diff --git a/src/server/ChangeLog b/src/server/ChangeLog index df7b3b9095a02f2657c37bc886ffc962f7d731b7..e10f65b2f53dee778f1a25f2ffd91bd0b29de88d 100644 --- a/src/server/ChangeLog +++ b/src/server/ChangeLog @@ -1,3 +1,40 @@ +Wed Apr 1 22:02:55 1992 Per Cederqvist (ceder@lysator) + + * connections.h (Connection): New field: invisible. + * session.c, fncdef.txt (login_old): New name for the function + login(). + * fncdef.txt (login): New function with a parameter for invisible + use. + * session.c, fncdef.txt (login): New function with invisibility + support. + * session.c (logout, pepsi, change_what_i_am_doing): Don't send + asynchronous messages if the session is invisible. + + * connections.h (Connection): New field: ident_user. + * connections.h (Res_type): New types: rt_session_info_ident and + rt_who_info_ident_list. + * connections.c (login_request): Set ident_user. + * fncdef.txt (who_is_on_ident, get_session_info_ident): New + functions that behaves like who_is_on and get_session_info, but + also returns the ident name. + * internal_conections.c (EMPTY_CONNECTION, new_client, + kill_client): Set/free ident_user and invisible. + * prot_a_output.c (prot_a_output_who_info_ident, + prot_a_output_who_info_ident_list, + prot_a_output_session_info_ident): New functions. + * prot-a.c (reply): rt_who_info_ident_list and + rt_session_info_ident: New reply types. + * session.c (login_old): Generate the a proper (but not + 1.1.0-compatible) string in username. + * session.c (who_is_on, get_session_info): Generate username. + * session.c (who_is_on_ident, get_session_info_ident): New functions. + + * prot-a.c (prot_a_reply): Free username when returning a + session_info. + It is allocated in get_session_info() in session.c. + * prot-a-output.c (prot_a_output_who_info_list): Free username + when returning a who_info_list. + Tue Mar 31 23:48:47 1992 Per Cederqvist (ceder@robert) * rfc931.[hc]: New file. diff --git a/src/server/connections.c b/src/server/connections.c index 31d3230c3684c06503ae4106b897fc0b83c5e72c..ed0d3ed052fec17794aaf6396663e3eef150cac3 100644 --- a/src/server/connections.c +++ b/src/server/connections.c @@ -1,5 +1,5 @@ /* - * $Id: connections.c,v 0.12 1992/02/26 18:45:19 ceder Exp $ + * $Id: connections.c,v 0.13 1992/04/01 20:50:37 ceder Exp $ * Copyright (C) 1991 Lysator Academic Computer Association. * * This file is part of the LysKOM server. @@ -30,7 +30,7 @@ * Created by Willf|r 31/3-90. Mostly written by ceder. */ -static char *rcsid = "$Id: connections.c,v 0.12 1992/02/26 18:45:19 ceder Exp $"; +static char *rcsid = "$Id: connections.c,v 0.13 1992/04/01 20:50:37 ceder Exp $"; #include <errno.h> @@ -65,6 +65,7 @@ static char *rcsid = "$Id: connections.c,v 0.12 1992/02/26 18:45:19 ceder Exp $" #include "mux.h" #include "mux-parse.h" #include "internal-connections.h" +#include "rfc931.h" ISCMCB * kom_server_mcb = NULL; Connection * active_connection = NULL; @@ -712,7 +713,13 @@ login_request(ISCECB *event) cp = new_client(); cp->mux = event->session->udg; s_crea_str(&cp->hostname, event->session->info.tcp.hostname); - + + /* Get the real user name, as returned by the Ident protocol + (rfc 931). */ + realuser = ger_real_username(event->session); + if (realuser != NULL) + s_crea_str(&cp->ident_user, realuser); + mux_addclient(event->session->udg, 0, cp); BUG(("\n[Client %d from %s", cp->session_no, diff --git a/src/server/connections.h b/src/server/connections.h index 2f4b7143ac500aed44e80e84df50fc16a5b2a91a..aeba849c4d4aebe87b887a1e548b625b6d667a46 100644 --- a/src/server/connections.h +++ b/src/server/connections.h @@ -1,5 +1,5 @@ /* - * $Id: connections.h,v 0.7 1992/02/26 18:45:18 ceder Exp $ + * $Id: connections.h,v 0.8 1992/04/01 20:50:40 ceder Exp $ * Copyright (C) 1991 Lysator Academic Computer Association. * * This file is part of the LysKOM server. @@ -23,7 +23,7 @@ * Please mail bug reports to bug-lyskom@lysator.liu.se. */ /* - * $Id: connections.h,v 0.7 1992/02/26 18:45:18 ceder Exp $ + * $Id: connections.h,v 0.8 1992/04/01 20:50:40 ceder Exp $ * * connections.h -- The top level of the communication packet. * @@ -55,6 +55,8 @@ typedef struct connection { u_char ena_level; /* Enable level */ String username; /* Userid and hostname. */ String hostname; /* Real hostname */ + String ident_user; /* Real username */ + Bool invisible; /* Is this session invisible? */ /* The following are used by server/connections.c */ @@ -149,11 +151,19 @@ typedef enum { rt_time_date, rt_session_info, rt_session_no, - rt_text_no + rt_text_no, + rt_session_info_ident, + rt_who_info_ident_list } Res_type; /* * The result from a call is stored in this union. + * + * The pointers in these structures are normally set to point into + * data from the cache, and should thus not be free()d. In those cases + * where this actually contains newly allocated memory (and it is not + * allocated via tmp_alloc()) it should be free()d in prot_a_reply() in + * prot-a.c. */ typedef union { u_long number; diff --git a/src/server/internal-connections.c b/src/server/internal-connections.c index cdc1ecf688a7aba19594864a70537b8a1e201825..68325f0d719ef80e04f6a996d8744bc0efc4e6bb 100644 --- a/src/server/internal-connections.c +++ b/src/server/internal-connections.c @@ -1,5 +1,5 @@ /* - * $Id: internal-connections.c,v 0.7 1991/11/10 19:02:31 linus Exp $ + * $Id: internal-connections.c,v 0.8 1992/04/01 20:50:42 ceder Exp $ * Copyright (C) 1991 Lysator Academic Computer Association. * * This file is part of the LysKOM server. @@ -28,7 +28,7 @@ * Abstract routines on the data type Connection. */ -static char *rcsid = "$Id: internal-connections.c,v 0.7 1991/11/10 19:02:31 linus Exp $"; +static char *rcsid = "$Id: internal-connections.c,v 0.8 1992/04/01 20:50:42 ceder Exp $"; #include "exp.h" @@ -49,13 +49,21 @@ INTERNAL Session_no no_of_connection_attempts = 0; INTERNAL Connection *last_conn = NULL; INTERNAL const Connection EMPTY_CONNECTION = - ((Connection){0, NULL, NULL, 0, NULL, NO_TIME, 0, - EMPTY_STRING_i, 0, EMPTY_STRING_i, EMPTY_STRING_i, + ((Connection){0, NULL, NULL, + /* Things used by services.c */ + 0, NULL, NO_TIME, 0, + EMPTY_STRING_i, 0, + EMPTY_STRING_i, EMPTY_STRING_i, EMPTY_STRING_i, + FALSE, + /* Used by server/connections.c */ NULL, '\0', 0, 0, 0, 0, 0, 0, 0, + /* Gather data... */ 0, 0, 0, 0, EMPTY_STRING_i, EMPTY_STRING_i, EMPTY_STRING_i, NULL, NULL, DEFAULT_PRIV_BITS_i, - NULL_CONF_TYPE_i, EMPTY_tm_i, EMPTY_STRING_i, 0, FALSE, + NULL_CONF_TYPE_i, EMPTY_tm_i, + /* Protocol independent... */ + EMPTY_STRING_i, 0, FALSE, NO_TIME, 0, FALSE}); @@ -109,6 +117,8 @@ new_client(void) c->what_am_i_doing = EMPTY_STRING; c->ena_level = 0; c->username = EMPTY_STRING; + c->ident_user = EMPTY_STRING; + c->invisible = FALSE; c->kill_me = FALSE; return c; @@ -154,6 +164,7 @@ kill_client(Connection *cp) s_clear(&cp->what_am_i_doing); s_clear(&cp->username); s_clear(&cp->hostname); + s_clear(&cp->ident_user); if ( cp->mux != NULL ) { diff --git a/src/server/prot-a-output.c b/src/server/prot-a-output.c index 3efd8f452319c1f728b861a8c22d3addcf105b0a..9d4351745f955fb44d262d626e8bb1c0c294d92b 100644 --- a/src/server/prot-a-output.c +++ b/src/server/prot-a-output.c @@ -1,5 +1,5 @@ /* - * $Id: prot-a-output.c,v 0.7 1991/11/16 03:30:08 ceder Exp $ + * $Id: prot-a-output.c,v 0.8 1992/04/01 20:50:44 ceder Exp $ * Copyright (C) 1991 Lysator Academic Computer Association. * * This file is part of the LysKOM server. @@ -28,7 +28,7 @@ * Written by ceder 1990-07-13 */ -static char *rcsid = "$Id: prot-a-output.c,v 0.7 1991/11/16 03:30:08 ceder Exp $"; +static char *rcsid = "$Id: prot-a-output.c,v 0.8 1992/04/01 20:50:44 ceder Exp $"; #include <kom-types.h> @@ -257,10 +257,10 @@ prot_a_output_text_list(Connection *fp, else mux_printf(fp, " *"); } - -void -prot_a_output_who_info(Connection *fp, - Who_info *info) + +static void +prot_a_output_who_info_ident(Connection *fp, + Who_info_ident *info) { mux_printf(fp, " %lu %lu %lu", (u_long)info->person, @@ -269,6 +269,26 @@ prot_a_output_who_info(Connection *fp, prot_a_output_string(fp, info->what_am_i_doing); prot_a_output_string(fp, info->username); + prot_a_output_string(fp, info->hostname); + prot_a_output_string(fp, info->ident_user); +} + + +static void +prot_a_output_who_info(Connection *fp, + Who_info *info) +{ + String user_host_host = EMPTY_STRING; + + mux_printf(fp, " %lu %lu %lu", + (u_long)info->person, + (u_long)info->working_conference, + (u_long)info->session_no); + + prot_a_output_string(fp, info->what_am_i_doing); + prot_a_output_string(fp, user_host_host); + + s_clear(&user_host_host); } @@ -286,6 +306,30 @@ prot_a_output_who_info_list(Connection *fp, for ( i = 0; i < info.no_of_persons; i++ ) { prot_a_output_who_info(fp, &info.info[ i ]); + /* The username is specially alloced in who_is_on() in + session.c. */ + s_clear(&info.info[i].username); + } + mux_printf(fp, " }"); + } + else + mux_printf(fp, " *"); +} + +void +prot_a_output_who_info_ident_list(Connection *fp, + Who_info_ident_list info) +{ + int i; + + mux_printf(fp, " %lu", (u_long)info.no_of_persons); + + if ( info.info != NULL && info.no_of_persons > 0 ) + { + mux_printf(fp, " {"); + for ( i = 0; i < info.no_of_persons; i++ ) + { + prot_a_output_who_info_ident(fp, &info.info[ i ]); } mux_printf(fp, " }"); } @@ -333,6 +377,24 @@ prot_a_output_session_info(Connection *fp, mux_printf(fp, " %lu", (u_long)info->idle_time); prot_a_output_time(fp, info->connection_time); } + +void +prot_a_output_session_info_ident(Connection *fp, + Session_info *info) +{ + mux_printf(fp, " %lu %lu %lu", + (u_long)info->person, + (u_long)info->working_conference, + (u_long)info->session); + + prot_a_output_string(fp, info->what_am_i_doing); + prot_a_output_string(fp, info->username); + prot_a_output_string(fp, info->hostname); + prot_a_output_string(fp, info->ident_user); + + mux_printf(fp, " %lu", (u_long)info->idle_time); + prot_a_output_time(fp, info->connection_time); +} void prot_a_output_info(Connection *fp, diff --git a/src/server/prot-a-output.h b/src/server/prot-a-output.h index 779bc599268a33156692783a53f6c60b69611f38..65e617355bd46ddd37e03807eb4c80b6f8fe0fc5 100644 --- a/src/server/prot-a-output.h +++ b/src/server/prot-a-output.h @@ -1,5 +1,5 @@ /* - * $Id: prot-a-output.h,v 0.4 1991/11/16 03:30:07 ceder Exp $ + * $Id: prot-a-output.h,v 0.5 1992/04/01 20:50:46 ceder Exp $ * Copyright (C) 1991 Lysator Academic Computer Association. * * This file is part of the LysKOM server. @@ -23,7 +23,7 @@ * Please mail bug reports to bug-lyskom@lysator.liu.se. */ /* - * $Id: prot-a-output.h,v 0.4 1991/11/16 03:30:07 ceder Exp $ + * $Id: prot-a-output.h,v 0.5 1992/04/01 20:50:46 ceder Exp $ * */ extern void @@ -76,6 +76,9 @@ prot_a_output_who_info_list(Connection *fp, Who_info_list info); extern void +prot_a_output_who_info_ident_list(Connection *fp, + Who_info_ident_list info) +extern void prot_a_output_who_info_list_old(Connection *fp, Who_info_list_old info); @@ -83,6 +86,10 @@ void prot_a_output_session_info(Connection *fp, Session_info *info); +void +prot_a_output_session_info_ident(Connection *fp, + Session_info *info); + extern void prot_a_output_string(Connection *fp, String str); diff --git a/src/server/prot-a.c b/src/server/prot-a.c index 0690973e6c201406578ea9eb3199326f13fd77d5..aedadf5b9db8449a5440da869671f5c2e2d33081 100644 --- a/src/server/prot-a.c +++ b/src/server/prot-a.c @@ -1,5 +1,5 @@ /* - * $Id: prot-a.c,v 0.12 1991/12/17 23:07:40 ceder Exp $ + * $Id: prot-a.c,v 0.13 1992/04/01 20:50:49 ceder Exp $ * Copyright (C) 1991 Lysator Academic Computer Association. * * This file is part of the LysKOM server. @@ -26,7 +26,7 @@ * Protocol A. */ -static char *rcsid = "$Id: prot-a.c,v 0.12 1991/12/17 23:07:40 ceder Exp $"; +static char *rcsid = "$Id: prot-a.c,v 0.13 1992/04/01 20:50:49 ceder Exp $"; #include <stdio.h> @@ -133,6 +133,10 @@ prot_a_reply(Connection *client, case rt_session_info: prot_a_output_session_info(client, &res->session_info); + /* Clear username, since it is allocated (in get_session_info() + in session.c). See comment abover the definition of + typedef Result_holder in connections.h. */ + s_clear(&res->session_info->username); BUG(("={Session_info not listed}\n")); break; @@ -165,6 +169,18 @@ prot_a_reply(Connection *client, prot_a_output_text_no (client, res->text_no); BUG(("=(Text_no)%d\n", res->text_no)); break; + + case rt_who_info_ident_list: + prot_a_output_who_info_ident_list(client, + res->who_info_ident_list); + BUG(("={Who_info_ident_list not listed}\n")); + break; + + case rt_session_info_ident: + prot_a_output_session_info_ident(client, + &res->session_info); + BUG(("={Session_info_ident not listed}\n")); + break; } mux_putc('\n', client); } @@ -237,7 +253,7 @@ prot_a_is_legal_fnc(Call_header fnc) { switch(fnc) { - case call_fnc_login: + case call_fnc_login_old: case call_fnc_logout: case call_fnc_pepsi: case call_fnc_change_name: @@ -299,6 +315,9 @@ prot_a_is_legal_fnc(Call_header fnc) case call_fnc_create_anonymous_text: case call_fnc_find_next_text_no: case call_fnc_find_previous_text_no: + case call_fnc_who_is_on_ident: + case call_fnc_get_session_info_ident: + case call_fnc_login: return TRUE; default: @@ -320,13 +339,6 @@ prot_a_parse_packet(Connection *client) client->c_string0 = EMPTY_STRING; /* "A5B" as first input. */ /* Protokoll B will not suffer from this... */ - if ( s_strcat(&client->username, - s_fcrea_str((const unsigned char *)"@")) != OK ) - restart_kom("prot_a_parse_packet: s_strcat\n"); - - if ( s_strcat(&client->username, client->hostname) != OK ) - restart_kom("prot_a_parse_packet: s_strcat II\n"); - mux_printf(client, "LysKOM\n"); mux_flush(client); BUG(("[Client %d is logged on]\n", client->session_no));