/* * $Id: ram-output.c,v 0.6 1993/01/16 23:17:43 ceder Exp $ * Copyright (C) 1991 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. */ /* * ram-output.c - write objects to disk. * * This is a hack. It shouldn't be used except for debugging and as a * temporary substitute for what Willf|r is (or should:-) be doing. * * Written by ceder 1990-07-13. Rewritten 1990-08-31. * Some functions rewritten for speed by Inge Wallin. * (It worked - now saving is twice as fast.) */ static char *rcsid = "$Id: ram-output.c,v 0.6 1993/01/16 23:17:43 ceder Exp $"; #include "rcs.h" USE(rcsid); #include #include #include #include #include "lyskomd.h" #include "ram-output.h" #include "com.h" #include "isc-interface.h" #include "connections.h" #include "prot-a-output.h" #include "log.h" void foutput_person (FILE *fp, Person *person) { foutput_string (fp, person->username); foutput_priv_bits (fp, person->privileges); foutput_personal_flags (fp, person->flags); foutput_text_list (fp, person->created_texts); foutput_mark_list (fp, person->marks); foutput_membership_list (fp, person->conferences); foutput_time(fp, person->last_login); fprintf (fp, " %lu %lu %lu %lu %lu %lu %lu %lu %lu", (u_long) person -> user_area, (u_long) person -> total_time_present, /* This is not a time, * but a number of seconds. */ (u_long) person -> sessions, (u_long) person -> created_lines, (u_long) person -> created_bytes, (u_long) person -> read_texts, (u_long) person -> no_of_text_fetches, (u_long) person -> created_persons, (u_long) person -> created_confs); } void foutput_conference (FILE *fp, Conference *conf_c) { foutput_string(fp, conf_c->name); foutput_member_list(fp, conf_c->members); foutput_text_list(fp, conf_c->texts); foutput_conf_type(fp, conf_c->type); foutput_time(fp, conf_c -> creation_time ); foutput_time(fp, conf_c -> last_written ); fprintf (fp, " %lu %lu %lu %lu %lu %lu %lu", (u_long) conf_c -> creator, (u_long) conf_c -> presentation, (u_long) conf_c -> supervisor, (u_long) conf_c -> permitted_submitters, (u_long) conf_c -> super_conf, (u_long) conf_c -> msg_of_day, (u_long) conf_c -> nice); } void foutput_text_stat(FILE *fp, Text_stat *t_stat) { int i; foutput_time(fp, t_stat->creation_time); foutput_ulong((u_long) t_stat->author, fp); foutput_ulong((u_long) t_stat->file_pos, fp); foutput_ulong((u_long) t_stat->no_of_lines, fp); foutput_ulong((u_long) t_stat->no_of_chars, fp); foutput_ulong((u_long) t_stat->no_of_marks, fp); foutput_ulong((u_long) t_stat->no_of_misc, fp); if ( t_stat->misc_items != NULL && t_stat->no_of_misc > 0 ) { fputs(" {", fp); for ( i = 0; i < t_stat->no_of_misc; i++ ) foutput_misc_info(fp, t_stat->misc_items[ i ]); fputs(" }", fp); } else fputs(" *", fp); } extern void foutput_string(FILE *fp, String str) { foutput_ulong((u_long)str.len, fp); putc('H', fp); if (str.len) fwrite(str.string, str.len, 1, fp); } extern void foutput_priv_bits(FILE *fp, Priv_bits bits) { putc(' ', fp); putc(bits.wheel + '0', fp); putc(bits.admin + '0', fp); putc(bits.statistic + '0', fp); putc(bits.create_pers + '0', fp); putc(bits.create_conf + '0', fp); putc(bits.change_name + '0', fp); putc(bits.extern_gw + '0', fp); putc(bits.flg8 + '0', fp); putc(bits.flg9 + '0', fp); putc(bits.flg10 + '0', fp); putc(bits.flg11 + '0', fp); putc(bits.flg12 + '0', fp); putc(bits.flg13 + '0', fp); putc(bits.flg14 + '0', fp); putc(bits.flg15 + '0', fp); putc(bits.flg16 + '0', fp); } extern void foutput_personal_flags(FILE *fp, Personal_flags flags) { putc(' ', fp); putc(flags.unread_is_secret + '0', fp); putc(flags.flg2 + '0', fp); putc(flags.flg3 + '0', fp); putc(flags.flg4 + '0', fp); putc(flags.flg5 + '0', fp); putc(flags.flg6 + '0', fp); putc(flags.flg7 + '0', fp); putc(flags.flg8 + '0', fp); } void foutput_text_list(FILE *fp, Text_list text_list) { int i; foutput_ulong((u_long)text_list.first_local_no, fp); foutput_ulong((u_long)text_list.no_of_texts, fp); if ( text_list.texts != NULL && text_list.no_of_texts > 0 ) { fputs(" {", fp); for ( i = 0; i < text_list.no_of_texts; i++ ) foutput_ulong((u_long)text_list.texts[ i ], fp); fputs(" }", fp); } else fprintf(fp, " *"); } void foutput_mark_list(FILE *fp, Mark_list mark_list) { int i; fprintf(fp, " %lu", (u_long)mark_list.no_of_marks); if ( mark_list.marks != NULL && mark_list.no_of_marks > 0 ) { fprintf(fp, " {"); for ( i = 0; i < mark_list.no_of_marks; i++ ) foutput_mark(fp, mark_list.marks[ i ]); fprintf(fp, " }"); } else fprintf(fp, " *"); } extern void foutput_mark(FILE *fp, Mark mark) { fprintf(fp, " %lu %lu", (u_long)mark.text_no, (u_long)mark.mark_type); } void foutput_membership_list (FILE * fp, Membership_list mlist) { int i; fprintf(fp, " %lu", (u_long)mlist.no_of_confs); if ( mlist.confs != NULL && mlist.no_of_confs > 0 ) { fprintf(fp, " {"); for ( i = 0; i < mlist.no_of_confs; i++) foutput_membership(fp, mlist.confs + i); fprintf(fp, " }"); } else fprintf(fp, " *"); } void foutput_membership(FILE *fp, Membership *mship) { int i; foutput_time(fp, mship->last_time_read ); if ( mship->read_texts == NULL && mship->no_of_read != 0 ) { log("foutput_membership(): no_of_read forced to 0" " in someones membership in %lu.\n", mship->conf_no); mship->no_of_read = 0; } fprintf(fp, " %lu %lu %lu %lu", (u_long)mship->conf_no, (u_long)mship->priority, (u_long)mship->last_text_read, (u_long)mship->no_of_read); if ( mship->read_texts != NULL && mship->no_of_read > 0) { fprintf(fp, " {"); for ( i = 0; i < mship->no_of_read; i++) fprintf(fp, " %lu", (u_long)mship->read_texts[ i ]); fprintf(fp, " }"); } else fprintf(fp, " *"); } void foutput_time(FILE *fp, time_t clock) { foutput_ulong((u_long) clock, fp); } extern void foutput_member_list(FILE *fp, Member_list m_list) { int i; fprintf(fp, " %lu", (u_long)m_list.no_of_members); if ( m_list.members != NULL && m_list.no_of_members > 0 ) { fprintf(fp, " {"); for ( i = 0; i < m_list.no_of_members; i++ ) foutput_member(fp, m_list.members[ i ]); fprintf(fp, " }"); } else fprintf(fp, " *"); } void foutput_member(FILE *fp, Member member) { fprintf(fp, " %lu", (u_long)member.member); } extern void foutput_conf_type(FILE *fp, Conf_type type) { putc(' ', fp); putc(type.rd_prot + '0', fp); putc(type.original + '0', fp); putc(type.secret + '0', fp); putc(type.letter_box + '0', fp); } extern void foutput_misc_info(FILE *fp, Misc_info misc) { foutput_ulong((u_long)misc.type, fp); switch(misc.type) { case recpt: foutput_ulong((u_long)misc.datum.recipient, fp); break; case cc_recpt: foutput_ulong((u_long)misc.datum.cc_recipient, fp); break; case loc_no: foutput_ulong((u_long)misc.datum.local_no, fp); break; case rec_time: foutput_time(fp, misc.datum.received_at); break; case comm_to: foutput_ulong((u_long)misc.datum.comment_to, fp); break; case comm_in: foutput_ulong((u_long)misc.datum.commented_in, fp); break; case footn_to: foutput_ulong((u_long)misc.datum.footnote_to, fp); break; case footn_in: foutput_ulong((u_long)misc.datum.footnoted_in, fp); break; case sent_by: foutput_ulong((u_long)misc.datum.sender, fp); break; case sent_at: foutput_time(fp, misc.datum.sent_at); break; #ifndef COMPILE_CHECKS default: restart_kom("prot_a_output_misc_info: Illegal misc\n"); #endif } } /* * Output the unsigned long L in the fastest way possible to the file * FP. Ok, it's ugly, but it's fast (or is it?). */ void foutput_ulong (u_long l, FILE *fp) { static char buf[20]; char *cp; putc(' ', fp); if (l < 10) putc("0123456789"[l], fp); else { cp = buf + 19; while (l > 0) { *cp-- = (l % 10) + '0'; l /= 10; } fwrite(cp + 1, buf + 19 - cp, 1, fp); } }