/* * $Id: party.h,v 1.6 2002/08/23 13:39:23 howardjp Exp $ * * Copyright (c) 1990 * Jan Wolter. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by Jan Wolter * and his contributors. * 4. Neither the name of Jan Wolter nor the names of his contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY JAN WOLTER AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL JAN WOLTER OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ /* PARTY PROGRAM - GLOBAL DECLARATIONS */ /* This file contains installation dependent information about the party * program. The user should define either SYSIII, SYSV or BSD to get this * to compile. If none of these seem appropriate, there are lower level * defines that can be set to mix and match features from this Unixes. * * BSD works for SunOS and Mach. SYSV has not been tested in eons. * * Defines should be set with -D options in the Makefile, not by editting * this file. This just sets defaults if you don't define anything. The * defaults are mostly set up for M-Net. */ #include #include /* Comment this out if you ain't got it */ #include /* The name of the partytab file must be compiled into the program. This * is the file that determines the rest of the system configuration. */ #ifndef PARTYTAB #define PARTYTAB "/usr/local/lib/party/partytab" #endif /*PARTYTAB*/ /* either SUID or SGID should be set, depending on whether the party * program is to be installed suid or sgid. */ #ifndef SUID #ifndef SGID #define SUID #endif /*SGID*/ #endif /*SUID*/ /* MAILDELAY determines how often the program checks for new mail and for * idleness. The test will be made roughly every 4*MAILDELAY seconds. */ #ifndef MAILDELAY #define MAILDELAY 30 #endif /*MAILDELAY*/ /* UTMP is the location of the utmp file, which varies on some systems */ #ifndef UTMP #ifdef _PATH_UTMP #define UTMP _PATH_UTMP #else #define UTMP "/etc/utmp" #endif #endif /* The following options give default values for options. All of these can * be overridden by the partytab file, and most can be overridden by the * user in various ways. */ #ifndef DFLT_CHANTAB #define DFLT_CHANTAB "/usr/local/lib/party/chantab" #endif /*DFLT_CHANTAB*/ #ifndef DFLT_DIR #define DFLT_DIR "/usr/local/lib/party/log" #endif /*DFLT_DIR*/ #ifndef DFLT_HELP #define DFLT_HELP "/usr/local/lib/party/partyhlp" #endif /*DFLT_HELP*/ #ifndef DFLT_MAKENOISE #define DFLT_MAKENOISE "/usr/local/lib/party/noisetab" #endif /*DFLT_MAKENOISE*/ #ifndef DFLT_WHOFILE #define DFLT_WHOFILE "/usr/local/lib/party/partytmp" #endif /*DFLT_WHOFILE*/ #ifndef DFLT_FULLMESG #define DFLT_FULLMESG "Sorry, Party is full. Please try again later." #endif /*DFLT_FULLMESG*/ #ifndef DFLT_INTRO #define DFLT_INTRO "Welcome to PARTY! Type '?' for help:" #endif /*DFLT_INTRO*/ #ifndef DFLT_PROMPT #define DFLT_PROMPT ">" #endif /*DFLT_PROMPT*/ #ifndef DFLT_TPMORP #define DFLT_TPMORP "" #endif /*DFLT_TPMORP*/ #ifndef DFLT_SPACEONLY #define DFLT_SPACEONLY "Type '?' for help." #endif /*DFLT_SPACEONLY*/ #ifndef DFLT_SHELL #define DFLT_SHELL "/bin/sh" #endif /*DFLT_SHELL*/ #ifndef DFLT_BACK #define DFLT_BACK "10" #endif /*DFLT_BACK*/ #ifndef DFLT_COLS #define DFLT_COLS "80" #endif /*DFLT_COLS*/ #ifndef DFLT_FILTER #define DFLT_FILTER "" #endif /*DFLT_FILTER*/ #ifndef DFLT_START #define DFLT_START "party" #endif /*DFLT_START*/ #ifndef DFLT_READLIM #define DFLT_READLIM "0" #endif /*DFLT_READLIM*/ #ifndef DFLT_MAILDIR #define DFLT_MAILDIR "/usr/mail" #endif /*DFLT_MAILDIR*/ #ifndef DFLT_KNOCKWAIT #define DFLT_KNOCKWAIT "30" #endif /*DFLT_KNOCKWAIT*/ #ifndef DFLT_IDLEOUT #define DFLT_IDLEOUT "10" #endif /*DFLT_IDLEOUT*/ #ifndef DFLT_CAPACITY #define DFLT_CAPACITY "50" #endif /*DFLT_CAPACITY*/ #ifndef DFLT_DEBUG #define DFLT_DEBUG "party.debug" #endif /*DFLT_DEBUG*/ /* Recognize some builtin compiler defines */ #ifdef NeXT #ifndef BSD #define BSD #endif #endif #if defined(sparc) || defined(bsdi) #ifndef BSD #define BSD #endif #ifndef POSIX #define POSIX #endif #endif /* Translate high level defines into lower level defines */ #ifdef SYSIII #define NOSTRSTR /* Don't use strstr() call */ #define L_LOCKING /* Use locking() to lock files */ #define F_TERMIO /* Use ioctl() to set modes */ typedef int vint; /* No void type on this old machine */ typedef unsigned mtype; /* arg type for malloc() */ #define BFSZ 268 /* in Sys3 can't type more than 256 anyway */ #define CANT_RESET /* can't give up effective uid and take it back */ #define RAND() rand() #define MAXRAND 32767 #define SEEDRAND(x) srand(x) #define NOSELECT #endif /*SYSIII*/ #ifdef SYSV #define L_LOCKF /* Use lockf() to lock files */ #define F_TERMIO /* Use ioctl() to set modes */ #define NODUP2 /* Don't use dup2() call */ #define BFSZ 1035 #define index strchr typedef void vint; typedef unsigned long mtype; /* arg type for malloc() */ #define RAND() rand() #define MAXRAND 32767 #define SEEDRAND(x) srand(x) #define VAR_ARGS #endif /*SYSV*/ #ifdef BSD #define L_FLOCK /* Use flock() to lock files */ #if defined(bsdi) || defined(linux) || defined(__FreeBSD__) #define F_TERMIOS /* Use tcsetattr() to set modes */ #else #define F_STTY /* Use stty() to set modes */ #endif /*bsdi*/ #define WINDOWS /* Get window size from kernel */ #define BFSZ 1035 typedef void vint; typedef unsigned long mtype; /* arg type for malloc() */ #define RAND() random() #define MAXRAND 2147483647 #define SEEDRAND(x) srandom(x) #define VAR_ARGS #endif /*BSD*/ #ifdef POSIX #include #endif #ifdef F_TERMIOS #include struct termios cooked, cbreak; #define GTTY(fd, st) tcgetattr(fd, (st)) #ifdef TCSASOFT #define STTY(fd, st) tcsetattr(fd, TCSASOFT | TCSANOW, (st)) #else #define STTY(fd, st) tcsetattr(fd, TCSANOW, (st)) #endif #define EOF_CHAR (cooked.c_cc[VEOF]) #define ERASE_CHAR (cooked.c_cc[VERASE]) #define KILL_CHAR (cooked.c_cc[VKILL]) #ifdef VREPRINT #define REPRINT_CHAR (cooked.c_cc[VREPRINT]) #else #define REPRINT_CHAR '\022' #endif #ifdef VWERASE #define WERASE_CHAR (cooked.c_cc[VWERASE]) #else #define WERASE_CHAR '\027' #endif #ifdef VLNEXT #define LNEXT_CHAR (cooked.c_cc[VLNEXT]) #else #define LNEXT_CHAR '\026' #endif #endif /*F_TERMIOS*/ #ifdef F_TERMIO #include struct termio cooked, cbreak; #define GTTY(fd, st) ioctl(fd, TCGETA, (st)) #define STTY(fd, st) ioctl(fd, TCSETAF, (st)) #define EOF_CHAR (cooked.c_cc[VEOF]) #define ERASE_CHAR (cooked.c_cc[VERASE]) #define KILL_CHAR (cooked.c_cc[VKILL]) #ifdef VREPRINT #define REPRINT_CHAR (cooked.c_cc[VREPRINT]) #else #define REPRINT_CHAR '\022' #endif #ifdef VWERASE #define WERASE_CHAR (cooked.c_cc[VWERASE]) #else #define WERASE_CHAR '\027' #endif #ifdef VLNEXT #define LNEXT_CHAR (cooked.c_cc[VLNEXT]) #else #define LNEXT_CHAR '\026' #endif #endif /*F_TERMIO*/ #ifdef F_STTY #include struct tchars tch; struct ltchars ltch; struct sgttyb cooked, cbreak; #define GTTY(fd, st) ioctl(fd, TIOCGETP, (st)) #define STTY(fd, st) ioctl(fd, TIOCSETN, (st)) #define EOF_CHAR (tch.t_eofc) #define ERASE_CHAR (cooked.sg_erase) #define KILL_CHAR (cooked.sg_kill) #ifdef TIOCGLTC #define WERASE_CHAR (ltch.t_werasc) #define REPRINT_CHAR (ltch.t_rprntc) #define LNEXT_CHAR (ltch.t_lnextc) #else #define WERASE_CHAR '\027' #define REPRINT_CHAR '\022' #define LNEXT_CHAR '\026' #endif #endif /*F_STTY*/ #ifdef L_FLOCK #include #define LOCK(file) flock(fileno(file), LOCK_EX) #define UNLOCK(file) flock(fileno(file), LOCK_UN) #endif /*L_FLOCK*/ #ifdef L_LOCKF #define LOCK(file) fseek(file, 0L, 0), lockf(file, 1, 0L) #define UNLOCK(file) fseek(file, 0L, 0), lockf(file, 0, 0L) #endif /*L_LOCKF*/ #ifdef L_LOCKING #define LOCK(file) fseek(file, 0L, 0), chk_lock(file, 1) #define UNLOCK(file) fseek(file, 0L, 0), chk_lock(file, 0) #endif /*L_LOCKING*/ #ifdef SUID #define CHN_MODE 0644 #define DEP_MODE 0600 #define USR_MODE 0600 #ifdef _POSIX_SAVED_IDS #define be_user() seteuid(real_id) #define be_party() seteuid(eff_id) #else #ifdef CANT_RESET #define be_user() #define be_party() #else #define be_user() setreuid(eff_id,real_id) #define be_party() setreuid(real_id,eff_id) #endif /*CANT_RESET*/ #endif /*_POSIX_SAVED_IDS*/ #endif /*SUID*/ #ifdef SGID #define CHN_MODE 0664 #define USR_MODE 0664 #define DEP_MODE 0660 #ifdef _POSIX_SAVED_IDS #define be_user() setegid(real_id) #define be_party() setegid(eff_id) #else #ifdef CANT_RESET #define be_user() #define be_party() #else #define be_user() setregid(eff_id,real_id) #define be_party() setregid(real_id,eff_id) #endif /*CANT_RESET*/ #endif /*_POSIX_SAVED_IDS*/ #endif /*SGID*/ #include #include #include #include #include #include #include #include /* BSDI is only Unix I know of that threatens to change namesize from 8 to * anything else. Most don't even have a define for it. */ #ifndef UT_NAMESIZE #define UT_NAMESIZE 8 #endif #ifndef UT_LINESIZE #define UT_LINESIZE 8 #endif /* Option table structure */ struct optent { char *name; /* Name for this option */ char pf; /* Syntax for this option */ char yes; /* Boolean value of this option 0=no, 1=yes, 2=see */ char *str; /* String value of this option */ }; struct cmdent { char *name; /* Name for this command */ char abbr; /* Minimum number of characters which must match */ }; /* Option pf flags - how can the option be used? */ #define PF_SYS 0001 /* Can only be set in partytab */ #define PF_NO 0002 /* Can use "option" and "nooption" form */ #define PF_SEE 0004 /* Can use "seeoption" form */ #define PF_STR 0010 /* Can use "option=string" form */ #define PF_NUM 0020 /* Can use "option=number" form */ #define PF_CHN 0040 /* Reset on chn change. Not user settable */ #define PF_SHOW 0100 /* Print even without "all" flag */ extern struct optent opt[]; /* Option structure -- see opttab.c */ extern struct cmdent cmd[]; /* Command structure -- see opttab.c */ extern int rst; /* Party file open for read */ extern FILE *wfd; /* Party file open for write */ extern int out_fd; /* Stream to terminal or filter */ extern char *progname; /* Program name */ extern char *channel; /* Current channel number (NULL is outside)*/ extern long tailed_from; /* File offset we last tailed from */ extern char *version; extern char name[]; /* User's internal name or alias */ extern char realname[]; /* User's real name (used for mail check) */ extern char logname[]; /* Name user logged in under (utmp) */ extern char logtty[]; /* /dev/ttyXX that user logged into (utmp) */ extern long logtime; /* Time that the user logged in (utmp)*/ extern FILE *debug; /* Debug output file */ extern int real_id, eff_id; /* Real and Effective uid */ /* The following buffer gets used for all sorts of things in all sorts of * places. Beware! */ #define INDENT UT_NAMESIZE+2 /* Just changing this value won't work */ char inbuf[BFSZ+INDENT+2]; /* Text buffer - first 10 for "name: " */ char *txbuf; /* Text buffer - pointer to respose portion */ /* of inbuf */ #define CHN_LEN 12 /* Maximum length of channel name */ /* Data structure used in compiling list of channels for :list command */ struct chnname { char name[CHN_LEN+1]; /* Name of this command */ int users; /* number of users in this channel */ struct chnname *next; /* Next entry */ }; #ifndef NOIGNORE /* Structure of linked list of ignored user. Initially null */ struct ign { struct ign *next; char name[UT_NAMESIZE+1]; }; extern struct ign *ignoring; #endif /*NOIGNORE*/ int alrm(), intr(), hup(), term(), setcols(); #ifdef BSD int susp(); #endif /*BSD*/ vint err(char *, ...), db(char *, ...); char *getlogin(), *malloc(), *ctime(), *fgets(), *getenv(); char *chn_file_name(), *getline(); char *strchr(), *strpbrk(), *strrchr(), *strstr(); char *firstin(), *firstout(); struct passwd *getpwnam(), *getpwuid(); struct chnname *who_clist(), *addchn(); char *leafname(); long backup(); time_t time(); vint (*oldsigpipe)(); vint (*(signal()))(); FILE *upopen(); #ifndef NOCLOSE char *usr_file_name(); #endif