Skip to content
Snippets Groups Projects
Select Git revision
  • 314365b27659ab2ff02b2313eedf2b32b500cc6f
  • master default protected
  • streebog
  • gost28147
  • master-updates
  • ed448
  • shake256
  • curve448
  • ecc-sqrt
  • gosthash94cp
  • cmac64
  • block16-refactor
  • siv-mode
  • cmac-layout
  • delete-des-compat
  • delete-rsa_blind
  • aes-struct-layout
  • release-3.4-fixes
  • struct-layout
  • attribute-deprecated
  • rename-data-symbols
  • nettle_3.5.1_release_20190627
  • nettle_3.5_release_20190626
  • nettle_3.5rc1
  • nettle_3.4.1_release_20181204
  • nettle_3.4.1rc1
  • nettle_3.4_release_20171119
  • nettle_3.4rc2
  • nettle_3.4rc1
  • nettle_3.3_release_20161001
  • nettle_3.2_release_20160128
  • nettle_3.1.1_release_20150424
  • nettle_3.1_release_20150407
  • nettle_3.1rc3
  • nettle_3.1rc2
  • nettle_3.1rc1
  • nettle_3.0_release_20140607
  • nettle_2.7.1_release_20130528
  • nettle_2.7_release_20130424
  • nettle_2.6_release_20130116
  • nettle_2.5_release_20120707
41 results

dsa-keygen.c

