rsalz@uunet.uu.net (Rich Salz) (04/12/89)
Submitted-by: dsinc!syd@uunet.UU.NET (Syd Weinstein) Posting-number: Volume 18, Issue 89 Archive-name: elm2.2/part10 #!/bin/sh # this is part 10 of a multipart archive # do not concatenate these parts, unpack them in order with /bin/sh # file hdrs/shortname.1 continued # CurArch=10 if test ! -r s2_seq_.tmp then echo "Please unpack part 1 first!" exit 1; fi ( read Scheck if test "$Scheck" != $CurArch then echo "Please unpack part $Scheck next!" exit 1; else exit 0; fi ) < s2_seq_.tmp || exit 1 echo "x - Continuing file hdrs/shortname.1" sed 's/^X//' << 'SHAR_EOF' >> hdrs/shortname.1 XReceived: by convex (4.12/4.7) X id AA01616; Tue, 24 Mar 87 16:47:43 cst XReceived: by ndmce.UUCP (smail2.3) X id AA24491; 24 Mar 87 16:41:30 CST (Tue) XTo: ndmce!hplabs!taylor@hplabs.HP.COM XDate: Tue, 24 Mar 87 16:08:01 CST XSubject: shortnames.h mods XX-Mailer: Elm [version 1.5] X XDave, X XHello. I have just finished installing Elm on my 68k unix box running XUnisoft Uniplus+ sysvr1. Unfortunately the C compiler doesn't support Xlong variable names so I had the dubious honor of updating shortnames.h Xto include several new variable and function names. I also do not have Xthe setvbuf() function. I modified filter.h to delete it. I am enclosing Xmy changes if you are interested... X XManlio D. Marquez Xjlsoft!marquez X X X Xshortnames.h X----------------------- X/** shortnames.h **/ X X/** This file is from Geoff Kuenning, and will help those poor users that X are stuck using C compilers that don't have flexnames. Too bad. X X This file has no explicit copyright. X X**/ X X#define PutLine0 PLine0 X#define PutLine1 PLine1 X#define PutLine2 PLine2 X#define PutLine3 PLine3 X X#define add_to_table add_2_table X#define address1 addrs1 X#define addressII addrsII X#define addresses addr_s X#define alternate_prompt alt_prompt X#define alternative_addresses alt_addrs X#define alternatives alts X#define always_leave alw_leave X X#define calendar_line cal_line X#define cancelled_msg cncld_msg X#define central_message_buffer cntrl_bfr X#define check_form_file chk_frmf X#define compare_dates cmp_dates X#define compare_headers cmp_hdrs X#define copy_message_across cpy_msg_across X#define current_record cur_rec X#define current_time cur_time X X#define define_softkeys def_softkeys X#define display_central_message displ_cntrl_msg X#define display_error displ_error X#define display_headers displ_hdrs X#define display_helpfile dspl_helpfile X#define display_line dspl_line X#define display_options displ_options X#define display_title displ_titles X#define display_to displ_to X X#define encrypted crypted X#define encrypted_key crypt_key X#define expanded_cc xp_cc X#define expanded_to xp_to X#define expand_address xp_addr X#define expand_domain xp_domain X#define expand_env xp_env X#define expand_filename xp_filename X#define expand_group xp_group X#define expand_logname xp_logname X#define expand_site xp_site X#define expand_system xp_system X X#define filename2 fn2 X#define findnode_has_been_initialized fndhbi X#define format_long frm_lng X#define form_letter frm_let X#define forward forwrd X X#define generate_reply_to gen_reply_to X#define get_return_name g_ret_name X X#define header_line h_line X#define header_page h_page X#define headers_per_page h_per_page X#define header_table h_table X X#define install_aliases ins_aliases X X#define last_line_loc last_ln_loc X#define long_sum lng_sum X X#define machine_group mach_group X#define mailbox_defined mbox_defined X#define mailfile_size mfile_size X#define message_count msg_count X#define message_number msg_number X X#define newaliases nwaliases X#define noptimize_return noret_opt X#define noptimize_usenet nousenet_opt X X#define one_liner one_lner X#define optimize_and_add opt_and_add X#define optimize_arpa opt_arpa X#define optimize_cmplx_arpa opt_cmplx_arpa X#define optimize_return opt_return X#define optimize_usenet opt_usenet X#define optional_arg opt_arg X#define optionally_enter opt_enter X#define options_help opt_hlp X#define original_cc orig_cc X#define original_msg_num orig_msg_num X#define original_to orig_to X X#define parse_arguments pars_arguments X#define parse_arpa_from prs_arpa_from X#define password_entry pw_entry X#define pattern_enter pat_enter X#define pattern_match pat_match X#define prompt_for_entry prpt_ent X#define prompt_for_sized_entry prpt_sntry X#define prompt_for_multiple_entries prpt_fme X X#define read_alias_files rd_alias_files X#define read_headers rd_headers X#define read_in_file rd_n_file X#define read_in_messages rd_n_mess X#define read_rc rd_rc X#define read_rc_file rd_rc_file X#define received_on_machine rcvd_on_machine X#define remove_all rem_all X#define remove_first_word rem_1st_word X#define remove_domains rem_domains X#define remove_header rem_hdr X#define remove_user rem_user X#define remove_through_ch rem_thru_ch X#define reply_to_everyone repl_to_everyone X#define resolve_received rslv_received X X#define save_option_string sv_string X#define save_option_sort sv_sort X#define save_option_number sv_number X#define save_option_on_off sv_on_off X#define save_option_weedlist sv_weed X#define save_option_alternatives sv_alts X#define show_message shw_message X#define show_msg showmsg X#define show_msg_tag sh_msg_tag X#define size_of_pathfd sz_of_pathfd X#define softkeys_off soft_off X#define softkeys_on soft_on X#define subjectbuffer subjbuff X#define subject_matches subj_matches X#define switching_to_default sw_t_def X#define system_call sys_call X#define system_data sys_data X#define system_files sys_files X#define system_hash_table sys_hash_table X#define system_record sys_record X X#define tail_of_string tl_of_string X#define talk_to_sys tlk_to_sys X#define tempfile tmpfile X#define termcap_label tcap_label X#define top_of_screen_left top_left_of_screen X#define top_of_screen_right top_right_of_screen X#define translate_return xlate_return X X#define update_mailtime upd_mailtime X#define update_title upd_title X#define unexpanded_cc unexp_cc X#define unexpanded_to unexp_to X X#define verify_transmission vfy_xmsn X X#define weeding_out wding_out X X--------------------------------------- X Xextra change for filter.h (stuck at end of file) X X--------------------------------------- X X#ifndef setvbuf X# define setvbuf(fd,a,b,c) /* if don't have it, punt it off */ X#endif X X--------------------------------------- X X X SHAR_EOF echo "File hdrs/shortname.1 is complete" chmod 0444 hdrs/shortname.1 || echo "restore of hdrs/shortname.1 fails" echo "x - extracting hdrs/shortname.2 (Text)" sed 's/^X//' << 'SHAR_EOF' > hdrs/shortname.2 && XNOTE: This file is obsolete and is not being kept uptodate. It is provided Xfor reference only. X XSyd Weinstein XElm Coordinator X XFrom seismo!sundc!eli!geller@hplabs.HP.COM Wed Mar 25 22:15:48 1987 XReceived: from hplabsc (hplabsc.hpl.hp.com) by hpldat ; Wed, 25 Mar 87 22:15:48 pst XReturn-Path: <seismo!sundc!eli!geller@hplabs.HP.COM> XReceived: from hplabs.HP.COM by hplabsc ; Wed, 25 Mar 87 22:15:04 pst XReceived: from seismo.CSS.GOV by hplabs.HP.COM with TCP ; Wed, 25 Mar 87 22:12:56 pst XReceived: from sundc.UUCP by seismo.CSS.GOV (5.54/1.14) with UUCP X id AA24355; Thu, 26 Mar 87 01:12:39 EST XFrom: seismo!sundc!eli!geller@hplabs.HP.COM XReceived: by sundc.uucp (3.2/SMI-3.2) X id AA06338; Thu, 26 Mar 87 01:10:15 EST XDate: Thu, 26 Mar 87 01:10:15 EST XMessage-Id: <8703260610.AA06338@sundc.uucp> XDave: XTo: hplabs!taylor@hplabs.HP.COM X XHere's the shortnames.h stuff I told you about. Hope its helpful - Xbut you probably don't need it, being that you use a real Xcompiler... X XAlso - has reply.c been posted to mod.sources? I'm looking Xforward to receiving it. That's the last link I need before XElm gets up and running. X X X/* X * D. Geller, 3/12/87 X */ X X#define alternate_editor alt_editor X#define prompt_for_entry pf_entry X#define prompt_for_multiple_entries pf_mult X#define prompt_for_sized_entry pf_size X#define long_summary lng_sum X#define options_help opts_help X#define save_option_string svo_string X#define save_option_sort svo_sort X#define save_option_on_off svo_onoff X#define save_option_number svo_numb X#define save_option_weedlist svo_weed X#define save_option_alternatives svo_alt X#define form_letter form_le X#define form_letter_section form_sect X#define one_liner_for onel_for X#define switching_to_default swi_to X#define findnode_has_been_initialized fnodhas X X/* X * end of additions by Geller X */ X X SHAR_EOF chmod 0444 hdrs/shortname.2 || echo "restore of hdrs/shortname.2 fails" echo "x - extracting hdrs/shortname.h (Text)" sed 's/^X//' << 'SHAR_EOF' > hdrs/shortname.h && X X/* @(#)$Id: shortname.h,v 2.3 89/03/25 21:45:34 syd Exp $ */ X X/******************************************************************************* X * The Elm Mail System - $Revision: 2.3 $ $State: Exp $ X * X ******************************************************************************* X * Bug reports, patches, comments, suggestions should be sent to: X * X * Syd Weinstein, Elm Coordinator X * syd@dsinc.UUCP dsinc!syd X * X ******************************************************************************* X * $Log: shortname.h,v $ X * Revision 2.3 89/03/25 21:45:34 syd X * Initial 2.2 Release checkin X * X * X ******************************************************************************/ X X/** This file is from Geoff Kuenning, and will help those poor users that X are stuck using C compilers that don't have flexnames. Too bad. X XNOTE: This file is obsolete and is not being kept uptodate. It is provided Xfor reference only. X XSyd Weinstein XElm Coordinator X X**/ X X#define CleartoEOS Clear_EOS X#define CleartoEOLN Clear_EOLN X X#define PutLine0 PLine0 X#define PutLine1 PLine1 X#define PutLine2 PLine2 X#define PutLine3 PLine3 X X#define add_to_table add_2_table X#define address1 addrs1 X#define addressII addrsII X#define addresses addr_s X#define alternate_prompt alt_prompt X#define alternative_addresses alt_addrs X#define always_leave alw_leave X X#define calendar_line cal_line X#define cancelled_msg cncld_msg X#define central_message_buffer cntrl_bfr X#define compare_dates cmp_dates X#define compare_headers cmp_hdrs X#define copy_message_across cpy_msg_across X#define current_record cur_rec X#define current_time cur_time X X#define define_softkeys def_softkeys X#define display_central_message displ_cntrl_msg X#define display_error displ_error X#define display_headers displ_hdrs X#define display_helpfile dspl_helpfile X#define display_options displ_options X#define display_title displ_titles X#define display_to displ_to X X#define encrypted crypted X#define encrypted_key crypt_key X#define expanded_cc xp_cc X#define expanded_to xp_to X#define expand_address xp_addr X#define expand_domain xp_domain X#define expand_env xp_env X#define expand_filename xp_filename X#define expand_group xp_group X#define expand_logname xp_logname X#define expand_site xp_site X#define expand_system xp_system X X#define filename2 fn2 X#define forward forwrd X X#define generate_reply_to gen_reply_to X#define get_return_name g_ret_name X X#define header_line h_line X#define header_page h_page X#define headers_per_page h_per_page X#define headers hdrs X X#define install_aliases ins_aliases X X#define last_line_loc last_ln_loc X X#define machine_group mach_group X#define mailbox_defined mbox_defined X#define mailfile_size mfile_size X#define message_count msg_count X#define message_number msg_number X X#define newaliases nwaliases X#define noptimize_return noret_opt X#define noptimize_usenet nousenet_opt X X#define optimize_and_add opt_and_add X#define optimize_arpa opt_arpa X#define optimize_cmplx_arpa opt_cmplx_arpa X#define optimize_return opt_return X#define optimize_usenet opt_usenet X#define optional_arg opt_arg X#define optionally_enter opt_enter X#define original_cc orig_cc X#define original_msg_num orig_msg_num X#define original_to orig_to X X#define parse_arguments pars_arguments X#define parse_arpa_from prs_arpa_from X#define password_entry pw_entry X#define pattern_enter pat_enter X#define pattern_match pat_match X X#define read_alias_files rd_alias_files X#define read_headers rd_headers X#define read_rc rd_rc X#define read_rc_file rd_rc_file X#define received_on_machine rcvd_on_machine X#define remove_all rem_all X#define remove_first_word rem_1st_word X#define remove_domains rem_domains X#define remove_header rem_hdr X#define remove_user rem_user X#define remove_through_ch rem_thru_ch X#define reply_to_everyone repl_to_everyone X#define resolve_received rslv_received X X#define show_message shw_message X#define show_msg showmsg X#define show_msg_tag sh_msg_tag X#define size_of_pathfd sz_of_pathfd X#define softkeys_off soft_off X#define softkeys_on soft_on X#define subjectbuffer subjbuff X#define subject_matches subj_matches X#define system_call sys_call X#define system_data sys_data X#define system_files sys_files X#define system_hash_table sys_hash_table X#define system_record sys_record X X#define tail_of_string tl_of_string X#define talk_to_sys tlk_to_sys X#define tempfile tmpfile X#define termcap_label tcap_label X#define top_of_screen_left top_left_of_screen X#define top_of_screen_right top_right_of_screen X#define translate_return xlate_return X X#define update_mailtime upd_mailtime X#define update_title upd_title X#define unexpanded_cc unexp_cc X#define unexpanded_to unexp_to X X#define verify_transmission vfy_xmsn X X#define weeding_out wding_out SHAR_EOF chmod 0444 hdrs/shortname.h || echo "restore of hdrs/shortname.h fails" echo "x - extracting hdrs/sysdefs.SH (Text)" sed 's/^X//' << 'SHAR_EOF' > hdrs/sysdefs.SH && Xcase $CONFIG in X'') X if test ! -f config.sh; then X ln ../config.sh . || \ X ln ../../config.sh . || \ X ln ../../../config.sh . || \ X (echo "Can't find config.sh."; exit 1) X echo "Using config.sh from above..." X fi X . ./config.sh X ;; Xesac Xecho "Extracting hdrs/sysdefs.h (with variable substitutions)" Xsed <<!GROK!THIS! >sysdefs.h -e 's!^#undef!/\*#undef!' X/* $Id: sysdefs.SH,v 2.12 89/03/25 21:45:37 syd Exp $ */ X/******************************************************************************* X * The Elm Mail System - $Revision: 2.12 $ $State: Exp $ X * X * Copyright (c) 1986, 1987 Dave Taylor X * Copyright (c) 1988, 1989 USENET Community Trust X ******************************************************************************* X * Bug reports, patches, comments, suggestions should be sent to: X * X * Syd Weinstein, Elm Coordinator X * elm@dsinc.UUCP dsinc!elm X * X ******************************************************************************* X * $Log: sysdefs.SH,v $ X * Revision 2.12 89/03/25 21:45:37 syd X * Initial 2.2 Release checkin X * X * X ******************************************************************************/ X X/** System level, configurable, defines for the ELM mail system. **/ X X X#define FIND_DELTA 10 /* byte region where the binary search X on the path alias file is fruitless X (can't be within this boundary) */ X X#define MAX_IN_WEEDLIST 150 /* max headers to weed out */ X X#define MAX_HOPS 35 /* max hops in return addr to E)veryone */ X X#define DEFAULT_BATCH_SUBJECT "$defbatsub" X X#define DEFAULT_DOMAIN "$mydomain" /* if mydomain file is missing */ X X/** If you want to implement 'site hiding' in the mail, then you'll need to X uncomment the following lines and set them to reasonable values. See X the configuration guide for more details....(actually these are undoc- X umented because they're fairly dangerous to use. Just ignore 'em and X perhaps one day you'll find out what they do, ok?) X**/ X X/**************************************************************************** X X#define SITE_HIDING X#define HIDDEN_SITE_NAME "fake-machine-name" X#define HIDDEN_SITE_USERS "/usr/mail/lists/hidden_site_users" X X****************************************************************************/ X X#define system_text_file "$lib/aliases.text" X#define system_hash_file "$lib/aliases.hash" X#define system_data_file "$lib/aliases.data" X X#define ALIAS_TEXT ".elm/aliases.text" X#define ALIAS_HASH ".elm/aliases.hash" X#define ALIAS_DATA ".elm/aliases.data" X X#define pathfile "$pathalias" X#define domains "$domains" X#define hostdomfile "$lib/domain" X X#define Lsys "$lsysfile" X X/** where to put the output of the elm -d command... (in home dir) **/ X#define DEBUGFILE "ELM:debug.info" X#define OLDEBUG "ELM:debug.last" X X#define temp_dir "$tmpdir/" X#define temp_file "$tmpdir/snd." X#define temp_form_file "$tmpdir/form." X#define temp_mbox "$tmpdir/mbox." X#define temp_print "$tmpdir/print." X#define temp_edit "$tmpdir/elm-edit" X#define temp_uuname "$tmpdir/uuname." X#define readmsg_file ".elm/readmsg" X X#define emacs_editor "$emacs" X X#define default_editor "$defeditor" X#define mailhome "$maildir/" X X#define default_shell "$prefshell" X#define default_pager "$pager" X#define default_printout "$cat %s | $linepr" X X#define sendmail "$sendmail" X#define smflags "-oi -oem" /* ignore dots and mail back errors */ X#define smflagsv "-oi -oem -v" /* Verbose voyuer mode */ X#define mailer "$mailer" X X#define mailx "$mailx" X X#define helphome "$lib" X#define helpfile "elm-help" X X#define ELMRC_INFO "$lib/elmrc-info" X X#define elmrcfile ".elm/elmrc" X#define old_elmrcfile ".elm/elmrc.old" X#define mailheaders ".elm/elmheaders" X#define dead_letter "Cancelled.mail" X X#define unedited_mail "emergency.mbox" X X#define newalias "newalias 1>&2 > /dev/null" X#define readmsg "readmsg" X X#define remove_cmd "$rm -f" /* how to remove a file */ X#define cat "$cat" /* how to display files */ X#define sed_cmd "$sed" /* how to access sed */ X#define move_cmd "$mv" /* how to access sed */ X#define uuname "$uuname" /* how to get a uuname */ X!GROK!THIS! SHAR_EOF chmod 0444 hdrs/sysdefs.SH || echo "restore of hdrs/sysdefs.SH fails" echo "x - extracting src/Makefile.SH (Text)" sed 's/^X//' << 'SHAR_EOF' > src/Makefile.SH && Xcase $CONFIG in X'') X if test ! -f config.sh; then X ln ../config.sh . || \ X ln ../../config.sh . || \ X ln ../../../config.sh . || \ X (echo "Can't find config.sh."; exit 1) X fi X . ./config.sh X ;; Xesac Xcase "$0" in X*/*) cd `expr X$0 : 'X\(.*\)/'` ;; Xesac X Xecho "Extracting src/Makefile (with variable substitutions)" Xcat >Makefile <<!GROK!THIS! X# $Id: Makefile.SH,v 2.15 89/03/25 21:45:38 syd Exp $ X# X# Makefile for the ELM mail program. X# X# Copyright (c) 1986, 1987 Dave Taylor X# Copyright (c) 1988, 1989 USENET Community Trust X# X# Bug reports, patches, comments, suggestions should be sent to: X# X# Syd Weinstein - elm@dsinc.UUCP X# dsinc!elm X# X# $Log: Makefile.SH,v $ X# Revision 2.15 89/03/25 21:45:38 syd X# Initial 2.2 Release checkin X# X# X# Variables X# Variables established by Configure XCC = $cc XCCFLAGS = $ccflags $xencf XCHGRP = $chgrp XCHMOD = $chmod XCP = $cp XDEST = $bin XECHO = $echo XLFLAGS = $ldflags $xenlf XLIB = $lib XLIB2 = $libs XLIBS = $cryptlib $termlib $dbm XLINT = $lint XMAILGRP = $mailgrp XMAILERMODE = $mailermode XMV = $mv XOPTIMIZE = $optimize XRM = $rm -f XTOUCH = $touch X X!GROK!THIS! X Xcat >>Makefile <<'!NO!SUBS!' X X# Variables you may want to manually edit X# If you want debug logging then you'll X# want to uncomment the following. X#DEBUG = -DDEBUG X X# If you're on an ACSnet system (Australia) then X# you'll want to uncomment the following. X# DACSNET = -DACSNET X X# Other general variables XBIN = ../bin XCFLAGS = $(CCFLAGS) $(OPTIMIZE) -I$(INCLDIR) $(DEBUG) $(DACSNET) XINCLDIR = ../hdrs XLINTFLAGS = -I$(INCLDIR) XSHELL = /bin/sh X X# Lists XELM_SRC = addr_util.c \ X alias.c \ X aliasdb.c \ X aliaslib.c \ X args.c \ X bouncebk.c \ X builtin.c \ X calendar.c \ X conn_to.c \ X curses.c \ X date.c \ X delete.c \ X domains.c \ X edit.c \ X editmsg.c \ X elm.c \ X encode.c \ X errno.c \ X expires.c \ X file.c \ X file_util.c \ X fileio.c \ X forms.c \ X hdrconfg.c \ X help.c \ X init.c \ X in_utils.c \ X leavembox.c \ X limit.c \ X mailmsg1.c \ X mailmsg2.c \ X mailtime.c \ X mkhdrs.c \ X newmbox.c \ X opt_utils.c \ X options.c \ X out_utils.c \ X pattern.c \ X pmalloc.c \ X quit.c \ X read_rc.c \ X remail.c \ X reply.c \ X returnadd.c \ X save_opts.c \ X savecopy.c \ X screen.c \ X showmsg.c \ X showmsg_c.c \ X signals.c \ X softkeys.c \ X sort.c \ X string2.c \ X strings.c \ X syscall.c \ X utils.c \ X validname.c X XELM_OBJ = addr_util.o \ X alias.o \ X aliasdb.o \ X aliaslib.o \ X args.o \ X bouncebk.o \ X builtin.o \ X calendar.o \ X conn_to.o \ X curses.o \ X date.o \ X delete.o \ X domains.o \ X edit.o \ X editmsg.o \ X elm.o \ X encode.o \ X errno.o \ X expires.o \ X file.o \ X file_util.o \ X fileio.o \ X forms.o \ X hdrconfg.o \ X help.o \ X init.o \ X in_utils.o \ X leavembox.o \ X limit.o \ X mailmsg1.o \ X mailmsg2.o \ X mailtime.o \ X mkhdrs.o \ X newmbox.o \ X opt_utils.o \ X options.o \ X out_utils.o \ X pattern.o \ X pmalloc.o \ X quit.o \ X read_rc.o \ X remail.o \ X reply.o \ X returnadd.o \ X save_opts.o \ X savecopy.o \ X screen.o \ X showmsg.o \ X showmsg_c.o \ X signals.o \ X softkeys.o \ X sort.o \ X string2.o \ X strings.o \ X syscall.o \ X utils.o \ X validname.o X X# Standard targets Xall: $(BIN)/elm X Xinstall: $(DEST)/elm X Xuninstall: X $(RM) $(DEST)/elm X X# This is the only target that gets installed even if not out-of-date X# with respect the files from which it is installed. Xrmt-install: rmt-defined X -$(MV) $(DEST)/elm $(DEST)/elm.old X -$(RM) $(DEST)/elm.old X $(CP) $(REMOTE)$(DEST)/elm $(DEST)/elm X $(CHGRP) $(MAILGRP) $(DEST)/elm X $(CHMOD) $(MAILERMODE) $(DEST)/elm X Xrmt-defined: X @(if [ "$(REMOTE)" = "" ];\ X then\ X $(ECHO) "You need to define 'REMOTE' as the remote file system";\ X $(ECHO) "for this particular command. The easiest way to do this";\ X $(ECHO) "to type:";\ X $(ECHO) " make REMOTE=<remote file system> rmt-install";\ X exit 1;\ X fi); X Xlint: X $(LINT) $(LINTFLAGS) $(ELM_SRC) > LINT.OUT X Xclean: X $(RM) $(ELM_OBJ) $(BIN)/elm X X# Dependencies and rules X# Dependencies of header files upon other header files they include X$(INCLDIR)/defs.h: $(INCLDIR)/../config.h $(INCLDIR)/sysdefs.h X $(CHMOD) u+w $@ X $(TOUCH) $@ X X$(INCLDIR)/elm.h: $(INCLDIR)/curses.h $(INCLDIR)/defs.h X $(CHMOD) u+w $@ X $(TOUCH) $@ X X$(INCLDIR)/headers.h: $(INCLDIR)/curses.h $(INCLDIR)/defs.h X $(CHMOD) u+w $@ X $(TOUCH) $@ X X# Dependencies of C object files Xaddr_util.o: $(INCLDIR)/headers.h Xalias.o: $(INCLDIR)/headers.h Xaliasdb.o: $(INCLDIR)/headers.h Xaliaslib.o: $(INCLDIR)/headers.h Xargs.o: $(INCLDIR)/headers.h Xbouncebk.o: $(INCLDIR)/headers.h Xbuiltin.o: $(INCLDIR)/headers.h Xcalendar.o: $(INCLDIR)/headers.h Xconn_to.o: $(INCLDIR)/headers.h Xcurses.o: $(INCLDIR)/headers.h Xdate.o: $(INCLDIR)/headers.h Xdelete.o: $(INCLDIR)/headers.h Xdomains.o: $(INCLDIR)/headers.h Xedit.o: $(INCLDIR)/headers.h Xeditmsg.o: $(INCLDIR)/headers.h Xelm.o: $(INCLDIR)/elm.h Xencode.o: $(INCLDIR)/headers.h Xerrno.o: $(INCLDIR)/headers.h Xexpires.o: $(INCLDIR)/headers.h Xfile.o: $(INCLDIR)/headers.h Xfile_util.o: $(INCLDIR)/headers.h Xfileio.o: $(INCLDIR)/headers.h Xforms.o: $(INCLDIR)/headers.h Xhdrconfg.o: $(INCLDIR)/headers.h Xhelp.o: $(INCLDIR)/headers.h Xin_utils.o: $(INCLDIR)/headers.h Xinit.o: $(INCLDIR)/headers.h $(INCLDIR)/patchlevel.h Xleavembox.o: $(INCLDIR)/headers.h Xlimit.o: $(INCLDIR)/headers.h Xmailmsg1.o: $(INCLDIR)/headers.h Xmailmsg2.o: $(INCLDIR)/headers.h Xmailtime.o: $(INCLDIR)/headers.h Xmkhdrs.o: $(INCLDIR)/headers.h Xnewmbox.o: $(INCLDIR)/headers.h Xopt_utils.o: $(INCLDIR)/headers.h Xoptions.o: $(INCLDIR)/headers.h Xout_utils.o: $(INCLDIR)/headers.h Xpattern.o: $(INCLDIR)/headers.h Xpmalloc.o: $(INCLDIR)/defs.h Xquit.o: $(INCLDIR)/headers.h Xread_rc.o: $(INCLDIR)/headers.h Xremail.o: $(INCLDIR)/headers.h Xreply.o: $(INCLDIR)/headers.h Xreturnadd.o: $(INCLDIR)/headers.h Xsave_opts.o: $(INCLDIR)/save_opts.h $(INCLDIR)/headers.h Xsavecopy.o: $(INCLDIR)/headers.h Xscreen.o: $(INCLDIR)/headers.h Xshowmsg.o: $(INCLDIR)/headers.h Xshowmsg_c.o: $(INCLDIR)/headers.h Xsignals.o: $(INCLDIR)/headers.h Xsoftkeys.o: $(INCLDIR)/headers.h Xsort.o: $(INCLDIR)/headers.h Xstrings.o: $(INCLDIR)/headers.h Xsyscall.o: $(INCLDIR)/headers.h Xutils.o: $(INCLDIR)/headers.h Xvalidname.o: $(INCLDIR)/defs.h X X# Dependencies and rules for compiling C programs X$(BIN)/elm: $& $(ELM_OBJ) X $(CC) $(LFLAGS) -o $@ $(ELM_OBJ) $(LIBS) $(LIB2) X X# Dependencies and rules for installing C programs X$(DEST)/elm: $(BIN)/elm X -$(MV) $@ $@.old X -$(RM) $@.old X $(CP) $(BIN)/elm $@ X $(CHGRP) $(MAILGRP) $@ X $(CHMOD) $(MAILERMODE) $@ X X!NO!SUBS! SHAR_EOF chmod 0444 src/Makefile.SH || echo "restore of src/Makefile.SH fails" echo "x - extracting src/addr_util.c (Text)" sed 's/^X//' << 'SHAR_EOF' > src/addr_util.c && X Xstatic char rcsid[] = "@(#)$Id: addr_util.c,v 2.15 89/03/25 21:45:40 syd Exp $"; X X/******************************************************************************* X * The Elm Mail System - $Revision: 2.15 $ $State: Exp $ X * X * Copyright (c) 1986, 1987 Dave Taylor X * Copyright (c) 1988, 1989 USENET Community Trust X ******************************************************************************* X * Bug reports, patches, comments, suggestions should be sent to: X * X * Syd Weinstein, Elm Coordinator X * elm@dsinc.UUCP dsinc!elm X * X ******************************************************************************* X * $Log: addr_util.c,v $ X * Revision 2.15 89/03/25 21:45:40 syd X * Initial 2.2 Release checkin X * X * X ******************************************************************************/ X X/** This file contains addressing utilities X X**/ X X#include "headers.h" X X#include <sys/types.h> X#include <sys/stat.h> X#ifdef PWDINSYS X# include <sys/pwd.h> X#else X# include <pwd.h> X#endif X X#include <ctype.h> X X#ifdef BSD X#undef tolower X#undef toupper X#endif X Xchar *shift_lower(), *get_alias_address(), *get_token(), *strtok(), X *strchr(), *strcpy(), *strcat(), *strncpy(); X Xchar * Xgcos_name(gcos_field, logname) Xchar *logname, *gcos_field; X{ X /** Return the full name found in a passwd file gcos field **/ X X#ifdef BERKNAMES X X static char fullname[SLEN]; X register char *fncp, *gcoscp, *lncp, *end; X X X /* full name is all chars up to first ',' (or whole gcos, if no ',') */ X /* replace any & with logname in upper case */ X X for(fncp = fullname, gcoscp= gcos_field, end = fullname + SLEN - 1; X (*gcoscp != ',' && *gcoscp != '\0' && fncp != end); X gcoscp++) { X X if(*gcoscp == '&') { X for(lncp = logname; *lncp; fncp++, lncp++) X *fncp = toupper(*lncp); X } else { X *fncp++ = *gcoscp; X } X } X X *fncp = '\0'; X return(fullname); X#else X#ifdef USGNAMES X X char *firstcp, *lastcp; X X /* The last character of the full name is the one preceding the first X * '('. If there is no '(', then the full name ends at the end of the X * gcos field. X */ X if(lastcp = strchr(gcos_field, '(')) X *lastcp = '\0'; X X /* The first character of the full name is the one following the X * last '-' before that ending character. NOTE: that's why we X * establish the ending character first! X * If there is no '-' before the ending character, then the fullname X * begins at the beginning of the gcos field. X */ X if(firstcp = strrchr(gcos_field, '-')) X firstcp++; X else X firstcp = gcos_field; X X return(firstcp); X X#else X /* use full gcos field */ X return(gcos_field); X#endif X#endif X} X Xchar * Xget_full_name(logname) Xchar *logname; X{ X /* return a pointer to the full user name for the passed logname X * or NULL if cannot be found X * If PASSNAMES get it from the gcos field, otherwise get it X * from ~/.fullname. X */ X X FILE *fp; X static char fullname[SLEN]; X char fullnamefile[SLEN]; X struct passwd *getpwnam(), *pass; X X if((pass = getpwnam(logname)) == NULL) X return(NULL); X#ifdef PASSNAMES /* get full_username from gcos field */ X strcpy(fullname, gcos_name(pass->pw_gecos, logname)); X#else /* get full_username from ~/.fullname file */ X sprintf(fullnamefile, "%s/.fullname", pass->pw_dir); X X if(can_access(fullnamefile, READ_ACCESS) != 0) X return(NULL); /* fullname file not accessible to user */ X if((fp = fopen(fullnamefile, "r")) == NULL) X return(NULL); /* fullname file cannot be opened! */ X if(fgets(fullname, SLEN, fp) == NULL) { X fclose(fp); X return(NULL); /* fullname file empty! */ X } X fclose(fp); X no_ret(fullname); /* remove trailing '\n' */ X#endif X return(fullname); X} X Xint Xtalk_to(sitename) Xchar *sitename; X{ X /** If we talk to the specified site, return true, else X we're going to have to expand this baby out, so X return false! **/ X X struct lsys_rec *sysname; X X sysname = talk_to_sys; X X if (sysname == NULL) { X dprint(2, (debugfile, X "Warning: talk_to_sys is currently set to NULL!\n")); X return(0); X } X X while (sysname != NULL) { X if (strcmp(sysname->name, sitename) == 0) X return(1); X else X sysname = sysname->next; X } X X return(0); X} X Xadd_site(buffer, site, lastsite) Xchar *buffer, *site, *lastsite; X{ X /** add site to buffer, unless site is 'uucp', current machine, or X site is the same as lastsite. If not, set lastsite to X site. X **/ X X char local_buffer[SLEN]; X char *strip_parens(); X X if (strcmp(site, "uucp") != 0) X if (strcmp(site, lastsite) != 0) X if (strcmp(site, hostname) != 0) { X if (buffer[0] == '\0') X strcpy(buffer, strip_parens(site)); /* first in list! */ X else { X sprintf(local_buffer,"%s!%s", buffer, strip_parens(site)); X strcpy(buffer, local_buffer); X } X strcpy(lastsite, strip_parens(site)); /* don't want THIS twice! */ X } X} X X#ifdef USE_EMBEDDED_ADDRESSES X Xget_address_from(prefix, line, buffer) Xchar *prefix, *line, *buffer; X{ X /** This routine extracts the address from either a 'From:' line X or a 'Reply-To:' line...the algorithm is quite simple, too: X increment 'line' past header, then check last character of X line. If it's a '>' then the address is contained within '<>' X and if it's a ')' then the address is in the 'clear'... **/ X X register int i, j = 0; X X no_ret(line); X X line = (char *) (line + strlen(prefix) + 1); X X if (line[strlen(line)-1] == '>') { X for (i=strlen(line)-2; i > -1 && line[i] != '<'; i--) X buffer[j++] = line[i]; X buffer[j] = 0; X reverse(buffer); X } X else { /* either ')' or address in the clear... */ X for (i=0; i < strlen(line) && line[i] != '('; i++) X buffer[j++] = line[i]; X if (buffer[j-1] == '(') j--; X buffer[j] = 0; X } X} X X#endif X Xtranslate_return(addr, ret_addr) Xchar *addr, *ret_addr; X{ X /** Return ret_addr to be the same as addr, but with the login X of the person sending the message replaced by '%s' for X future processing... X Fixed to make "%xx" "%%xx" (dumb 'C' system!) X **/ X X register int loc, loc2, iindex = 0; X X loc2 = chloc(addr,'@'); X if ((loc = chloc(addr, '%')) < loc2) X loc2 = loc; X X if (loc2 != -1) { /* ARPA address. */ X /* algorithm is to get to '@' sign and move backwards until X we've hit the beginning of the word or another metachar. X */ X for (loc = loc2 - 1; loc > -1 && addr[loc] != '!'; loc--) X ; X } X else { /* usenet address */ X /* simple algorithm - find last '!' */ X X loc2 = strlen(addr); /* need it anyway! */ X X for (loc = loc2; loc > -1 && addr[loc] != '!'; loc--) X ; X } X X /** now copy up to 'loc' into destination... **/ X X while (iindex <= loc) { X ret_addr[iindex] = addr[iindex]; X iindex++; X } X X /** now append the '%s'... **/ X X ret_addr[iindex++] = '%'; X ret_addr[iindex++] = 's'; X X /** and, finally, if anything left, add that **/ X X while (loc2 < strlen(addr)) { X ret_addr[iindex++] = addr[loc2++]; X if (addr[loc2-1] == '%') /* tweak for "printf" */ X ret_addr[iindex++] = '%'; X } X X ret_addr[iindex] = '\0'; X} X Xint Xbuild_address(to, full_to) Xchar *to, *full_to; X{ X /** loop on all words in 'to' line...append to full_to as X we go along, until done or length > len. Modified to X know that stuff in parens are comments...Returns non-zero X if it changed the information as it copied it across... X **/ X X register int i, j, changed = 0, in_parens = 0, expanded_information = 0; X char word[SLEN], next_word[SLEN], *ptr, buffer[SLEN]; X char new_to_list[SLEN]; X char *strpbrk(), *expand_system(), *strcat(), *gecos; X X new_to_list[0] = '\0'; X X i = get_word(to, 0, word); X X full_to[0] = '\0'; X X while (i > 0) { X X j = get_word(to, i, next_word); X Xtry_new_word: X if(word[0] == '(') X in_parens++; X X if (in_parens) { X if(word[strlen(word)-1] == ')') X in_parens--; X strcat(full_to, " "); X strcat(full_to, word); X } X else if (strpbrk(word,"!@:") != NULL) { X#ifdef DONT_TOUCH_ADDRESSES X sprintf(full_to, "%s%s%s", full_to, X full_to[0] != '\0'? ", " : "", word); X#else X sprintf(full_to, "%s%s%s", full_to, X full_to[0] != '\0'? ", " : "", expand_system(word, 1)); X#endif X } X else if ((ptr = get_alias_address(word, 1, 0)) != NULL) { X sprintf(full_to, "%s%s%s", full_to, X full_to[0] != '\0'? ", " : "", ptr); X expanded_information++; X } X else if (strlen(word) > 0) { X if (valid_name(word)) { X if (j > 0 && next_word[0] == '(') /* already has full name */ X gecos = NULL; X else /* needs a full name */ X gecos=get_full_name(word); X#ifdef USE_DOMAIN X sprintf(full_to, "%s%s%s@%s%s%s%s%s", X full_to, X (full_to[0] != '\0'? ", " : ""), X word, X hostname, X hostdomain, X (gecos ? " (" : ""), X (gecos ? gecos : ""), X (gecos ? ")" : "")); X#else X sprintf(full_to, "%s%s%s%s%s%s", X full_to, X (full_to[0] != '\0'? ", " : ""), X word, X (gecos ? " (" : ""), X (gecos ? gecos : ""), X (gecos ? ")" : "")); X#endif X } else if (check_only) { X printf("(alias \"%s\" is unknown)\n\r", word); X changed++; X } X else if (! isatty(fileno(stdin)) ) { /* batch mode error! */ X fprintf(stderr,"Cannot expand alias '%s'!\n\r", word); X fprintf(stderr,"Use \"checkalias\" to find valid addresses!\n\r"); X dprint(1, (debugfile, X "Can't expand alias %s - bailing out of build_address\n", X word)); X leave(0); X } X else { X dprint(2,(debugfile,"Entered unknown address %s\n", word)); X sprintf(buffer, "'%s' is an unknown address. Replace with: ", X word); X word[0] = '\0'; X changed++; X X PutLine0(LINES, 0, buffer); X X (void)optionally_enter(word, LINES, strlen(buffer), FALSE, FALSE); X clear_error(); X if (strlen(word) > 0) { X dprint(3,(debugfile, "Replaced with %s in build_address\n", X word)); X goto try_new_word; X } X else X dprint(3,(debugfile, X "Address removed from TO list by build_address\n")); X continue; X } X } X X /* and this word to the new to list */ X if(*new_to_list != '\0') X strcat(new_to_list, " "); X strcat(new_to_list, word); X X if((i = j) > 0) X strcpy(word, next_word); X } X X /* if new to list is different from original, update original */ X if (changed) X strcpy(to, new_to_list); X X return( expanded_information > 0 ? 1 : 0 ); X} X Xint Xreal_from(buffer, entry) Xchar *buffer; Xstruct header_rec *entry; X{ X /***** Returns true iff 's' has the seven 'from' fields, (or X 8 - some machines include the TIME ZONE!!!) X Initialize the date and from entries in the record X and also the message received date/time if 'entry' X is not NULL. *****/ X X struct header_rec temp_rec, *rec_ptr; X char junk[STRING], timebuff[STRING], holding_from[SLEN]; X int eight_fields = 0; X X /* set rec_ptr according to whether the data is to be returned X * in the second argument */ X rec_ptr = (entry == NULL ? &temp_rec : entry); X X rec_ptr->year[0] = '\0'; X timebuff[0] = '\0'; X junk[0] = '\0'; X X /* From <user> <day> <month> <day> <hr:min:sec> <year> */ X X sscanf(buffer, "%*s %*s %*s %*s %*s %s %*s %s", timebuff, junk); X X if (strlen(timebuff) < 3) { X dprint(3,(debugfile, X "Real_from returns FAIL [no time field] on\n-> %s\n", X buffer)); X return(FALSE); X } X X if (timebuff[1] != ':' && timebuff[2] != ':') { X dprint(3,(debugfile, X "Real_from returns FAIL [bad time field] on\n-> %s\n", X buffer)); X return(FALSE); X } X if (junk[0] != '\0') { /* try for 8 field entry */ X junk[0] = '\0'; X sscanf(buffer, "%*s %*s %*s %*s %*s %s %*s %*s %s", timebuff, junk); X if (junk[0] != '\0') { X dprint(3, (debugfile, X "Real_from returns FAIL [too many fields] on\n-> %s\n", X buffer)); X return(FALSE); X } X eight_fields++; X } X X /** now get the info out of the record! **/ X X if (eight_fields) X sscanf(buffer, "%s %s %s %s %s %s %*s %s", X junk, holding_from, rec_ptr->dayname, rec_ptr->month, X rec_ptr->day, rec_ptr->time, rec_ptr->year); X else X sscanf(buffer, "%s %s %s %s %s %s %s", X junk, holding_from, rec_ptr->dayname, rec_ptr->month, X rec_ptr->day, rec_ptr->time, rec_ptr->year); X X strncpy(rec_ptr->from, holding_from, STRING-1); X rec_ptr->from[STRING-1] = '\0'; X resolve_received(rec_ptr); X return(rec_ptr->year[0] != '\0'); X} X Xforwarded(buffer, entry) Xchar *buffer; Xstruct header_rec *entry; X{ X /** Change 'from' and date fields to reflect the ORIGINATOR of X the message by iteratively parsing the >From fields... X Modified to deal with headers that include the time zone X of the originating machine... **/ X X char machine[SLEN], buff[SLEN], holding_from[SLEN]; X X machine[0] = holding_from[0] = '\0'; X X sscanf(buffer, "%*s %s %s %s %s %s %s %*s %*s %s", X holding_from, entry->dayname, entry->month, X entry->day, entry->time, entry->year, machine); X X if (isdigit(entry->month[0])) { /* try for veeger address */ X sscanf(buffer, "%*s %s %s%*c %s %s %s %s %*s %*s %s", X holding_from, entry->dayname, entry->day, entry->month, X entry->year, entry->time, machine); X } X if (isalpha(entry->year[0])) { /* try for address including tz */ X sscanf(buffer, "%*s %s %s %s %s %s %*s %s %*s %*s %s", X holding_from, entry->dayname, entry->month, X entry->day, entry->time, entry->year, machine); X } X X /* the following fix is to deal with ">From xyz ... forwarded by xyz" X which occasionally shows up within AT&T. Thanks to Bill Carpenter X for the fix! */ X X if (strcmp(machine, holding_from) == 0) X machine[0] = '\0'; X X if (machine[0] == '\0') X strcpy(buff, holding_from[0] ? holding_from : "anonymous"); X else X sprintf(buff,"%s!%s", machine, holding_from); X X strncpy(entry->from, buff, STRING-1); X entry->from[STRING-1] = '\0'; X} X Xparse_arpa_who(buffer, newfrom, is_really_a_to) Xchar *buffer, *newfrom; Xint is_really_a_to; X{ X /** try to parse the 'From:' line given... It can be in one of X two formats: X From: Dave Taylor <hplabs!dat> X or From: hplabs!dat (Dave Taylor) X X Added: removes quotes if name is quoted (12/12) X Added: only copies STRING characters... X Added: if no comment part, copy address instead! X Added: if is_really_a_to, this is really a 'to' line X and treat as if we allow embedded addresses X **/ X X int use_embedded_addresses; X char temp_buffer[SLEN], *temp; X register int i, j = 0, in_parens; X X temp = (char *) temp_buffer; X temp[0] = '\0'; X X no_ret(buffer); /* blow away '\n' char! */ X X if (lastch(buffer) == '>') { X for (i=strlen("From: "); buffer[i] != '\0' && buffer[i] != '<' && X buffer[i] != '('; i++) X temp[j++] = buffer[i]; X temp[j] = '\0'; X } X else if (lastch(buffer) == ')') { X in_parens = 1; X for (i=strlen(buffer)-2; buffer[i] != '\0' && buffer[i] != '<'; i--) { X switch(buffer[i]) { X case ')': in_parens++; X break; X case '(': in_parens--; X break; X } X if(!in_parens) break; X temp[j++] = buffer[i]; X } X temp[j] = '\0'; X reverse(temp); X } X X#ifdef USE_EMBEDDED_ADDRESSES X use_embedded_addresses = TRUE; X#else X use_embedded_addresses = FALSE; X#endif X X if(use_embedded_addresses || is_really_a_to) { X /** if we have a null string at this point, we must just have a X From: line that contains an address only. At this point we X can have one of a few possibilities... X X From: address X From: <address> X From: address () X **/ X X if (strlen(temp) == 0) { X if (lastch(buffer) != '>') { X for (i=strlen("From:");buffer[i] != '\0' && buffer[i] != '('; i++) X temp[j++] = buffer[i]; X temp[j] = '\0'; X } X else { /* get outta '<>' pair, please! */ X for (i=strlen(buffer)-2;buffer[i] != '<' && buffer[i] != ':';i--) X temp[j++] = buffer[i]; X temp[j] = '\0'; X reverse(temp); X } X } X } X X if (strlen(temp) > 0) { /* mess with buffer... */ X X /* remove leading spaces and quotes... */ X X while (whitespace(temp[0]) || quote(temp[0])) X temp = (char *) (temp + 1); /* increment address! */ X X /* remove trailing spaces and quotes... */ X X i = strlen(temp) - 1; X X while (whitespace(temp[i]) || quote(temp[i])) X temp[i--] = '\0'; X X /* if anything is left, let's change 'from' value! */ X X if (strlen(temp) > 0) { X strncpy(newfrom, temp, STRING-1); X newfrom[STRING-1] = '\0'; X } X } X} X Xparse_arpa_date(string, entry) Xchar *string; Xstruct header_rec *entry; X{ X /** Parse and figure out the given date format... return X the entry fields changed iff it turns out we have a X valid parse of the date! **/ X X char word[15][WLEN], buffer[SLEN], *bufptr; X char *aword; X int words = 0; X X strcpy(buffer, string); X bufptr = (char *) buffer; X X /** break the line down into words... **/ X X while ((aword = strtok(bufptr," \t '\"-/(),.")) != NULL) { X strcpy(word[words++], aword); X bufptr = NULL; X } X X if (words < 6) { /* strange format. We're outta here! */ X dprint(3,(debugfile, X "Parse_arpa_date failed [less than six fields] on\n-> %s\n", X string)); X return; X } X X /* There are now five possible combinations that we could have: X X Date: day_number month_name year_number time timezone X Date: day_name day_number month_name year_number ... X Date: day_name month_name day_number time year_number X Date: day_name month_name day_number year_number time X Date: day_number month_name year_number time timezone day_name X X Note that they are distinguishable by checking the first X character of the second, third and fourth words... X */ X X if (isdigit(word[1][0])) { /*** type one! ***/ X if (! valid_date(word[1], word[2], word[3])) { X dprint(3,(debugfile, X "parse_arpa_date failed [bad date: %s/%s/%s] on\n-> %s\n", X word[1], word[2], word[3], string)); X return; /* strange date! */ X } X strncpy(entry->day, word[1], 2); X entry->day[2] = '\0'; X strncpy(entry->month, word[2], 3); X entry->month[3] = '\0'; X strncpy(entry->year, word[3], 4); X entry->year[4] = '\0'; X strncpy(entry->time, word[4], 10); X entry->time[10] = '\0'; X } X else if (isdigit(word[2][0])) { /*** type two! ***/ X if (! valid_date(word[2], word[3], word[4])) { X dprint(3,(debugfile, X "parse_arpa_date failed [bad date: %s/%s/%s] on\n-> %s\n", X word[2], word[3], word[4], string)); X return; /* strange date! */ X } X strncpy(entry->day, word[2], 2); X entry->day[2] = '\0'; X strncpy(entry->month, word[3], 3); X entry->month[3] = '\0'; X strncpy(entry->year, word[4], 4); X entry->year[4] = '\0'; X strncpy(entry->time, word[5], 10); X entry->time[10] = '\0'; X } X else if (isdigit(word[3][0])) { X if (word[4][1] == ':' || X word[4][2] == ':') { /*** type three! ***/ X if (! valid_date(word[3], word[2], word[5])) { X dprint(3, (debugfile, X "parse_arpa_date failed [bad date: %s/%s/%s] on\n-> %s\n", X word[3], word[2], word[5], string)); X return; /* strange date! */ X } X strncpy(entry->year, word[5], 4); X entry->year[4] = '\0'; X strncpy(entry->time, word[4], 10); X entry->time[10] = '\0'; X } X else { /*** type four! ***/ X if (! valid_date(word[3], word[2], word[4])) { X dprint(3,(debugfile, X "parse_arpa_date failed [bad date: %s/%s/%s] on\n-> %s\n", X word[3], word[2], word[4], string)); X return; /* strange date! */ X } X strncpy(entry->year, word[4], 4); X entry->year[4] = '\0'; X strncpy(entry->time, word[5], 10); X entry->time[10] = '\0'; X } X strncpy(entry->day, word[3], 2); X entry->day[2] = '\0'; X strncpy(entry->month, word[2], 3); X entry->month[3] = '\0'; X } X X /** finally, let's just normalize the monthname to be a three X letter abbreviation, with the first capitalized and the X second and third in lowercase... **/ X X shift_lower(entry->month); X entry->month[0] = toupper(entry->month[0]); X} X Xfix_arpa_address(address) Xchar *address; X{ X /** Given a pure ARPA address, try to make it reasonable. X X This means that if you have something of the form a@b@b make X it a@b. If you have something like a%b%c%b@x make it a%b@x... X **/ X X register int host_count = 0, i; X char hosts[MAX_HOPS][NLEN]; /* array of machine names */ X char *host, *addrptr; X X /* break down into a list of machine names, checking as we go along */ X X addrptr = (char *) address; X X while ((host = get_token(addrptr, "%@", 2)) != NULL) { X for (i = 0; i < host_count && ! equal(hosts[i], host); i++) X ; X X if (i == host_count) { X strcpy(hosts[host_count++], host); X if (host_count == MAX_HOPS) { X dprint(2, (debugfile, X "Can't build return address - hit MAX_HOPS in fix_arpa_address\n")); X error("Can't build return address - hit MAX_HOPS limit!"); X return(1); X } X } X else X host_count = i + 1; X addrptr = NULL; X } X X /** rebuild the address.. **/ X X address[0] = '\0'; X X for (i = 0; i < host_count; i++) X sprintf(address, "%s%s%s", address, X address[0] == '\0'? "" : X (i == host_count - 1 ? "@" : "%"), X hosts[i]); X X return(0); X} X Xfigure_out_addressee(buffer, mail_to) Xchar *buffer; Xchar *mail_to; X{ X /** This routine steps through all the addresses in the "To:" X list, initially setting it to the first entry (if mail_to X is NULL) or, if the user is found (eg "alternatives") to X the current "username". X X Modified to know how to read quoted names... X also modified to look for a comma or eol token and then X try to give the maximal useful information when giving the X default "to" entry (e.g. "Dave Taylor <taylor@hpldat>" X will now give "Dave Taylor" rather than just "Dave") X **/ X X char *address, *bufptr, mybuf[SLEN]; X register int iindex = 0, index2 = 0; X X if (equal(mail_to, username)) return; /* can't be better! */ X X bufptr = (char *) buffer; /* use the string directly */ X X if (strchr(buffer,'"') != NULL) { /* we have a quoted string */ X while (buffer[iindex] != '"') X iindex++; X iindex++; /* skip the leading quote */ X while (buffer[iindex] != '"' && iindex < strlen(buffer)) X mail_to[index2++] = buffer[iindex++]; X mail_to[index2] = '\0'; X } X X else { X X while ((address = strtok(bufptr, ",\t\n\r")) != NULL) { X X if (! okay_address(address, "don't match me!")) { X strcpy(mail_to, username); /* it's to YOU! */ X return; X } X else if (strlen(mail_to) == 0) { /* it's SOMEthing! */ X X /** this next bit is kinda gory, but allows us to use the X existing routines to parse the address - by pretending X it's a From: line and going from there... X Ah well - you get what you pay for, right? X **/ X X if (strlen(address) > (sizeof mybuf) - 7) /* ensure it ain't */ X address[(sizeof mybuf)-7] = '\0'; /* too long mon! */ X X sprintf(mybuf, "From: %s", address); X parse_arpa_who(mybuf, mail_to, TRUE); SHAR_EOF echo "End of part 10" echo "File src/addr_util.c is continued in part 11" echo "11" > s2_seq_.tmp exit 0 -- Please send comp.sources.unix-related mail to rsalz@uunet.uu.net.