Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP Posting-Version: version B 2.10.3 4.3bsd-beta 6/6/85; site ucbvax.BERKELEY.EDU Path: utzoo!linus!decvax!ucbvax!broome From: broome@ucbvax.BERKELEY.EDU (Jonathan C. Broome) Newsgroups: net.sources Subject: source to "phone" system (part 1 of 4) Message-ID: <11311@ucbvax.BERKELEY.EDU> Date: Sun, 29-Dec-85 03:38:29 EST Article-I.D.: ucbvax.11311 Posted: Sun Dec 29 03:38:29 1985 Date-Received: Sun, 29-Dec-85 20:15:13 EST Organization: University of California at Berkeley Lines: 316 #-----cut here-----cut here-----cut here-----cut here----- #! /bin/sh # This is a shell archive, meaning: # 1. Remove everything above the #! /bin/sh line. # 2. Save the resulting text in a file. # 3. Execute the file with /bin/sh (not csh) to create the files: # NOTE # READ_ME # phone.1 # Makefile # common.h # This archive created: Sat Dec 28 01:18:51 1985 export PATH; PATH=/bin:$PATH echo shar: extracting "'NOTE'" '(2690 characters)' if test -f 'NOTE' then echo shar: will not over-write existing file "'NOTE'" else cat << \!Funky!Stuff! > 'NOTE' Well, this is the first part of the source to my "phone" program, as promised. I received quite a few responses, many with weird addresses, thus the posting instead of a mailing. Be warned that this source is *not* a finished product, but more a "gamma test" version, although it has been running on a dozen UCB machines for several months and seems to work reasonably well. For those of you who may feel compelled to hack on it, I have laced the sources with quite a few comments about possible improvements. I would also welcome any suggestions/code you may come up with. Hopefully I will be able to send out a finished product sometime in the coming few months ... A few of the letters I received mentioned an interest in porting this to SysV machines and such ... Good luck! (Last I heard, AT&T had just heard of IPC!) This has only been tested on 4.[23] machines (Vax, Sun, and Perkin/Elmer), but will hopefully be easy enough to port to other hardware. Installing phone: Create an empty directory to put the sources in. Unshar the archive files by feeding to "sh" (or use "unshar"). Run "make", then "make install" (use "make -n" first if you're paranoid!) Add "phone" to /etc/services, the line should look like: phone 1167/udp # phone - conference calling (broome) A note on port numbers: there is no need for phone to use priviledged port numbers (think about it), and it would really be best for you to stick with port 1167 (what we use at Berkeley), at least if you want to be able to communicate with the outside world. I am working on an rfc-type spec in order to get a legitimately-assigned port number, but it will take a little while, so let's use 1167, okay? Back to installation: If your site runs the inetd, also add this line to /etc/services: phone dgram udp wait root /etc/phoned phoned Finally, if you do not use inetd, start up the phoned by typing "/etc/phoned", else do a "ps ax | grep inetd" to find inetd's pid, then kill -HUP pid to have it reread the config file. The manual page is presently pretty skimpy, so you may want to look at the routines in kb.c and cmd.c to get some idea as to what is going on. (Brownie points to anyone who writes a better man page!) For those of you with arpanet access, the sources will also be available in ~ftp/pub/phone.tar on ucbvax for your ftp'ing enjoyment. Good luck, and enjoy! ============================================================================== Jonathan C. Broome University of California at Berkeley ...!ucbvax!broome broome@ucb-vax.berkeley.edu ============================================================================== !Funky!Stuff! fi # end of overwriting check echo shar: extracting "'READ_ME'" '(1102 characters)' if test -f 'READ_ME' then echo shar: will not over-write existing file "'READ_ME'" else cat << \!Funky!Stuff! > 'READ_ME' Stuff for installing phone: 22 Dec 1985 =========================== =========== Phone consists of three parts - the client ("phone"), the master daemon ("phoned"), and the conversation daemon ("convd"). "Phoned" is the master server on each machine. It receives requests from the client process and acts on them. Its main purpose is to receive, store, and process call requests. All communication to phoned is through udp/ip datagrams. The master daemon can be compiled to run standalone or under the inetd as a single-threaded datagram-oriented server. The conversation daemon is invoked by the master daemon when a user requests a conversation. Its purpose is simply to relay what each person types back to all the others in a single conversation. Each user connects to the convd over a tcp/ip stream connection, and the convd reads a buffer from each client and resends the buffer to the other users. "Phone" is the user client program, responsible for managing windows and sending control packets to request calls. !Funky!Stuff! fi # end of overwriting check echo shar: extracting "'phone.1'" '(4210 characters)' if test -f 'phone.1' then echo shar: will not over-write existing file "'phone.1'" else cat << \!Funky!Stuff! > 'phone.1' .TH PHONE 1 .UC 5 .SH NAME phone \- communicate with other users in real-time .SH SYNOPSIS phone [ user@host [tty] ] .SH DESCRIPTION \fIPhone\fR allows for two or more people to interact in a conversation across a machine or network, providing a form of conference calling. Each participant has a window in which to type. The first line of each window is a header showing who is in the window, like: .sp 1 .nf .in +3 ---- root@cory on console (Commodore Cory) -------------- .in -3 .fi .sp 1 The login name and tty are automatically determined, and the real name is taken from the password file, which may be overridden by setting the \fINAME\fR environment variable (see \fIcsh\fR(1) for further details.) Users may join or leave a conversation at any point in time, and the windows will be automatically resized and redrawn. .SH USAGE When you are being paged by another person, a message like this will appear on your screen: .br .sp 1 .nf .in +5 Message from the Telephone_Operator@host at time ... phone: connection requested by user@host phone: respond with "phone user@host" .in -5 .sp 1 .fi You may answer the phone simply by typing "phone", which will answer the pending call, and connect you directly. .br .sp 1 \fIPhone\fR has two \fImodes\fR, much like the \fIvi\fR editor. These two modes are called \fIconversation\fR and \fIcommand\fR modes, and are toggled through the escape () and return () keys. .br .sp 1 When in the \fIconversation\fR mode, anything typed on the keyboard is sent to everyone in the current conversation. This is the default mode. .br .sp 1 The \fIcommand\fR mode is used to execute commands, and is entered by pressing the escape key. When in this mode, \fIphone\fR will clear the bottom line of the screen and print the prompt "Command>". At this point anything typed in is added to the command buffer, and will be executed when the return key is pressed. To exit command mode without executing the acommand, press the escape key a second time. .br .sp 1 To ivite another user to join the current conversation from within \fIphone\fP, enter command mode by pressing the escape key, then type .br .sp 1 .in +5 call \fIuser@host\fR .in -5 .sp 1 followed by the key. The user will receive a message like the one shown above if he is logged in. The \fIhost\fR part of the name may be omitted if the both you and the other person are on the same machine. .br .sp 1 \fIPhone\fR also allows a user to execute shell commands inside his window with any keyboard input being fed to the process. The program's output is sent to all users in the conversation. A shell command is executed within \fIphone\fR through the use of the \fIrun\fR or \fI!\fR command. An example of this is: .br .sp 1 .in +5 run adb a.out core .in -5 .sp 1 to run the \fIadb\fR command with the arguments \fIa.out\fR and \fIcore\fR. Note that tilde expansion (ie. ~user) is done by \fIphone\fR, but wildcarding, piping, and i/o redirection are performed by the user's shell. It is unlikely that anyone actually cares, of course. Also, the use of visually-oriented programs such as \fIvi\fR and \fIrogue\fR is not recommended, as this usually results in strange and unpredictable things happening. If your terminal goes up in a puff of smoke, you were warned. .br .sp 1 To find about the other commands available with \fIphone\fR, type \fIhelp\fR or \fI?\fR in command mode. .PP You can allow or disallow \fIphone\fR messages to your terminal through the use of the \fImesg\fR command. When you first log on, messages are enabled. .SH BUGS \fICsh\fR is unhappy being fed through pipes, but it's a dumb program anyway. .br The manual page is horrendous at best. .br Please send any problems, questions, or suggestions to the author. .SH AUTHOR Jonathan C. Broome (broome@ucb-vax.berkeley.edu) .br The original user interface is borrowed from a previous program (also called \fIphone\fR) posted to the network in late 1984, author unknown. .SH FILES .ta \w'/etc/passwd 'u .br /etc/hosts to find the recipient's machine .br /etc/utmp to find the recipient's tty .br /etc/passwd to find each user's real name .SH "SEE ALSO" mail(1), mesg(1), talk(1), who(1), write(1) !Funky!Stuff! fi # end of overwriting check echo shar: extracting "'Makefile'" '(310 characters)' if test -f 'Makefile' then echo shar: will not over-write existing file "'Makefile'" else cat << \!Funky!Stuff! > 'Makefile' # # Master makefile for the phone program 18 December 1985 # # You'll need to edit the makefile in each of the subdirectories # to change the compilation flags. # DIRS = client master conv .DEFAULT: for i in ${DIRS} ; do \ cd $$i ; make MFLAGS="${MFLAGS}" $@ ; cd .. ; \ done default: all !Funky!Stuff! fi # end of overwriting check echo shar: extracting "'common.h'" '(1266 characters)' if test -f 'common.h' then echo shar: will not over-write existing file "'common.h'" else cat << \!Funky!Stuff! > 'common.h' /* * Defines common to all the parts of the phone system. */ #ifndef ESC #define ESC '\033' /* precedes all commands */ #endif #define ACK 'y' /* good response code */ #define NAK 'n' /* not-so-good code */ /* * Commands sent from conversation daemon to client. */ #define META 0200 /* high bit for command characters */ #define ADDUSER (01<<5) /* add a user to the conversation */ #define DELUSER (02<<5) /* delete a user from conversation */ #define UPDATE (03<<5) /* set screen update mode */ /* * Commands sent from or master daemon to client. */ #define MESSAGE 'M' /* following is message text */ /* * Commands sent by client to conversation or master daemons. */ #define ANSWER 'A' /* he got the invite, will answer */ #define CALLING 'C' /* daemon is calling the user */ #define PAGE 'P' /* page a user */ #define INQUIRE 'I' /* inquire as to whether invited */ #define REINVITE 'R' /* renew a request for paging */ #define DAEMON 'D' /* create a daemon for me */ #define WHO 'W' /* tell me who's on ... */ #define KILL 'K' /* cause the daemon to exit */ #ifndef PORT #define PORT 1167 #endif !Funky!Stuff! fi # end of overwriting check # End of shell archive exit 0