Select Git revision
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, " }");
}
}