Blame
  • Forked from Nettle / nettle
    Source project has a limited visibility.
    prot-a-output.c 26.28 KiB
    /*
     * $Id: prot-a-output.c,v 0.37 1998/12/26 22:40:49 byers Exp $
     * Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996  Lysator Academic Computer Association.
     *
     * This file is part of the LysKOM server.
     * 
     * LysKOM is free software; you can redistribute it and/or modify it
     * under the terms of the GNU General Public License as published by 
     * the Free Software Foundation; either version 1, or (at your option) 
     * any later version.
     * 
     * LysKOM is distributed in the hope that it will be useful, but WITHOUT
     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
     * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
     * for more details.
     * 
     * You should have received a copy of the GNU General Public License
     * along with LysKOM; see the file COPYING.  If not, write to
     * Lysator, c/o ISY, Linkoping University, S-581 83 Linkoping, SWEDEN,
     * or the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, 
     * MA 02139, USA.
     *
     * Please mail bug reports to bug-lyskom@lysator.liu.se. 
     */
    /*
     * prot-a-output.c  -  write objects through a mux connection.
     *
     * Written by ceder 1990-07-13
     */
    
    
    
    #ifdef HAVE_CONFIG_H
    #  include <config.h>
    #endif
    
    static const char *
    rcsid = "$Id: prot-a-output.c,v 0.37 1998/12/26 22:40:49 byers Exp $";
    #include "rcs.h"
    USE(rcsid);
    
    #include <time.h>
    #include <setjmp.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #ifdef HAVE_STDARG_H
    #  include <stdarg.h>
    #endif
    #include <assert.h>
    
    #include "s-string.h"
    #include "kom-types.h"
    #include "isc-interface.h"
    #include "com.h"
    #include "async.h"
    #include "connections.h"
    #include "mux.h"
    #include "prot-a-output.h"
    #include "lyskomd.h"
    #include "param.h"
    #include "local-to-global.h"
    
    void
    prot_a_output_person (Connection *fp,
                          Person *person)
    {
        Local_text_no first_created = l2g_next_key(&person->created_texts, 0);
        Local_text_no uncreated = l2g_first_appendable_key(&person->created_texts);
        Local_text_no num_created;
    
        if (first_created == 0)
    	first_created = uncreated;
    
        num_created = uncreated - first_created;
    
        prot_a_output_string (fp, person->username);
        prot_a_output_priv_bits (fp, person->privileges);
        prot_a_output_personal_flags (fp, person->flags);
    
        prot_a_output_time(fp, person->last_login);
    
        mux_printf (fp, " %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu",
    	     (unsigned long) person -> user_area,
    	     (unsigned long) person -> total_time_present, /* This is not a time,
    						     * but a number of seconds.
    						     */
    	     (unsigned long) person -> sessions,
    	     (unsigned long) person -> created_lines,
    	     (unsigned long) person -> created_bytes,
    	     (unsigned long) person -> read_texts,
    	     (unsigned long) person -> no_of_text_fetches,
    	     (unsigned long) person -> created_persons,
    	     (unsigned long) person -> created_confs,
    	     (unsigned long) first_created,
    	     (unsigned long) num_created,
    	     (unsigned long) person -> marks.no_of_marks,
    	     (unsigned long) person -> conferences.no_of_confs);
    }
    
    void prot_a_output_membership_type(Connection *fp,
                                       const Membership_type type)
    {
        mux_putc(' ', fp);
        mux_putc(type.invitation + '0', fp);
        mux_putc(type.passive    + '0', fp);
        mux_putc(type.secret     + '0', fp);
        mux_putc(type.reserved1  + '0', fp);
        mux_putc(type.reserved2  + '0', fp);
        mux_putc(type.reserved3  + '0', fp);
        mux_putc(type.reserved4  + '0', fp);
        mux_putc(type.reserved5  + '0', fp);
    }
    
    void prot_a_output_membership(Connection *fp,
                                  const Membership *mship)
    {
        prot_a_output_membership_old(fp, mship);
        mux_printf(fp, " %lu", (unsigned long)mship->added_by);
        prot_a_output_time(fp, mship->added_at);
        prot_a_output_membership_type(fp, mship->type);
    }
    
    void prot_a_output_extended_membership(Connection *fp,
                                           const Extended_Membership *mship)
    {
        mux_printf(fp, " %lu", mship->position);
        prot_a_output_membership (fp, &mship->membership);
    }
    
    void
    prot_a_output_membership_old(Connection *fp,
    			     const Membership *mship)
    {
        int i;
        
        prot_a_output_time(fp, mship->last_time_read );
        
        mux_printf(fp, " %lu %lu %lu %lu",
    	    (unsigned long)mship->conf_no,
    	    (unsigned long)mship->priority,
    	    (unsigned long)mship->last_text_read,
    	    (unsigned long)mship->no_of_read);
        
        if ( mship->read_texts != NULL && mship->no_of_read > 0)
        {
    	mux_printf(fp, " {");
    	for ( i = 0; i < mship->no_of_read; i++)
    	    mux_printf(fp, " %lu", (unsigned long)mship->read_texts[ i ]);
    	
    	mux_printf(fp, " }");
        }
        else
    	mux_printf(fp, " *");
    }
    
    	
    void
    prot_a_output_membership_list_old (Connection	* fp,
                                       Membership_list	  mlist)
    {
        int i;
        
        mux_printf(fp, " %lu", (unsigned long)mlist.no_of_confs);
    
        if ( mlist.confs != NULL && mlist.no_of_confs > 0 )
        {
    	mux_printf(fp, " {");
    	for ( i = 0; i < mlist.no_of_confs; i++)
    	    prot_a_output_membership_old(fp, mlist.confs + i);
    	mux_printf(fp, " }");
        }
        else
    	mux_printf(fp, " *");
    }
    
    void
    prot_a_output_membership_list (Connection	* fp,
                                   Membership_list	  mlist)
    {
        int i;
        
        mux_printf(fp, " %lu", (unsigned long)mlist.no_of_confs);
    
        if ( mlist.confs != NULL && mlist.no_of_confs > 0 )
        {
    	mux_printf(fp, " {");
    	for ( i = 0; i < mlist.no_of_confs; i++)
    	    prot_a_output_membership(fp, mlist.confs + i);
    	mux_printf(fp, " }");
        }
        else
    	mux_printf(fp, " *");
    }
    
    void
    prot_a_output_conf_list(Connection *fp,
    			Conf_list_old conf_list)
    {
        unsigned long i;
    
        mux_printf(fp, " %lu", (unsigned long)conf_list.no_of_conf_nos);
        if ( conf_list.conf_nos != NULL && conf_list.no_of_conf_nos > 0 )
        {
    	mux_printf(fp, " {");
    	for ( i = 0; i < conf_list.no_of_conf_nos; i++ )
    	    mux_printf(fp, " %lu", (unsigned long)conf_list.conf_nos[ i ]);
    	mux_printf(fp, " }");
        }
        else
    	mux_printf(fp, " *");
    
        if ( conf_list.type_of_conf != NULL && conf_list.no_of_conf_nos > 0 )
        {
    	mux_printf(fp, " {");
    	for ( i = 0; i < conf_list.no_of_conf_nos; i++ )
    	    prot_a_output_conf_type(fp, conf_list.type_of_conf[ i ]);
    	mux_printf(fp, " }");
        }
        else
    	mux_printf(fp, " *");
    }
    
    void
    prot_a_output_conf_no_list(Connection *fp,
    			   Conf_no_list conf_no_list)
    {
        int i;
    
        mux_printf(fp, " %lu", (unsigned long)conf_no_list.no_of_confs);
        if ( conf_no_list.conf_nos != NULL && conf_no_list.no_of_confs > 0 )
        {
    	mux_printf(fp, " {");
    	for ( i = 0; i < conf_no_list.no_of_confs; i++ )
    	    mux_printf(fp, " %lu", (unsigned long)conf_no_list.conf_nos[ i ]);
    	mux_printf(fp, " }");
        }
        else
    	mux_printf(fp, " *");
    }
        
    
    void
    prot_a_output_conference (Connection *fp,
                              Conference *conf_c)
    {
        Local_text_no first_local_no = l2g_next_key(&conf_c->texts, 0);
        Local_text_no uncreated = l2g_first_appendable_key(&conf_c->texts);
        Local_text_no no_of_texts;
    
        if (first_local_no == 0)
    	first_local_no = uncreated;
    
        no_of_texts = uncreated - first_local_no;
    
        prot_a_output_string(fp, conf_c->name);
        prot_a_output_extended_conf_type(fp, conf_c->type);
        prot_a_output_time(fp, conf_c -> creation_time );
        prot_a_output_time(fp, conf_c -> last_written );
        mux_printf (fp, " %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu",
                    (unsigned long) conf_c -> creator,
                    (unsigned long) conf_c -> presentation,
                    (unsigned long) conf_c -> supervisor,
                    (unsigned long) conf_c -> permitted_submitters,
                    (unsigned long) conf_c -> super_conf,
                    (unsigned long) conf_c -> msg_of_day,
                    (unsigned long) conf_c -> nice,
                    (unsigned long) conf_c -> members.no_of_members,
                    (unsigned long) first_local_no,
                    (unsigned long) no_of_texts,
                    (unsigned long) conf_c -> expire);
        prot_a_output_aux_item_list (fp, &conf_c->aux_item_list);
    }
    
    void
    prot_a_output_conference_old (Connection *fp,
                                  Conference *conf_c)
    {
        Local_text_no first_local_no = l2g_next_key(&conf_c->texts, 0);
        Local_text_no uncreated = l2g_first_appendable_key(&conf_c->texts);
        Local_text_no no_of_texts;
    
        if (first_local_no == 0)
    	first_local_no = uncreated;
    
        no_of_texts = uncreated - first_local_no;
    
        prot_a_output_string(fp, conf_c->name);
    
        prot_a_output_conf_type(fp, conf_c->type);
    
        prot_a_output_time(fp, conf_c -> creation_time );
        prot_a_output_time(fp, conf_c -> last_written );
    
        mux_printf (fp, " %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu",
    	     (unsigned long) conf_c -> creator,
    	     (unsigned long) conf_c -> presentation,
    	     (unsigned long) conf_c -> supervisor,
    	     (unsigned long) conf_c -> permitted_submitters,
    	     (unsigned long) conf_c -> super_conf,
    	     (unsigned long) conf_c -> msg_of_day,
    	     (unsigned long) conf_c -> nice,
    	     (unsigned long) conf_c -> members.no_of_members,
    	     (unsigned long) first_local_no,
    	     (unsigned long) no_of_texts);
    }
    
    void prot_a_output_uconference(Connection *fp,
    			       Small_conf *conf_c)
    {
        prot_a_output_string(fp, conf_c -> name);
        prot_a_output_extended_conf_type(fp, conf_c -> type);
        mux_printf(fp, " %lu %lu",
    	       (unsigned long) conf_c -> highest_local_no,
    	       (unsigned long) conf_c -> nice);
    }
    
    
    void
    prot_a_output_mark_list(Connection *fp,
    			Mark_list mark_list)
    {
        int i;
    
        mux_printf(fp, " %lu", (unsigned long)mark_list.no_of_marks);
    
        if ( mark_list.marks != NULL && mark_list.no_of_marks > 0 )
        {
    	mux_printf(fp, " {");
    	for ( i = 0; i < mark_list.no_of_marks; i++ )
    	    prot_a_output_mark(fp, mark_list.marks[ i ]);
    	mux_printf(fp, " }");
        }
        else
    	mux_printf(fp, " *");
        
    }
    
    void
    prot_a_output_aux_item_flags(Connection *fp,
                                 Aux_item_flags flags)
    {
        mux_putc(' ', fp);
        mux_putc(flags.deleted + '0', fp);
        mux_putc(flags.inherit + '0', fp);
        mux_putc(flags.secret + '0', fp);
        mux_putc(flags.hide_creator + '0', fp);
        mux_putc(flags.dont_garb + '0', fp);
        mux_putc(flags.reserved3 + '0', fp);
        mux_putc(flags.reserved4 + '0', fp);
        mux_putc(flags.reserved5 + '0', fp);
    }
    
    void
    prot_a_output_aux_item(Connection *fp,
                           Aux_item *item)
    {
        mux_printf(fp, " %lu %lu %lu",
                   item->aux_no,
                   item->tag,
                   (unsigned long)item->creator);
        prot_a_output_time(fp, item->sent_at);
        prot_a_output_aux_item_flags(fp, item->flags);
        mux_printf(fp, " %lu", item->inherit_limit);
        prot_a_output_string(fp, item->data);
    }
    
    void
    prot_a_output_text_stat_old(Connection *fp,
                                Text_stat *t_stat)
    {
        int i;
    
        prot_a_output_time(fp, t_stat->creation_time);
        
        mux_printf(fp, " %lu %lu %lu %lu %lu",
    	    (unsigned long)t_stat->author,
    	    (unsigned long)t_stat->no_of_lines,
    	    (unsigned long)t_stat->no_of_chars,
    	    (unsigned long)t_stat->no_of_marks,
    	    (unsigned long)t_stat->no_of_misc);
    
        if ( t_stat->misc_items != NULL && t_stat->no_of_misc > 0 )
        {
    	mux_printf(fp, " {");
    	for ( i = 0; i < t_stat->no_of_misc; i++ )
    	    prot_a_output_misc_info(fp, t_stat->misc_items[ i ]);
    	mux_printf(fp, " }");
        }
        else
    	mux_printf(fp, " *");
    }	
    
    void
    prot_a_output_aux_item_list(Connection *fp,
    			    Aux_item_list *aux)
    {
      int i;
    
        mux_printf(fp, " %lu",
                   (unsigned long)aux->length);
    
        if ( aux->items != NULL && aux->length > 0 )
        {
            mux_printf(fp, " {");
            for (i = 0; i < aux->length; i++)
                prot_a_output_aux_item(fp, &aux->items[i]);
            mux_printf(fp, " }");
        }
        else
    	mux_printf(fp, " *");
    }
    
    void
    prot_a_output_text_stat(Connection *fp,
                            Text_stat *t_stat)
    {
        prot_a_output_text_stat_old(fp, t_stat);
        prot_a_output_aux_item_list(fp, &t_stat->aux_item_list);
    }	
    
    
    static void
    prot_a_output_who_info_ident(Connection *fp,
    			     Who_info_ident *info)
    {
        mux_printf(fp, " %lu %lu %lu",
    	    (unsigned long)info->person,
    	    (unsigned long)info->working_conference,
    	    (unsigned long)info->session_no);
    
        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);
    }
    
    
    void
    prot_a_output_who_info(Connection *fp,
    		       Who_info *info)
    {
        mux_printf(fp, " %lu %lu %lu",
    	    (unsigned long)info->person,
    	    (unsigned long)info->working_conference,
    	    (unsigned long)info->session_no);
    
        prot_a_output_string(fp, info->what_am_i_doing); 
        prot_a_output_string(fp, info->username);
    }
    
    
    void
    prot_a_output_who_info_list(Connection *fp,
    			    Who_info_list info)
    {
        int i;
        
        mux_printf(fp, " %lu", (unsigned 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(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", (unsigned 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, " }");
        }
        else
    	mux_printf(fp, " *");
    }
    
    void
    prot_a_output_who_info_list_old(Connection *fp,
    				Who_info_list_old info)
    {
        int i;
        
        mux_printf(fp, " %lu", (unsigned 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++ )
    	{
    	    mux_printf(fp, " %lu %lu",
    		    (unsigned long)info.info[ i ].person,
    		    (unsigned long)info.info[ i ].working_conference);
    	    
    	    prot_a_output_string(fp, info.info[ i ].what_am_i_doing);
    	}
    	mux_printf(fp, " }");
        }
        else
    	mux_printf(fp, " *");
    }
    
    void
    prot_a_output_session_info(Connection *fp,
    			   Session_info *info)
    {
        mux_printf(fp, " %lu %lu %lu",
    	    (unsigned long)info->person,
    	    (unsigned long)info->working_conference,
    	    (unsigned long)info->session);
    
        prot_a_output_string(fp, info->what_am_i_doing);
        prot_a_output_string(fp, info->username);
    
        mux_printf(fp, " %lu", (unsigned long)info->idle_time);
        prot_a_output_time(fp, info->connection_time);
    }
    
    void
    prot_a_output_session_info_ident(Connection *fp,
    				 Session_info_ident *info)
    {
        mux_printf(fp, " %lu %lu %lu",
    	    (unsigned long)info->person,
    	    (unsigned long)info->working_conference,
    	    (unsigned 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", (unsigned long)info->idle_time);
        prot_a_output_time(fp, info->connection_time);
    }
        
    void
    prot_a_output_info(Connection *fp,
                       Info *info)
    {
        prot_a_output_info_old(fp, info);
        prot_a_output_aux_item_list(fp, &info->aux_item_list);
    }
    
    void
    prot_a_output_info_old(Connection *fp,
                           Info *info)
    {
        mux_printf(fp, " %lu %lu %lu %lu %lu %lu",
    	    (unsigned long)info->version,
    	    (unsigned long)info->conf_pres_conf,
    	    (unsigned long)info->pers_pres_conf,
    	    (unsigned long)info->motd_conf,
    	    (unsigned long)info->kom_news_conf,
    	    (unsigned long)info->motd_of_lyskom);
    }
    
    
    extern void
    prot_a_output_string(Connection *fp,
    		     String str)
    {
        mux_printf(fp, " %luH", (unsigned long)str.len);
        mux_write(fp, str.string, str.len);
    }
    
    
    extern void
    prot_a_output_priv_bits(Connection *fp,
    			Priv_bits bits)
    {
        mux_putc(' ', fp);
        mux_putc(bits.wheel + '0', fp);
        mux_putc(bits.admin + '0', fp);
        mux_putc(bits.statistic + '0', fp);
        mux_putc(bits.create_pers + '0', fp);
        mux_putc(bits.create_conf + '0', fp);
        mux_putc(bits.change_name + '0', fp);
        mux_putc(bits.extern_gw + '0', fp);
        mux_putc(bits.flg8 + '0', fp);
        mux_putc(bits.flg9 + '0', fp);
        mux_putc(bits.flg10 + '0', fp);
        mux_putc(bits.flg11 + '0', fp);
        mux_putc(bits.flg12 + '0', fp);
        mux_putc(bits.flg13 + '0', fp);
        mux_putc(bits.flg14 + '0', fp);
        mux_putc(bits.flg15 + '0', fp);
        mux_putc(bits.flg16 + '0', fp);
    }
    
    
    extern void
    prot_a_output_personal_flags(Connection *fp,
    			     Personal_flags flags)
    {
        mux_putc(' ', fp);
        mux_putc(flags.unread_is_secret + '0', fp);
        mux_putc(flags.flg2 + '0', fp);
        mux_putc(flags.flg3 + '0', fp);
        mux_putc(flags.flg4 + '0', fp);
        mux_putc(flags.flg5 + '0', fp);
        mux_putc(flags.flg6 + '0', fp);
        mux_putc(flags.flg7 + '0', fp);
        mux_putc(flags.flg8 + '0', fp);
    }	
    
    extern void
    prot_a_output_conf_type(Connection *fp,
    			Conf_type type)
    {
        mux_putc(' ', fp);
        mux_putc(type.rd_prot + '0', fp);
        mux_putc(type.original + '0', fp);
        mux_putc(type.secret + '0', fp);
        mux_putc(type.letter_box + '0', fp);
    }
    
    extern void
    prot_a_output_extended_conf_type(Connection *fp,
    				 Conf_type type)
    {
        mux_putc(' ', fp);
        mux_putc(type.rd_prot + '0', fp);
        mux_putc(type.original + '0', fp);
        mux_putc(type.secret + '0', fp);
        mux_putc(type.letter_box + '0', fp);
        mux_putc(type.allow_anon + '0', fp);
        mux_putc(type.forbid_secret + '0', fp);
        mux_putc(type.reserved2 + '0', fp);
        mux_putc(type.reserved3 + '0', fp);
    }
    
    extern void
    prot_a_output_member_list(Connection *fp,
                              Member_list m_list)
    {
        int i;
    
        mux_printf(fp, " %lu", (unsigned long)m_list.no_of_members);
        if ( m_list.members != NULL && m_list.no_of_members > 0 )
        {
    	mux_printf(fp, " {");
    	for ( i = 0; i < m_list.no_of_members; i++ )
    	    prot_a_output_member(fp, m_list.members[ i ]);
    	mux_printf(fp, " }");
        }
        else
    	mux_printf(fp, " *");
    }
    
    extern void
    prot_a_output_member_list_old(Connection *fp,
                                  Member_list m_list)
    {
        int i;
    
        mux_printf(fp, " %lu", (unsigned long)m_list.no_of_members);
        if ( m_list.members != NULL && m_list.no_of_members > 0 )
        {
    	mux_printf(fp, " {");
    	for ( i = 0; i < m_list.no_of_members; i++ )
    	    prot_a_output_member_old(fp, m_list.members[ i ]);
    	mux_printf(fp, " }");
        }
        else
    	mux_printf(fp, " *");
    }
    
    
    void
    prot_a_output_member(Connection *fp,
    		     Member member)
    {
        mux_printf(fp, " %lu", (unsigned long)member.member);
        mux_printf(fp, " %lu", (unsigned long)member.added_by);
        prot_a_output_time(fp, member.added_at);
        prot_a_output_membership_type(fp, member.type);
    }
    
    void
    prot_a_output_member_old(Connection *fp,
    		     Member member)
    {
        mux_printf(fp, " %lu", (unsigned long)member.member);
    }
    
        
    extern void
    prot_a_output_mark(Connection *fp,
    		   Mark mark)
    {
        mux_printf(fp, " %lu %lu", (unsigned long)mark.text_no, (unsigned long)mark.mark_type);
    }
    
    
    extern void
    prot_a_output_misc_info(Connection *fp, 
    			Misc_info misc)
    {
        mux_printf(fp, " %lu", (unsigned long)misc.type);
        
        switch(misc.type)
        {
        case recpt:
    	mux_printf(fp, " %lu", (unsigned long)misc.datum.recipient);
    	break;
    	
        case cc_recpt:
    	mux_printf(fp, " %lu", (unsigned long)misc.datum.cc_recipient);
    	break;
    	
        case bcc_recpt:
    	mux_printf(fp, " %lu", (unsigned long)misc.datum.bcc_recipient);
    	break;
    	
        case loc_no:
    	mux_printf(fp, " %lu", (unsigned long)misc.datum.local_no);
    	break;
    	
        case rec_time:
    	prot_a_output_time(fp, misc.datum.received_at);
    	break;
    	
        case comm_to:
    	mux_printf(fp, " %lu", (unsigned long)misc.datum.comment_to);
    	break;
    	
        case comm_in:
    	mux_printf(fp, " %lu", (unsigned long)misc.datum.commented_in);
    	break;
    	
        case footn_to:
    	mux_printf(fp, " %lu", (unsigned long)misc.datum.footnote_to);
    	break;
    	
        case footn_in:
    	mux_printf(fp, " %lu", (unsigned long)misc.datum.footnoted_in);
    	break;
    	
        case sent_by:
    	mux_printf(fp, " %lu", (unsigned long)misc.datum.sender);
    	break;
    	
        case sent_at:
    	prot_a_output_time(fp, misc.datum.sent_at);
    	break;
    
    #ifndef COMPILE_CHECKS
        default:
    	restart_kom("prot_a_output_misc_info: Illegal misc\n");
    #endif
        }
    }
    
    
    void
    prot_a_output_time(Connection *fp,
    		   time_t clk)
    {
        struct tm *t;
    
        t = localtime( &clk );
    
        mux_printf(fp, " %lu %lu %lu %lu %lu %lu %lu %lu %lu",
                   (unsigned long) t -> tm_sec,
                   (unsigned long) t -> tm_min,
                   (unsigned long) t -> tm_hour,
                   (unsigned long) t -> tm_mday,
                   (unsigned long) t -> tm_mon,
                   (unsigned long) t -> tm_year,
                   (unsigned long) t -> tm_wday,
                   (unsigned long) t -> tm_yday,
                   (unsigned long) t -> tm_isdst);
    }
    
    
    void
    prot_a_output_session_no(Connection *fp,
    			 Session_no session_no)
    {
        mux_printf(fp, " %lu", (unsigned long) session_no);
    }
    
    void
    prot_a_output_text_no(Connection *fp,
    		      Text_no text)
    {
        mux_printf(fp, " %lu", (unsigned long) text);
    }
    
    static void
    prot_a_output_conf_z_info (Connection  *fp,
    			   Conf_z_info *conf_c)
    {
        prot_a_output_string(fp, conf_c->name);
        prot_a_output_conf_type(fp, conf_c->type);
        mux_printf (fp, " %lu", (unsigned long) conf_c -> conf_no);
    }
    
    extern void
    prot_a_output_conf_z_info_list(Connection *fp,
    			       Conf_z_info_list c_list)
    {
        int i;
    
        mux_printf(fp, " %lu", (unsigned long)c_list.no_of_confs);
        if ( c_list.confs != NULL && c_list.no_of_confs > 0 )
        {
    	mux_printf(fp, " {");
    	for ( i = 0; i < c_list.no_of_confs; i++ )
    	    prot_a_output_conf_z_info(fp, &c_list.confs[ i ]);
    	mux_printf(fp, " }");
        }
        else
    	mux_printf(fp, " *");
    }
    
    void
    prot_a_output_version_info (Connection  *fp,
    			    Version_info *v_info)
    {
        mux_printf (fp, " %lu", (unsigned long) v_info->protocol_version);
        prot_a_output_string(fp, v_info->server_name);
        prot_a_output_string(fp, v_info->server_version);
    }
    
    void
    prot_a_output_num_list (Connection *fp,
                            Number_list *num_list)
    {
        int i;
        
        mux_printf(fp, " %lu", (unsigned long) num_list->length);
        if (num_list->length == 0)
            mux_printf(fp, " *");
        else
        {
            mux_printf(fp, " {");
            for (i = 0; i < num_list->length; i++)
                mux_printf(fp, " %lu", (unsigned long)num_list->data[i]);
            mux_printf(fp, " }");
        }
    }
    
    static void
    prot_a_output_session_flags(Connection *fp,
    			    Session_flags flags)
    {
        mux_putc(' ', fp);
        mux_putc(flags.invisible + '0', fp);
        mux_putc(flags.user_active_used + '0', fp);
        mux_putc(flags.user_absent + '0', fp);
        mux_putc(flags.reserved3 + '0', fp);
        mux_putc(flags.reserved4 + '0', fp);
        mux_putc(flags.reserved5 + '0', fp);
        mux_putc(flags.reserved6 + '0', fp);
        mux_putc(flags.reserved7 + '0', fp);
    }	
    static void
    prot_a_output_dynamic_session_info (Connection *fp,
    				    Dynamic_session_info *info)
    {
        mux_printf(fp, " %lu %lu %lu %lu",
    	       (unsigned long)info->session,
    	       (unsigned long)info->person,
    	       (unsigned long)info->working_conference,
    	       (unsigned long)info->idle_time);
        prot_a_output_session_flags(fp, info->flags);
        prot_a_output_string(fp, info->what_am_i_doing);
    }
    
    void
    prot_a_output_static_session_info (Connection *fp,
    				   Static_session_info *info)
    {
        prot_a_output_string(fp, info->username);
        prot_a_output_string(fp, info->hostname);
        prot_a_output_string(fp, info->ident_user);
        prot_a_output_time(fp, info->connection_time);
    }
    
    void
    prot_a_output_dynamic_session_info_list (Connection *fp,
    					 Dynamic_session_info_list *list)
    {
        long i;
    
        mux_printf(fp, " %lu", (unsigned long) list->no_of_sessions);
        if (list->no_of_sessions == 0)
    	mux_printf(fp, " *");
        else
        {
    	mux_printf(fp, " {");
    	for (i = 0; i < list->no_of_sessions; i++)
    	    prot_a_output_dynamic_session_info(fp, &list->sessions[i]);
    	mux_printf(fp, " }");
        }
    }
    
    void
    prot_a_output_l2g_iterator_as_text_list(Connection *fp,
    					L2g_iterator_as_text_list *iter)
    {
        Local_text_no lno = l2gi_begin(iter);
        Local_text_no limit = l2gi_end(iter);
    
        mux_printf(fp, " %lu %lu",
    	       (unsigned long)lno,
    	       (unsigned long)(limit - lno));
    
        if (limit - lno > 0)
        {
    	mux_printf(fp, " {");
    	for (; !iter->search_ended; l2gi_next(iter))
    	{
    	    /* Write the correct number of zeroes. */
    	    for (; lno < iter->lno; ++lno)
    		mux_printf(fp, " 0");
    	    /* Write this piece of data. */
    	    mux_printf(fp, " %lu", (unsigned long)iter->tno);
    	    ++lno;
    	}
    	/* Write any trailing zeroes */
    	for (; lno < limit; ++lno)
    	    mux_printf(fp, " 0");
    	mux_printf(fp, " }");
        }
        else
    	mux_printf(fp, " *");
    }
    
    void
    prot_a_output_text_mapping(Connection *fp,
    			   Text_mapping *map)
    {
        Local_text_no lowest;
        Local_text_no highest;
        Local_text_no limit;
        Local_text_no zeroes = 0;
        Local_text_no nonzeroes = 0;
        L2g_iterator iter;
    
        /* Count the number of internal zeroes to determine if we should
           use a dense or sparse representation. */
    
        for (l2gi_searchsome(&iter, map->l2g, map->first, 0),
    	     highest = (lowest = iter.lno) - 1;
    	 !iter.search_ended && nonzeroes < map->no_of_texts;
    	 l2gi_next(&iter))
        {
    	zeroes += (iter.lno - highest) - 1;
    	nonzeroes++;
    	highest = iter.lno;
        }
    
        limit = highest + 1;
    
        /* Emit the "later-texts-exists" flag. */
    
        mux_printf(fp, " %c", iter.search_ended ? '0' : '1');
    
    
        /* Emit the block, either a sparse or a dense one. */
    
        if (nonzeroes == 0)
        {
    	/* Special case: an emtpy array.  Use the sparse format so
    	   that we don't have to philosophize about what the lower
    	   limit in the text-list should be. */
    	mux_printf(fp, " 0 0 *");
        }
        else if (zeroes >= nonzeroes)
        {
    	/* There are at least as many zeroes as real mappings, so use
    	   a sparse representation. */
    
    	mux_printf(fp, " 0 %lu {", (unsigned long)nonzeroes);
    
    	for (l2gi_searchsome(&iter, map->l2g, map->first, limit);
    	     !iter.search_ended;
    	     l2gi_next(&iter))
    	{
    	    mux_printf(fp, " %lu %lu",
    		       (unsigned long)iter.lno,
    		       (unsigned long)iter.tno);
    	}
    	mux_printf(fp, " }");
        }
        else
        {
    	/* Emit a dense block. */
    	mux_printf(fp, " 1 %lu %lu {",
    		   (unsigned long)lowest,
    		   (unsigned long)(zeroes + nonzeroes));
    	highest = lowest;
    	for (l2gi_searchsome(&iter, map->l2g, map->first, limit);
    	     !iter.search_ended;
    	     l2gi_next(&iter))
    	{
    	    while (highest++ < iter.lno)
    		mux_printf(fp, " 0");
    	    mux_printf(fp, " %lu", (unsigned long)iter.tno);
    	}
    	mux_printf(fp, " }");
        }
    }