shithub: 9bbs

Download patch

ref: c0aa29099d9d1e09c812c2438868ec2091c81ec7
author: sl <sl@gaff>
date: Sat Aug 24 23:25:14 EDT 2024

mercurial -> git: initial import (sans commit history)

--- /dev/null
+++ b/9bbs/.git/HEAD
@@ -1,0 +1,1 @@
+ref: refs/heads/front
--- /dev/null
+++ b/9bbs/.git/config
@@ -1,0 +1,4 @@
+[core]
+	repositoryformatversion = p9.0
+[branch "front"]
+	remote = origin
binary files /dev/null b/bin/9bbs differ
--- /dev/null
+++ b/bin/9bbs2nostromo
@@ -1,0 +1,36 @@
+#!/bin/rc
+# convert old message format to new message format.
+rfork e
+fn checkdir{
+	if(! test -d $1){
+		echo $1 does not exist >[1=2]
+		exit checkdir
+	}
+}
+fn seconds2rfc822{ date `{cat} | awk '{print $1 ", " $3 " " $2 " " $6 " " $4 " " $5}' }
+fn usage{
+	echo usage: 9bbs2nostromo src dst post >[1=2]
+	exit usage
+}
+if(~ $#2 0 || ~ $#4 1)
+	usage
+src=$1
+dst=$2
+post=$3
+checkdir $src
+checkdir $dst
+builtin cd $src
+if(~ $#post 0 || ! ~ $post [0-9]*)
+	post=1
+for(i in `{ls | grep -e '^[0-9]'}){
+	{
+		echo From: `{cat $i/from}
+		echo X-Room: `{cat name}
+		echo Date: `{echo $i | seconds2rfc822}
+		echo X-Date-N: $i
+		echo
+		cat $i/body
+	} >$dst/$post
+	echo $i '->' $post
+	post=`{echo $post^+1 | bc}
+}
--- /dev/null
+++ b/bin/mkperms
@@ -1,0 +1,42 @@
+#!/bin/rc
+# fix file permissions for etc/ and rooms/ when running as user other than none.
+# run from 9bbs install directory.
+rfork e
+argv0=$0
+fn usage {
+	echo usage: $argv0 '[ -g group ] [ -m mode]' >[1=2]
+	exit usage
+}
+ngroup=()
+nmode=()
+if(~ $#* 0)
+	usage
+while(~ $1 -*){
+	switch($1){
+	case -g
+		ngroup=$2
+		shift
+	case -m
+		nmode=$2
+		shift
+	case *
+		usage
+	}
+	shift
+}
+if(! ~ $#* 0)
+	usage
+if(! grep -s -e ':'^$ngroup^':' /adm/users){
+	echo group does not exist.
+	exit nogroup
+}
+for(i in `{walk etc/users}){
+	chgrp $ngroup $i
+	chmod $nmode $i
+	chmod g-w etc
+}
+for(i in `{walk etc/rooms rooms}){
+	chgrp $ngroup $i
+	chmod 775 $i
+	chmod g-w rooms
+}
--- /dev/null
+++ b/bin/mkroom
@@ -1,0 +1,16 @@
+#!/bin/rc
+# create a room.
+# run from 9bbs install directory.
+rfork e
+if(grep -s -e '^'$"1'$' etc/roomlist){
+	echo !room already exists &&
+	exit
+}
+mkdir -p rooms/$1 &&
+cp rooms/lobby/1 rooms/$1/ &&	# hope you didn't edit this file!
+echo $1 >>etc/roomlist &&
+echo $1/1 >>etc/rooms &&
+for(i in `{ls etc/users})
+	echo $1/1 >>$i/rooms	# what if the user is logged in?
+for(i in `{walk rooms/$1})
+	chgrp none $i
--- /dev/null
+++ b/etc/goodbye
@@ -1,0 +1,9 @@
+
+----------------------------------------------------------------------------
+"Quis custodiet ipsos custodes."
+         --Juvenal, _Satires_, VI, 347
+          Quoted as the epigraph of
+          the Tower Commission Report,
+          1987
+----------------------------------------------------------------------------
+
--- /dev/null
+++ b/etc/motd
@@ -1,0 +1,41 @@
+ +---------------------------------------------------+
+ |  Intellectual Property Policy for OSUNY U.K. BBS  |
+ +---------------------------------------------------+
+
+In accordance with Title 17 U.S.C. Section 107, the material within is
+distributed without profit to those who have expressed a prior interest
+in receiving the included information for research and educational
+purposes.  Use of this system constitutes the expression of prior
+interest.
+
+
+.+===============================================+.
+|                                                 |     
+|     _  ,^.  _                                   |
+|   ,'/ -' '- \`.                                 |
+|  / |   \ /   | \                                |
+| |  |   | |   |  |                               |
+| |   \_,' `._/   |  __   __ __  __  __  _  _     |    
+| |               | (( \  || ||  ||\ ||  \\//     |
+|  \             /   \\   || ||  ||\\||   )/      |
+|   `.         .'   \_))  \\_//  || \||  //       |
+|     `--._.--'                                   |
+|                                  u.k.           |
+|                                                 |     
+|                                                 |
+`+===============================================+' 
+
+
+---------------------------------------------------------------------------
+            Someday they won't let you, so now you must agree
+        The times they are a-telling, and the changing isn't free
+        You've read it in the tea leaves, and the tracks are on TV
+                          Beware the savage jaw
+                                 Of 1984
+---------------------------------------------------------------------------
+===========================================================================
+  ssh osuny.bell-labs.co port 999	# any username, no password
+	RSA SHA256:lf2khQcO6kib2dN/eXYaemzV/sBSt+Yaou/E4PKYxUQ
+  telnet osuny.bell-labs.co port 666
+===========================================================================
+
--- /dev/null
+++ b/etc/roomlist
@@ -1,0 +1,1 @@
+lobby
--- /dev/null
+++ b/etc/rooms
@@ -1,0 +1,1 @@
+lobby/1
--- /dev/null
+++ b/etc/users/sl/created
@@ -1,0 +1,1 @@
+Tue Feb  7 16:47:55 GMT 2012
--- /dev/null
+++ b/etc/users/sl/editor
@@ -1,0 +1,1 @@
+sam -d
--- /dev/null
+++ b/etc/users/sl/password
@@ -1,0 +1,1 @@
+CHANGEME
--- /dev/null
+++ b/etc/users/sl/plines
@@ -1,0 +1,1 @@
+22
--- /dev/null
+++ b/etc/users/sl/room
@@ -1,0 +1,1 @@
+lobby
--- /dev/null
+++ b/etc/users/sl/rooms
@@ -1,0 +1,1 @@
+lobby/1
--- /dev/null
+++ b/etc/users/sl/sig
@@ -1,0 +1,1 @@
+sl
--- /dev/null
+++ b/etc/users/sl/wrap
@@ -1,0 +1,1 @@
+72
--- /dev/null
+++ b/etc/welcome
@@ -1,0 +1,20 @@
+
+----------------------------------------------------------------------------
+
+  W E L C O M E  T O  O S U N Y  U . K .
+
+----------------------------------------------------------------------------
+
+  The default editor is sam -d.  (http://sam.cat-v.org)
+
+  The following is an example of how to enter a simple message:
+
+	e
+	i
+	[your text here]
+	.
+	w
+	q
+
+  type 'h' for general help with the system.
+
binary files /dev/null b/img/9til.de.png differ
--- /dev/null
+++ b/index.md
@@ -1,0 +1,143 @@
+9bbs
+====
+
+citadel style bbs for plan 9, written in rc
+
+download
+--------
+
+[9bbs.tgz](http://plan9.stanleylieber.com/src/9bbs.tgz)
+
+	hg clone https://code.9front.org/hg/9bbs
+
+install
+-------
+
+9bbs is started by a [listen(8)](http://man.9front.org/8/listen)
+script that runs on an arbitrary port.  The example files included
+with this distribution are setup to run on port 666, but may be
+modified to suit.  The following instructions assume that a listener
+is already scanning the directory `/rc/bin/service` (true by default
+for cpu servers).  In this scenario, the 9bbs script will be run as
+user `none`, which has special properties limiting its access to
+system resources.  Run 9bbs as any user other than `none` at
+your own risk.  WARNING: Because user `none` can only read and
+write files that are world-accessible, anyone with access to the
+file system will be able to read and write files under `etc/`.
+
+First, edit `src/tcp666` to reflect the location of the 9bbs files on
+your system, and set any desired options.  Edit `etc/motd` and
+`etc/welcome` according to taste.
+
+Next, build and install the programs:
+
+	cd 9bbs/src
+	mk install
+	cd ..
+	mk log
+	mk perms	# user who runs this must be a member of group none
+
+Note: 9bbs uses a modified copy of the Plan 9 pager,
+[p(1)](http://man.9front.org/1/p).  It is identical in all ways to the
+original except that the `!` command for issuing shell commands has been
+removed.  The resulting np binary is copied to `$objtype/bin/`, the
+tcp666 script is copied to `/rc/bin/service/`, and a log file is created
+in `/sys/log/9bbs`.  All other 9bbs files remain within the 9bbs
+directory.
+
+All of that completed, 9bbs will now answer telnet connections on port
+666.
+
+Suggested: Read the source.
+
+use
+---
+
+The following commands have been implemented:
+
+	[0-9]+	print specified message
+	b		back
+	B		toggle biff
+	C		change password
+	d [...]		delete message
+	D [...]		view, set message delimiter
+	>D		truncate message delimiter
+	e		enter message
+	E [...]		view, set editor (choices: sam, simple)
+	f		jump to first message
+	g [...]		list rooms with unread messages, go to specified room
+	gr		list ten most recently active rooms
+	grep [...]	grep messages in current room for regexp
+	h, help		print this help message
+	k [...]		print roomlist or grep for specified regexp
+	l		jump to last message
+	L [...]		view, set number of lines to print before engaging pager (enter to continue, q to quit)
+	n		next
+	p, re [...]		print message with minimal headers
+	P [...]		print message with full headers
+	r [...]		reply to message
+	q		quit
+	S [...]		view, set signature
+	>S		truncate signature
+	t		print current date and time
+	u		list users
+	w		who is online
+	wr		list ten most recently active users
+	W [...]		view, set line wrap width
+	y		synchronize message list for current room
+	z		mark all messages (on the entire bbs) as read
+	" [...]		print message in quoted form, suitable for reply
+	?		print debug information
+
+rooms
+-----
+
+A room is a directory somewhere under `rooms/` that contains at least
+one numbered message file.  An example room has been included in the
+distribution: `rooms/lobby/`.
+
+To create a room:
+
+	cd 9bbs
+	./bin/mkroom roomname
+
+Note: Rooms may be nested.
+
+messages
+---------
+
+The message format is as follows:
+
+	To: lobby
+	Date: Wed, 31 Dec 1969 19:00:01 EST
+	X-Date-N: 1
+	
+	This is a placeholder message created to bootstrap the system.
+
+todo
+----
+
+• `g [room]/[n]` to print message `[n]` in `[room]`.
+
+mailing list
+------------
+
+Mainly for announcements.
+
+To subscribe:
+
+	echo subscribe | mail 9bbs-owner@stanleylieber.com
+
+After you're subscribed, messages will arrive from, and may be sent
+to, 9bbs@stanleylieber.com.
+
+To unsubscribe:
+
+	echo unsubscribe | mail 9bbs-owner@stanleylieber.com
+
+powered
+-------
+
+<http://osuny.bell-labs.co> - telnet port 666, ssh port 999
+
+<http://9til.de> - telnet port 999
--- /dev/null
+++ b/mkfile
@@ -1,0 +1,23 @@
+log:V:
+	>/sys/log/9bbs
+	chmod +aw /sys/log/9bbs
+	cp src/tcp666 /rc/bin/service
+
+perms:V:
+	for(i in `{walk etc/users}){
+		chgrp none $i
+		chmod 777 $i	# see bin/mkperms for users other than none
+	}
+	for(i in `{walk etc/rooms rooms}){
+		chgrp none $i
+		chmod 777 $i	# gross
+	}
+
+web:V:
+	if(test -f 9bbs.tgz)
+		rm 9bbs.tgz
+	cd ..
+	tar zcvf /tmp/9bbs.tgz 9bbs
+	cd 9bbs
+	cp /tmp/9bbs.tgz ../src/
+	rm /tmp/9bbs.tgz
--- /dev/null
+++ b/rooms/lobby/1
@@ -1,0 +1,5 @@
+To: lobby
+Date: Wed, 31 Dec 1969 19:00:01 EST
+X-Date-N: 1
+
+This is a placeholder message created to bootstrap the system.
--- /dev/null
+++ b/src/mkfile
@@ -1,0 +1,7 @@
+</$objtype/mkfile
+BIN=/$objtype/bin
+TARG=np
+
+OFILES=np.$O
+
+</sys/src/cmd/mkone
--- /dev/null
+++ b/src/np.c
@@ -1,0 +1,84 @@
+#include <u.h>
+#include <libc.h>
+#include <bio.h>
+
+#define	DEF	22	/* lines in chunk: 3*DEF == 66, #lines per nroff page */
+
+Biobuf *cons;
+Biobuf bout;
+
+int pglen = DEF;
+
+void printfile(int);
+
+void
+main(int argc, char *argv[])
+{
+	int n;
+	int f;
+
+	if((cons = Bopen("/dev/cons", OREAD)) == 0) {
+		fprint(2, "np: can't open /dev/cons\n");
+		exits("missing /dev/cons");
+	}
+	Blethal(cons, nil);
+	Binit(&bout, 1, OWRITE);
+	Blethal(&bout, nil);
+	n = 0;
+	while(argc > 1) {
+		--argc; argv++;
+		if(*argv[0] == '-'){
+			pglen = atoi(&argv[0][1]);
+			if(pglen <= 0)
+				pglen = DEF;
+		} else {
+			n++;
+			f = open(argv[0], OREAD);
+			if(f < 0){
+				fprint(2, "np: can't open %s - %r\n", argv[0]);
+				continue;
+			}
+			printfile(f);
+			close(f);
+		}
+	}
+	if(n == 0)
+		printfile(0);
+	exits(0);
+}
+
+void
+printfile(int f)
+{
+	int i, j, n;
+	char *s, *cmd;
+	Biobuf *b;
+
+	b = malloc(sizeof(Biobuf));
+	Binit(b, f, OREAD);
+	Blethal(b, nil);
+	for(;;){
+		for(i=1; i <= pglen; i++) {
+			s = Brdline(b, '\n');
+			if(s == 0){
+				n = Blinelen(b);
+				if(n > 0)	/* line too long for Brdline */
+					for(j=0; j<n; j++)
+						Bputc(&bout, Bgetc(b));
+				else{		/* true EOF */
+					free(b);
+					return;
+				}
+			}else{
+				Bwrite(&bout, s, Blinelen(b)-1);
+				if(i < pglen)
+					Bwrite(&bout, "\n", 1);
+			}
+		}
+		Bflush(&bout);
+		cmd = Brdline(cons, '\n');
+		if(cmd == 0 || *cmd == 'q')
+			exits(0);
+		cmd[Blinelen(cons)-1] = 0;
+	}
+}
--- /dev/null
+++ b/src/tcp666
@@ -1,0 +1,2 @@
+#!/bin/rc
+nostromoname=azure@bell-labs.co /usr/sl/osuny/bin/9bbs -f lobby -m /usr/sl/osuny -p 9000 >>[2]/sys/log/9bbs