git: 9front

Download patch

ref: 018426260159dbc838467cc79b10156d09d1714d
parent: 25f124f828118d1e7904ae88acc791ad89166623
author: cinap_lenrek <cinap_lenrek@centraldogma>
date: Mon May 9 06:38:45 EDT 2011

replace aquarela with ip/cifsd

--- a/sys/man/8/aquarela
+++ /dev/null
@@ -1,225 +1,0 @@
-.TH AQUARELA 8
-.SH NAME
-aquarela \- CIFS server
-.SH SYNOPSIS
-.B aquarela
-[
-.B -np
-] [
-.B -d
-.I debug
-] [
-.B -u
-.I N
-] [
-.B -w
-.I workgroup
-]
-.SH DESCRIPTION
-.I Aquarela
-provides
-.SM CIFS
-(once known as
-.SM SMB\c
-)
-access to Plan 9 file servers.
-It announces and subsequently listens on
-.B tcp!*!445
-for connections to the file hierarchies called `shares' by
-.SM CIFS\c .
-Users are authenticated with their
-.SM APOP
-secret (see
-.IR auth (8)).
-Each session is managed by a process running as the authenticated user.
-Two persistent processes handle listening, session setup, and housekeeping.
-.PP
-An
-.I aquarela
-.SM CIFS
-share corresponds to a directory under
-.BR /n .
-A client request for a specific share, say,
-.BR share ,
-causes
-.I aquarela
-to attempt a
-.I 9fs
-(in
-.IR srv (4))
-connection to the file server
-.BR share .
-If connection succeeds, a file hierarchy rooted at
-.B /n/share
-is presented to the client.
-The client request fails otherwise.
-Requests for the protocol equivalent of
-.B /
-are satisfied with a directory containing only the default share,
-.BR local .
-.PP
-The options are:
-.TF "-u "
-.TP
-.B -n
-Enable limited
-.SM NETBIOS
-service.
-.I Aquarela
-will register with the `master browser' for
-.I workgroup
-and listen on
-.B tcp!*!139
-and
-.B udp!*!13[7-9]
-for
-.SM NETBIOS
-name resolution and session requests.
-This works in tandem with a complete
-.SM NETBIOS
-master name server, like that provided by Unix
-\fInmbd\fR(8).
-.SM NETBIOS
-is not required for
-.SM CIFS
-file service.
-.TP
-.BI -u " N
-Send Unicode.
-For
-.IR N ,
-.B 1
-enables,
-.B 0
-disables Unicoding of file names and metadata.
-There is no code page support, so
-.I aquarela
-emits
-.SM UTF
-if
-.I N
-is
-.BR 0 .
-.TP
-.BI -w " workgroup
-Set
-.I workgroup
-(or `primary domain') of server.
-Default
-.BR PLAN9 .
-.PD
-.SH EXAMPLE
-To start
-.SM CIFS
-service on system
-.BR plan9 :
-.IP
-.EX
-% aquarela -u 1 &
-.EE
-.PP
-To then make the
-.B dump
-filesystem available as drive
-.B Y:
-on a Windows machine:
-.IP
-.EX
-C:\\>net use Y: \\\\plan9.example.com\\dump
-.EE
-.SH FILES
-.TF /sys/log/aquarela
-.TP
-.B /n/local
-Default
-.SM CIFS
-share
-.TP
-.B /sys/log/aquarela
-Log file
-.PD
-.SH SOURCE
-.B /sys/src/cmd/aquarela
-.SH SEE ALSO
-.IR auth (8),
-.IR srv (4),
-.IR utf (6)
-.SH DIAGNOSTICS
-Log messages are appended to
-.B /sys/log/aquarela
-if it exists. The
-.B -p
-option prints them on standard output as well.
-The
-.B -d
-option adds verbose output about
-.I debug
-to the log messages, where
-.I debug
-is one of:
-.TF any-smb-name
-.TP
-.B allcmds
-All
-.SM CIFS
-requests and responses.
-.TP
-.B tids
-Connections and disconnections per-share.
-.TP
-.B sids
-Creation and deletion of search ids.
-.TP
-.B fids
-Creation and deletion of file ids.
-.TP
-.B rap2
-.SM RAP
-calls.
-.TP
-.B find
-Transaction2 find commands.
-.TP
-.B query
-Transaction2 query commands.
-.TP
-.B sharedfiles
-All files opened.
-.TP
-.B poolparanoia
-Draconian error checking in memory allocator.
-.TP
-.B sessions
-Connections and disconnections on server.
-.TP
-.B rep
-Regular expression conversions.
-.TP
-.B locks
-Locking activity.
-.TP
-.I any-smb-name
-Debug only
-.B SMB_
-requests or
-.B transaction2
-sub-requests
-(e.g.,
-.B SMB_COM_SESSION_SETUP_ANDX
-or
-.BR SMB_TRANS2_FIND_FIRST2 )
-matching symbolic name
-.I any-smb-name.
-.TP
-.BI 0x nn
-Debug only messages with hexadecimal id
-.BI 0x nn.
-.PD
-.SH BUGS
-The first connection attempt to a share sometimes fails erroneously - try again.
-The share disk space reported by some clients is inaccurate.
-Some clients can't rename directories.
-Write attempts without sufficient permissions fail (correctly), but appear on client to temporarily succeed.
-.PP
-This program should probably be named
-.IR cifsserver .
--- a/sys/src/cmd/aquarela/COPYRIGHT
+++ /dev/null
@@ -1,1 +1,0 @@
-Contributed by Nigel Roles <nigel@9fs.org>
--- a/sys/src/cmd/aquarela/addname.c
+++ /dev/null
@@ -1,69 +1,0 @@
-#include <u.h>
-#include <libc.h>
-#include <ip.h>
-#include <thread.h>
-#include "netbios.h"
-
-int
-nbnsaddname(uchar *serveripaddr, NbName name, ulong ttl, uchar *ipaddr)
-{
-	NbnsMessage *nq;
-	Alt aa[3];
-	int tries = NbnsRetryBroadcast;
-	NbnsAlarm *a;
-	int rv;
-	NbnsMessage *response;
-
-	nq = nbnsmessagenameregistrationrequestnew(0, serveripaddr == nil, name, ttl, ipaddr);
-	if (nq == nil)
-		return -1;
-	a = nbnsalarmnew();
-	if (a == nil) {
-		free(nq);
-		return -1;
-	}
-	aa[0].c = a->c;
-	aa[0].v = nil;
-	aa[0].op = CHANRCV;
-	aa[1].op = CHANRCV;
-	aa[2].op = CHANEND;
-	while (tries > 0) {
-		NbnsTransaction *t;
-		nq->id = nbnsnextid();
-		t = nbnstransactionnew(nq, serveripaddr);
-		aa[1].c = t->c;
-		aa[1].v = &response;
-		nbnsalarmset(a, NbnsTimeoutBroadcast);
-		for (;;) {
-			int i;
-			i = alt(aa);
-			if (i == 0) {
-				tries--;
-				break;
-			}
-			else if (i == 1) {
-				if (response->opcode == NbnsOpRegistration) {
-					nbnstransactionfree(&t);
-					goto done;
-				}
-				nbnsmessagefree(&response);
-			}
-		}
-		nbnstransactionfree(&t);
-	}
-done:
-	if (tries == 0)
-		rv = -1;
-	else {
-		if (response->rcode != 0)
-			rv = response->rcode;
-		else if (response->an == nil)
-			rv = -1;
-		else
-			rv = 0;
-		nbnsmessagefree(&response);
-	}
-	nbnsalarmfree(&a);
-	nbnsmessagefree(&nq);
-	return rv;
-}
--- a/sys/src/cmd/aquarela/alarm.c
+++ /dev/null
@@ -1,125 +1,0 @@
-#include <u.h>
-#include <libc.h>
-#include <ip.h>
-#include <thread.h>
-#include "netbios.h"
-
-static struct {
-	int thread;
-	int die;
-	QLock;
-	NbnsAlarm *head;
-} alarmlist = { -1 };
-
-#define MaxLong ((1 << (sizeof(long) * 8 - 1)) - 1)
-
-void
-alarmist(void *)
-{
-	for (;;) {
-		vlong now;
-		long snooze;
-//print("running\n");
-		qlock(&alarmlist);
-		if (alarmlist.die) {
-			qunlock(&alarmlist);
-			break;
-		}
-		now = nsec() / 1000000;
-		while (alarmlist.head && alarmlist.head->expirems <= now) {
-//print("expiring because %lld > %lld\n", alarmlist.head->expirems, now);
-			sendul(alarmlist.head->c, 1);
-			alarmlist.head = alarmlist.head->next;
-		}
-		if (alarmlist.head) {
-			vlong vsnooze = alarmlist.head->expirems - now;
-			if (vsnooze > MaxLong)
-				snooze = MaxLong;
-			else
-				snooze = vsnooze;
-		}
-		else
-			snooze = 60 * 1000;
-//print("snoozing for %ld\n", snooze);
-		qunlock(&alarmlist);
-		sleep(snooze);
-	}
-}
-
-NbnsAlarm *
-nbnsalarmnew(void)
-{
-	NbnsAlarm *a;
-	a = mallocz(sizeof(*a), 1);
-	if (a == nil)
-		return nil;
-	a->c = chancreate(sizeof(ulong), 1);
-	if (a->c == nil) {
-		free(a);
-		return nil;
-	}
-	return a;
-}
-
-void
-nbnsalarmcancel(NbnsAlarm *a)
-{
-	NbnsAlarm **ap;
-	int rv;
-	qlock(&alarmlist);
-	for (ap = &alarmlist.head; *ap && *ap != a; ap = &(*ap)->next)
-		;
-	if (*ap) {
-		*ap = a->next;
-		if (ap == &alarmlist.head)
-			threadint(alarmlist.thread);
-	}
-	qunlock(&alarmlist);
-	do {
-		ulong v;
-		rv = nbrecv(a->c, &v);
-	} while (rv != 0);
-}
-
-void
-nbnsalarmend(void)
-{
-	qlock(&alarmlist);
-	if (alarmlist.thread >= 0) {
-		alarmlist.die = 1;
-		threadint(alarmlist.thread);
-	}
-	qunlock(&alarmlist);
-}
-
-void
-nbnsalarmset(NbnsAlarm *a, ulong millisec)
-{
-	NbnsAlarm **ap;
-	nbnsalarmcancel(a);
-	a->expirems = nsec() / 1000000 + millisec;
-	qlock(&alarmlist);
-	for (ap = &alarmlist.head; *ap; ap = &(*ap)->next)
-		if (a->expirems < (*ap)->expirems)
-			break;
-	a->next = (*ap);
-	*ap = a;
-	if (alarmlist.thread < 0)
-		alarmlist.thread = proccreate(alarmist, nil, 16384);
-	else
-		threadint(alarmlist.thread);
-	qunlock(&alarmlist);
-}
-
-void
-nbnsalarmfree(NbnsAlarm **ap)
-{
-	NbnsAlarm *a;
-	a = *ap;
-	if (a) {
-		nbnsalarmcancel(a);
-		chanfree(a->c);
-		free(a);
-		*ap = nil;
-	}
-}
--- a/sys/src/cmd/aquarela/alloc.c
+++ /dev/null
@@ -1,17 +1,0 @@
-#include <u.h>
-#include <libc.h>
-#include <ip.h>
-#include <thread.h>
-#include "netbios.h"
-
-void *
-nbemalloc(ulong nbytes)
-{
-	void *p;
-	p = malloc(nbytes);
-	if (p == nil) {
-		print("nbemalloc: failed\n");
-		threadexitsall("mem");
-	}
-	return p;
-}
--- a/sys/src/cmd/aquarela/aquarela.c
+++ /dev/null
@@ -1,308 +1,0 @@
-#include "headers.h"
-#include <pool.h>
-
-static void
-disconnecttree(void *magic, void *arg)
-{
-	smbtreedisconnect((SmbSession *)magic, (SmbTree *)arg);
-}
-
-static void
-closesearch(void *magic, void *arg)
-{
-	smbsearchclose((SmbSession *)magic, (SmbSearch *)arg);
-}
-
-static void
-smbsessionfree(SmbSession *s)
-{
-	if (s) {
-		smbidmapfree(&s->tidmap, disconnecttree, s);
-		smbidmapfree(&s->sidmap, closesearch, s);
-		smbbufferfree(&s->response);
-		free(s->client.accountname);
-		free(s->client.primarydomain);
-		free(s->client.nativeos);
-		free(s->client.nativelanman);
-		free(s->transaction.in.parameters);
-		free(s->transaction.in.data);
-		free(s->transaction.in.setup);
-		free(s->transaction.in.name);
-		smbbufferfree(&s->transaction.out.parameters);
-		smbbufferfree(&s->transaction.out.data);
-		auth_freechal(s->cs);
-		free(s);
-	}
-}
-
-int
-smbsessionwrite(SmbSession *smbs, void *p, long n)
-{
-	SmbHeader h;
-	SmbOpTableEntry *ote;
-	uchar *pdata;
-	int rv;
-	SmbBuffer *b = nil;
-	ushort bytecount;
-	SmbProcessResult pr;
-
-	if (smbs->response == nil)
-		smbs->response = smbbuffernew(576);
-	else
-		smbresponsereset(smbs);
-	smbs->errclass = SUCCESS;
-	smbs->error = SUCCESS;
-//	print("received %ld bytes\n", n);
-	if (n <= 0)
-		goto closedown;
-	b = smbbufferinit(p, p, n);
-	if (!smbbuffergetheader(b, &h, &pdata, &bytecount)) {
-		smblogprint(-1, "smb: invalid header\n");
-		goto closedown;
-	}
-smbloglock();
-smblogprint(h.command, "received:\n");
-smblogdata(h.command, smblogprint, p, n, 0x1000);
-smblogunlock();
-	ote = smboptable + h.command;
-	if (ote->name == nil) {
-		smblogprint(-1, "smb: illegal opcode 0x%.2ux\n", h.command);
-		goto unimp;
-	}
-	if (ote->process == nil) {
-		smblogprint(-1, "smb: opcode %s unimplemented\n", ote->name);
-		goto unimp;
-	}
-	if (smbs->nextcommand != SMB_COM_NO_ANDX_COMMAND
-		&& smbs->nextcommand != h.command) {
-		smblogprint(-1, "smb: wrong command - expected %.2ux\n", smbs->nextcommand);
-		goto misc;
-	}
-	smbs->nextcommand = SMB_COM_NO_ANDX_COMMAND;
-	switch (h.command) {
-	case SMB_COM_NEGOTIATE:
-	case SMB_COM_SESSION_SETUP_ANDX:
-	case SMB_COM_TREE_CONNECT_ANDX:
-	case SMB_COM_ECHO:
-		break;
-	default:
-		if (smbs->state != SmbSessionEstablished) {
-			smblogprint(-1, "aquarela: command %.2ux unexpected\n", h.command);
-			goto unimp;
-		}
-	}
-	pr = (*ote->process)(smbs, &h, pdata, b);
-	switch (pr) {
-	case SmbProcessResultUnimp:
-	unimp:
-		smbseterror(smbs, ERRDOS, ERRunsup);
-		pr = SmbProcessResultError;
-		break;
-	case SmbProcessResultFormat:
-		smbseterror(smbs, ERRSRV, ERRsmbcmd);
-		pr = SmbProcessResultError;
-		break;
-	case SmbProcessResultMisc:
-	misc:
-		smbseterror(smbs, ERRSRV, ERRerror);
-		pr = SmbProcessResultError;
-		break;
-	}
-	if (pr == SmbProcessResultError) {
-		smblogprint(h.command, "reply: error %d/%d\n", smbs->errclass, smbs->error);
-		if (!smbresponseputerror(smbs, &h, smbs->errclass, smbs->error))
-			pr = SmbProcessResultDie;
-		else
-			pr = SmbProcessResultReply;
-	}
-	else
-		smblogprint(h.command, "reply: ok\n");
-	if (pr == SmbProcessResultReply)
-		rv = smbresponsesend(smbs) == SmbProcessResultOk ? 0 : -1;
-	else if (pr == SmbProcessResultDie)
-		rv = -1;
-	else
-		rv = 0;
-	goto done;
-closedown:
-	rv = -1;
-done:
-	if (rv < 0) {
-		smblogprintif(smbglobals.log.sessions, "shutting down\n");
-		smbsessionfree(smbs);
-	}
-	smbbufferfree(&b);
-	if (smbglobals.log.poolparanoia)
-		poolcheck(mainmem);
-	return rv;
-}
-
-static int
-nbwrite(NbSession *nbss, void *p, long n)
-{
-	return smbsessionwrite((SmbSession *)nbss->magic, p, n);
-}
-
-static int
-cifswrite(SmbCifsSession *cifs, void *p, long n)
-{
-	return smbsessionwrite((SmbSession *)cifs->magic, p, n);
-}
-
-int
-nbssaccept(void *, NbSession *s, NBSSWRITEFN **writep)
-{
-	SmbSession *smbs = smbemallocz(sizeof(SmbSession), 1);
-	smbs->nbss = s;
-	s->magic = smbs;
-	smbs->nextcommand = SMB_COM_NO_ANDX_COMMAND;
-	*writep = nbwrite;
-	smblogprintif(smbglobals.log.sessions, "netbios session started\n");
-	return 1;
-}
-
-int
-cifsaccept(SmbCifsSession *s, SMBCIFSWRITEFN **writep)
-{
-	SmbSession *smbs = smbemallocz(sizeof(SmbSession), 1);
-	smbs->cifss = s;
-	s->magic = smbs;
-	smbs->nextcommand = SMB_COM_NO_ANDX_COMMAND;
-	*writep = cifswrite;
-	smblogprintif(smbglobals.log.sessions, "cifs session started\n");
-	return 1;
-}
-
-void
-usage(void)
-{
-	fprint(2, "usage: %s [-np] [-d debug] [-u N] [-w workgroup]\n", argv0);
-	threadexitsall("usage");
-}
-
-static void
-logset(char *cmd)
-{
-	int x;
-	if (strcmp(cmd, "allcmds") == 0) {
-		for (x = 0; x < 256; x++)
-			smboptable[x].debug = 1;
-		for (x = 0; x < smbtrans2optablesize; x++)
-			smbtrans2optable[x].debug = 1;
-		return;
-	}
-	if (strcmp(cmd, "tids") == 0) {
-		smbglobals.log.tids = 1;
-		return;
-	}
-	if (strcmp(cmd, "sids") == 0) {
-		smbglobals.log.sids = 1;
-		return;
-	}
-	if (strcmp(cmd, "fids") == 0) {
-		smbglobals.log.fids = 1;
-		return;
-	}
-	if (strcmp(cmd, "rap2") == 0) {
-		smbglobals.log.rap2 = 1;
-		return;
-	}
-	else if (strcmp(cmd, "find") == 0) {
-		smbglobals.log.find = 1;
-		return;
-	}
-	if (strcmp(cmd, "query") == 0) {
-		smbglobals.log.query = 1;
-		return;
-	}
-	if (strcmp(cmd, "sharedfiles") == 0) {
-		smbglobals.log.sharedfiles = 1;
-		return;
-	}
-	if (strcmp(cmd, "poolparanoia") == 0) {
-		mainmem->flags |= POOL_PARANOIA;
-		smbglobals.log.poolparanoia = 1;
-		return;
-	}
-	if (strcmp(cmd, "sessions") == 0) {
-		smbglobals.log.sessions = 1;
-		return;
-	}
-	if (strcmp(cmd, "rep") == 0) {
-		smbglobals.log.rep = 1;
-		return;
-	}
-	if (strcmp(cmd, "locks") == 0) {
-		smbglobals.log.locks = 1;
-		return;
-	}
-
-	for (x = 0; x < 256; x++)
-		if (smboptable[x].name && strcmp(smboptable[x].name, cmd) == 0) {
-			smboptable[x].debug = 1;
-			return;
-		}
-	for (x = 0; x < smbtrans2optablesize; x++)
-		if (smbtrans2optable[x].name && strcmp(smbtrans2optable[x].name, cmd) == 0) {
-			smbtrans2optable[x].debug = 1;
-			return;
-		}
-	if (strlen(cmd) == 4 && cmd[0] == '0' && cmd[1] == 'x') {
-		int c;
-		c = strtoul(cmd + 2, 0, 16);
-		if (c >= 0 && c <= 255) {
-			smboptable[c].debug = 1;
-			return;
-		}
-	}
-	print("debugging command %s not recognised\n", cmd);
-}
-
-
-void
-threadmain(int argc, char **argv)
-{
-	NbName from, to;
-	char *e = nil;
-	int netbios = 0;
-	ARGBEGIN {
-	case 'u':
-		smbglobals.unicode = strtol(ARGF(), 0, 0) != 0;
-		break;
-	case 'p':
-		smbglobals.log.print = 1;
-		break;
-	case 'd':
-		logset(ARGF());
-		break;
-	case 'w':
-		smbglobals.primarydomain = ARGF();
-		break;
-	case 'n':
-		netbios = 1;
-		break;
-	default:
-		usage();
-	} ARGEND;
-	smbglobalsguess(0);
-	smblistencifs(cifsaccept);
-	if (netbios) {
-		nbinit();
-		nbmknamefromstring(from, "*");
-		nbmknamefromstring(to, "*smbserver\\x20");
-		nbsslisten(to, from, nbssaccept, nil);
-		nbmknamefromstringandtype(to, smbglobals.serverinfo.name, 0x20);
-		nbsslisten(to, from, nbssaccept, nil);
-	}
-	smblogprint(-1, "Aquarela %d.%d running\n", smbglobals.serverinfo.vmaj, smbglobals.serverinfo.vmin);
-	for (;;) {
-		if (netbios&& !smbbrowsesendhostannouncement(smbglobals.serverinfo.name, 60 * 1000,
-			SV_TYPE_SERVER,
-			smbglobals.serverinfo.remark, &e)) {
-			smblogprint(-1, "hostannounce failed: %s\n", e);
-		}
-		if (sleep(60 * 1000) < 0)
-			break;
-	}
-}
-
--- a/sys/src/cmd/aquarela/cifscmd.c
+++ /dev/null
@@ -1,239 +1,0 @@
-#include "headers.h"
-#include <bio.h>
-
-SmbClient *c;
-Biobuf bin, bout;
-static int verbose = 1;
-
-#define	SEP(c)	(((c)==' ')||((c)=='\t')||((c)=='\n'))
-
-typedef struct Slut {
-	char *name;
-	int val;
-} Slut;
-
-static char *
-tokenise(char *s, char **start, char **end)
-{
-	char *to;
-	Rune r;
-	int n;
-
-	while(*s && SEP(*s))				/* skip leading white space */
-		s++;
-	to = *start = s;
-	while(*s){
-		n = chartorune(&r, s);
-		if(SEP(r)){
-			if(to != *start)		/* we have data */
-				break;
-			s += n;				/* null string - keep looking */
-			while(*s && SEP(*s))	
-				s++;
-			to = *start = s;
-		} 
-		else if(r == '\''){
-			s += n;				/* skip leading quote */
-			while(*s){
-				n = chartorune(&r, s);
-				if(r == '\''){
-					if(s[1] != '\'')
-						break;
-					s++;		/* embedded quote */
-				}
-				while (n--)
-					*to++ = *s++;
-			}
-			if(!*s)				/* no trailing quote */
-				break;
-			s++;				/* skip trailing quote */ 
-		}
-		else  {
-			while(n--)
-				*to++ = *s++;
-		}
-	}
-	*end = to;
-	return s;
-}
-
-static int
-parse(char *s, char *fields[], int nfields)
-{
-	int c, argc;
-	char *start, *end;
-
-	argc = 0;
-	c = *s;
-	while(c){
-		s = tokenise(s, &start, &end);
-		c = *s++;
-		if(*start == 0)
-			break;
-		if(argc >= nfields-1)
-			return -1;
-		*end = 0;
-		fields[argc++] = start;
-	}
-	fields[argc] = 0;
-Bprint(&bout, "parse returns %d\n", argc);
-	return argc;
-}
-
-typedef struct {
-	char *name;
-	long (*f)(SmbClient *, int, char *[]);
-	int connected;
-	char *help;
-} Cmd;
-static Cmd cmd[];
-
-static long
-cmdhelp(SmbClient *, int argc, char *argv[])
-{
-	Cmd *cp;
-	char *p;
-
-	if(argc)
-		p = argv[0];
-	else
-		p = 0;
-	for (cp = cmd; cp->name; cp++) {
-		if (p == 0 || strcmp(p, cp->name) == 0)
-			Bprint(&bout, "%s\n", cp->help);
-	}
-	return 0;
-}
-
-static Slut sharemodeslut[] = {
-	{ "compatibility", SMB_OPEN_MODE_SHARE_COMPATIBILITY },
-	{ "exclusive", SMB_OPEN_MODE_SHARE_EXCLUSIVE },
-	{ "denywrite", SMB_OPEN_MODE_SHARE_DENY_WRITE },
-	{ "denyread", SMB_OPEN_MODE_SHARE_DENY_READOREXEC },
-	{ "denynone", SMB_OPEN_MODE_SHARE_DENY_NONE },
-	{ 0 }
-};
-
-static Slut openmodeslut[] = {
-	{ "oread", OREAD },
-	{ "owrite", OWRITE },
-	{ "ordwr", ORDWR },
-	{ "oexec", OEXEC },
-	{ 0 }
-};
-
-static int
-slut(Slut *s, char *pat)
-{
-	while (s->name) {
-		if (cistrcmp(s->name, pat) == 0)
-			return s->val;
-		s++;
-	}
-	Bprint(&bout, "%s unrecognised\n", pat);
-	return -1;	
-}
-
-static long
-cmdopen(SmbClient *c, int argc, char *argv[])
-{
-	char *errmsg;
-	int sm, om;
-	int rv;
-	uchar errclass;
-	ushort error;
-	ushort fid, attr;
-	ulong mtime, size;
-	ushort accessallowed;
-
-	if (argc != 3) {
-		Bprint(&bout, "wrong number of arguments\n");
-		return -1;
-	}
-	sm = slut(sharemodeslut, argv[1]);
-	if (sm < 0) 
-		return -1;
-	om = slut(openmodeslut, argv[2]);
-	if (om < 0)
-		return -1;
-	errmsg = nil;
-	rv = smbclientopen(c, (sm << 3) | om, argv[0], &errclass, &error, &fid, &attr, &mtime, &size, &accessallowed, &errmsg);
-	if (rv == 0) {
-		if (errmsg) {
-			print("local error %s\n", errmsg);
-			free(errmsg);
-			return -1;
-		}
-		return (errclass << 16) | error;
-	}
-	print("fid 0x%.4ux attr 0x%.4ux time %ld size %lud accessallowed %ud\n",
-		fid, attr, mtime, size, accessallowed);
-	return 0;
-}
-
-static Cmd cmd[] = {
-	{ "help",	cmdhelp,	0, "help" },
-	{ "open", cmdopen, 1, "open name sharemode openmode" },
-	{ 0, 0 },
-};
-
-void
-threadmain(int argc, char *argv[])
-{
-	char *errmsg;
-	int ac;
-	char *ap, *av[256];
-	Cmd *cp;
-	long status;
-
-	if (argc > 3) {
-		print("usage: cifscmd [to [share]]\n");
-		exits("args");
-	}
-	smbglobalsguess(1);
-	errmsg = nil;
-
-	if (Binit(&bin, 0, OREAD) == Beof || Binit(&bout, 1, OWRITE) == Beof) {
-		fprint(2, "%s: can't init bio: %r\n", argv0);
-		threadexits("Binit");
-	}
-
-	if (argc > 1) {
-		c = smbconnect(argv[1], argc == 3 ? argv[2] : nil, &errmsg);
-		if (c == nil)
-			fprint(2, "failed to connect: %s\n", errmsg);
-	}
-	while (ap = Brdline(&bin, '\n')) {
-		ap[Blinelen(&bin) - 1] = 0;
-		switch (ac = parse(ap, av, nelem(av))) {
-		default:
-			for (cp = cmd; cp->name; cp++) {
-				if (strcmp(cp->name, av[0]) == 0)
-					break;
-			}
-			if (cp->name == 0) {
-				Bprint(&bout, "eh?\n");
-				break;
-			}
-			if (c == 0 && cp->connected) {
-				Bprint(&bout, "not currently connected\n");
-				break;
-			}
-			if ((status = (*cp->f)(c, ac - 1, &av[1])) != -1) {
-				if(verbose)
-					Bprint(&bout, "ok %ld/%ld\n", status >> 16, status & 0xffff);
-				break;
-			}
-			break;
-
-		case -1:
-			Bprint(&bout, "eh?\n");
-			break;
-
-		case 0:
-			break;
-		}
-		Bflush(&bout);
-	}
-	threadexits(0);
-}
--- a/sys/src/cmd/aquarela/client.c
+++ /dev/null
@@ -1,145 +1,0 @@
-#include <u.h>
-#include <libc.h>
-#include <ip.h>
-#include <thread.h>
-#include "netbios.h"
-
-static char *hmsg = "headers";
-int chatty = 1;
-
-void
-warning(char *fmt, ...)
-{
-	char err[128];
-	va_list arg;
-
-	va_start(arg, fmt);
-	vseprint(err, err+sizeof(err), fmt, arg);
-	va_end(arg);
-	syslog(1, "netbios-ns", err);
-	if (chatty)
-		print("%s\n", err);
-}
-
-static int
-udpannounce(void)
-{
-	int data, ctl;
-	char dir[64];
-	char datafile[64+6];
-
-	/* get a udp port */
-	ctl = announce("udp!*!netbios-ns", dir);
-	if(ctl < 0){
-		warning("can't announce on netbios-ns udp port");
-		return -1;
-	}
-	snprint(datafile, sizeof(datafile), "%s/data", dir);
-
-	/* turn on header style interface */
-	if(write(ctl, hmsg, strlen(hmsg)) , 0)
-		abort(); /* hmsg */;
-	data = open(datafile, ORDWR);
-	if(data < 0){
-		close(ctl);
-		warning("can't announce on dns udp port");
-		return -1;
-	}
-
-	close(ctl);
-	return data;
-}
-
-#define BROADCAST 1
-
-
-void
-listen137(void *)
-{	
-	for (;;) {
-		uchar msg[Udphdrsize + 576];
-		int len = read(fd137, msg, sizeof(msg));
-		if (len < 0)
-			break;
-		if (len >= Udphdrsize) {
-			NbnsMessage *s;
-			Udphdr *uh;
-			uchar *p;
-
-			uh = (Udphdr*)msg;
-			p = msg + Udphdrsize;
-			len -= Udphdrsize;
-			s = nbnsconvM2S(p, len);
-			if (s) {
-				print("%I:%d -> %I:%d\n", uh->raddr, nhgets(uh->rport), uh->laddr, nhgets(uh->lport));
-				nbnsdumpmessage(s);
-				if (s->response) {
-					NbnsTransaction *t;
-					qlock(&transactionlist);
-					for (t = transactionlist.head; t; t = t->next)
-						if (t->id == s->id)
-							break;
-					if (t) {
-						sendp(t->c, s);
-					}
-					else
-						nbnsmessagefree(&s);
-					qunlock(&transactionlist);
-				}
-				else
-					nbnsmessagefree(&s);
-			}
-		}
-	}
-}
-
-void
-usage(void)
-{
-	fprint(2, "usage: %s [-u ipaddr] name\n", argv0);
-	exits("usage");
-}
-
-void
-threadmain(int argc, char **argv)
-{
-	int broadcast = 1, i, listen137thread, rv;
-	char *ip;
-	uchar ipaddr[IPaddrlen], serveripaddr[IPaddrlen];
-	NbName nbname;
-
-	ARGBEGIN {
-	case 'u':
-		broadcast = 0;
-		ip = EARGF(usage());
-		if (parseip(serveripaddr, ip) == -1)
-			sysfatal("bad ip address %s", ip);
-		break;
-	default:
-		usage();
-	} ARGEND;
-
-	if (argc == 0)
-		usage();
-
-	nbmknamefromstring(nbname, argv[0]);
-
-	ipifc = readipifc("/net", nil, 0);
-	if (ipifc == nil || ipifc->lifc == nil)
-		sysfatal("no network interface");
-	fmtinstall('I', eipfmt);
-	ipmove(bcastaddr, ipifc->lifc->ip);
-	for (i = 0; i < IPaddrlen; i++)
-		bcastaddr[i] |= ~ipifc->lifc->mask[i];
-	print("broadcasting to %I\n", bcastaddr);
-//	setnetmtpt("/net");
-	fd137 = udpannounce();
-	listen137thread = proccreate(listen137, nil, 16384);
-	rv = nbnsaddname(broadcast ? nil : serveripaddr, nbname, 3000, ipifc->lifc->ip);
-	if (rv != 0)
-		print("error code %d\n", rv);
-	else
-		print("%I\n", ipaddr);
-	nbnsalarmend();
-	threadint(listen137thread);
-}
--- a/sys/src/cmd/aquarela/dump.c
+++ /dev/null
@@ -1,137 +1,0 @@
-#include <u.h>
-#include <libc.h>
-#include <ip.h>
-#include <thread.h>
-#include "netbios.h"
-
-static char *
-opname(int opcode)
-{
-	switch (opcode) {
-	case NbnsOpQuery: return "query";
-	case NbnsOpRegistration: return "registration";
-	case NbnsOpRelease: return "release";
-	case NbnsOpWack: return "wack";
-	case NbnsOpRefresh: return "refresh";
-	default:
-		return "???";
-	}
-}
-
-void
-nbnsdumpname(NbName name)
-{
-	int x;
-	for (x = 0; x < NbNameLen - 1; x++) {
-		if (name[x] == ' ')
-			break;
-		print("%c", tolower(name[x]));
-	}
-	print("\\x%.2ux", name[NbNameLen - 1]);
-}
-
-void
-nbnsdumpmessagequestion(NbnsMessageQuestion *q)
-{
-	print("question: ");
-	nbnsdumpname(q->name);
-	switch (q->type) {
-	case NbnsQuestionTypeNb: print(" NB");	break;
-	case NbnsQuestionTypeNbStat: print(" NBSTAT"); break;
-	default: print(" ???");
-	}
-	switch (q->class) {
-	case NbnsQuestionClassIn: print(" IN"); break;
-	default: print(" ???");
-	}
-	print("\n");
-}
-
-void
-nbnsdumpmessageresource(NbnsMessageResource *r, char *name)
-{
-	print("%s: ", name);
-	nbnsdumpname(r->name);
-	switch (r->type) {
-	case NbnsResourceTypeA: print(" A");	break;
-	case NbnsResourceTypeNs: print(" NS");	break;
-	case NbnsResourceTypeNull: print(" NULL");	break;
-	case NbnsResourceTypeNb: print(" NB");	break;
-	case NbnsResourceTypeNbStat: print(" NBSTAT"); break;
-	default: print(" ???");
-	}
-	switch (r->class) {
-	case NbnsResourceClassIn: print(" IN"); break;
-	default: print(" ???");
-	}
-	print(" ttl: %lud", r->ttl);
-	if (r->rdlength) {
-		int i;
-		print(" rdata: ");
-		for (i = 0; i < r->rdlength; i++)
-			print("%.2ux", r->rdata[i]);
-	}
-	print("\n");
-}
-
-void
-nbnsdumpmessage(NbnsMessage *s)
-{
-	NbnsMessageQuestion *q;
-	NbnsMessageResource *r;
-	print("0x%.4ux %s %s (%d)",
-		s->id, opname(s->opcode), s->response ? "response" : "request", s->opcode);
-	if (s->broadcast)
-		print(" B");
-	if (s->recursionavailable)
-		print(" RA");
-	if (s->recursiondesired)
-		print(" RD");
-	if (s->truncation)
-		print(" TC");
-	if (s->authoritativeanswer)
-		print(" AA");
-	if (s->response)
-		print(" rcode %d", s->rcode);
-	print("\n");
-	for (q = s->q; q; q = q->next)
-		nbnsdumpmessagequestion(q);
-	for (r = s->an; r; r = r->next)
-		nbnsdumpmessageresource(r, "answer");
-	for (r = s->ns; r; r = r->next)
-		nbnsdumpmessageresource(r, "ns");
-	for (r = s->ar; r; r = r->next)
-		nbnsdumpmessageresource(r, "additional");
-}
-
-void
-nbdumpdata(void *ap, long n)
-{
-	uchar *p = ap;
-	long i;
-	i = 0;
-	while (i < n) {
-		int l = n - i < 16 ? n - i : 16;
-		int b;
-		print("0x%.4lux  ", i);
-		for (b = 0; b < l; b += 2) {
-			print(" %.2ux", p[i + b]);
-			if (b < l - 1)
-				print("%.2ux", p[i + b + 1]);
-			else
-				print("  ");
-		}
-		while (b < 16) {
-			print("     ");
-			b++;
-		}
-		print("        ");
-		for (b = 0; b < l; b++)
-			if (p[i + b] >= ' ' && p[i + b] <= '~')
-				print("%c", p[i + b]);
-			else
-				print(".");
-		print("\n");
-		i += l;
-	}
-}
--- a/sys/src/cmd/aquarela/findname.c
+++ /dev/null
@@ -1,73 +1,0 @@
-#include <u.h>
-#include <libc.h>
-#include <ip.h>
-#include <thread.h>
-#include "netbios.h"
-
-int
-nbnsfindname(uchar *serveripaddr, NbName name, uchar *ipaddr, ulong *ttlp)
-{
-	NbnsMessage *nq;
-	Alt aa[3];
-	int tries = NbnsRetryBroadcast;
-	NbnsAlarm *a;
-	int rv;
-	NbnsMessage *response;
-
-	nq = nbnsmessagenamequeryrequestnew(0, serveripaddr == nil, name);
-	if (nq == nil)
-		return -1;
-	a = nbnsalarmnew();
-	if (a == nil) {
-		free(nq);
-		return -1;
-	}
-	aa[0].c = a->c;
-	aa[0].v = nil;
-	aa[0].op = CHANRCV;
-	aa[1].op = CHANRCV;
-	aa[2].op = CHANEND;
-	while (tries > 0) {
-		NbnsTransaction *t;
-		nq->id = nbnsnextid();
-		t = nbnstransactionnew(nq, serveripaddr);
-		aa[1].c = t->c;
-		aa[1].v = &response;
-		nbnsalarmset(a, NbnsTimeoutBroadcast);
-		for (;;) {
-			int i;
-			i = alt(aa);
-			if (i == 0) {
-				tries--;
-				break;
-			}
-			else if (i == 1) {
-				if (response->opcode == NbnsOpQuery) {
-					nbnstransactionfree(&t);
-					goto done;
-				}
-				nbnsmessagefree(&response);
-			}
-		}
-		nbnstransactionfree(&t);
-	}
-done:
-	if (tries == 0)
-		rv = -1;
-	else {
-		if (response->rcode != 0)
-			rv = response->rcode;
-		else if (response->an == nil)
-			rv = -1;
-		else {
-			rv = 0;
-			v4tov6(ipaddr, response->an->rdata + 2);
-			if (ttlp)
-				*ttlp = response->an->ttl;
-		}
-		nbnsmessagefree(&response);
-	}
-	nbnsalarmfree(&a);
-	nbnsmessagefree(&nq);
-	return rv;
-}
--- a/sys/src/cmd/aquarela/headers.h
+++ /dev/null
@@ -1,10 +1,0 @@
-#include <u.h>
-#include <libc.h>
-#include <ip.h>
-#include <thread.h>
-#include <auth.h>
-#include <regexp.h>
-#include "netbios.h"
-#include "smb.h"
-#include "smbdat.h"
-#include "smbfns.h"
--- a/sys/src/cmd/aquarela/message.c
+++ /dev/null
@@ -1,55 +1,0 @@
-#include <u.h>
-#include <libc.h>
-#include <ip.h>
-#include <thread.h>
-#include "netbios.h"
-
-NbnsMessage *
-nbnsmessagenamequeryrequestnew(ushort id, int broadcast, NbName name)
-{
-	NbnsMessage *s;
-	NbnsMessageQuestion *q;
-	s = nbnsmessagenew();
-	if (s == nil)
-		return nil;
-	s->id = id;
-	s->opcode = NbnsOpQuery;
-	s->broadcast = broadcast;
-	s->recursiondesired = 1;
-	q =  nbnsmessagequestionnew(name, NbnsQuestionTypeNb, NbnsQuestionClassIn);
-	if (q == nil) {
-		nbnsmessagefree(&s);
-		return nil;
-	}
-	nbnsmessageaddquestion(s, q);
-	return s;
-}
-
-NbnsMessage *
-nbnsmessagenameregistrationrequestnew(ushort id, int broadcast, NbName name, ulong ttl, uchar *ipaddr)
-{
-	NbnsMessage *s;
-	NbnsMessageQuestion *q;
-	uchar rdata[6];
-	NbnsMessageResource *r;
-
-	s = nbnsmessagenew();
-	if (s == nil)
-		return nil;
-	s->id = id;
-	s->opcode = NbnsOpRegistration;
-	s->broadcast = broadcast;
-	s->recursiondesired = 1;
-	q =  nbnsmessagequestionnew(name, NbnsQuestionTypeNb, NbnsQuestionClassIn);
-	if (q == nil) {
-		nbnsmessagefree(&s);
-		return nil;
-	}
-	nbnsmessageaddquestion(s, q);
-	rdata[0] = 0;
-	rdata[1] = 0;
-	v6tov4(rdata + 2, ipaddr);
-	r = nbnsmessageresourcenew(name, NbnsResourceTypeNb, NbnsResourceClassIn, ttl, 6, rdata);
-	nbnsmessageaddresource(&s->ar, r);
-	return s;
-}
--- a/sys/src/cmd/aquarela/mkfile
+++ /dev/null
@@ -1,114 +1,0 @@
-</$objtype/mkfile
-
-CFLAGS=$CFLAGS
-
-UPDATEFLAGS=
-
-FILES=\
-	nbnsconv\
-	dump\
-	message\
-	findname\
-	addname\
-	alarm\
-	nbss\
-	nbns\
-	nbname\
-	alloc\
-	nbresolve\
-	smbconv\
-	smbnegotiate\
-	smballoc\
-	smbcommon\
-	smbcomsessionsetupandx\
-	smbstring\
-	smbresponse\
-	smbcomtreeconnectandx\
-	smbtree\
-	smbservice\
-	smbcomtransaction\
-	smbrap2\
-	smbcomdir\
-	smbglobals\
-	smboptable\
-	smbconnect\
-	smbbuffer\
-	nbdgram\
-	nbdgramconv\
-	nbdgramdump\
-	nb\
-	nblistener\
-	smbtransaction\
-	smbbrowse\
-	smbtrans2find\
-	smbidmap\
-	smbcomecho\
-	smbcomopen\
-	smbtime\
-	smbpath\
-	smbfile\
-	smbtrans2query\
-	smbcomclose\
-	smbcomread\
-	smblog\
-	smbcomquery\
-	smbcomfindclose2\
-	smbcomtreedisconnect\
-	smbsharedfile\
-	smblisten\
-	smbrap2client\
-	smbtrans2client\
-	smbcomdelete\
-	smbdircache\
-	smbrep\
-	smbcomflush\
-	smbcomwrite\
-	smbclientopen\
-	smbcomsetinfo\
-	smbcomcreatedir\
-	smbcomdeletedir\
-	smbcomrename\
-	smbcomlocking\
-	smbtrans2set\
-
-LIBCFILES=${FILES:%=%.c}
-LIBOFILES=${FILES:%=%.$O}
-
-SLIB=libsmb.a.$O
-
-LIB=$SLIB\
-
-HFILES=\
-	headers.h\
-	netbios.h\
-	smb.h\
-	smbfns.h\
-	smbdat.h
-
-TARG=\
-	aquarela\
-	cifscmd\
-#	testconnect\
-#	testnbdgram\
-#	testtime\
-
-
-CFILES=${TARG:%=%.c} $LIBCFILES
-
-BIN=/$objtype/bin
-
-it:V: all
-
-</sys/src/cmd/mkmany
-
-INC=
-CFLAGS=$INC $CFLAGS $XCFLAGS
-
-$SLIB(%.$O):N: %.$O
-$SLIB:	${LIBOFILES:%=$SLIB(%)}
-	names = `{echo $newprereq |sed 's/ /\n/g' |sed -n 's/'$SLIB'\(([^)]+)\)/\1/gp'}
-	ar vu $SLIB $names
-#	rm $names
-
-clean:V:
-	rm -f *.[$OS] y.tab.? y.debug y.output [$OS].* $TARG *.log
--- a/sys/src/cmd/aquarela/nb.c
+++ /dev/null
@@ -1,25 +1,0 @@
-#include "headers.h"
-
-NbGlobals nbglobals;
-
-NbName nbnameany = { '*' };
-
-int
-nbinit(void)
-{
-	Ipifc *ipifc;
-	int i;
-	fmtinstall('I', eipfmt);
-	fmtinstall('B', nbnamefmt);
-	ipifc = readipifc("/net", nil, 0);
-	if (ipifc == nil || ipifc->lifc == nil) {
-		print("no network interface");
-		return -1;
-	}
-	ipmove(nbglobals.myipaddr, ipifc->lifc->ip);
-	ipmove(nbglobals.bcastaddr, ipifc->lifc->ip);
-	nbmknamefromstring(nbglobals.myname, sysname());
-	for (i = 0; i < IPaddrlen; i++)
-		nbglobals.bcastaddr[i] |= ~ipifc->lifc->mask[i];
-	return 0;
-}
--- a/sys/src/cmd/aquarela/nbdgram.c
+++ /dev/null
@@ -1,216 +1,0 @@
-#include <u.h>
-#include <libc.h>
-#include <ip.h>
-#include <thread.h>
-#include "netbios.h"
-
-static struct {
-	int thread;
-	QLock;
-	int fd;
-} udp = { -1 };
-
-typedef struct Listen Listen;
-
-struct Listen {
-	NbName to;
-	int (*deliver)(void *magic, NbDgram *s);
-	void *magic;
-	Listen *next;
-};
-
-static struct {
-	QLock;
-	Listen *head;
-} listens;
-
-static void
-udplistener(void *)
-{
-//print("udplistener - starting\n");
-	for (;;) {
-		uchar msg[Udphdrsize + 576];
-		int len = read(udp.fd, msg, sizeof(msg));
-		if (len < 0)
-			break;
-		if (len >= nbudphdrsize) {
-			NbDgram s;
-//			Udphdr *uh;
-			uchar *p;
-			int n;
-
-//			uh = (Udphdr*)msg;
-			p = msg + nbudphdrsize;
-			len -= nbudphdrsize;
-			n = nbdgramconvM2S(&s, p, p + len);
-			if (n) {
-				switch (s.type) {
-				case NbDgramError:
-					print("nbdgramlisten: error: ip %I port %d code 0x%.2ux\n", s.srcip, s.srcport, s.error.code);
-					break;
-				case NbDgramDirectUnique:
-				case NbDgramDirectGroup:
-				case NbDgramBroadcast: {
-					int delivered = 0;
-					Listen **lp, *l;
-					if ((s.flags & NbDgramMore) || s.datagram.offset != 0)
-						break;
-					if (!nbnameisany(s.datagram.dstname)
-						&& !nbnametablefind(s.datagram.dstname, 0)) {
-/* - only do this if a broadcast node, and can tell when packets are broadcast...
-						s.flags &= 3;
-						ipmove(s.srcip, nbglobals.myipaddr);
-						s.srcport = NbDgramPort;
-						s.type = NbDgramError;	
-						s.error.code = NbDgramErrorDestinationNameNotPresent;
-						nbdgramsendto(uh->raddr, nhgets(uh->rport), &s);
-*/
-						break;
-					}
-					qlock(&listens);
-					for (lp = &listens.head; (l = *lp) != nil;) {
-						if (nbnameisany(l->to) || nbnameequal(l->to, s.datagram.dstname)) {
-							switch ((*l->deliver)(l->magic, &s)) {
-							case 0:
-								delivered = 1;
-								/* fall through */
-							case -1:
-								*lp = l->next;
-								free(l);
-								continue;
-							default:
-								delivered = 1;
-								break;
-							}
-						}
-						lp = &l->next;
-					}
-					qunlock(&listens);
-					USED(delivered);
-				}
-				default:
-					;
-				}
-			}
-		}
-	}
-print("udplistener - exiting\n");
-	qlock(&udp);
-	udp.thread = -1;
-	qunlock(&udp);
-}
-
-static char *
-startlistener(void)
-{
-	qlock(&udp);
-	if (udp.thread < 0) {
-		char *e;
-		e = nbudpannounce(NbDgramPort, &udp.fd);
-		if (e) {
-			qunlock(&udp);
-			return e;
-		}
-		udp.thread = proccreate(udplistener, nil, 16384);
-	}
-	qunlock(&udp);
-	return nil;
-}
-
-char *
-nbdgramlisten(NbName to, int (*deliver)(void *magic, NbDgram *s), void *magic)
-{
-	Listen *l;
-	char *e;
-	nbnametablefind(to, 1);
-	e = startlistener();
-	if (e)
-		return e;
-	l = nbemalloc(sizeof(Listen));
-	nbnamecpy(l->to, to);
-	l->deliver = deliver;
-	l->magic = magic;
-	qlock(&listens);
-	l->next = listens.head;
-	listens.head = l;
-	qunlock(&listens);
-	return 0;
-}
-
-int
-nbdgramsendto(uchar *ipaddr, ushort port, NbDgram *s)
-{
-	Udphdr *u;
-	uchar msg[NbDgramMaxPacket + Udphdrsize];
-	int l;
-	int rv;
-	char *e;
-
-	e = startlistener();
-	if (e != nil)
-		return 0;
-
-	l = nbdgramconvS2M(msg + nbudphdrsize, msg + sizeof(msg), s);
-	if (l == 0) {
-		print("conv failed\n");
-		return 0;
-	}
-	u = (Udphdr *)msg;
-	ipmove(u->laddr, nbglobals.myipaddr);
-	hnputs(u->lport, NbDgramPort);
-	ipmove(u->raddr, ipaddr);
-	hnputs(u->rport, port);
-//nbdumpdata(msg, l + nbudphdrsize);
-//print("transmitting\n");
-	rv = write(udp.fd, msg, l + nbudphdrsize);
-//print("rv %d l %d hdrsize %d error %r\n", rv, l, nbudphdrsize);
-	return rv == l + nbudphdrsize;
-}
-
-static struct {
-	Lock;
-	ushort id;
-} id;
-
-static ushort
-nextdgramid(void)
-{
-	ushort v;
-	lock(&id);
-	v = id.id++;
-	unlock(&id);
-	return v;
-}
-
-int
-nbdgramsend(NbDgramSendParameters *p, uchar *data, long datalen)
-{
-	NbDgram s;
-	uchar dstip[IPaddrlen];
-	s.type = p->type;
-	switch (p->type) {
-	case NbDgramBroadcast:
-	case NbDgramDirectGroup:
-		ipmove(dstip, nbglobals.bcastaddr);
-		break;
-	case NbDgramDirectUnique:
-		if (!nbnameresolve(p->to, dstip)) {
-			werrstr("nbdgramsend: name resolution failed");
-			return 0;
-		}
-		break;
-	default:
-		werrstr("nbdgramsend: illegal datagram type");
-		return 0;
-	}
-	s.flags = NbDgramFirst;
-	s.id = nextdgramid();
-	ipmove(s.srcip, nbglobals.myipaddr);
-	s.srcport = NbDgramPort;
-	s.datagram.offset = 0;
-	s.datagram.data = data;
-	s.datagram.length = datalen;
-	nbnamecpy(s.datagram.dstname, p->to);
-	nbnamecpy(s.datagram.srcname, nbglobals.myname);
-	return nbdgramsendto(dstip, NbDgramPort, &s);
-}
--- a/sys/src/cmd/aquarela/nbdgramconv.c
+++ /dev/null
@@ -1,116 +1,0 @@
-#include <u.h>
-#include <libc.h>
-#include <ip.h>
-#include <thread.h>
-#include "netbios.h"
-
-int
-nbdgramconvM2S(NbDgram *s, uchar *ap, uchar *ep)
-{
-	uchar *p = ap;
-	int n;
-	ushort length;
-
-	if (ap + 6 + IPv4addrlen > ep)
-		return 0;
-	s->type = *p++;
-	s->flags = *p++;
-	s->id = nhgets(p); p+= 2;
-	v4tov6(s->srcip, p); p+= IPv4addrlen;
-	s->srcport = nhgets(p); p += 2;
-	switch (s->type) {
-	case NbDgramDirectUnique:
-	case NbDgramDirectGroup:
-	case NbDgramBroadcast:
-		if (p + 4 > ep)
-			return 0;
-		length = nhgets(p); p += 2;
-		s->datagram.offset = nhgets(p); p += 2;
-		if (p + length > ep)
-			return 0;
-		ep = p + length;
-		n = nbnamedecode(p, p, ep, s->datagram.srcname);
-		if (n == 0)
-			return 0;
-		p += n;
-		n = nbnamedecode(p, p, ep, s->datagram.dstname);
-		if (n == 0)
-			return 0;
-		p += n;
-		s->datagram.data = p;
-		s->datagram.length = ep - p;
-		p = ep;
-		break;
-	case NbDgramError:
-		if (p + 1 > ep)
-			return 0;
-		s->error.code = *p++;
-		break;
-	case NbDgramQueryRequest:
-	case NbDgramPositiveQueryResponse:
-	case NbDgramNegativeQueryResponse:
-		n = nbnamedecode(p, p, ep, s->query.dstname);
-		if (n == 0)
-			return 0;
-		p += n;
-		break;
-	default:
-		return 0;
-	}
-	return p - ap;
-}
-
-int
-nbdgramconvS2M(uchar *ap, uchar *ep, NbDgram *s)
-{
-	uchar *p = ap;
-	uchar *fixup;
-	int n;
-
-	if (p + 6 + IPv4addrlen > ep)
-		return 0;
-	*p++ = s->type;
-	*p++ = s->flags;
-	hnputs(p, s->id); p+= 2;
-	v6tov4(p, s->srcip); p += IPv4addrlen;
-	hnputs(p, s->srcport); p+= 2;
-	switch (s->type) {
-	case NbDgramDirectUnique:
-	case NbDgramDirectGroup:
-	case NbDgramBroadcast:
-		if (p + 4 > ep)
-			return 0;
-		fixup = p;
-		hnputs(p, s->datagram.length); p += 2;
-		hnputs(p, s->datagram.offset); p += 2;
-		n = nbnameencode(p, ep, s->datagram.srcname);
-		if (n == 0)
-			return 0;
-		p += n;
-		n = nbnameencode(p, ep, s->datagram.dstname);
-		if (n == 0)
-			return 0;
-		p += n;
-		if (p + s->datagram.length > ep)
-			return 0;
-		memcpy(p, s->datagram.data, s->datagram.length); p += s->datagram.length;
-		hnputs(fixup, p - fixup - 4);
-		break;
-	case NbDgramError:
-		if (p + 1 > ep)
-			return 0;
-		*p++ = s->error.code;
-		break;
-	case NbDgramQueryRequest:
-	case NbDgramPositiveQueryResponse:
-	case NbDgramNegativeQueryResponse:
-		n = nbnameencode(p, ep, s->datagram.dstname);
-		if (n == 0)
-			return 0;
-		p += n;
-		break;
-	default:
-		return 0;
-	}
-	return p - ap;
-}
--- a/sys/src/cmd/aquarela/nbdgramdump.c
+++ /dev/null
@@ -1,19 +1,0 @@
-#include "headers.h"
-
-void
-nbdgramdump(NbDgram *s)
-{
-	print("type 0x%.2ux flags 0x%.2ux id 0x%.4ux srcip %I port %d\n",
-		s->type, s->flags, s->id, s->srcip, s->srcport);
-	switch (s->type) {
-	case NbDgramError:
-		print("\terror.code 0x%.2ux\n", s->error.code);
-		break;
-	case NbDgramDirectUnique:
-	case NbDgramDirectGroup:
-	case NbDgramBroadcast:
-		print("\tlength %ud offset %ud srcname %B dstname %B\n",
-			s->datagram.length, s->datagram.offset, s->datagram.srcname, s->datagram.dstname);
-		break;
-	}
-}
--- a/sys/src/cmd/aquarela/nblistener.c
+++ /dev/null
@@ -1,32 +1,0 @@
-#include "headers.h"
-
-static char *hmsg = "headers";
-
-int nbudphdrsize;
-
-char *
-nbudpannounce(ushort port, int *fdp)
-{
-	int data, ctl;
-	char dir[64], datafile[64+6], addr[NETPATHLEN];
-
-	snprint(addr, sizeof(addr), "udp!*!%d", port);
-	/* get a udp port */
-	ctl = announce(addr, dir);
-	if(ctl < 0)
-		return "can't announce on port";
-	snprint(datafile, sizeof(datafile), "%s/data", dir);
-
-	/* turn on header style interface */
-	nbudphdrsize = Udphdrsize;
-	if (write(ctl, hmsg, strlen(hmsg)) != strlen(hmsg))
-		return "failed to turn on headers";
-	data = open(datafile, ORDWR);
-	if (data < 0) {
-		close(ctl);
-		return "failed to open data file";
-	}
-	close(ctl);
-	*fdp = data;
-	return nil;
-}
--- a/sys/src/cmd/aquarela/nbname.c
+++ /dev/null
@@ -1,299 +1,0 @@
-#include <u.h>
-#include <libc.h>
-#include <ip.h>
-#include <thread.h>
-#include "netbios.h"
-
-static int
-decodehex(char c)
-{
-	if (c >= '0' && c <= '9')
-		return c - '0';
-	else if (c >= 'A' && c <= 'F')
-		return c - 'A' + 10;
-	else if (c >= 'a' && c <= 'f')
-		return c - 'a' + 10;
-	return 0;
-}
-
-static char
-encodehex(int n)
-{
-	if (n >= 0 && n <= 9)
-		return '0' + n;
-	if (n >= 10 && n <= 15)
-		return 'a' + (n - 10);
-	return '?';
-}
-
-static int
-_nameextract(uchar *base, uchar *p, uchar *ep, int k, uchar *outbuf, int outbufmaxlen, int *outbuflenp)
-{
-	uchar *op, *oep, *savep;
-	savep = p;
-	op = outbuf;
-	oep = outbuf + outbufmaxlen;
-	for (;;) {
-		uchar b;
-		int n;
-		if (p >= ep)
-			return 0;
-		b = *p++;
-		if (b == 0)
-			break;
-		if (k) {
-			if (op >= oep)
-				return 0;
-			*op++ = '.';
-		}
-		if ((b & 0xc0) == 0xc0) {
-			ushort off;
-			if (ep - p < 2)
-				return 0;
-			off = nhgets(p - 1) & 0x3fff; p++;
-			if (_nameextract(base, base + off, p, k, op, oep - ep, &n) == 0)
-				return 0;
-			op += n;
-		}
-		else if ((b & 0xc0) != 0x00)
-			return 0;
-		else if (b != 0x20)
-			return 0;
-		else {
-			int x;
-			if (p + b > ep)
-				return 0;
-			if (op + b / 2 > oep)
-				return 0;
-			for (x = 0; x < b; x += 2) {
-				uchar hn, ln;
-				if (*p < 'A' || *p >= 'A' + 16)
-					return 0;
-				hn = *p++ - 'A';
-				if (*p < 'A' || *p >= 'A' + 16)
-					return 0;
-				ln = *p++ - 'A';
-				*op++ = (hn << 4) | ln;
-			}
-		}
-		k++;
-	}
-	*outbuflenp = op - outbuf;
-	return p - savep;
-}
-
-int
-nbnamedecode(uchar *base, uchar *p, uchar *ep, NbName nbname)
-{
-	int n;
-	int rv = _nameextract(base, p, ep, 0, nbname, NbNameLen, &n);
-	if (rv == 0)
-		return rv;
-	if (n != NbNameLen)
-		return 0;
-	return rv;
-}
-
-int
-nbnameencode(uchar *ap, uchar *ep, NbName name)
-{
-	uchar *p = ap;
-	int i;
-	if (p + 1 + 2 * NbNameLen + 1 > ep)
-		return 0;
-	*p++ = NbNameLen * 2;
-	for (i = 0; i < NbNameLen; i++) {
-		*p++ = 'A' + ((name[i] >> 4) & 0xf);
-		*p++ = 'A' + (name[i] & 0xf);
-	}
-	*p++ = 0;
-	return p - ap;
-}
-
-void
-nbnamecpy(NbName n1, NbName n2)
-{
-	memcpy(n1, n2, NbNameLen);
-}
-
-void
-nbmknamefromstring(NbName nbname, char *s)
-{
-	int i;
-	memset(nbname, ' ', NbNameLen - 1);
-	nbname[NbNameLen - 1] = 0;
-	i = 0;
-	while (*s) {
-		if (*s == '\\' && *(s + 1) == 'x') {
-			s += 2;
-			if (*s == 0 || *(s + 1) == 0)
-				return;
-			nbname[NbNameLen - 1] = (decodehex(s[0]) << 4) | decodehex(s[1]);
-			return;
-		} else {
-			if (i < NbNameLen - 1)
-				nbname[i++] = toupper(*s);
-			s++;
-		}
-	}
-}
-
-void
-nbmknamefromstringandtype(NbName nbname, char *s, uchar type)
-{
-	nbmknamefromstring(nbname, s);
-	nbname[NbNameLen - 1] = type;
-}
-
-void
-nbmkstringfromname(char *buf, int buflen, NbName name)
-{
-	int x;
-	for (x = 0; x < NbNameLen - 1; x++) {
-		if (name[x] == ' ')
-			break;
-		if (buflen > 1) {
-			*buf++ = tolower(name[x]);
-			buflen--;
-		}
-	}
-	if (name[NbNameLen - 1] != 0) {
-		if (buflen > 1) {
-			*buf++ = '\\';
-			buflen--;
-		}
-		if (buflen > 1) {
-			*buf++ = 'x';
-			buflen--;
-		}
-		if (buflen > 1) {
-			*buf++ = encodehex(name[NbNameLen - 1] >> 4);
-			buflen--;
-		}
-		if (buflen > 1)
-			*buf++ = encodehex(name[NbNameLen - 1] & 0x0f);
-	}
-	*buf = 0;
-}
-
-int
-nbnameisany(NbName name)
-{
-	return name[0] == '*';
-}
-
-int
-nbnameequal(NbName name1, NbName name2)
-{
-	if (name1[NbNameLen - 1] != name2[NbNameLen - 1])
-		return 0;
-	if (nbnameisany(name1))
-		return 1;
-	if (nbnameisany(name2))
-		return 1;
-	return memcmp(name1, name2, NbNameLen - 1) == 0;
-}
-
-int
-nbnamefmt(Fmt *f)
-{
-	uchar *n;
-	char buf[100];
-	n = va_arg(f->args, uchar *);
-	nbmkstringfromname(buf, sizeof(buf), n);
-	return fmtstrcpy(f, buf);
-}
-
-typedef struct NbNameTableEntry NbNameTableEntry;
-struct NbNameTableEntry {
-	NbName name;
-	NbNameTableEntry *next;
-};
-
-static struct {
-	QLock;
-	NbNameTableEntry *head;
-} nbnametable;
-
-int
-nbnametablefind(NbName name, int add)
-{
-	int rv;
-	NbNameTableEntry *p;
-	qlock(&nbnametable);
-	for (p = nbnametable.head; p; p = p->next) {
-		if (nbnameequal(p->name, name)) {
-			qunlock(&nbnametable);
-			return 1;
-		}
-	}
-	if (add) {
-		p = nbemalloc(sizeof(*p));
-		nbnamecpy(p->name, name);
-		p->next = nbnametable.head;
-		nbnametable.head = p;
-		rv = 1;
-	}
-	else
-		rv = 0;
-	qunlock(&nbnametable);
-	return rv;
-}
-
-typedef struct NbRemoteNameTableEntry NbRemoteNameTableEntry;
-struct NbRemoteNameTableEntry {
-	NbName name;
-	char ipaddr[IPaddrlen];
-	long expire;
-	NbRemoteNameTableEntry *next;
-};
-
-static struct {
-	QLock;
-	NbRemoteNameTableEntry *head;
-} nbremotenametable;
-
-int
-nbremotenametablefind(NbName name, uchar *ipaddr)
-{
-	NbRemoteNameTableEntry *p, **pp;
-	long now = time(nil);
-	qlock(&nbremotenametable);
-	for (pp = &nbremotenametable.head; (p = *pp) != nil;) {
-		if (p->expire <= now) {
-//print("nbremotenametablefind: expired %B\n", p->name);
-			*pp = p->next;
-			free(p);
-			continue;
-		}
-		if (nbnameequal(p->name, name)) {
-			ipmove(ipaddr, p->ipaddr);
-			qunlock(&nbremotenametable);
-			return 1;
-		}
-		pp = &p->next;
-	}
-	qunlock(&nbremotenametable);
-	return 0;
-}
-
-int
-nbremotenametableadd(NbName name, uchar *ipaddr, ulong ttl)
-{
-	NbRemoteNameTableEntry *p;
-	qlock(&nbremotenametable);
-	for (p = nbremotenametable.head; p; p = p->next)
-		if (nbnameequal(p->name, name))
-			break;
-	if (p == nil) {
-		p = nbemalloc(sizeof(*p));
-		p->next = nbremotenametable.head;
-		nbremotenametable.head = p;
-		nbnamecpy(p->name, name);
-	}
-	ipmove(p->ipaddr, ipaddr);
-	p->expire = time(nil) + ttl;
-//print("nbremotenametableadd: %B ttl %lud expire %ld\n", p->name, ttl, p->expire);
-	qunlock(&nbremotenametable);
-	return 1;
-}
--- a/sys/src/cmd/aquarela/nbns.c
+++ /dev/null
@@ -1,156 +1,0 @@
-#include <u.h>
-#include <libc.h>
-#include <ip.h>
-#include <thread.h>
-#include "netbios.h"
-
-static struct {
-	int thread;
-	QLock;
-	int fd;
-} udp = { -1 };
-
-typedef struct Listen Listen;
-
-struct Listen {
-	NbName to;
-	int (*deliver)(void *magic, NbDgram *s);
-	void *magic;
-	Listen *next;
-};
-
-static struct {
-	Lock;
-	ushort id;
-} id;
-
-struct {
-	QLock;
-	NbnsTransaction *head;
-} transactionlist;
-
-static void
-udplistener(void *)
-{	
-	for (;;) {
-		uchar msg[Udphdrsize + 576];
-		int len = read(udp.fd, msg, sizeof(msg));
-		if (len < 0)
-			break;
-		if (len >= nbudphdrsize) {
-			NbnsMessage *s;
-//			Udphdr *uh;
-			uchar *p;
-
-//			uh = (Udphdr*)msg;
-			p = msg + nbudphdrsize;
-			len -= nbudphdrsize;
-			s = nbnsconvM2S(p, len);
-			if (s) {
-//print("%I:%d -> %I:%d\n", uh->raddr, nhgets(uh->rport), uh->laddr, nhgets(uh->lport));
-//nbnsdumpmessage(s);
-				if (s->response) {
-					NbnsTransaction *t;
-					qlock(&transactionlist);
-					for (t = transactionlist.head; t; t = t->next)
-						if (t->id == s->id)
-							break;
-					if (t)
-						sendp(t->c, s);
-					else
-						nbnsmessagefree(&s);
-					qunlock(&transactionlist);
-				}
-				else
-					nbnsmessagefree(&s);
-			}
-		}
-	}
-}
-
-static char *
-startlistener(void)
-{
-	qlock(&udp);
-	if (udp.thread < 0) {
-		char *e;
-		e = nbudpannounce(NbnsPort, &udp.fd);
-		if (e) {
-			qunlock(&udp);
-			return e;
-		}
-		udp.thread = proccreate(udplistener, nil, 16384);
-	}
-	qunlock(&udp);
-	return nil;
-}
-
-ushort
-nbnsnextid(void)
-{
-	ushort rv;
-	lock(&id);
-	rv = id.id++;
-	unlock(&id);
-	return rv;
-}
-	
-NbnsTransaction *
-nbnstransactionnew(NbnsMessage *s, uchar *ipaddr)
-{
-	NbnsTransaction *t;
-	uchar msg[Udphdrsize + 576];
-	Udphdr *u;
-	int len;
-
-	startlistener();
-	len = nbnsconvS2M(s, msg + nbudphdrsize, sizeof(msg) - nbudphdrsize);
-	if (len == 0)
-		return 0;
-	t = mallocz(sizeof(*t), 1);
-	if (t == nil)
-		return nil;
-	t->id = s->id;	
-	t->c = chancreate(sizeof(NbnsMessage *), 3);
-	if (t->c == nil) {
-		free(t);
-		return nil;
-	}
-	qlock(&transactionlist);
-	t->next = transactionlist.head;
-	transactionlist.head = t;
-	qunlock(&transactionlist);
-	u = (Udphdr *)msg;
-	ipmove(u->laddr, nbglobals.myipaddr);
-	hnputs(u->lport, NbnsPort);
-	if (s->broadcast || ipaddr == nil)
-		ipmove(u->raddr, nbglobals.bcastaddr);
-	else
-		ipmove(u->raddr, ipaddr);
-	hnputs(u->rport, NbnsPort);
-	write(udp.fd, msg, len + nbudphdrsize);
-	return t;
-}
-
-void
-nbnstransactionfree(NbnsTransaction **tp)
-{
-	NbnsTransaction **tp2;
-	NbnsMessage *s;
-	NbnsTransaction *t;
-
-	t = *tp;
-	if (t) {
-		qlock(&transactionlist);
-		while ((s = nbrecvp(t->c)) != nil)
-			nbnsmessagefree(&s);
-		for (tp2 = &transactionlist.head; *tp2 && *tp2 != t; tp2 = &(*tp2)->next)
-			;
-		if (*tp2) {
-			*tp2 = t->next;
-			free(t);
-		}
-		qunlock(&transactionlist);
-		*tp = nil;
-	}
-}
--- a/sys/src/cmd/aquarela/nbnsconv.c
+++ /dev/null
@@ -1,314 +1,0 @@
-#include <u.h>
-#include <libc.h>
-#include <ip.h>
-#include <thread.h>
-#include "netbios.h"
-
-void
-nbnsmessagequestionfree(NbnsMessageQuestion **qp)
-{
-	NbnsMessageQuestion *q = *qp;
-	if (q) {
-		free(q);
-		*qp = nil;
-	}
-}
-
-void
-nbnsmessageresourcefree(NbnsMessageResource **rp)
-{
-	NbnsMessageResource *r = *rp;
-	if (r) {
-		free(r->rdata);
-		free(r);
-		*rp = nil;
-	}
-}
-
-static void
-questionfree(NbnsMessageQuestion **qp)
-{
-	while (*qp) {
-		NbnsMessageQuestion *next = (*qp)->next;
-		nbnsmessagequestionfree(qp);
-		*qp = next;
-	}
-}
-
-static void
-resourcefree(NbnsMessageResource **rp)
-{
-	while (*rp) {
-		NbnsMessageResource *next = (*rp)->next;
-		nbnsmessageresourcefree(rp);
-		*rp = next;
-	}
-}
-
-void
-nbnsmessagefree(NbnsMessage **sp)
-{
-	NbnsMessage *s = *sp;
-	if (s) {
-		questionfree(&s->q);
-		resourcefree(&s->an);
-		resourcefree(&s->ns);
-		resourcefree(&s->ar);
-		free(s);
-		*sp = nil;
-	}
-}
-
-void
-nbnsmessageaddquestion(NbnsMessage *s, NbnsMessageQuestion *q)
-{
-	NbnsMessageQuestion **qp;
-	for (qp = &s->q; *qp; qp = &(*qp)->next)
-		;
-	*qp = q;
-}
-
-NbnsMessageQuestion *
-nbnsmessagequestionnew(NbName name, ushort type, ushort class)
-{
-	NbnsMessageQuestion *q;
-	q = mallocz(sizeof(*q), 1);
-	if (q == nil)
-		return nil;
-	nbnamecpy(q->name, name);
-	q->type = type;
-	q->class = class;
-	return q;
-}
-
-NbnsMessageResource *
-nbnsmessageresourcenew(NbName name, ushort type, ushort class, ulong ttl, int rdlength, uchar *rdata)
-{
-	NbnsMessageResource *r;
-	r= mallocz(sizeof(*r), 1);
-	if (r == nil)
-		return nil;
-	nbnamecpy(r->name, name);
-	r->type = type;
-	r->class = class;
-	r->ttl = ttl;
-	r->rdlength = rdlength;
-	if (rdlength) {
-		r->rdata = malloc(rdlength);
-		if (r->rdata == nil) {
-			free(r);
-			return nil;
-		}
-		memcpy(r->rdata, rdata, rdlength);
-	}
-	return r;
-}
-
-void
-nbnsmessageaddresource(NbnsMessageResource **rp, NbnsMessageResource *r)
-{
-	for (; *rp; rp = &(*rp)->next)
-		;
-	*rp = r;
-}
-
-NbnsMessage *
-nbnsmessagenew(void)
-{
-	return mallocz(sizeof(NbnsMessage), 1);
-}
-
-static int
-resourcedecode(NbnsMessageResource **headp, int count, uchar *ap, uchar *pp, uchar *ep)
-{
-	uchar *p = pp;
-	int i;
-	for (i = 0; i < count; i++) {
-		int n;
-		NbnsMessageResource *r, **rp;
-		r = mallocz(sizeof(NbnsMessageResource), 1);
-		if (r == nil)
-			return -1;
-		for (rp = headp; *rp; rp = &(*rp)->next)
-			;
-		*rp = r;
-		n = nbnamedecode(ap, p, ep, r->name);
-		if (n == 0)
-			return -1;
-		p += n;
-		if (p + 10 > ep)
-			return -1;
-		r->type = nhgets(p); p += 2;
-		r->class = nhgets(p); p += 2;
-		r->ttl = nhgetl(p); p += 4;
-		r->rdlength = nhgets(p); p += 2;
-//print("rdlength %d\n", r->rdlength);
-		if (r->rdlength) {
-			if (p + r->rdlength > ep)
-				return -1;
-			r->rdata = malloc(r->rdlength);
-			if (r == nil)
-				return -1;
-			memcpy(r->rdata, p, r->rdlength);
-			p += r->rdlength;
-		}
-	}
-	return p - pp;
-}
-
-NbnsMessage *
-nbnsconvM2S(uchar *ap, int nap)
-{
-	uchar *p, *ep;
-	ushort qdcount, ancount, nscount, arcount, ctrl;
-	int i;
-	NbnsMessage *s;
-	int n;
-
-	if (nap < 12)
-		return nil;
-	p = ap;
-	ep = ap + nap;
-	s = nbnsmessagenew();
-	if (s == nil)
-		return nil;
-	s->id = nhgets(p); p+= 2;
-	ctrl = nhgets(p); p += 2;
-	qdcount = nhgets(p); p += 2;
-	ancount = nhgets(p); p += 2;
-	nscount = nhgets(p); p += 2;
-	arcount = nhgets(p); p += 2;
-	s->response = (ctrl & NbnsResponse) != 0;
-	s->opcode = (ctrl >> NbnsOpShift) & NbnsOpMask;
-	s->broadcast = (ctrl & NbnsFlagBroadcast) != 0;
-	s->recursionavailable = (ctrl & NbnsFlagRecursionAvailable) != 0;
-	s->recursiondesired = (ctrl & NbnsFlagRecursionDesired) != 0;
-	s->truncation = (ctrl & NbnsFlagTruncation) != 0;
-	s->authoritativeanswer = (ctrl & NbnsFlagAuthoritativeAnswer) != 0;
-	s->rcode = s->response ? (ctrl & NbnsRcodeMask) : 0;
-	for (i = 0; i < qdcount; i++) {
-		int n;
-		NbName nbname;
-		NbnsMessageQuestion *q;
-		ushort type, class;
-		n = nbnamedecode(ap, p, ep, nbname);
-		if (n == 0)
-			goto fail;
-		p += n;
-		if (p + 4 > ep)
-			goto fail;
-		type = nhgets(p); p += 2;
-		class = nhgets(p); p += 2;
-		q = nbnsmessagequestionnew(nbname, type, class);
-		if (q == nil)
-			goto fail;
-		nbnsmessageaddquestion(s, q);
-	}
-	n = resourcedecode(&s->an, ancount, ap, p, ep);
-	if (n < 0)
-		goto fail;
-	p += n;
-	n = resourcedecode(&s->ns, nscount, ap, p, ep);
-	if (n < 0)
-		goto fail;
-	p += n;
-	n = resourcedecode(&s->ar, arcount, ap, p, ep);
-	if (n < 0)
-		goto fail;
-//print("arcount %d\n", arcount);
-	return s;
-fail:
-	nbnsmessagefree(&s);
-	return nil;
-}
-
-static int
-resourceencode(NbnsMessageResource *r, uchar *ap, uchar *ep)
-{
-	uchar *p = ap;
-	for (; r; r = r->next) {
-		int n = nbnameencode(p, ep, r->name);
-		if (n == 0)
-			return -1;
-		p += n;
-		if (p + 10 > ep)
-			return -1;
-		hnputs(p, r->type); p += 2;
-		hnputs(p, r->class); p += 2;
-		hnputl(p, r->ttl); p += 4;
-		hnputs(p, r->rdlength); p += 2;
-		if (p + r->rdlength > ep)
-			return -1;
-		memcpy(p, r->rdata, r->rdlength);
-		p += r->rdlength;
-	}
-	return p - ap;
-}
-
-int
-nbnsconvS2M(NbnsMessage *s, uchar *ap, int nap)
-{
-	uchar *p = ap;
-	uchar *ep = ap + nap;
-	ushort ctrl;
-	NbnsMessageQuestion *q;
-	NbnsMessageResource *r;
-	int k;
-	int n;
-
-	if (p + 12 > ep)
-		return 0;
-	hnputs(p, s->id); p+= 2;
-	ctrl = (s->opcode & NbnsOpMask) << NbnsOpShift;
-	if (s->response) {
-		ctrl |= s->rcode & NbnsRcodeMask;
-		ctrl |= NbnsResponse;
-	}
-	if (s->broadcast)
-		ctrl |= NbnsFlagBroadcast;
-	if (s->recursionavailable)
-		ctrl |= NbnsFlagRecursionAvailable;
-	if (s->recursiondesired)
-		ctrl |= NbnsFlagRecursionDesired;
-	if (s->truncation)
-		ctrl |= NbnsFlagTruncation;
-	if (s->authoritativeanswer)
-		ctrl |= NbnsFlagAuthoritativeAnswer;
-	hnputs(p, ctrl); p += 2;
-	for (q = s->q, k = 0; q; k++, q = q->next)
-		;
-	hnputs(p, k); p += 2;
-	for (r = s->an, k = 0; r; k++, r = r->next)
-		;
-	hnputs(p, k); p += 2;
-	for (r = s->ns, k = 0; r; k++, r = r->next)
-		;
-	hnputs(p, k); p += 2;
-	for (r = s->ar, k = 0; r; k++, r = r->next)
-		;
-	hnputs(p, k); p += 2;
-	for (q = s->q; q; q = q->next) {
-		int n = nbnameencode(p, ep, q->name);
-		if (n == 0)
-			return 0;
-		p += n;
-		if (p + 4 > ep)
-			return 0;
-		hnputs(p, q->type); p += 2;
-		hnputs(p, q->class); p += 2;
-	}
-	n = resourceencode(s->an, p, ep);
-	if (n < 0)
-		return 0;
-	p += n;
-	n = resourceencode(s->ns, p, ep);
-	if (n < 0)
-		return 0;
-	p += n;
-	n = resourceencode(s->ar, p, ep);
-	if (n < 0)
-		return 0;
-	p += n;
-	return p - ap;
-}
-
--- a/sys/src/cmd/aquarela/nbresolve.c
+++ /dev/null
@@ -1,31 +1,0 @@
-#include "headers.h"
-#include <bio.h>
-#include <ndb.h>
-
-int
-nbnameresolve(NbName nbname, uchar *ipaddr)
-{
-	ulong r, ttl;
-	char name[NETPATHLEN];
-	NbName copy;
-	Ndbtuple *t;
-
-	/* for now, just use dns */
-	if (nbremotenametablefind(nbname, ipaddr)) {
-//print("%B found in cache\n", nbname);
-		return 1;
-	}
-	if (nbnsfindname(nil, nbname, ipaddr, &ttl) == 0) {
-		nbremotenametableadd(nbname, ipaddr, ttl);
-		return 1;
-	}
-	nbnamecpy(copy, nbname);
-	copy[NbNameLen - 1] = 0;
-	nbmkstringfromname(name, sizeof(name), copy);
-	t = dnsquery("/net", name, "ip");
-	if (t == nil)
-		return 0;
-	r = parseip(ipaddr, t->line->val);
-	ndbfree(t);
-	return r != -1;
-}
--- a/sys/src/cmd/aquarela/nbss.c
+++ /dev/null
@@ -1,428 +1,0 @@
-#include <u.h>
-#include <libc.h>
-#include <ip.h>
-#include <thread.h>
-#include "netbios.h"
-
-static struct {
-	int thread;
-	QLock;
-	char adir[NETPATHLEN];
-	int acfd;
-	char ldir[NETPATHLEN];
-	int lcfd;
-} tcp = { -1 };
-
-typedef struct Session Session;
-
-enum { NeedSessionRequest, Connected, Dead };
-
-struct Session {
-	NbSession;
-	int thread;
-	Session *next;
-	int state;
-	NBSSWRITEFN *write;
-};
-
-static struct {
-	QLock;
-	Session *head;
-} sessions;
-
-typedef struct Listen Listen;
-
-struct Listen {
-	NbName to;
-	NbName from;
-	int (*accept)(void *magic, NbSession *s, NBSSWRITEFN **writep);
-	void *magic;
-	Listen *next;
-};
-
-static struct {
-	QLock;
-	Listen *head;
-} listens;
-
-static void
-deletesession(Session *s)
-{
-	Session **sp;
-	close(s->fd);
-	qlock(&sessions);
-	for (sp = &sessions.head; *sp && *sp != s; sp = &(*sp)->next)
-		;
-	if (*sp)
-		*sp = s->next;
-	qunlock(&sessions);
-	free(s);
-}
-
-static void
-tcpreader(void *a)
-{
-	Session *s = a;
-	uchar *buf;
-	int buflen = 0x1ffff + 4;
-	buf = nbemalloc(buflen);
-	for (;;) {
-		int n;
-		uchar flags;
-		ushort length;
-
-		n = readn(s->fd, buf, 4);
-		if (n != 4) {
-		die:
-			free(buf);
-			if (s->state == Connected)
-				(*s->write)(s, nil, -1);
-			deletesession(s);
-			return;
-		}
-		flags = buf[1];
-		length = nhgets(buf + 2) | ((flags & 1) << 16);
-		n = readn(s->fd, buf + 4, length);
-		if (n != length)
-			goto die;
-		if (flags & 0xfe) {
-			print("nbss: invalid flags field 0x%.2ux\n", flags);
-			goto die;
-		}
-		switch (buf[0]) {
-		case 0: /* session message */
-			if (s->state != Connected && s->state != Dead) {
-				print("nbss: unexpected session message\n");
-				goto die;
-			}
-			if (s->state == Connected) {
-				if ((*s->write)(s, buf + 4, length) != 0) {
-					s->state = Dead;
-					goto die;
-				}
-			}
-			break;
-		case 0x81: /* session request */ {
-			uchar *p, *ep;
-			Listen *l;
-			int k;
-			int called_found;
-			uchar error_code;
-
-			if (s->state == Connected) {
-				print("nbss: unexpected session request\n");
-				goto die;
-			}
-			p = buf + 4;
-			ep = p + length;
-			k = nbnamedecode(p, p, ep, s->to);
-			if (k == 0) {
-				print("nbss: malformed called name in session request\n");
-				goto die;
-			}
-			p += k;
-			k = nbnamedecode(p, p, ep, s->from);
-			if (k == 0) {
-				print("nbss: malformed calling name in session request\n");
-				goto die;
-			}
-/*
-			p += k;
-			if (p != ep) {
-				print("nbss: extra data at end of session request\n");
-				goto die;
-			}
-*/
-			called_found = 0;
-//print("nbss: called %B calling %B\n", s->to, s->from);
-			qlock(&listens);
-			for (l = listens.head; l; l = l->next)
-				if (nbnameequal(l->to, s->to)) {
-					called_found = 1;
-					if (nbnameequal(l->from, s->from))
-						break;
-				}
-			if (l == nil) {
-				qunlock(&listens);
-				error_code  = called_found ? 0x81 : 0x80;
-			replydie:
-				buf[0] = 0x83;
-				buf[1] = 0;
-				hnputs(buf + 2, 1);
-				buf[4] = error_code;
-				write(s->fd, buf, 5);
-				goto die;
-			}
-			if (!(*l->accept)(l->magic, s, &s->write)) {
-				qunlock(&listens);
-				error_code = 0x83;
-				goto replydie;
-			}
-			buf[0] = 0x82;
-			buf[1] = 0;
-			hnputs(buf + 2, 0);
-			if (write(s->fd, buf, 4) != 4) {
-				qunlock(&listens);
-				goto die;
-			}
-			s->state = Connected;
-			qunlock(&listens);
-			break;
-		}
-		case 0x85: /* keep awake */
-			break;
-		default:
-			print("nbss: opcode 0x%.2ux unexpected\n", buf[0]);
-			goto die;
-		}
-	}
-}
-
-static NbSession *
-createsession(int fd)
-{
-	Session *s;
-	s = nbemalloc(sizeof(Session));
-	s->fd = fd;
-	s->state = NeedSessionRequest;
-	qlock(&sessions);
-	s->thread = procrfork(tcpreader, s, 32768, RFNAMEG);
-	if (s->thread < 0) {
-		qunlock(&sessions);
-		free(s);
-		return nil;
-	}
-	s->next = sessions.head;
-	sessions.head = s;
-	qunlock(&sessions);
-	return s;
-}
-
-static void
-tcplistener(void *)
-{
-	for (;;) {
-		int dfd;
-		char ldir[NETPATHLEN];
-		int lcfd;
-//print("tcplistener: listening\n");
-		lcfd = listen(tcp.adir, ldir);
-//print("tcplistener: contact\n");
-		if (lcfd < 0) {
-		die:
-			qlock(&tcp);
-			close(tcp.acfd);
-			tcp.thread = -1;
-			qunlock(&tcp);
-			return;
-		}
-		dfd = accept(lcfd, ldir);
-		close(lcfd);
-		if (dfd < 0)
-			goto die;
-		if (createsession(dfd) == nil)
-			close(dfd);
-	}
-}
-
-int
-nbsslisten(NbName to, NbName from,int (*accept)(void *magic, NbSession *s, NBSSWRITEFN **writep), void *magic)
-{
-	Listen *l;
-	qlock(&tcp);
-	if (tcp.thread < 0) {
-		fmtinstall('B', nbnamefmt);
-		tcp.acfd = announce("tcp!*!netbios", tcp.adir);
-		if (tcp.acfd < 0) {
-			print("nbsslisten: can't announce: %r\n");
-			qunlock(&tcp);
-			return -1;
-		}
-		tcp.thread = proccreate(tcplistener, nil, 16384);
-	}
-	qunlock(&tcp);
-	l = nbemalloc(sizeof(Listen));
-	nbnamecpy(l->to, to);
-	nbnamecpy(l->from, from);
-	l->accept = accept;
-	l->magic = magic;
-	qlock(&listens);
-	l->next = listens.head;
-	listens.head = l;
-	qunlock(&listens);
-	return 0;
-}
-
-void
-nbssfree(NbSession *s)
-{	
-	deletesession((Session *)s);
-}
-
-int
-nbssgatherwrite(NbSession *s, NbScatterGather *a)
-{
-	uchar hdr[4];
-	NbScatterGather *ap;
-	long l = 0;
-	for (ap = a; ap->p; ap++)
-		l += ap->l;
-//print("nbssgatherwrite %ld bytes\n", l);
-	hnputl(hdr, l);
-//nbdumpdata(hdr, sizeof(hdr));
-	if (write(s->fd, hdr, sizeof(hdr)) != sizeof(hdr))
-		return -1;
-	for (ap = a; ap->p; ap++) {
-//nbdumpdata(ap->p, ap->l);
-		if (write(s->fd, ap->p, ap->l) != ap->l)
-			return -1;
-	}
-	return 0;
-}
-
-NbSession *
-nbssconnect(NbName to, NbName from)
-{
-	Session *s;
-	uchar ipaddr[IPaddrlen];
-	char dialaddress[100];
-	char dir[NETPATHLEN];
-	uchar msg[576];
-	int fd;
-	long o;
-	uchar flags;
-	long length;
-
-	if (!nbnameresolve(to, ipaddr))
-		return nil;
-	fmtinstall('I', eipfmt);
-	snprint(dialaddress, sizeof(dialaddress), "tcp!%I!netbios", ipaddr);
-	fd = dial(dialaddress, nil, dir, nil);
-	if (fd < 0)
-		return nil;
-	msg[0] = 0x81;
-	msg[1] = 0;
-	o = 4;
-	o += nbnameencode(msg + o, msg + sizeof(msg) - o, to);
-	o += nbnameencode(msg + o, msg + sizeof(msg) - o, from);
-	hnputs(msg + 2, o - 4);
-	if (write(fd, msg, o) != o) {
-		close(fd);
-		return nil;
-	}
-	if (readn(fd, msg, 4) != 4) {
-		close(fd);
-		return nil;
-	}
-	flags = msg[1];
-	length = nhgets(msg + 2) | ((flags & 1) << 16);
-	switch (msg[0]) {
-	default:
-		close(fd);
-		werrstr("unexpected session message code 0x%.2ux", msg[0]);
-		return nil;
-	case 0x82:
-		if (length != 0) {
-			close(fd);
-			werrstr("length not 0 in positive session response");
-			return nil;
-		}
-		break;
-	case 0x83:
-		if (length != 1) {
-			close(fd);
-			werrstr("length not 1 in negative session response");
-			return nil;
-		}
-		if (readn(fd, msg + 4, 1) != 1) {
-			close(fd);
-			return nil;
-		}
-		close(fd);
-		werrstr("negative session response 0x%.2ux", msg[4]);
-		return nil;
-	}
-	s = nbemalloc(sizeof(Session));
-	s->fd = fd;
-	s->state = Connected;
-	qlock(&sessions);
-	s->next = sessions.head;
-	sessions.head = s;
-	qunlock(&sessions);
-	return s;
-}
-
-long
-nbssscatterread(NbSession *nbs, NbScatterGather *a)
-{
-	uchar hdr[4];
-	uchar flags;
-	long length, total;
-	NbScatterGather *ap;
-	Session *s = (Session *)nbs;
-
-	long l = 0;
-	for (ap = a; ap->p; ap++)
-		l += ap->l;
-//print("nbssscatterread %ld bytes\n", l);
-again:
-	if (readn(s->fd, hdr, 4) != 4) {
-	dead:
-		s->state = Dead;
-		return -1;
-	}
-	flags = hdr[1];
-	length = nhgets(hdr + 2) | ((flags & 1) << 16);
-//print("%.2ux: %d\n", hdr[0], length);
-	switch (hdr[0]) {
-	case 0x85:
-		if (length != 0) {
-			werrstr("length in keepalive not 0");
-			goto dead;
-		}
-		goto again;
-	case 0x00:
-		break;
-	default:
-		werrstr("unexpected session message code 0x%.2ux", hdr[0]);
-		goto dead;
-	}
-	if (length > l) {
-		werrstr("message too big (%ld)", length);
-		goto dead;
-	}
-	total = length;
-	for (ap = a; length && ap->p; ap++) {
-		long thistime;
-		long n;
-		thistime = length;
-		if (thistime > ap->l)
-			thistime = ap->l;
-//print("reading %d\n", length);
-		n = readn(s->fd, ap->p, thistime);
-		if (n != thistime)
-			goto dead;
-		length -= thistime;
-	}
-	return total;
-}
-
-int
-nbsswrite(NbSession *s, void *buf, long maxlen)
-{
-	NbScatterGather a[2];
-	a[0].l = maxlen;
-	a[0].p = buf;
-	a[1].p = nil;
-	return nbssgatherwrite(s, a);
-}
-
-long
-nbssread(NbSession *s, void *buf, long maxlen)
-{
-	NbScatterGather a[2];
-	a[0].l = maxlen;
-	a[0].p = buf;
-	a[1].p = nil;
-	return nbssscatterread(s, a);
-}
--- a/sys/src/cmd/aquarela/netbios.h
+++ /dev/null
@@ -1,251 +1,0 @@
-enum {
-	NbNameLen = 16,	
-	NbnsTimeoutBroadcast = 1000,
-	NbnsRetryBroadcast = 3,
-	NbnsPort = 137,
-	NbDgramMaxLen = 576,
-};
-
-typedef struct NbnsHdr {
-	uchar name_trn_id[2];
-	uchar ctrl[2];
-	uchar qdcount[2];
-	uchar ancount[2];
-	uchar nscount[2];
-	uchar arcount[2];
-} NbnsHdr;
-
-enum {
-	NbnsResponse = 1 << 15
-};
-
-enum {
-	NbnsOpShift = 11,
-	NbnsOpMask = 0xf,
-	NbnsOpQuery = 0,
-	NbnsOpRegistration = 5,
-	NbnsOpRelease = 6,
-	NbnsOpWack = 7,
-	NbnsOpRefresh = 8
-};
-
-enum {
-	NbnsFlagBroadcast = (1 << 4),
-	NbnsFlagRecursionAvailable = (1 << 7),
-	NbnsFlagRecursionDesired = (1 << 8),
-	NbnsFlagTruncation = (1 << 9),
-	NbnsFlagAuthoritativeAnswer = (1 << 10),
-};
-
-enum {
-	NbnsRcodeShift = 0,
-	NbnsRcodeMask = 0xf,
-};
-
-enum {
-	NbnsQuestionTypeNb = 0x0020,
-	NbnsQuestionTypeNbStat = 0x0021,
-	NbnsQuestionClassIn = 0x0001,
-};
-
-enum {
-	NbnsResourceTypeA = 0x0001,
-	NbnsResourceTypeNs = 0x0002,
-	NbnsResourceTypeNull = 0x000a,
-	NbnsResourceTypeNb = 0x0020,
-	NbnsResourceTypeNbStat = 0x0021,
-	NbnsResourceClassIn = 0x0001,
-};
-
-typedef struct NbnsMessageQuestion NbnsMessageQuestion;
-typedef struct NbnsMessageResource NbnsMessageResource;
-
-typedef uchar NbName[NbNameLen];
-int nbnamedecode(uchar *base, uchar *p, uchar *ep, NbName name);
-int nbnameencode(uchar *p, uchar *ep, NbName name);
-int nbnameequal(NbName name1, NbName name2);
-void nbnamecpy(NbName n1, NbName n2);
-void nbmknamefromstring(NbName nbname, char *string);
-void nbmknamefromstringandtype(NbName nbname, char *string, uchar type);
-void nbmkstringfromname(char *buf, int buflen, NbName name);
-#pragma varargck type "B" uchar *
-
-int nbnamefmt(Fmt *);
-
-struct NbnsMessageQuestion {
-	NbName name;
-	ushort type;
-	ushort class;
-	NbnsMessageQuestion *next;
-};
-
-NbnsMessageQuestion *nbnsmessagequestionnew(NbName name, ushort type, ushort class);
-
-struct NbnsMessageResource {
-	NbName name;
-	ushort type;
-	ushort class;
-	ulong ttl;
-	ushort rdlength;
-	uchar *rdata;
-	NbnsMessageResource *next;
-};
-NbnsMessageResource *nbnsmessageresourcenew(NbName name, ushort type, ushort class, ulong ttl, int rdcount, uchar *rdata);
-
-typedef struct NbnsMessage {
-	ushort id;
-	int response;
-	int opcode;
-	int broadcast;
-	int recursionavailable;
-	int recursiondesired;
-	int truncation;
-	int authoritativeanswer;
-	int rcode;
-	NbnsMessageQuestion *q;
-	NbnsMessageResource *an;
-	NbnsMessageResource *ns;
-	NbnsMessageResource *ar;
-} NbnsMessage;
-
-NbnsMessage *nbnsmessagenew(void);
-void nbnsmessageaddquestion(NbnsMessage *s, NbnsMessageQuestion *q);
-void nbnsmessageaddresource(NbnsMessageResource **rp, NbnsMessageResource *r);
-NbnsMessage *nbnsconvM2S(uchar *ap, int nap);
-void nbnsmessagefree(NbnsMessage **sp);
-void nbnsdumpmessage(NbnsMessage *s);
-int nbnsconvS2M(NbnsMessage *s, uchar *ap, int nap);
-
-
-NbnsMessage *nbnsmessagenamequeryrequestnew(ushort id, int broadcast, NbName name);
-NbnsMessage *nbnsmessagenameregistrationrequestnew(ushort id, int broadcast, NbName name, ulong ttl, uchar *ipaddr);
-
-typedef struct NbnsTransaction NbnsTransaction;
-
-struct NbnsTransaction {
-	ushort id;
-	Channel *c;
-	NbnsTransaction *next;
-};
-ushort nbnsnextid(void);
-
-int nbnsfindname(uchar *serveripaddr, NbName name, uchar *ipaddr, ulong *ttlp);
-int nbnsaddname(uchar *serveripaddr, NbName name, ulong ttl, uchar *ipaddr);
-
-NbnsTransaction *nbnstransactionnew(NbnsMessage *request, uchar *ipaddr);
-void nbnstransactionfree(NbnsTransaction **tp);
-
-typedef struct NbnsAlarm NbnsAlarm;
-
-struct NbnsAlarm {
-	Channel *c;
-	vlong expirems;
-	NbnsAlarm *next;
-};
-
-void nbnsalarmset(NbnsAlarm *a, ulong millisec);
-void nbnsalarmcancel(NbnsAlarm *a);
-void nbnsalarmfree(NbnsAlarm **ap);
-NbnsAlarm *nbnsalarmnew(void);
-void nbnsalarmend(void);
-
-typedef struct NbSession NbSession;
-typedef int NBSSWRITEFN(NbSession *s, void *buf, long n);
-
-struct NbSession {
-	int fd;
-	void *magic;
-	NbName from;
-	NbName to;
-};
-
-int nbsslisten(NbName to, NbName from, int (*accept)(void *magic, NbSession *s, NBSSWRITEFN **write), void *magic);
-NbSession *nbssconnect(NbName to, NbName from);
-void nbssfree(NbSession *s);
-
-typedef struct NbScatterGather NbScatterGather;
-
-struct NbScatterGather {
-	void *p;
-	long l;
-};
-
-int nbssgatherwrite(NbSession *s, NbScatterGather *a);
-long nbssscatterread(NbSession *, NbScatterGather *a);
-int nbsswrite(NbSession *s, void *buf, long n);
-long nbssread(NbSession *s, void *buf, long n);
-void *nbemalloc(ulong);
-
-int nbnameresolve(NbName name, uchar *ipaddr);
-
-void nbdumpdata(void *data, long datalen);
-
-typedef struct NbDgram {
-	uchar type;
-	uchar flags;
-	ushort id;
-	uchar srcip[IPaddrlen];
-	ushort srcport;
-	union {
-		struct {
-			ushort length;
-			ushort offset;
-			NbName srcname;
-			NbName dstname;
-			uchar *data;
-		} datagram;
-		struct {
-			uchar code;
-		} error;
-		struct {
-			NbName dstname;
-		} query;
-	};
-} NbDgram;
-
-enum {
-	NbDgramDirectUnique = 0x10,
-	NbDgramDirectGroup,
-	NbDgramBroadcast,
-	NbDgramError,
-	NbDgramQueryRequest,
-	NbDgramPositiveQueryResponse,
-	NbDgramNegativeQueryResponse,
-	NbDgramMore = 1,
-	NbDgramFirst = 2,
-	NbDgramPort = 138,
-	NbDgramErrorDestinationNameNotPresent = 0x82,
-	NbDgramMaxPacket = 576,
-};
-
-typedef struct NbDgramSendParameters {
-	NbName to;
-	uchar type;
-} NbDgramSendParameters;
-
-int nbdgramconvM2S(NbDgram *s, uchar *p, uchar *ep);
-int nbdgramconvS2M(uchar *p, uchar *ep, NbDgram *s);
-void nbdgramdump(NbDgram *s);
-int nbdgramsendto(uchar *ipaddr, ushort port, NbDgram *s);
-int nbdgramsend(NbDgramSendParameters *p, unsigned char *data, long datalen);
-char *nbdgramlisten(NbName to, int (*deliver)(void *magic, NbDgram *s), void *magic);
-
-int nbnametablefind(NbName name, int add);
-int nbnameisany(NbName name);
-
-int nbremotenametablefind(NbName name, uchar *ipaddr);
-int nbremotenametableadd(NbName name, uchar *ipaddr, ulong ttl);
-
-typedef struct NbGlobals {
-	uchar myipaddr[IPaddrlen];
-	uchar bcastaddr[IPaddrlen];
-	NbName myname;
-} NbGlobals;
-
-extern NbGlobals nbglobals;
-extern NbName nbnameany;
-
-int nbinit(void);
-char *nbudpannounce(ushort port, int *fdp);
-
-extern int nbudphdrsize;
--- a/sys/src/cmd/aquarela/smb.h
+++ /dev/null
@@ -1,387 +1,0 @@
-typedef struct SmbRawHeader {
-	uchar protocol[4];
-	uchar command;
-//	union {
-//		struct {
-//			uchar errorclass;
-//			uchar reserved;
-//			uchar error[2];
-//		} doserror;
-		uchar status[4];
-//	};
-	uchar flags;
-	uchar flags2[2];
-//	union {
-		uchar extra[12];
-//		struct {
-//			uchar pidhigh[2];
-//			uchar securitysignature[8];
-//		};
-//	};
-	uchar tid[2];
-	uchar pid[2];
-	uchar uid[2];
-	uchar mid[2];
-	uchar wordcount;
-	uchar parameterwords[1];
-} SmbRawHeader;
-
-enum {
-	SmbHeaderFlagReserved = (3 << 1),
-	SmbHeaderFlagCaseless = (1 << 3),
-	SmbHeaderFlagServerIgnore = (1 << 4),
-	SMB_FLAGS_SERVER_TO_REDIR = (1 << 7),
-};
-
-enum {
-	SMB_FLAGS2_KNOWS_LONG_NAMES = (1 << 0),
-	SMB_FLAGS2_KNOWS_EAS = (1 << 1),
-	SMB_FLAGS2_SECURITY_SIGNATURE = (1 << 2),
-	SMB_FLAGS2_RESERVED1 = (1 << 3),
-	SMB_FLAGS2_IS_LONG_NAME = (1 << 6),
-	SMB_FLAGS2_EXT_SEC = (1 << 1),
-	SMB_FLAGS2_DFS = (1 << 12),
-	SMB_FLAGS2_PAGING_IO = (1 << 13),
-	SMB_FLAGS2_ERR_STATUS = (1 << 14),
-	SMB_FLAGS2_UNICODE = (1 << 15),
-};
-
-enum {
-	SMB_COM_CREATE_DIRECTORY = 0x00,
-	SMB_COM_DELETE_DIRECTORY = 0x01,
-	SMB_COM_OPEN = 0x02,
-	SMB_COM_CREATE = 0x03,
-	SMB_COM_CLOSE = 0x04,
-	SMB_COM_FLUSH = 0x05,
-	SMB_COM_DELETE = 0x06,
-	SMB_COM_RENAME = 0x07,
-	SMB_COM_QUERY_INFORMATION = 0x08,
-	SMB_COM_SET_INFORMATION = 0x09,
-	SMB_COM_READ = 0x0A,
-	SMB_COM_WRITE = 0x0B,
-	SMB_COM_LOCK_BYTE_RANGE = 0x0C,
-	SMB_COM_UNLOCK_BYTE_RANGE = 0x0D,
-	SMB_COM_CREATE_TEMPORARY = 0x0E,
-	SMB_COM_CREATE_NEW = 0x0F,
-	SMB_COM_CHECK_DIRECTORY = 0x10,
-	SMB_COM_PROCESS_EXIT = 0x11,
-	SMB_COM_SEEK = 0x12,
-	SMB_COM_LOCK_AND_READ = 0x13,
-	SMB_COM_WRITE_AND_UNLOCK = 0x14,
-	SMB_COM_READ_RAW = 0x1A,
-	SMB_COM_READ_MPX = 0x1B,
-	SMB_COM_READ_MPX_SECONDARY = 0x1C,
-	SMB_COM_WRITE_RAW = 0x1D,
-	SMB_COM_WRITE_MPX = 0x1E,
-	SMB_COM_WRITE_MPX_SECONDARY = 0x1F,
-	SMB_COM_WRITE_COMPLETE = 0x20,
-	SMB_COM_QUERY_SERVER = 0x21,
-	SMB_COM_SET_INFORMATION2 = 0x22,
-	SMB_COM_QUERY_INFORMATION2 = 0x23,
-	SMB_COM_LOCKING_ANDX = 0x24,
-	SMB_COM_TRANSACTION = 0x25,
-	SMB_COM_TRANSACTION_SECONDARY = 0x26,
-	SMB_COM_IOCTL = 0x27,
-	SMB_COM_IOCTL_SECONDARY = 0x28,
-	SMB_COM_COPY = 0x29,
-	SMB_COM_MOVE = 0x2A,
-	SMB_COM_ECHO = 0x2B,
-	SMB_COM_WRITE_AND_CLOSE = 0x2C,
-	SMB_COM_OPEN_ANDX = 0x2D,
-	SMB_COM_READ_ANDX = 0x2E,
-	SMB_COM_WRITE_ANDX = 0x2F,
-	SMB_COM_NEW_FILE_SIZE = 0x30,
-	SMB_COM_CLOSE_AND_TREE_DISC = 0x31,
-	SMB_COM_TRANSACTION2 = 0x32,
-	SMB_COM_TRANSACTION2_SECONDARY = 0x33,
-	SMB_COM_FIND_CLOSE2 = 0x34,
-	SMB_COM_FIND_NOTIFY_CLOSE = 0x35,
-/* Used by Xenix/Unix 0x60 - 0x6E */,
-	SMB_COM_TREE_CONNECT = 0x70,
-	SMB_COM_TREE_DISCONNECT = 0x71,
-	SMB_COM_NEGOTIATE = 0x72,
-	SMB_COM_SESSION_SETUP_ANDX = 0x73,
-	SMB_COM_LOGOFF_ANDX = 0x74,
-	SMB_COM_TREE_CONNECT_ANDX = 0x75,
-	SMB_COM_QUERY_INFORMATION_DISK = 0x80,
-	SMB_COM_SEARCH = 0x81,
-	SMB_COM_FIND = 0x82,
-	SMB_COM_FIND_UNIQUE = 0x83,
-	SMB_COM_FIND_CLOSE = 0x84,
-	SMB_COM_NT_TRANSACT = 0xA0,
-	SMB_COM_NT_TRANSACT_SECONDARY = 0xA1,
-	SMB_COM_NT_CREATE_ANDX = 0xA2,
-	SMB_COM_NT_CANCEL = 0xA4,
-	SMB_COM_NT_RENAME = 0xA5,
-	SMB_COM_OPEN_PRINT_FILE = 0xC0,
-	SMB_COM_WRITE_PRINT_FILE = 0xC1,
-	SMB_COM_CLOSE_PRINT_FILE = 0xC2,
-	SMB_COM_GET_PRINT_QUEUE = 0xC3,
-	SMB_COM_READ_BULK = 0xD8,
-	SMB_COM_WRITE_BULK = 0xD9,
-	SMB_COM_NO_ANDX_COMMAND = 0xff,
-};
-
-enum {
-	SUCCESS = 0,
-	ERRDOS = 0x01,
-	ERRSRV = 0x02,
-	ERRHRD = 0x03,
-	ERRCMD = 0xff,
-};
-
-enum {
-	ERRbadfunc = 1,
-	ERRbadfile = 2,
-	ERRbadpath = 3,
-	ERRnofids = 4,
-	ERRnoaccess = 5,
-	ERRbadfid = 6,
-	ERRbadmcb = 7,
-	ERRnomem = 8,
-	ERRbadmem = 9,
-	ERRbadenv = 10,
-	ERRbadformat = 11,
-	ERRbadaccess = 12,
-	ERRbaddata  =13,
-	ERRbaddrive = 15,
-	ERRremcd = 16,
-	ERRdiffdevice = 17,
-	ERRnofiles = 18,
-	ERRbadshare = 32,
-	ERRlock = 33,
-	ERRunsup = 50,
-	ERRfilexists = 80,
-	ERRunknownlevel = 124,
-	ERRquota = 512,
-	ERRnotalink = 513,
-};
-
-enum {
-	ERRerror = 1,
-	ERRbadpw = 2,
-	ERRaccess = 4,
-	ERRinvtid = 5,
-	ERRsmbcmd = 64,
-	ERRtoomanyuids = 90,
-	ERRbaduid = 91,
-	ERRnosupport = 65535,
-};
-
-enum {
-	CAP_RAW_MODE = 0x0001,
-	CAP_MPX_MODE = 0x0002,
-	CAP_UNICODE = 0x0004,
-	CAP_LARGE_FILES =  0x0008,
-	CAP_NT_SMBS = 0x0010,
-	CAP_RPC_REMOTE_APIS = 0x0020,
-	CAP_STATUS32 = 0x0040,
-	CAP_LEVEL_II_OPLOCKS = 0x0080,
-	CAP_LOCK_AND_READ = 0x0100,
-	CAP_NT_FIND = 0x0200,
-	CAP_DFS = 0x1000,
-	CAP_INFOLEVEL_PASSTHRU = 0x2000,
-	CAP_W2K_SMBS = 0x2000,
-	CAP_LARGE_READX = 0x4000,
-	CAP_LARGE_WRITEX = 0x8000,
-	CAP_UNIX = 0x00800000,
-	CAP_BULK_TRANSFER = 0x20000000,
-	CAP_COMPRESSED_DATA = 0x40000000,
-	CAP_EXTENDED_SECURITY = 0x80000000
-};
-
-enum {
-	RapNetShareEnum = 0,
-	RapNetShareGetInfo = 1,
-	RapNetServerGetInfo = 13,
-	RapNetWkstaGetInfo = 63,
-	RapNetServerEnum2 = 104,
-};
-
-enum {
-	SMB_RAP_NERR_SUCCESS = 0,
-	SMB_RAP_ERROR_MORE_DATA = 234,
-};
-
-enum {
-	STYPE_DISKTREE,
-	STYPE_PRINTQ,
-	STYPE_DEVICE,
-	STYPE_IPC
-};
-
-enum {
-	SV_TYPE_WORKSTATION = 0x00000001,
-	SV_TYPE_SERVER = 0x00000002,
-	SV_TYPE_SQLSERVER = 0x00000004,
-	SV_TYPE_DOMAIN_CTRL = 0x00000008,
-	SV_TYPE_DOMAIN_BAKCTRL = 0x00000010,
-	SV_TYPE_TIME_SOURCE = 0x00000020,
-	SV_TYPE_AFP = 0x00000040,
-	SV_TYPE_NOVELL = 0x00000080,
-	SV_TYPE_DOMAIN_MEMBER = 0x00000100,
-	SV_TYPE_PRINTQ_SERVER = 0x00000200,
-	SV_TYPE_DIALIN_SERVER = 0x00000400,
-	SV_TYPE_SERVER_UNIX = 0x00000800,
-	SV_TYPE_NT = 0x00001000,
-	SV_TYPE_WFW = 0x00002000,
-	SV_TYPE_SERVER_MFPN = 0x00004000,
-	SV_TYPE_SERVER_NT = 0x00008000,
-	SV_TYPE_POTENTIAL_BROWSER = 0x00010000,
-	SV_TYPE_BACKUP_BROWSER = 0x00020000,
-	SV_TYPE_MASTER_BROWSER = 0x00040000,
-	SV_TYPE_DOMAIN_MASTER = 0x00080000,
-	SV_TYPE_SERVER_OSF = 0x00100000,
-	SV_TYPE_SERVER_VMS = 0x00200000,
-	SV_TYPE_WIN95_PLUS = 0x00400000,
-	SV_TYPE_DFS_SERVER = 0x00800000,
-	SV_TYPE_ALTERNATE_XPORT = 0x20000000,
-	SV_TYPE_LOCAL_LIST_ONLY = 0x40000000,
-	SV_TYPE_DOMAIN_ENUM = 0x80000000,
-	SV_TYPE_ALL = 0xFFFFFFFF,
-};
-
-enum {
-	SMB_TRANS2_OPEN = 0,
-	SMB_TRANS2_FIND_FIRST2 = 1,
-	SMB_TRANS2_FIND_NEXT2 = 2,
-	SMB_TRANS2_QUERY_FS_INFORMATION = 3,
-	SMB_TRANS2_SET_FS_INFORMATION = 4,
-	SMB_TRANS2_QUERY_PATH_INFORMATION = 5,
-	SMB_TRANS2_SET_PATH_INFORMATION = 6,
-	SMB_TRANS2_QUERY_FILE_INFORMATION = 7,
-	SMB_TRANS2_SET_FILE_INFORMATION = 8,
-	SMB_TRANS2_FSCTL = 9,
-	SMB_TRANS2_IOCTL2 = 0xA,
-	SMB_TRANS2_FIND_NOTIFY_FIRST = 0xB,
-	SMB_TRANS2_FIND_NOTIFY_NEXT = 0xC,
-	SMB_TRANS2_CREATE_DIRECTORY = 0xD,
-	SMB_TRANS2_SESSION_SETUP = 0xE,
-	SMB_TRANS2_GET_DFS_REFERRAL = 0x10,
-	SMB_TRANS2_REPORT_DFS_INCONSISTENCY = 0x11,
-};
-
-enum {
-	SMB_FIND_CLOSE = 1,
-	SMB_FIND_CLOSE_EOS = 2,
-	SMB_FIND_RETURN_RESUME_KEYS = 4,
-	SMB_FIND_CONTINUE = 8,
-	SMB_FIND_BACKUP = 16
-};
-
-enum {
-	SMB_INFO_STANDARD = 1,
-	SMB_FIND_FILE_BOTH_DIRECTORY_INFO = 0x104,
-	SMB_QUERY_FILE_BASIC_INFO = 0x101,
-	SMB_QUERY_FILE_STANDARD_INFO = 0x102,
-	SMB_QUERY_FILE_EA_INFO = 0x103,
-	SMB_QUERY_FILE_ALL_INFO = 0x107,
-	SMB_QUERY_FILE_STREAM_INFO = 0x109,
-};
-
-enum {
-	SMB_SET_FILE_BASIC_INFO = 0x101,
-	SMB_SET_FILE_DISPOSITION_INFO = 0x102,
-	SMB_SET_FILE_ALLOCATION_INFO = 0x103,
-	SMB_SET_FILE_END_OF_FILE_INFO = 0x104,
-};
-
-enum {
-	SMB_ATTR_READ_ONLY = (1 << 0),
-	SMB_ATTR_HIDDEN = (1 << 1),
-	SMB_ATTR_SYSTEM = (1 << 2),
-	SMB_ATTR_DIRECTORY = (1 << 4),
-	SMB_ATTR_ARCHIVE = (1 << 5),
-	SMB_ATTR_NORMAL = (1 << 7),
-	SMB_ATTR_COMPRESSED = 0x800,
-	SMB_ATTR_TEMPORARY = 0x100,
-	SMB_ATTR_WRITETHROUGH = 0x80000000,
-	SMB_ATTR_NO_BUFFERING = 0x20000000,
-	SMB_ATTR_RANDOM_ACCESS = 0x10000000,
-};
-
-enum {
-	SMB_OFUN_EXIST_SHIFT = 0,
-	SMB_OFUN_EXIST_MASK = 3,
-	SMB_OFUN_EXIST_FAIL = 0,
-	SMB_OFUN_EXIST_OPEN = 1,
-	SMB_OFUN_EXIST_TRUNCATE = 2,
-	SMB_OFUN_NOEXIST_CREATE = (1 << 4),
-};
-
-enum {
-	SMB_OPEN_FLAGS_ADDITIONAL = 1,
-	SMB_OPEN_FLAGS_OPLOCK = 2,
-	SMB_OPEN_FLAGS_OPBATCH = 4,
-	SMB_OPEN_MODE_ACCESS_SHIFT = 0,
-	SMB_OPEN_MODE_ACCESS_MASK = 7,
-	SMB_OPEN_MODE_SHARE_SHIFT = 4,
-	SMB_OPEN_MODE_SHARE_MASK = 7,
-	SMB_OPEN_MODE_SHARE_COMPATIBILITY  = 0,
-	SMB_OPEN_MODE_SHARE_EXCLUSIVE = 1,
-	SMB_OPEN_MODE_SHARE_DENY_WRITE = 2,
-	SMB_OPEN_MODE_SHARE_DENY_READOREXEC = 3,
-	SMB_OPEN_MODE_SHARE_DENY_NONE = 4,
-	SMB_OPEN_MODE_WRITE_THROUGH = (1 << 14),
-};
-
-enum {
-	SMB_INFO_ALLOCATION = 1,
-	SMB_INFO_VOLUME = 2,
-	SMB_QUERY_FS_VOLUME_INFO = 0x102,
-	SMB_QUERY_FS_SIZE_INFO = 0x103,
-	SMB_QUERY_FS_ATTRIBUTE_INFO = 0x105,
-};
-
-enum {
-	SMB_CD_SUPERCEDE = 0,
-	SMB_CD_OPEN = 1,
-	SMB_CD_CREATE = 2,
-	SMB_CD_OPEN_IF = 3,
-	SMB_CD_OVERWRITE = 4,
-	SMB_CD_OVERWRITE_IF = 5,
-	SMB_CD_MAX = 5,
-};
-
-enum {
-	SMB_DA_SPECIFIC_MASK = 0x0000ffff,
-	SMB_DA_SPECIFIC_READ_DATA = 0x00000001,
-	SMB_DA_SPECIFIC_WRITE_DATA = 0x00000002,
-	SMB_DA_SPECIFIC_APPEND_DATA = 0x00000004,
-	SMB_DA_SPECIFIC_READ_EA = 0x00000008,
-	SMB_DA_SPECIFIC_WRITE_EA = 0x00000010,
-	SMB_DA_SPECIFIC_EXECUTE = 0x00000020,
-	SMB_DA_SPECIFIC_DELETE_CHILD = 0x00000040,
-	SMB_DA_SPECIFIC_READ_ATTRIBUTES = 0x00000080,
-	SMB_DA_SPECIFIC_WRITE_ATTRIBUTES = 0x00000100,
-	SMB_DA_STANDARD_MASK = 0x00ff0000,
-	SMB_DA_STANDARD_DELETE_ACCESS = 0x00010000,
-	SMB_DA_STANDARD_READ_CONTROL_ACCESS = 0x00020000,
-	SMB_DA_STANDARD_WRITE_DAC_ACCESS = 0x00040000,
-	SMB_DA_STANDARD_WRITE_OWNER_ACCESS = 0x00080000,
-	SMB_DA_STANDARD_SYNCHRONIZE_ACCESS = 0x00100000,
-	SMB_DA_GENERIC_MASK = 0xf0000000,
-	SMB_DA_GENERIC_ALL_ACCESS = 0x10000000,
-	SMB_DA_GENERIC_EXECUTE_ACCESS = 0x20000000,
-	SMB_DA_GENERIC_WRITE_ACCESS = 0x40000000,
-	SMB_DA_GENERIC_READ_ACCESS = 0x80000000
-};
-
-enum {
-	SMB_SA_NO_SHARE = 0x00000000,
-	SMB_SA_SHARE_READ = 0x00000001,
-	SMB_SA_SHARE_WRITE = 0x00000002,
-	SMB_SA_SHARE_DELETE = 0x00000004,
-};
-
-enum {
-	SMB_CO_DIRECTORY = 0x00000001,
-	SMB_CO_WRITETHROUGH = 0x00000002,
-	SMB_CO_SEQUENTIAL_ONLY = 0x00000004,
-	SMB_CO_FILE = 0x00000040,
-	SMB_CO_NO_EA_KNOWLEDGE = 0x00000200,
-	SMB_CO_EIGHT_DOT_THREE_ONLY = 0x00000400,
-	SMB_CO_RANDOM_ACCESS = 0x00000800,
-	SMB_CO_DELETE_ON_CLOSE = 0x00001000,
-};
-
--- a/sys/src/cmd/aquarela/smballoc.c
+++ /dev/null
@@ -1,43 +1,0 @@
-#include "headers.h"
-
-#ifndef LEAK
-void *
-smbemallocz(ulong size, int clear)
-{
-	void *p = nbemalloc(size);
-	if (clear && p)
-		memset(p, 0, size);
-	return p;
-}
-
-void *
-smbemalloc(ulong size)
-{
-	return smbemallocz(size, 0);
-}
-
-char *
-smbestrdup(char *p)
-{
-	char *q;
-	q = smbemalloc(strlen(p) + 1);
-	return strcpy(q, p);
-}
-#endif
-
-void
-smbfree(void **pp)
-{
-	void *p = *pp;
-	if (p) {
-		free(p);
-		*pp = nil;
-	}
-}
-
-void
-smberealloc(void **pp, ulong size)
-{
-	*pp = realloc(*pp, size);
-	assert(size == 0 || *pp);
-}
--- a/sys/src/cmd/aquarela/smbbrowse.c
+++ /dev/null
@@ -1,56 +1,0 @@
-#include "headers.h"
-
-int
-smbmailslotsend(NbDgramSendParameters *p, SmbBuffer *msg, char **errmsgp)
-{
-	ushort setup[3];
-	int rv;
-	SmbTransaction transaction;
-	SmbBuffer *b;
-	SmbHeader h;
-	setup[0] = 1;
-	setup[1] = 0;
-	setup[2] = 0;
-	memset(&transaction, 0, sizeof(transaction));
-	transaction.in.name = smbglobals.mailslotbrowse;
-	transaction.in.scount = 3;
-	transaction.in.setup = setup;
-	transaction.in.tdcount = smbbufferreadspace(msg);
-	transaction.in.data = smbbufferreadpointer(msg);
-	b = smbbuffernew(NbDgramMaxLen);
-	memset(&h, 0, sizeof(h));
-	rv = smbtransactionexecute(&transaction, &h, nil, b, &smbtransactionmethoddgram, p, nil, errmsgp);
-	smbbufferfree(&b);
-	return rv;
-}
-
-int
-smbbrowsesendhostannouncement(char *name, ulong periodms, ulong type, char *comment, char **errmsgp)
-{
-	NbDgramSendParameters p;
-	SmbBuffer *b;
-	int rv;
-//	NbName msbrowse;
-
-//	msbrowse[0] = 1;
-//	msbrowse[1] = 2;
-//	memcpy(msbrowse + 2, "__MSBROWSE__", 12);
-//	msbrowse[14] = 2;
-//	msbrowse[15] = 1;
-//	nbnamecpy(p.to, msbrowse);
-	nbmknamefromstringandtype(p.to, smbglobals.primarydomain, 0x1d);
-	p.type = NbDgramDirectUnique;
-	b = smbbuffernew(NbDgramMaxLen);
-	smbbufferputb(b, 1);
-	smbbufferputb(b, 0);
-	smbbufferputl(b, periodms);
-	smbbufferputstrn(b, name, 16, 1);
-	smbbufferputb(b, 4);
-	smbbufferputb(b, 0);
-	smbbufferputl(b, type);
-	smbbufferputl(b, 0xaa55011f);
-	smbbufferputstring(b, nil, 0, comment);
-	rv = smbmailslotsend(&p, b, errmsgp);
-	smbbufferfree(&b);
-	return rv;
-}
--- a/sys/src/cmd/aquarela/smbbuffer.c
+++ /dev/null
@@ -1,597 +1,0 @@
-#include "headers.h"
-
-#define BUFFER 1
-#define STRUCT 2
-#define PUSHED 4
-
-struct SmbBuffer {
-	uchar *buf;
-	ulong realmaxlen;
-	ulong maxlen;
-	ulong rn;
-	ulong wn;
-	ulong savewn;
-	int flags;
-};
-
-void
-smbbufferreset(SmbBuffer *s)
-{
-	if (s == nil)
-		return;
-	s->rn = 0;
-	s->wn = 0;
-	s->flags &= ~PUSHED;
-}
-
-void
-smbbuffersetbuf(SmbBuffer *s, void *p, ulong maxlen)
-{
-	s->realmaxlen = s->maxlen = maxlen;
-	if (s->buf) {
-		if (s->flags & BUFFER)
-			free(s->buf);
-		s->buf = nil;
-	}
-	s->flags &= ~BUFFER;
-	if (p)
-		s->buf = p;
-	else {
-		s->buf = smbemalloc(maxlen);
-		s->flags |= BUFFER;
-	}
-	smbbufferreset(s);
-}
-
-SmbBuffer *
-smbbufferinit(void *base, void *bdata, ulong blen)
-{
-	SmbBuffer *b;
-	b = smbemalloc(sizeof(*b));
-	b->buf = base;
-	b->flags = STRUCT;	
-	b->rn = (uchar *)bdata - (uchar *)base;
-	b->wn = b->rn + blen;
-	b->realmaxlen = b->maxlen = b->wn;
-	return b;
-}
-
-int
-smbbufferalignl2(SmbBuffer *s, int al2)
-{
-	ulong mask, newn;
-	mask = (1 << al2) - 1;
-	newn = (s->wn + mask) & ~mask;
-	if (newn != s->wn) {
-		if (newn > s->maxlen)
-			return 0;
-		s->wn = newn;
-	}
-	return 1;
-}
-
-int
-smbbufferputb(SmbBuffer *s, uchar b)
-{
-	if (s->wn >= s->maxlen)
-		return 0;
-	s->buf[s->wn++] = b;
-	return 1;
-}
-
-ulong
-smbbufferspace(SmbBuffer *sess)
-{
-	return sess->maxlen - sess->wn;
-}
-
-int
-smbbufferoffsetputs(SmbBuffer *sess, ulong offset, ushort s)
-{
-	if (offset + 2 > sess->wn)
-		return 0;
-	smbhnputs(sess->buf + offset, s);
-	return 1;
-}
-
-int
-smbbufferputs(SmbBuffer *sess, ushort s)
-{
-	if (sess->wn + sizeof(ushort) > sess->maxlen)
-		return 0;
-	smbhnputs(sess->buf + sess->wn, s);
-	sess->wn += sizeof(ushort);
-	return 1;
-}
-
-int
-smbbufferputl(SmbBuffer *s, ulong l)
-{
-	if (s->wn + sizeof(ulong) > s->maxlen)
-		return 0;
-	smbhnputl(s->buf + s->wn, l);
-	s->wn += sizeof(ulong);
-	return 1;
-}
-
-int
-smbbufferputv(SmbBuffer *s, vlong v)
-{
-	if (s->wn + sizeof(vlong) > s->maxlen)
-		return 0;
-	smbhnputv(s->buf + s->wn, v);
-	s->wn += sizeof(vlong);
-	return 1;
-}
-
-int
-smbbufferputbytes(SmbBuffer *s, void *data, ulong datalen)
-{
-	if (s->wn + datalen > s->maxlen)
-		return 0;
-	if (data)
-		memcpy(s->buf + s->wn, data, datalen);
-	s->wn += datalen;
-	return 1;
-}
-
-int
-smbbufferputstring(SmbBuffer *b, SmbPeerInfo *p, ulong flags, char *string)
-{
-	int n = smbstringput(p, flags, b->buf, b->wn, b->maxlen, string);
-	if (n <= 0)
-		return 0;
-	b->wn += n;
-	return 1;
-}
-
-int
-smbbufferputstrn(SmbBuffer *s, char *string, int size, int upcase)
-{
-	int n = smbstrnput(s->buf, s->wn, s->maxlen, string, size, upcase);
-	if (n <= 0)
-		return 0;
-	s->wn += n;
-	return 1;
-}
-
-ulong
-smbbufferwriteoffset(SmbBuffer *s)
-{
-	return s->wn;
-}
-
-ulong
-smbbufferwritemaxoffset(SmbBuffer *s)
-{
-	return s->maxlen;
-}
-
-ulong
-smbbufferreadoffset(SmbBuffer *s)
-{
-	return s->rn;
-}
-
-void *
-smbbufferreadpointer(SmbBuffer *s)
-{
-	return s->buf + s->rn;
-}
-
-void *
-smbbufferwritepointer(SmbBuffer *s)
-{
-	return s->buf + s->wn;
-}
-
-ulong
-smbbufferwritespace(SmbBuffer *b)
-{
-	return b->maxlen - b->wn;
-}
-
-SmbBuffer *
-smbbuffernew(ulong maxlen)
-{
-	SmbBuffer *b;
-	b = smbemalloc(sizeof(SmbBuffer));
-	b->buf = smbemalloc(maxlen);
-	b->realmaxlen = b->maxlen = maxlen;
-	b->rn = 0;
-	b->wn = 0;
-	b->flags = STRUCT | BUFFER;
-	return b;
-}
-
-void
-smbbufferfree(SmbBuffer **bp)
-{
-	SmbBuffer *b = *bp;
-	if (b) {
-		if (b->flags & BUFFER) {
-			free(b->buf);
-			b->buf = nil;
-			b->flags &= ~BUFFER;
-		}
-		if (b->flags & STRUCT)
-			free(b);
-		*bp = nil;
-	}
-}
-
-uchar *
-smbbufferbase(SmbBuffer *b)
-{
-	return b->buf;
-}
-
-int
-smbbuffergetbytes(SmbBuffer *b, void *buf, ulong len)
-{
-	if (b->rn + len > b->wn)
-		return 0;
-	if (buf)
-		memcpy(buf, b->buf + b->rn, len);
-	b->rn += len;
-	return 1;
-}
-
-void
-smbbuffersetreadlen(SmbBuffer *b, ulong len)
-{
-	b->wn = b->rn + len;
-}
-
-int
-smbbuffertrimreadlen(SmbBuffer *b, ulong len)
-{
-	if (b->rn + len > b->wn)
-		return 0;
-	else if (b->rn + len < b->wn)
-		b->wn = b->rn + len;
-	return 1;
-}
-
-int
-smbbuffergets(SmbBuffer *b, ushort *sp)
-{
-	if (b->rn + 2 > b->wn)
-		return 0;
-	*sp = smbnhgets(b->buf + b->rn);
-	b->rn += 2;
-	return 1;
-}
-
-int
-smbbuffergetstrn(SmbBuffer *b, ushort size, char **sp)
-{
-	uchar *np;
-	if (size > b->wn - b->rn)
-		return 0;
-	np = memchr(b->buf + b->rn, 0, size);
-	if (np == nil)
-		return 0;
-	*sp = strdup((char *)b->buf + b->rn);
-	b->rn += size;
-	return 1;
-}
-
-int
-smbbuffergetstr(SmbBuffer *b, ulong flags, char **sp)
-{
-	int c;
-	char *p;
-	uchar *np;
-
-	np = memchr(b->buf + b->rn, 0, b->wn - b->rn);
-	if (np == nil)
-		return 0;
-	*sp = strdup((char *)b->buf + b->rn);
-	for (p = *sp; *p != 0; p++) {
-		c = *p;
-		if (c >= 'a' && c <= 'z' && (flags & SMB_STRING_UPCASE))
-			*p = toupper(c);
-		else if (c == '/' && (flags & SMB_STRING_REVPATH))
-			*p = '\\';
-		else if (c == '\\' && (flags & SMB_STRING_PATH))
-			*p = '/';
-		else if (smbglobals.convertspace){
-			if (c == 0xa0 && (flags & SMB_STRING_REVPATH))
-				*p = ' ';
-			else if (c == ' ' && (flags & SMB_STRING_PATH))
-				*p = 0xa0;
-		}
-	}
-	b->rn = np - b->buf + 1;
-	return 1;
-}
-
-int
-smbbuffergetstrinline(SmbBuffer *b, char **sp)
-{
-	uchar *np;
-	np = memchr(b->buf + b->rn, 0, b->wn - b->rn);
-	if (np == nil)
-		return 0;
-	*sp = (char *)b->buf + b->rn;
-	b->rn = np - b->buf + 1;
-	return 1;
-}
-
-int
-smbbuffergetucs2(SmbBuffer *b, ulong flags, char **sp)
-{
-	uchar *bdata = b->buf + b->rn;
-	uchar *edata = b->buf + b->wn;
-	Rune r;
-	int l;
-	char *p, *q;
-	uchar *savebdata;
-	int first;
-
-	l = 0;
-	if ((flags & SMB_STRING_UNALIGNED) == 0 && (bdata - b->buf) & 1)
-		bdata++;
-	savebdata = bdata;
-	first = 1;
-	do {
-		if (bdata + 2 > edata) {
-			l++;
-			break;
-		}
-		r = smbnhgets(bdata); bdata += 2;
-		if (first && (flags & SMB_STRING_PATH) && r != '\\')
-			l++;
-		first = 0;
-		if (flags & SMB_STRING_CONVERT_MASK)
-			r = smbruneconvert(r, flags);
-		l += runelen(r);
-	} while (r != 0);
-	p = smbemalloc(l);
-	bdata = savebdata;
-	q = p;
-	first = 1;
-	do {
-		if (bdata + 2 > edata) {
-			*q = 0;
-			break;
-		}
-		r = smbnhgets(bdata); bdata += 2;
-		if (first && (flags & SMB_STRING_PATH) && r != '\\')
-			*q++ = '/';
-		first = 0;
-		if (flags & SMB_STRING_CONVERT_MASK)
-			r = smbruneconvert(r, flags);
-		q += runetochar(q, &r);
-	} while (r != 0);
-	b->rn = bdata - b->buf;
-	*sp = p;
-	return 1;
-}
-
-int
-smbbuffergetstring(SmbBuffer *b, SmbHeader *h, ulong flags, char **sp)
-{
-	if (flags & SMB_STRING_UNICODE)
-		return smbbuffergetucs2(b, flags, sp);
-	else if (flags & SMB_STRING_ASCII)
-		return smbbuffergetstr(b, flags, sp);
-	else if (h->flags2 & SMB_FLAGS2_UNICODE)
-		return smbbuffergetucs2(b, flags, sp);
-	else
-		return smbbuffergetstr(b, flags, sp);
-}
-
-void *
-smbbufferpointer(SmbBuffer *b, ulong offset)
-{
-	return b->buf + offset;
-}
-
-int
-smbbuffergetb(SmbBuffer *b, uchar *bp)
-{
-	if (b->rn < b->wn) {
-		*bp = b->buf[b->rn++];
-		return 1;
-	}
-	return 0;
-}
-
-int
-smbbuffergetl(SmbBuffer *b, ulong *lp)
-{
-	if (b->rn + 4 <= b->wn) {
-		*lp = smbnhgetl(b->buf + b->rn);
-		b->rn += 4;
-		return 1;
-	}
-	return 0;
-}
-
-int
-smbbuffergetv(SmbBuffer *b, vlong *vp)
-{
-	if (b->rn + 8 <= b->wn) {
-		*vp = smbnhgetv(b->buf + b->rn);
-		b->rn += 8;
-		return 1;
-	}
-	return 0;
-}
-
-ulong
-smbbufferreadspace(SmbBuffer *b)
-{
-	return b->wn - b->rn;
-}
-
-void
-smbbufferwritelimit(SmbBuffer *b, ulong limit)
-{
-	if (b->rn + limit < b->maxlen)
-		b->maxlen = b->rn + limit;
-}
-
-int
-smbbufferreadskipto(SmbBuffer *b, ulong offset)
-{
-	if (offset < b->rn || offset >= b->wn)
-		return 0;
-	b->rn = offset;
-	return 1;
-}
-
-int
-smbbufferpushreadlimit(SmbBuffer *b, ulong limit)
-{
-	if (b->flags & PUSHED)
-		return 0;
-	if (limit > b->wn || limit < b->rn)
-		return 0;
-	b->savewn = b->wn;
-	b->wn = limit;
-	b->flags |= PUSHED;
-	return 1;
-}
-
-int
-smbbufferpopreadlimit(SmbBuffer *b)
-{
-	if ((b->flags & PUSHED) == 0)
-		return 0;
-	b->wn = b->savewn;
-	b->flags &= ~PUSHED;
-	return 1;
-}
-
-int
-smbbufferwritebackup(SmbBuffer *b, ulong offset)
-{
-	if (offset >= b->rn && offset <= b->wn) {
-		b->wn = offset;
-		return 1;
-	}
-	return 0;
-}
-
-int
-smbbufferreadbackup(SmbBuffer *b, ulong offset)
-{
-	if (offset <= b->rn) {
-		b->rn = offset;
-		return 1;
-	}
-	return 0;
-}
-
-int
-smbbufferfixuprelatives(SmbBuffer *b, ulong fixupoffset)
-{
-	ulong fixval;
-	if (fixupoffset < b->rn || fixupoffset > b->wn - 2)
-		return 0;
-	fixval = b->wn - fixupoffset - 2;
-	if (fixval > 65535)
-		return 0;
-	smbhnputs(b->buf + fixupoffset, fixval);
-	return 1;
-}
-
-int
-smbbufferfixuprelativel(SmbBuffer *b, ulong fixupoffset)
-{
-	ulong fixval;
-	if (fixupoffset < b->rn || fixupoffset > b->wn - 4)
-		return 0;
-	fixval = b->wn - fixupoffset - 4;
-	smbhnputl(b->buf + fixupoffset, fixval);
-	return 1;
-}
-
-int
-smbbufferfixupabsolutes(SmbBuffer *b, ulong fixupoffset)
-{
-	if (fixupoffset < b->rn || fixupoffset > b->wn - 2)
-		return 0;
-	if (b->wn > 65535)
-		return 0;
-	smbhnputs(b->buf + fixupoffset, b->wn);
-	return 1;
-}
-
-int
-smbbufferfixupl(SmbBuffer *b, ulong fixupoffset, ulong fixupval)
-{
-	if (fixupoffset < b->rn || fixupoffset > b->wn - 4)
-		return 0;
-	smbhnputl(b->buf + fixupoffset, fixupval);
-	return 1;
-}
-
-int
-smbbufferfixupabsolutel(SmbBuffer *b, ulong fixupoffset)
-{
-	if (fixupoffset < b->rn || fixupoffset > b->wn - 2)
-		return 0;
-	smbhnputl(b->buf + fixupoffset, b->wn);
-	return 1;
-}
-
-int
-smbbufferfixuprelativeinclusivel(SmbBuffer *b, ulong fixupoffset)
-{
-	if (fixupoffset < b->rn || fixupoffset > b->wn - 4)
-		return 0;
-	smbhnputl(b->buf + fixupoffset, b->wn - fixupoffset);
-	return 1;
-}
-
-int
-smbbufferfill(SmbBuffer *b, uchar val, ulong len)
-{
-	if (b->maxlen - b->wn < len)
-		return 0;
-	memset(b->buf + b->wn, val, len);
-	b->wn += len;
-	return 1;
-}
-
-int
-smbbufferoffsetgetb(SmbBuffer *b, ulong offset, uchar *bp)
-{
-	if (offset >= b->rn && offset + 1 <= b->wn) {
-		*bp = b->buf[b->rn + offset];
-		return 1;
-	}
-	return 0;
-}
-
-int
-smbbuffercopy(SmbBuffer *to, SmbBuffer *from, ulong amount)
-{
-	if (smbbufferreadspace(from) < amount)
-		return 0;
-	if (smbbufferputbytes(to, smbbufferreadpointer(from), amount)) {
-		assert(smbbuffergetbytes(from, nil, amount));
-		return 1;
-	}
-	return 0;
-}
-
-int
-smbbufferoffsetcopystr(SmbBuffer *b, ulong offset, char *buf, int buflen, int *lenp)
-{
-	uchar *np;
-	if (offset < b->rn || offset >= b->wn)
-		return 0;
-	np = memchr(b->buf + offset, 0, b->wn - offset);
-	if (np == nil)
-		return 0;
-	*lenp = np - (b->buf + offset) + 1;
-	if (*lenp > buflen)
-		return 0;
-	memcpy(buf, b->buf + offset, *lenp);
-	return 1;
-}
--- a/sys/src/cmd/aquarela/smbclientopen.c
+++ /dev/null
@@ -1,53 +1,0 @@
-#include "headers.h"
-
-int
-smbclientopen(SmbClient *c, ushort mode, char *name, uchar *errclassp, ushort *errorp,
-	ushort *fidp, ushort *attrp, ulong *mtimep, ulong *sizep, ushort *accessallowedp, char **errmsgp)
-{
-	SmbBuffer *b;
-	SmbHeader h;
-	ulong bytecountfixup;
-	long n;
-	uchar *pdata;
-	ushort bytecount;
-
-	b = smbbuffernew(65535);
-	h = c->protoh;
-	h.tid = c->sharetid;
-	h.command = SMB_COM_OPEN;
-	h.wordcount = 2;
-	smbbufferputheader(b, &h, &c->peerinfo);
-	smbbufferputs(b, mode);
-	smbbufferputs(b, 0);
-	bytecountfixup = smbbufferwriteoffset(b);
-	smbbufferputs(b, 0);
-	smbbufferputb(b, 4);
-	smbbufferputstring(b, &c->peerinfo, SMB_STRING_REVPATH, name);
-	smbbufferfixuprelatives(b, bytecountfixup);
-	nbsswrite(c->nbss, smbbufferreadpointer(b), smbbufferwriteoffset(b));
-	smbbufferreset(b);
-	n = nbssread(c->nbss, smbbufferwritepointer(b), smbbufferwritespace(b));
-	if (n < 0) {
-		smbstringprint(errmsgp, "read error: %r");
-		smbbufferfree(&b);
-		return 0;
-	}
-	smbbuffersetreadlen(b, n);
-	if (!smbbuffergetandcheckheader(b, &h, h.command, 7, &pdata, &bytecount, errmsgp)) {
-		smbbufferfree(&b);
-		return 0;
-	}
-	if (h.errclass) {
-		*errclassp = h.errclass;
-		*errorp = h.error;
-		smbbufferfree(&b);
-		return 0;
-	}
-	*fidp = smbnhgets(pdata); pdata += 2;
-	*attrp = smbnhgets(pdata); pdata += 2;
-	*mtimep = smbnhgetl(pdata); pdata += 4;
-	*sizep = smbnhgets(pdata); pdata += 4;
-	*accessallowedp = smbnhgets(pdata);
-	return 1;
-}
-
--- a/sys/src/cmd/aquarela/smbcomclose.c
+++ /dev/null
@@ -1,24 +1,0 @@
-#include "headers.h"
-
-SmbProcessResult
-smbcomclose(SmbSession *s, SmbHeader *h, uchar *pdata, SmbBuffer *)
-{
-	SmbTree *t;
-	SmbFile *f;
-	ushort fid;
-	if (!smbcheckwordcount("comclose", h, 3))
-		return SmbProcessResultFormat;
-	t = smbidmapfind(s->tidmap, h->tid);
-	if (t == nil) {
-		smbseterror(s, ERRSRV, ERRinvtid);
-		return SmbProcessResultError;
-	}
-	fid = smbnhgets(pdata);
-	f = smbidmapfind(s->fidmap, fid);
-	if (f == nil) {
-		smbseterror(s, ERRDOS, ERRbadfid);
-		return SmbProcessResultError;
-	}
-	smbfileclose(s, f);
-	return smbbufferputack(s->response, h, &s->peerinfo);
-}
--- a/sys/src/cmd/aquarela/smbcomcreatedir.c
+++ /dev/null
@@ -1,34 +1,0 @@
-#include "headers.h"
-
-SmbProcessResult
-smbcomcreatedirectory(SmbSession *s, SmbHeader *h, uchar *, SmbBuffer *b)
-{
-	int fd;
-	char *path;
-	char *fullpath = nil;
-	SmbTree *t;
-	uchar fmt;
-
-	if (h->wordcount != 0)
-		return SmbProcessResultFormat;
-	if (!smbbuffergetb(b, &fmt) || fmt != 0x04 || !smbbuffergetstring(b, h, SMB_STRING_PATH, &path))
-		return SmbProcessResultFormat;
-	smblogprint(h->command, "smbcomcreatedirectory: %s\n", path);
-	t = smbidmapfind(s->tidmap, h->tid);
-	if (t == nil) {
-		smbseterror(s, ERRSRV, ERRinvtid);
-		return SmbProcessResultError;
-	}
-	smbstringprint(&fullpath, "%s%s", t->serv->path, path);
-	fd = create(fullpath, OREAD, DMDIR | 0775);
-	if (fd < 0) {
-		smblogprint(h->command, "smbcomcreatedirectory failed: %r\n");
-		smbseterror(s, ERRDOS, ERRnoaccess);
-		free(path);
-		return SmbProcessResultError;
-	}
-	close(fd);
-	free(fullpath);
-	free(path);
-	return smbbufferputack(s->response, h, &s->peerinfo);
-}
--- a/sys/src/cmd/aquarela/smbcomdelete.c
+++ /dev/null
@@ -1,76 +1,0 @@
-#include "headers.h"
-#include <String.h>
-
-int
-smbremovefile(SmbTree *t, char *dir, char *name)
-{
-	String *s;
-	int rv;
-	s = s_new();
-	s_append(s, t->serv->path);
-	s_append(s, "/");
-	if (dir) {
-		s_append(s, dir);
-		s_append(s, "/");
-	}
-	s_append(s, name);
-	rv = remove(s_to_c(s));
-	s_free(s);
-	return rv;
-}
-
-SmbProcessResult
-smbcomdelete(SmbSession *s, SmbHeader *h, uchar *pdata, SmbBuffer *b)
-{
-	SmbProcessResult pr;
-	ushort sattr;
-	uchar fmt;
-	char *pattern = nil;
-	char *dir = nil;
-	char *name = nil;
-	Reprog *r = nil;
-	SmbTree *t;
-	int x, count;
-	SmbDirCache *dc = nil;
-
-	if (h->wordcount != 1)
-		return SmbProcessResultFormat;
-	sattr = smbnhgets(pdata);
-	if (!smbbuffergetb(b, &fmt) || fmt != 0x04
-		|| !smbbuffergetstring(b, h, SMB_STRING_PATH, &pattern))
-		return SmbProcessResultFormat;
-	smblogprint(SMB_COM_DELETE, "searchattributes: 0x%.4ux\npattern:%s\n", sattr, pattern);
-	smbpathsplit(pattern, &dir, &name);
-	t = smbidmapfind(s->tidmap, h->tid);
-	if (t == nil) {
-		smbseterror(s, ERRSRV, ERRinvtid);
-		pr = SmbProcessResultError;
-		goto done;
-	}
-	dc = smbmkdircache(t, dir);
-	if (dc == nil) {
-		pr = SmbProcessResultMisc;
-		goto done;
-	}
-	r = smbmkrep(name);
-	count = 0;
-	for (x = 0; x < dc->n; x++) {
-		if (!smbmatch(dc->buf[x].name, r))
-			continue;
-		if (smbremovefile(t, dir, dc->buf[x].name) == 0)
-			count++;
-	}
-	if (count == 0) {
-		smbseterror(s, ERRDOS, ERRnoaccess);
-		pr = SmbProcessResultError;
-	}
-	else
-		pr = smbbufferputack(s->response,h, &s->peerinfo);
-done:
-	free(pattern);
-	free(dir);
-	free(name);
-	smbdircachefree(&dc);
-	free(r);
-	return pr;
-}
--- a/sys/src/cmd/aquarela/smbcomdeletedir.c
+++ /dev/null
@@ -1,34 +1,0 @@
-#include "headers.h"
-
-SmbProcessResult
-smbcomdeletedirectory(SmbSession *s, SmbHeader *h, uchar *, SmbBuffer *b)
-{
-	int rv;
-	char *path;
-	char *fullpath = nil;
-	SmbTree *t;
-	uchar fmt;
-
-	if (h->wordcount != 0)
-		return SmbProcessResultFormat;
-	if (!smbbuffergetb(b, &fmt) || fmt != 0x04 || !smbbuffergetstring(b, h, SMB_STRING_PATH, &path))
-		return SmbProcessResultFormat;
-	smblogprint(h->command, "smbcomdeletedirectory: %s\n", path);
-	t = smbidmapfind(s->tidmap, h->tid);
-	if (t == nil) {
-		smbseterror(s, ERRSRV, ERRinvtid);
-		return SmbProcessResultError;
-	}
-	smbstringprint(&fullpath, "%s%s", t->serv->path, path);
-	rv = remove(fullpath);
-	if (rv < 0) {
-		smblogprint(h->command, "smbcomdeletedirectory failed: %r\n");
-		smbseterror(s, ERRDOS, ERRnoaccess);
-		free(path);
-		free(fullpath);
-		return SmbProcessResultError;
-	}
-	free(path);
-	free(fullpath);
-	return smbbufferputack(s->response, h, &s->peerinfo);
-}
--- a/sys/src/cmd/aquarela/smbcomdir.c
+++ /dev/null
@@ -1,49 +1,0 @@
-#include "headers.h"
-
-SmbProcessResult
-smbcomcheckdirectory(SmbSession *s, SmbHeader *h, uchar *, SmbBuffer *b)
-{
-	char *path;
-	Dir *d;
-	uchar fmt;
-	SmbProcessResult pr;
-	SmbTree *t;
-	char *fullpath = nil;
-
-	if (!smbcheckwordcount("comcheckdirectory", h, 0))
-		return SmbProcessResultFormat;
-
-	if (!smbbuffergetb(b, &fmt)
-		|| fmt != 4
-		|| !smbbuffergetstring(b, h, SMB_STRING_PATH, &path))
-		return SmbProcessResultFormat;
-
-	t = smbidmapfind(s->tidmap, h->tid);
-	if (t == nil) {
-		smbseterror(s, ERRSRV, ERRinvtid);
-		return SmbProcessResultError;
-	}
-	
-	smbstringprint(&fullpath, "%s%s", t->serv->path, path);
-smblogprintif(1, "smbcomcheckdirectory: statting %s\n", fullpath);
-	d = dirstat(fullpath);
-
-	if (d == nil || (d->mode & DMDIR) == 0) {
-		smbseterror(s, ERRDOS, ERRbadpath);
-		pr = SmbProcessResultError;
-		goto done;
-	}
-
-	if (access(fullpath, AREAD) < 0) {
-		smbseterror(s, ERRDOS, ERRbadpath);
-		pr = SmbProcessResultError;
-		goto done;
-	}
-
-	pr = smbbufferputack(s->response, h, &s->peerinfo) ? SmbProcessResultReply : SmbProcessResultMisc;
-done:
-	free(fullpath);
-	free(path);
-	free(d);
-	return pr;
-}
--- a/sys/src/cmd/aquarela/smbcomecho.c
+++ /dev/null
@@ -1,25 +1,0 @@
-#include "headers.h"
-
-SmbProcessResult
-smbcomecho(SmbSession *s, SmbHeader *h, uchar *pdata, SmbBuffer *b)
-{
-	ushort echocount, e;
-	if (!smbcheckwordcount("comecho", h, 1))
-		return SmbProcessResultFormat;
-	echocount = smbnhgets(pdata);
-	for (e = 0; e < echocount; e++) {
-		ulong bytecountfixupoffset;
-		SmbProcessResult pr;
-		if (!smbbufferputheader(s->response, h, &s->peerinfo)
-			|| !smbbufferputs(s->response, e))
-			return SmbProcessResultMisc;
-		bytecountfixupoffset = smbbufferwriteoffset(s->response);
-		if (!smbbufferputbytes(s->response, smbbufferreadpointer(b), smbbufferreadspace(b))
-			|| !smbbufferfixuprelatives(s->response, bytecountfixupoffset))
-			return SmbProcessResultMisc;
-		pr = smbresponsesend(s);
-		if (pr != SmbProcessResultOk)
-			return SmbProcessResultDie;
-	}
-	return SmbProcessResultOk;
-}
--- a/sys/src/cmd/aquarela/smbcomfindclose2.c
+++ /dev/null
@@ -1,12 +1,0 @@
-#include "headers.h"
-
-SmbProcessResult
-smbcomfindclose2(SmbSession *s, SmbHeader *h, uchar *pdata, SmbBuffer *)
-{
-	ushort sid;
-	if (!smbcheckwordcount("comfindclose2", h, 1))
-		return SmbProcessResultFormat;
-	sid = smbnhgets(pdata);
-	smbsearchclosebyid(s, sid);
-	return smbbufferputack(s->response, h, &s->peerinfo);
-}
--- a/sys/src/cmd/aquarela/smbcomflush.c
+++ /dev/null
@@ -1,28 +1,0 @@
-#include "headers.h"
-#include <String.h>
-
-SmbProcessResult
-smbcomflush(SmbSession *s, SmbHeader *h, uchar *pdata, SmbBuffer *)
-{
-	SmbTree *t;
-	SmbFile *f;
-	ushort fid;
-	Dir nulldir;
-	if (h->wordcount != 1)
-		return SmbProcessResultFormat;
-	fid = smbnhgets(pdata);
-	t = smbidmapfind(s->tidmap, h->tid);
-	if (t == nil) {
-		smbseterror(s, ERRSRV, ERRinvtid);
-		return SmbProcessResultError;
-	}
-	f = smbidmapfind(s->fidmap, fid);
-	if (f == nil) {
-		smbseterror(s, ERRDOS, ERRbadfid);
-		return SmbProcessResultError;
-	}
-	memset(&nulldir, 0xff, sizeof(nulldir));
-	nulldir.name = nulldir.uid = nulldir.gid = nulldir.muid = nil;
-	dirfwstat(f->fd, &nulldir);
-	return smbbufferputack(s->response, h, &s->peerinfo);
-}
--- a/sys/src/cmd/aquarela/smbcomlocking.c
+++ /dev/null
@@ -1,132 +1,0 @@
-#include "headers.h"
-
-static int
-getlock(SmbBuffer *b, int large, ushort *pidp, uvlong *offsetp, uvlong *lengthp)
-{
-	ulong ohigh, olow;
-	ulong lhigh, llow;
-	if (!smbbuffergets(b, pidp))
-		return 0;
-	if (large && !smbbuffergetbytes(b, nil, 2))
-		return 0;
-	if (large) {
-		if (!smbbuffergetl(b, &ohigh) || !smbbuffergetl(b, &olow)
-			|| !smbbuffergetl(b, &lhigh) || !smbbuffergetl(b, &llow))
-			return 0;
-		*offsetp = ((uvlong)ohigh << 32) | olow;
-		*lengthp = ((uvlong)lhigh << 32) | llow;
-		return 1;
-	}
-	if (!smbbuffergetl(b, &olow) || !smbbuffergetl(b, &llow))
-		return 0;
-	*offsetp = olow;
-	*lengthp = llow;
-	return 1;
-}
-
-SmbProcessResult
-smbcomlockingandx(SmbSession *s, SmbHeader *h, uchar *pdata, SmbBuffer *b)
-{
-	uchar andxcommand;
-	ushort andxoffset;
-	ulong andxoffsetfixup;
-	ushort fid;
-	uchar locktype;
-	uchar oplocklevel;
-	ulong timeout;
-	ushort numberofunlocks;
-	ushort numberoflocks;
-	SmbTree *t;
-	SmbFile *f;
-	int l;
-	SmbProcessResult pr;
-	ulong backupoffset;
-	int large;
-
-	if (!smbcheckwordcount("comlockingandx", h, 8))
-		return SmbProcessResultFormat;
-
-	andxcommand = *pdata++;
-	pdata++;
-	andxoffset = smbnhgets(pdata); pdata += 2;
-	fid = smbnhgets(pdata); pdata += 2;
-	locktype = *pdata++;
-	oplocklevel = *pdata++;
-	timeout = smbnhgetl(pdata); pdata += 4;
-	numberofunlocks = smbnhgets(pdata); pdata += 2;
-	numberoflocks = smbnhgets(pdata);
-	smblogprint(h->command, "smbcomlockingandx: fid 0x%.4ux locktype 0x%.2ux oplocklevel 0x%.2ux timeout %lud numberofunlocks %d numberoflocks %ud\n",
-		fid, locktype, oplocklevel, timeout, numberofunlocks, numberoflocks);
-	large = locktype & 0x10;
-	locktype &= ~0x10;
-	if (locktype != 0 || oplocklevel != 0) {
-		smblogprint(-1, "smbcomlockingandx: locktype 0x%.2ux unimplemented\n", locktype);
-		return SmbProcessResultUnimp;
-	}
-	if (oplocklevel != 0) {
-		smblogprint(-1, "smbcomlockingandx: oplocklevel 0x%.2ux unimplemented\n", oplocklevel);
-		return SmbProcessResultUnimp;
-	}
-	t = smbidmapfind(s->tidmap, h->tid);
-	if (t == nil) {
-		smbseterror(s, ERRSRV, ERRinvtid);
-	error:
-		return SmbProcessResultError;
-	}
-	f = smbidmapfind(s->fidmap, fid);
-	if (f == nil) {
-		smbseterror(s, ERRDOS, ERRbadfid);
-		goto error;
-	}
-	backupoffset = smbbufferreadoffset(b);
-	for (l = 0; l < numberofunlocks; l++) {
-		ushort pid;
-		uvlong offset;
-		uvlong length;
-		if (!getlock(b, large, &pid, &offset, &length)) {
-			pr = SmbProcessResultFormat;
-			goto done;
-		}
-		smblogprint(h->command, "smbcomlockingandx: unlock pid 0x%.4ux offset %llud length %llud\n",
-			pid, offset, length);
-		smbsharedfileunlock(f->sf, s, h->pid, offset, offset + length);
-	}
-	for (l = 0; l < numberoflocks; l++) {
-		ushort pid;
-		uvlong offset;
-		uvlong length;
-		if (!getlock(b, large, &pid, &offset, &length)) {
-			pr = SmbProcessResultFormat;
-			goto done;
-		}
-		smblogprint(h->command, "smbcomlockingandx: lock pid 0x%.4ux offset %llud length %llud\n",
-			pid, offset, length);
-		if (!smbsharedfilelock(f->sf, s, h->pid, offset, offset + length))
-			break;
-	}
-	if (l < numberoflocks) {
-		ushort i;
-		ushort pid;
-		uvlong offset;
-		uvlong length;
-		smbbufferreadbackup(b, backupoffset);
-		for (i  = 0; i < l; i++) {
-			assert(getlock(b, large, &pid, &offset, &length));
-			smbsharedfileunlock(f->sf, s, h->pid, offset, offset + length);
-		}
-		smbseterror(s, ERRDOS, ERRlock);
-		goto error;
-	}
-	h->wordcount = 2;
-	if (!smbbufferputandxheader(s->response, h, &s->peerinfo, andxcommand, &andxoffsetfixup)
-		|| !smbbufferputs(s->response, 0)) {	// bytecount 0
-		pr = SmbProcessResultMisc;
-		goto done;
-	}
-	if (andxcommand != SMB_COM_NO_ANDX_COMMAND)
-		pr = smbchaincommand(s, h, andxoffsetfixup, andxcommand, andxoffset, b);
-	else
-		pr = SmbProcessResultReply;
-done:
-	return pr;
-}
--- a/sys/src/cmd/aquarela/smbcommon.c
+++ /dev/null
@@ -1,335 +1,0 @@
-#include "headers.h"
-
-int
-smbsendunicode(SmbPeerInfo *i)
-{
-	return smbglobals.unicode && (i == nil || (i->capabilities & CAP_UNICODE) != 0);
-}
-
-int
-smbcheckwordcount(char *name, SmbHeader *h, ushort wordcount)
-{
-	if (h->wordcount != wordcount) {
-		smblogprint(-1, "smb%s: word count not %ud\n", name, wordcount);
-		return 0;
-	}
-	return 1;
-}
-
-int
-smbcheckwordandbytecount(char *name, SmbHeader *h, ushort wordcount, uchar **bdatap, uchar **edatap)
-{
-	ushort bytecount;
-	uchar *bdata;
-	if (h->wordcount != wordcount) {
-		smblogprint(-1, "smb%s: word count not %ud\n", name, wordcount);
-		return 0;
-	}
-	bdata = *bdatap;
-	if (bdata + 2 > *edatap) {
-		smblogprint(-1, "smb%s: not enough data for byte count\n", name);
-		return 0;
-	}
-	bytecount = smbnhgets(bdata); bdata += 2;
-	if (bdata + bytecount > *edatap) {
-		smblogprint(-1, "smb%s: not enough data for bytes\n", name);
-		return 0;
-	}
-	*edatap = bdata + bytecount;
-	*bdatap = bdata;
-	return 1;
-}
-
-SmbProcessResult
-smbchaincommand(SmbSession *s, SmbHeader *h, ulong andxoffsetfixup, uchar cmd, ushort offset, SmbBuffer *b)
-{
-	SmbOpTableEntry *ote;
-	uchar *pdata;
-	ushort bytecount;
-
-	h->command = cmd;
-	ote = smboptable + cmd;
-	if (ote->process == nil) {
-		smblogprint(-1, "smbchaincommand: %s (0x%.2ux) not implemented\n", ote->name, cmd);
-		return SmbProcessResultUnimp;
-	}
-	if (!smbresponsealignl2(s, 2)
-		|| !smbresponseoffsetputs(s, andxoffsetfixup, smbresponseoffset(s))
-		|| !smbbufferpopreadlimit(b))
-		return SmbProcessResultMisc;
-	if (!smbbufferreadskipto(b, offset)) {
-		smblogprint(-1, "smbchaincommand: illegal offset\n");
-		return SmbProcessResultFormat;
-	}
-	if (!smbbuffergetb(b, &h->wordcount)) {
-		smblogprint(-1, "smbchaincommand: not enough space for wordcount\n");
-		return SmbProcessResultFormat;
-	}
-	pdata = smbbufferreadpointer(b);
-	if (!smbbuffergetbytes(b, nil, h->wordcount * 2)) {
-		smblogprint(-1, "smbchaincommand: not enough space for parameters\n");
-		return SmbProcessResultFormat;
-	}
-	if (!smbbuffergets(b, &bytecount)) {
-		smblogprint(-1, "smbchaincommand: not enough space for bytecount\n");
-		return SmbProcessResultFormat;
-	}
-	if (!smbbufferpushreadlimit(b, smbbufferreadoffset(b) + bytecount)) {
-		smblogprint(-1, "smbchaincommand: not enough space for bytes\n");
-		return SmbProcessResultFormat;
-	}
-smblogprint(cmd, "chaining to %s\n", ote->name);
-	return (*ote->process)(s, h, pdata, b);
-}
-
-int
-smbbuffergetheader(SmbBuffer *b, SmbHeader *h, uchar **parametersp, ushort *bytecountp)
-{
-	SmbOpTableEntry *ote;
-	SmbRawHeader *rh;
-	rh = (SmbRawHeader *)smbbufferreadpointer(b);
-	if (!smbbuffergetbytes(b, nil, (long)offsetof(SmbRawHeader, parameterwords[0]))) {
-		smblogprint(-1, "smbgetheader: short packet\n");
-		return 0;
-	}
-	if (rh->protocol[0] != 0xff || memcmp(rh->protocol + 1, "SMB", 3) != 0) {
-		smblogprint(-1, "smbgetheader: invalid protocol\n");
-		return 0;
-	}
-	h->command = rh->command;
-	ote = smboptable + h->command;
-	if (ote->name == nil) {
-		smblogprint(-1, "smbgetheader: illegal opcode 0x%.2ux\n", h->command);
-		return 0;
-	}
-	h->errclass = rh->status[0];
-	h->error = smbnhgets(rh->status + 2);
-	h->flags = rh->flags;
-	h->flags2 = smbnhgets(rh->flags2);
-	if (h->flags & ~(SmbHeaderFlagCaseless | SMB_FLAGS_SERVER_TO_REDIR | SmbHeaderFlagReserved | SmbHeaderFlagServerIgnore))
-		smblogprint(-1, "smbgetheader: warning: unexpected flags 0x%.2ux\n", h->flags);
-	h->wordcount = rh->wordcount;
-	if (parametersp)
-		*parametersp = smbbufferreadpointer(b);
-	if (!smbbuffergetbytes(b, nil, h->wordcount * 2)) {
-		smblogprint(-1, "smbgetheader: not enough data for parameter words\n");
-		return 0;
-	}
-	h->tid = smbnhgets(rh->tid);
-	h->pid = smbnhgets(rh->pid);
-	h->uid = smbnhgets(rh->uid);
-	h->mid = smbnhgets(rh->mid);
-	if (!smbbuffergets(b, bytecountp))
-		*bytecountp = 0;
-	if (!smbbufferpushreadlimit(b, smbbufferreadoffset(b) + *bytecountp))
-		return 0;
-
-smblogprint(h->command, "%s %s: tid 0x%.4ux pid 0x%.4ux uid 0x%.4ux mid 0x%.4ux\n", ote->name,
-	(h->flags & SMB_FLAGS_SERVER_TO_REDIR) ? "response" : "request", h->tid, h->pid, h->uid, h->mid);
-	return 1;
-}
-
-int
-smbcheckheaderdirection(SmbHeader *h, int response, char **errmsgp)
-{
-	if (((h->flags & SMB_FLAGS_SERVER_TO_REDIR) == 0) == response) {
-		smbstringprint(errmsgp, "unexpected %s", response ? "request" : "response");
-		return 0;
-	}
-	return 1;
-}
-
-int
-smbcheckheader(SmbHeader *h, uchar command, int response, char **errmsgp)
-{
-	if (response && h->command != command) {
-		smbstringprint(errmsgp, "sent %.2uc request, got %.2ux response", command, h->command);
-		return 0;
-	}
-	if (!smbcheckheaderdirection(h, response, errmsgp))
-		return 0;
-	return 1;
-}
-
-int
-smbbuffergetandcheckheader(SmbBuffer *b, SmbHeader *h, uchar command, int response, uchar **pdatap, ushort *bytecountp, char **errmsgp)
-{
-	if (!smbbuffergetheader(b, h, pdatap, bytecountp)) {
-		smbstringprint(errmsgp, "smbbuffergetandcheckheader: not enough data for header");
-		return 0;
-	}
-	return smbcheckheader(h, command, response, errmsgp);
-}
-
-int
-smbsuccess(SmbHeader *h, char **errmsgp)
-{
-	if (h->errclass != SUCCESS) {
-		smbstringprint(errmsgp, "%s returned error %d/%d", smboptable[h->command].name, h->errclass, h->error);
-		return 0;
-	}
-	return 1;
-}
-
-#define BASE_FLAGS (0)
-
-int
-smbbufferputheader(SmbBuffer *b, SmbHeader *h, SmbPeerInfo *p)
-{
-	SmbRawHeader *rh;
-	if (offsetof(SmbRawHeader, parameterwords[0]) > smbbufferwritespace(b))
-		return 0;
-	if (smbbufferwriteoffset(b) == 0) {
-		rh = (SmbRawHeader *)smbbufferwritepointer(b);
-		rh->protocol[0] = 0xff;
-		memcpy(rh->protocol + 1, "SMB", 3);
-		rh->flags = SMB_FLAGS_SERVER_TO_REDIR | SmbHeaderFlagCaseless;
-		rh->command = h->command;
-		smbhnputs(rh->flags2, BASE_FLAGS | (smbsendunicode(p) ? SMB_FLAGS2_UNICODE : 0));
-		memset(rh->extra, 0, sizeof(rh->extra));
-		if (!smbbufferputbytes(b, nil, offsetof(SmbRawHeader, parameterwords[0])))
-			return 0;
-		rh->wordcount = h->wordcount;
-	}
-	else {
-		rh = (SmbRawHeader *)smbbufferreadpointer(b);
-		smbbufferputb(b, h->wordcount);
-	}
-	rh->status[0] = h->errclass;
-	rh->status[1] = 0;
-	smbhnputs(rh->status + 2, h->error);
-	smbhnputs(rh->tid, h->tid);
-	smbhnputs(rh->pid, h->pid);
-	smbhnputs(rh->uid, h->uid);
-	smbhnputs(rh->mid, h->mid);
-	return 1;
-}
-
-int
-smbbufferputerror(SmbBuffer *s, SmbHeader *h, SmbPeerInfo *p, uchar errclass, ushort error)
-{
-	h->errclass = errclass;
-	h->error = error;
-	return smbbufferputheader(s, h, p);
-}
-
-int
-smbbufferputandxheader(SmbBuffer *b, SmbHeader *h, SmbPeerInfo *p, uchar andxcommand, ulong *andxoffsetfixupp)
-{
-	if (!smbbufferputheader(b, h, p)
-		|| !smbbufferputb(b, andxcommand)
-		|| !smbbufferputb(b, 0))
-		return 0;
-	*andxoffsetfixupp = smbbufferwriteoffset(b);
-	return smbbufferputbytes(b, nil, 2);
-}
-
-void
-smbseterror(SmbSession *s, uchar errclass, ushort error)
-{
-	s->errclass = errclass;
-	s->error = error;
-}
-
-SmbProcessResult
-smbbufferputack(SmbBuffer *b, SmbHeader *h, SmbPeerInfo *p)
-{
-	h->wordcount = 0;
-	return smbbufferputheader(b, h, p) && smbbufferputs(b, 0) ? SmbProcessResultReply : SmbProcessResultMisc;
-}
-
-ushort
-smbplan9mode2dosattr(ulong mode)
-{
-	if (mode & DMDIR)
-		return SMB_ATTR_DIRECTORY;
-	return SMB_ATTR_NORMAL;
-}
-
-ulong
-smbdosattr2plan9mode(ushort attr)
-{
-	ulong mode = 0444;
-	if ((attr & SMB_ATTR_READ_ONLY) == 0)
-		mode |= 0222;
-	if (attr & SMB_ATTR_DIRECTORY) {
-		mode |= DMDIR | 0711;
-		mode &= DMDIR | 0755;
-	}
-	else
-		mode &= 0744;
-	return mode;
-}
-
-ulong
-smbdosattr2plan9wstatmode(ulong oldmode, ushort attr)
-{
-	ulong mode;
-	if (oldmode & DMDIR)
-		attr |= SMB_ATTR_DIRECTORY;
-	else
-		attr &= ~SMB_ATTR_DIRECTORY;
-	mode = smbdosattr2plan9mode(attr);
-	if (oldmode & 0444)
-		mode = (mode & ~0444) | (mode & 0444);
-	if ((attr & SMB_ATTR_READ_ONLY) == 0)
-		mode |= oldmode & 0222;
-	if (mode == oldmode)
-		mode = 0xffffffff;
-	return mode;
-}
-
-ulong
-smbplan9length2size32(vlong length)
-{
-	if (length > 0xffffffff)
-		return 0xffffffff;
-	return length;
-}
-
-vlong
-smbl2roundupvlong(vlong v, int l2)
-{
-	ulong mask;
-	mask = (1 << l2) - 1;
-	return (v + mask) & ~mask;
-}
-
-SmbSlut smbsharemodeslut[] = {
-	{ "compatibility", SMB_OPEN_MODE_SHARE_COMPATIBILITY },
-	{ "exclusive", SMB_OPEN_MODE_SHARE_EXCLUSIVE },
-	{ "denywrite", SMB_OPEN_MODE_SHARE_DENY_WRITE },
-	{ "denyread", SMB_OPEN_MODE_SHARE_DENY_READOREXEC },
-	{ "denynone", SMB_OPEN_MODE_SHARE_DENY_NONE },
-	{ 0 }
-};
-
-SmbSlut smbopenmodeslut[] = {
-	{ "oread", OREAD },
-	{ "owrite", OWRITE },
-	{ "ordwr", ORDWR },
-	{ "oexec", OEXEC },
-	{ 0 }
-};
-
-int
-smbslut(SmbSlut *s, char *pat)
-{
-	while (s->name) {
-		if (cistrcmp(s->name, pat) == 0)
-			return s->val;
-		s++;
-	}
-	return -1;
-}
-
-char *
-smbrevslut(SmbSlut *s, int val)
-{
-	while (s->name) {
-		if (s->val == val)
-			return s->name;
-		s++;
-	}
-	return nil;
-}
--- a/sys/src/cmd/aquarela/smbcomopen.c
+++ /dev/null
@@ -1,712 +1,0 @@
-#include "headers.h"
-
-static void
-smblogprintattr(int cmd, ushort attr)
-{
-	if (attr & SMB_ATTR_READ_ONLY)
-		smblogprint(cmd, " readonly");
-	if (attr & SMB_ATTR_HIDDEN)
-		smblogprint(cmd, " hidden");
-	if (attr & SMB_ATTR_SYSTEM)
-		smblogprint(cmd, " system");
-	if (attr & SMB_ATTR_DIRECTORY)
-		smblogprint(cmd, " directory");
-	if (attr & SMB_ATTR_ARCHIVE)
-		smblogprint(cmd, " archive");
-}
-
-static SmbFile *
-openfile(SmbSession *s, SmbTree *t, char *path, ushort mode, ushort attr, ushort ofun, ulong createoptions, uvlong createsize,
-	ushort *fidp, Dir **dp, ushort *actionp)
-{
-	int p9mode;
-	int share;
-	Dir *d = nil;
-	int fd = -1;
-	ushort action;
-	SmbFile *f = nil;
-	SmbSharedFile *sf = nil;
-	char *fullpath = nil;
-	int diropen = 0;
-
-//smblogprint(-1, "%s A %r", path);
-	p9mode = (mode >> SMB_OPEN_MODE_ACCESS_SHIFT) & SMB_OPEN_MODE_ACCESS_MASK;	
-	share = (mode >> SMB_OPEN_MODE_SHARE_SHIFT) & SMB_OPEN_MODE_SHARE_MASK;	
-	if (share == SMB_OPEN_MODE_SHARE_COMPATIBILITY) {
-	badshare:
-//smblogprint(-1, "%s SMB_OPEN_MODE_SHARE_COMPATIBILITY", path);
-		smbseterror(s, ERRDOS, ERRbadshare);
-		goto done;
-	}
-	smbstringprint(&fullpath, "%s%s", t->serv->path, path);
-	d = dirstat(fullpath);
-	if (d) {
-		/* file exists */
-		int ofunexist;
-		if (d->mode & DMDIR) {
-			if (createoptions & SMB_CO_FILE) {
-				smbseterror(s, ERRDOS, ERRnoaccess);
-				goto done;
-			}
-		}
-		else if (createoptions & SMB_CO_DIRECTORY) {
-			smbseterror(s, ERRDOS, ERRnoaccess);
-			goto done;
-		}
-			
-		sf = smbsharedfileget(d, p9mode, &share);
-		if (sf == nil)
-			goto badshare;
-		action = 1;
-		ofunexist = (ofun >> SMB_OFUN_EXIST_SHIFT) & SMB_OFUN_EXIST_MASK;
-		if (ofunexist == SMB_OFUN_EXIST_FAIL) {
-			smbseterror(s, ERRDOS, ERRfilexists);
-			goto done;
-		}
-		else if (ofunexist == SMB_OFUN_EXIST_TRUNCATE) {
-			if ((d->mode & DMDIR) || (p9mode != OWRITE && p9mode != ORDWR)) {
-				smbseterror(s, ERRDOS, ERRbadaccess);
-				goto done;
-			}
-			p9mode |= OTRUNC;
-			action = 3;
-		}
-		else if (ofunexist != SMB_OFUN_EXIST_OPEN) {
-			smbseterror(s, ERRDOS, ERRbadaccess);
-			goto done;
-		}
-		if (d->mode & DMDIR)
-			diropen = 1;
-		else
-			fd = open(fullpath, p9mode);
-	}
-	else {
-		/* file does not exist */
-		ulong p9attr;
-		action = 3;
-		if ((ofun & SMB_OFUN_NOEXIST_CREATE) == 0) {
-			smbseterror(s, ERRDOS, ERRbadfile);
-			goto done;
-		}
-		if (createsize != 0) {
-			smbseterror(s, ERRDOS, ERRunsup);
-			goto done;
-		}
-//smblogprint(-1, "creating: attr 0x%.4ux co 0x%.8lux\n", attr, createoptions);
-		if (createoptions & SMB_CO_FILE) {
-			attr &= SMB_ATTR_DIRECTORY;
-			if (attr == 0)
-				attr = SMB_ATTR_NORMAL;
-		}
-		else if (createoptions & SMB_CO_DIRECTORY) {
-			attr &= ~SMB_ATTR_NORMAL;
-			attr |= SMB_ATTR_DIRECTORY;
-			p9mode = OREAD;
-		}
-//smblogprint(-1, "creating: before conversion attr 0x%.4ux\n", attr);
-		p9attr = smbdosattr2plan9mode(attr);
-//smblogprint(-1, "creating: after conversion p9attr 0%.uo\n", p9attr);
-		fd = create(fullpath, p9mode, p9attr);
-		if (fd >= 0) {
-			d = dirfstat(fd);
-			sf = smbsharedfileget(d, p9mode, &share);
-			if (sf == nil) {
-				close(fd);
-				remove(path);
-				goto badshare;
-			}
-		}
-	}
-//smblogprint(-1, "%s D %r", fullpath);
-	if (!diropen && fd < 0) {
-		smbseterror(s, ERRSRV, ERRaccess);
-		goto done;
-	}
-	f = smbemalloc(sizeof(SmbFile));
-	if (diropen) {
-		f->ioallowed = 0;
-		f->fd = -1;
-	}
-	else {
-		f->ioallowed = 1;
-		f->fd = fd;
-	}
-	f->name = smbestrdup(path);
-	f->sf = sf;
-	sf = nil;
-	f->share = share;
-	f->p9mode = p9mode;
-	f->t = t;
-	if (s->fidmap == nil)
-		s->fidmap = smbidmapnew();
-	*fidp = smbidmapadd(s->fidmap, f);
-//smblogprint(h->command, "REPLY:\n t->id=0x%ux fid=%d path=%s\n", t->id, *fidp, path);
-	smblogprintif(smbglobals.log.fids, "openfile: 0x%.4ux/0x%.4ux %s\n", t->id, *fidp, path);
-	if (actionp)
-		*actionp = action;
-	if (dp) {
-		*dp = d;
-		d = nil;
-	}
-done:
-	if (sf)
-		smbsharedfileput(nil, sf, share);
-	free(d);
-	free(fullpath);
-	return f;
-}
-
-SmbProcessResult
-smbcomopenandx(SmbSession *s, SmbHeader *h, uchar *pdata, SmbBuffer *b)
-{
-	uchar andxcommand;
-	ushort andxoffset, flags, mode, sattr, attr;
-	ulong createtime;	
-	ushort ofun;
-	ulong createsize, timeout;
-	char *path = nil;
-	ulong andxoffsetfixupoffset;
-	SmbProcessResult pr;
-	ushort action;
-	Dir *d = nil;
-	SmbFile *f;
-	SmbTree *t;
-	ushort fid;
-
-	if (!smbcheckwordcount("comopenandx", h, 15))
-		return SmbProcessResultFormat;
-
-	andxcommand = *pdata++;
-	pdata++;
-	andxoffset = smbnhgets(pdata); pdata += 2;
-	flags = smbnhgets(pdata); pdata += 2;
-	mode = smbnhgets(pdata); pdata += 2;
-	sattr = smbnhgets(pdata); pdata += 2;
-	attr = smbnhgets(pdata); pdata += 2;
-	createtime = smbnhgetl(pdata); pdata += 4;
-	ofun = smbnhgets(pdata); pdata += 2;
-	createsize = smbnhgetl(pdata); pdata += 4;
-	timeout = smbnhgetl(pdata); pdata += 4;
-	pdata += 4;
-	USED(pdata);
-	if (!smbbuffergetstring(b, h, SMB_STRING_PATH, &path)) {
-		pr = SmbProcessResultFormat;
-		goto done;
-	}
-
-	smbloglock();
-	smblogprint(h->command, "flags 0x%.4ux", flags);
-	if (flags & SMB_OPEN_FLAGS_ADDITIONAL)
-		smblogprint(h->command, " additional");
-	if (flags & SMB_OPEN_FLAGS_OPLOCK)
-		smblogprint(h->command, " oplock");
-	if (flags & SMB_OPEN_FLAGS_OPBATCH)
-		smblogprint(h->command, " opbatch");
-	smblogprint(h->command, "\n");
-	smblogprint(h->command, "mode 0x%.4ux", mode);
-	switch ((mode >> SMB_OPEN_MODE_ACCESS_SHIFT) & SMB_OPEN_MODE_ACCESS_MASK) {
-	case OREAD:
-		smblogprint(h->command, " OREAD");
-		break;
-	case OWRITE:
-		smblogprint(h->command, " OWRITE");
-		break;
-	case ORDWR:
-		smblogprint(h->command, " ORDWR");
-		break;
-	case OEXEC:
-		smblogprint(h->command, " OEXEC");
-		break;
-	}
-	switch ((mode >> SMB_OPEN_MODE_SHARE_SHIFT) & SMB_OPEN_MODE_SHARE_MASK) {
-	case SMB_OPEN_MODE_SHARE_COMPATIBILITY:
-		smblogprint(h->command, " compatinility");
-		break;
-	case SMB_OPEN_MODE_SHARE_EXCLUSIVE:
-		smblogprint(h->command, " exclusive");
-		break;
-	case SMB_OPEN_MODE_SHARE_DENY_WRITE:
-		smblogprint(h->command, " deny write");
-		break;
-	case SMB_OPEN_MODE_SHARE_DENY_READOREXEC:
-		smblogprint(h->command, " deny readorxec");
-		break;
-	case SMB_OPEN_MODE_SHARE_DENY_NONE:
-		smblogprint(h->command, " deny none");
-		break;
-	}
-	if (mode & SMB_OPEN_MODE_WRITE_THROUGH)
-		smblogprint(h->command, " write through");
-	smblogprint(h->command, "\n");
-	smblogprint(h->command, "sattr 0x%.4ux", sattr);
-	smblogprintattr(h->command, sattr);
-	smblogprint(h->command, "\n");
-	smblogprint(h->command, "attr 0x%.4ux", attr);
-	smblogprintattr(h->command, attr);
-	smblogprint(h->command, "\n");
-	smblogprint(h->command, "createtime 0x%.8lux\n", createtime);
-	smblogprint(h->command, "ofun 0x%.4ux", ofun);
-	if (ofun & SMB_OFUN_NOEXIST_CREATE)
-		smblogprint(h->command, " noexistscreate");
-	else
-		smblogprint(h->command, " noexistfail");
-	switch ((ofun >> SMB_OFUN_EXIST_SHIFT) & SMB_OFUN_EXIST_MASK) {
-	case SMB_OFUN_EXIST_FAIL:
-		smblogprint(h->command, " existfail");
-		break;
-	case SMB_OFUN_EXIST_OPEN:
-		smblogprint(h->command, " existopen");
-		break;
-	case SMB_OFUN_EXIST_TRUNCATE:
-		smblogprint(h->command, " existtruncate");
-		break;
-	}
-	smblogprint(h->command, "\n");
-	smblogprint(h->command, "createsize 0x%.8lux\n", createsize);
-	smblogprint(h->command, "timeout 0x%.8lux\n", timeout);
-	smblogprint(h->command, "path %s\n", path);
-	smblogunlock();
-
-	t = smbidmapfind(s->tidmap, h->tid);
-	if (t == nil) {
-		smbseterror(s, ERRSRV, ERRinvtid);
-		goto errordone;
-	}
-
-	f = openfile(s, t, path, mode, attr, ofun, 0, createsize, &fid, &d, &action);
-	if (f == nil) {
-		pr = SmbProcessResultError;
-		goto done;
-	}
-	h->wordcount = 15;
-	if (!smbbufferputandxheader(s->response, h, &s->peerinfo, andxcommand, &andxoffsetfixupoffset)
-		|| !smbbufferputs(s->response, fid)
-		|| !smbbufferputs(s->response, smbplan9mode2dosattr(d->mode))
-		|| !smbbufferputl(s->response, smbplan9time2utime(d->mtime, s->tzoff))
-		|| !smbbufferputl(s->response, smbplan9length2size32(d->length))
-		|| !smbbufferputs(s->response, smbplan9mode2dosattr(d->mode)) // probbaly bogus
-		|| !smbbufferputs(s->response, 0)	// all files are files
-		|| !smbbufferputs(s->response, 0)	// pipe state
-		|| !smbbufferputs(s->response, action)
-		|| !smbbufferputl(s->response, 0)	// fileID
-		|| !smbbufferputs(s->response, 0)
-		|| !smbbufferputs(s->response, 0)) {	// bytecount 0
-		smbfileclose(s, f);
-		pr = SmbProcessResultMisc;
-		goto done;
-	}
-	if (andxcommand != SMB_COM_NO_ANDX_COMMAND)
-		pr = smbchaincommand(s, h, andxoffsetfixupoffset, andxcommand, andxoffset, b);
-	else
-		pr = SmbProcessResultReply;
-	goto done;	
-errordone:
-	pr = SmbProcessResultError;
-done:
-	free(path);
-	free(d);
-	return pr;
-}
-
-SmbProcessResult
-smbcomopen(SmbSession *s, SmbHeader *h, uchar *pdata, SmbBuffer *b)
-{
-	uchar fmt;
-	char *path;
-	ushort mode, attr;
-	SmbTree *t;
-	ushort fid;
-	Dir *d = nil;
-	SmbFile *f;
-	SmbProcessResult pr;
-
-	if (!smbcheckwordcount("comopen", h, 2))
-		return SmbProcessResultFormat;
-	mode = smbnhgets(pdata);
-	attr = smbnhgets(pdata + 2);
-	if (!smbbuffergetb(b, &fmt)
-		|| fmt != 4
-		|| !smbbuffergetstring(b, h, SMB_STRING_PATH, &path)) {
-		pr = SmbProcessResultFormat;
-		goto done;
-	}
-	t = smbidmapfind(s->tidmap, h->tid);
-	if (t == nil) {
-		smbseterror(s, ERRSRV, ERRinvtid);
-	error:
-		pr = SmbProcessResultError;
-		goto done;
-	}
-	f = openfile(s, t, path, mode, attr,
-		SMB_OFUN_EXIST_OPEN << SMB_OFUN_EXIST_SHIFT,
-		0, 0, &fid, &d, nil);
-	if (f == nil)
-		goto error;
-	h->wordcount = 7;
-	if (!smbbufferputheader(s->response, h, &s->peerinfo)
-		|| !smbbufferputs(s->response, fid)
-		|| !smbbufferputs(s->response, smbplan9mode2dosattr(d->mode))
-		|| !smbbufferputl(s->response, smbplan9time2utime(d->mtime, s->tzoff))
-		|| !smbbufferputl(s->response, smbplan9length2size32(d->length))
-		|| !smbbufferputs(s->response, 2)		// lies - this should be the actual access allowed
-		|| !smbbufferputs(s->response, 0))
-		pr = SmbProcessResultMisc;
-	else
-		pr = SmbProcessResultReply;
-done:
-	free(path);
-	free(d);
-	return pr;
-}
-
-
-/*
-   smb_com      SMBcreate       smb_com      SMBcreate
-   smb_wct      3               smb_wct      1
-   smb_vwv[0]   attribute       smb_vwv[0]   file handle
-   smb_vwv[1]   time low        smb_bcc      0
-   smb_vwv[2]   time high
-   smb_bcc      min = 2
-   smb_buf[]    ASCII -- 04
-                file pathname
-*/
-
-SmbProcessResult
-smbcomcreate(SmbSession *s, SmbHeader *h, uchar *pdata, SmbBuffer *b)
-{
-	int ofun, attr, mode;
-	long createtime;
-	char *path;
-	uchar fmt;
-	SmbFile *f;
-	SmbTree *t;
-	ushort fid;
-	SmbProcessResult pr;
-
-	path = nil;
-	if (!smbcheckwordcount("comcreate", h, 3))
-		return SmbProcessResultFormat;
-
-	smblogprint(h->command, "tid=%d\n", h->tid);
-	attr = smbnhgets(pdata); pdata += 2;
-	createtime = smbnhgetl(pdata);
-	if (!smbbuffergetb(b, &fmt) || fmt != 0x04 || 
-	    !smbbuffergetstring(b, h, SMB_STRING_PATH, &path)){
-		pr = SmbProcessResultError;
-		goto done;
-	}
-
-	smbloglock();
-	smblogprint(h->command, "path %s\n", path);
-	smblogprint(h->command, "attr 0x%.4ux", attr);
-	smblogprintattr(h->command, attr);
-	smblogprint(h->command, "\n");
-	smblogprint(h->command, "createtime 0x%.8lux\n", createtime);
-	smblogunlock();
-
-	t = smbidmapfind(s->tidmap, h->tid);
-	if (t == nil) {
-		pr = SmbProcessResultError;
-		goto done;
-	}
-
-	mode = (ORDWR<<SMB_OPEN_MODE_ACCESS_SHIFT) | // SFS: FIXME: should be OWRITE?
-		(SMB_OPEN_MODE_SHARE_EXCLUSIVE<<SMB_OPEN_MODE_SHARE_SHIFT);
-	ofun = SMB_OFUN_NOEXIST_CREATE|(SMB_OFUN_EXIST_FAIL<<SMB_OFUN_EXIST_SHIFT);
-	f = openfile(s, t, path, mode, attr, ofun, SMB_CO_FILE, 0, &fid, nil, nil);
-	if (f == nil) {
-		pr = SmbProcessResultError;
-		goto done;
-	}
-
-	h->wordcount = 1;		// SFS: FIXME: unsure of this constant, maybe should be 3
-	if (!smbbufferputheader(s->response, h, &s->peerinfo)
-		|| !smbbufferputs(s->response, fid)
-		|| !smbbufferputs(s->response, 0)){	// bytecount 0
-		pr = SmbProcessResultMisc;
-		goto done;
-	}
-	pr = SmbProcessResultReply;
-	goto done;
-
-done:
-	free(path);
-	return pr;
-}
-
-
-typedef struct SmbSblut {
-	char *s;
-	ulong mask;
-} SmbSblut;
-
-static SmbSblut dasblut[] = {
-	{ "SMB_DA_SPECIFIC_READ_DATA", SMB_DA_SPECIFIC_READ_DATA },
-	{ "SMB_DA_SPECIFIC_WRITE_DATA", SMB_DA_SPECIFIC_WRITE_DATA },
-	{ "SMB_DA_SPECIFIC_APPEND_DATA", SMB_DA_SPECIFIC_APPEND_DATA },
-	{ "SMB_DA_SPECIFIC_READ_EA", SMB_DA_SPECIFIC_READ_EA },
-	{ "SMB_DA_SPECIFIC_WRITE_EA", SMB_DA_SPECIFIC_WRITE_EA },
-	{ "SMB_DA_SPECIFIC_EXECUTE", SMB_DA_SPECIFIC_EXECUTE },
-	{ "SMB_DA_SPECIFIC_DELETE_CHILD", SMB_DA_SPECIFIC_DELETE_CHILD },
-	{ "SMB_DA_SPECIFIC_READ_ATTRIBUTES", SMB_DA_SPECIFIC_READ_ATTRIBUTES },
-	{ "SMB_DA_SPECIFIC_WRITE_ATTRIBUTES", SMB_DA_SPECIFIC_WRITE_ATTRIBUTES },
-	{ "SMB_DA_STANDARD_DELETE_ACCESS", SMB_DA_STANDARD_DELETE_ACCESS },
-	{ "SMB_DA_STANDARD_READ_CONTROL_ACCESS", SMB_DA_STANDARD_READ_CONTROL_ACCESS },
-	{ "SMB_DA_STANDARD_WRITE_DAC_ACCESS", SMB_DA_STANDARD_WRITE_DAC_ACCESS },
-	{ "SMB_DA_STANDARD_WRITE_OWNER_ACCESS", SMB_DA_STANDARD_WRITE_OWNER_ACCESS },
-	{ "SMB_DA_STANDARD_SYNCHRONIZE_ACCESS", SMB_DA_STANDARD_SYNCHRONIZE_ACCESS },
-	{ "SMB_DA_GENERIC_ALL_ACCESS", SMB_DA_GENERIC_ALL_ACCESS },
-	{ "SMB_DA_GENERIC_EXECUTE_ACCESS", SMB_DA_GENERIC_EXECUTE_ACCESS },
-	{ "SMB_DA_GENERIC_WRITE_ACCESS", SMB_DA_GENERIC_WRITE_ACCESS },
-	{ "SMB_DA_GENERIC_READ_ACCESS", SMB_DA_GENERIC_READ_ACCESS },
-	{ 0 }
-};
-
-static SmbSblut efasblut[] = {
-	{ "SMB_ATTR_READ_ONLY", SMB_ATTR_READ_ONLY },
-	{ "SMB_ATTR_HIDDEN", SMB_ATTR_HIDDEN },
-	{ "SMB_ATTR_SYSTEM", SMB_ATTR_SYSTEM },
-	{ "SMB_ATTR_DIRECTORY", SMB_ATTR_DIRECTORY },
-	{ "SMB_ATTR_ARCHIVE", SMB_ATTR_ARCHIVE },
-	{ "SMB_ATTR_NORMAL", SMB_ATTR_NORMAL },
-	{ "SMB_ATTR_COMPRESSED", SMB_ATTR_COMPRESSED },
-	{ "SMB_ATTR_TEMPORARY", SMB_ATTR_TEMPORARY },
-	{ "SMB_ATTR_WRITETHROUGH", SMB_ATTR_WRITETHROUGH },
-	{ "SMB_ATTR_NO_BUFFERING", SMB_ATTR_NO_BUFFERING },
-	{ "SMB_ATTR_RANDOM_ACCESS", SMB_ATTR_RANDOM_ACCESS },
-	{ 0 }
-};
-
-static SmbSblut sasblut[] = {
-	{ "SMB_SA_SHARE_READ", SMB_SA_SHARE_READ },
-	{ "SMB_SA_SHARE_WRITE", SMB_SA_SHARE_WRITE },
-	{ "SMB_SA_SHARE_DELETE", SMB_SA_SHARE_DELETE },
-	{ "SMB_SA_NO_SHARE", SMB_SA_NO_SHARE },
-	{ 0 }
-};
-
-static SmbSblut cosblut[] = {
-	{ "SMB_CO_DIRECTORY", SMB_CO_DIRECTORY },
-	{ "SMB_CO_WRITETHROUGH", SMB_CO_WRITETHROUGH },
-	{ "SMB_CO_SEQUENTIAL_ONLY", SMB_CO_SEQUENTIAL_ONLY },
-	{ "SMB_CO_FILE", SMB_CO_FILE },
-	{ "SMB_CO_NO_EA_KNOWLEDGE", SMB_CO_NO_EA_KNOWLEDGE },
-	{ "SMB_CO_EIGHT_DOT_THREE_ONLY", SMB_CO_EIGHT_DOT_THREE_ONLY },
-	{ "SMB_CO_RANDOM_ACCESS", SMB_CO_RANDOM_ACCESS },
-	{ "SMB_CO_DELETE_ON_CLOSE", SMB_CO_DELETE_ON_CLOSE },
-	{ 0 }
-};
-
-static SmbSlut cdslut[] = {
-	{ "SMB_CD_SUPERCEDE", SMB_CD_SUPERCEDE },
-	{ "SMB_CD_OPEN", SMB_CD_OPEN },
-	{ "SMB_CD_CREATE", SMB_CD_CREATE },
-	{ "SMB_CD_OPEN_IF", SMB_CD_OPEN_IF },
-	{ "SMB_CD_OVERWRITE", SMB_CD_OVERWRITE },
-	{ "SMB_CD_OVERWRITE_IF", SMB_CD_OVERWRITE_IF },
-	{ 0 }
-};
-
-static void
-smbsblutlogprint(uchar cmd, SmbSblut *sblut, ulong mask)
-{
-	while (sblut->s) {
-		if (mask && (sblut->mask & mask) || (mask == 0 && sblut->mask == 0))
-			smblogprint(cmd, " %s", sblut->s);
-		sblut++;
-	}
-}
-
-SmbProcessResult
-smbcomntcreateandx(SmbSession *s, SmbHeader *h, uchar *pdata, SmbBuffer *b)
-{
-	uchar andxcommand;
-	ushort andxoffset;
-	char *path = nil;
-	SmbProcessResult pr;
-	ulong namelength;
-	ulong flags;
-	ulong rootdirectoryfid, desiredaccess;
-	uvlong allocationsize;
-	ulong extfileattributes, shareaccess, createdisposition, createoptions, impersonationlevel;
-	uchar securityflags;
-	int p9mode;
-	int sharemode;
-	ushort mode;
-	SmbTree *t;
-	ushort ofun;
-	SmbFile *f;
-	ushort fid;
-	Dir *d = nil;
-	ushort action;
-	uvlong mtime;
-	ulong andxoffsetfixup;
-
-	if (!smbcheckwordcount("comntcreateandx", h, 24))
-		return SmbProcessResultFormat;
-
-	andxcommand = *pdata++;
-	pdata++;
-	andxoffset = smbnhgets(pdata); pdata += 2;
-	pdata++;
-	namelength = smbnhgets(pdata); pdata += 2;
-	flags = smbnhgetl(pdata); pdata += 4;
-	rootdirectoryfid = smbnhgetl(pdata); pdata += 4;
-	desiredaccess = smbnhgetl(pdata); pdata += 4;
-	allocationsize = smbnhgetv(pdata); pdata += 8;
-	extfileattributes = smbnhgetl(pdata); pdata += 4;
-	shareaccess = smbnhgetl(pdata); pdata += 4;
-	createdisposition = smbnhgetl(pdata); pdata += 4;
-	createoptions = smbnhgetl(pdata); pdata += 4;
-	impersonationlevel = smbnhgetl(pdata); pdata += 4;
-	securityflags = *pdata++;
-	USED(pdata);
-
-	if (!smbbuffergetstring(b, h, SMB_STRING_PATH, &path)) {
-		pr = SmbProcessResultFormat;
-		goto done;
-	}
-
-	smblogprint(h->command, "namelength %d\n", namelength);
-	smblogprint(h->command, "flags 0x%.8lux\n", flags);
-	smblogprint(h->command, "rootdirectoryfid %lud\n", rootdirectoryfid);
-	smblogprint(h->command, "desiredaccess 0x%.8lux", desiredaccess);
-	smbsblutlogprint(h->command, dasblut, desiredaccess);
-	smblogprint(h->command, "\n");
-	smblogprint(h->command, "allocationsize %llud\n", allocationsize);
-	smblogprint(h->command, "extfileattributes 0x%.8lux", extfileattributes);
-	smbsblutlogprint(h->command, efasblut, extfileattributes);
-	smblogprint(h->command, "\n");
-	smblogprint(h->command, "shareaccess 0x%.8lux", shareaccess);
-	smbsblutlogprint(h->command, sasblut, shareaccess);
-	smblogprint(h->command, "\n");
-	smblogprint(h->command, "createdisposition 0x%.8lux %s\n",
-		createdisposition, smbrevslut(cdslut, createdisposition));
-	smblogprint(h->command, "createoptions 0x%.8lux", createoptions);
-	smbsblutlogprint(h->command, cosblut, createoptions);
-	smblogprint(h->command, "\n");
-	smblogprint(h->command, "impersonationlevel 0x%.8lux\n", impersonationlevel);
-	smblogprint(h->command, "securityflags 0x%.2ux\n", securityflags);
-	smblogprint(h->command, "path %s\n", path);
-
-	if (rootdirectoryfid != 0) {
-		smblogprint(-1, "smbcomntcreateandx: fid relative not implemented\n");
-		goto unimp;
-	}
-
-	if (desiredaccess & SMB_DA_GENERIC_MASK)
-		switch (desiredaccess & SMB_DA_GENERIC_MASK){
-		case SMB_DA_GENERIC_READ_ACCESS:
-			p9mode = OREAD;
-			break;
-		case SMB_DA_GENERIC_WRITE_ACCESS:
-			p9mode = OWRITE;
-			break;
-		case SMB_DA_GENERIC_ALL_ACCESS:
-			p9mode = ORDWR;
-			break;
-		case SMB_DA_GENERIC_EXECUTE_ACCESS:
-			p9mode = OEXEC;
-			break;
-		default:
-			p9mode = OREAD;
-			break;
-		}
-	else
-	if (desiredaccess & SMB_DA_SPECIFIC_READ_DATA)
-		if (desiredaccess & (SMB_DA_SPECIFIC_WRITE_DATA | SMB_DA_SPECIFIC_APPEND_DATA))
-			p9mode = ORDWR;
-		else
-			p9mode = OREAD;
-	else if (desiredaccess & (SMB_DA_SPECIFIC_WRITE_DATA | SMB_DA_SPECIFIC_APPEND_DATA))
-		p9mode = ORDWR;
-	else
-		p9mode = OREAD;
-
-	if (shareaccess == SMB_SA_NO_SHARE)
-		sharemode = SMB_OPEN_MODE_SHARE_EXCLUSIVE;
-	else if (shareaccess & (SMB_SA_SHARE_READ | SMB_SA_SHARE_WRITE) ==
-		(SMB_SA_SHARE_READ | SMB_SA_SHARE_WRITE))
-		sharemode = SMB_OPEN_MODE_SHARE_DENY_NONE;
-	else if (shareaccess & SMB_SA_SHARE_READ)
-		sharemode = SMB_OPEN_MODE_SHARE_DENY_WRITE;
-	else if (shareaccess & SMB_SA_SHARE_WRITE)
-		sharemode = SMB_OPEN_MODE_SHARE_DENY_READOREXEC;
-	else
-		sharemode = SMB_OPEN_MODE_SHARE_DENY_NONE;
-
-	mode = (sharemode << SMB_OPEN_MODE_SHARE_SHIFT) | (p9mode << SMB_OPEN_MODE_ACCESS_SHIFT);
-
-	switch (createdisposition) {
-	default:
-		smblogprint(-1, "smbcomntcreateandx: createdisposition 0x%.8lux not implemented\n", createdisposition);
-		goto unimp;
-	case SMB_CD_OPEN:
-		ofun = SMB_OFUN_EXIST_OPEN;
-		break;
-	case SMB_CD_CREATE:
-		ofun = SMB_OFUN_EXIST_FAIL | SMB_OFUN_NOEXIST_CREATE;
-		break;
-	case SMB_CD_OPEN_IF:
-		ofun = SMB_OFUN_EXIST_OPEN | SMB_OFUN_NOEXIST_CREATE;
-		break;
-	case SMB_CD_OVERWRITE:
-		ofun = SMB_OFUN_EXIST_TRUNCATE;
-		break;
-	case SMB_CD_OVERWRITE_IF:
-		ofun = SMB_OFUN_EXIST_TRUNCATE | SMB_OFUN_NOEXIST_CREATE;
-		break;
-	}
-
-	t = smbidmapfind(s->tidmap, h->tid);
-	if (t == nil) {
-		smbseterror(s, ERRSRV, ERRinvtid);
-		pr = SmbProcessResultError;
-		goto done;
-	}
-
-	f = openfile(s, t, path, mode, extfileattributes, ofun, createoptions, allocationsize, &fid, &d, &action);
-
-	if (f == nil) {
-		pr = SmbProcessResultError;
-		goto done;
-	}
-
-	h->wordcount = 42;
-	mtime =  smbplan9time2time(d->mtime);
-	if (!smbbufferputandxheader(s->response, h, &s->peerinfo, andxcommand, &andxoffsetfixup)
-		|| !smbbufferputb(s->response, 0)		// oplocks? pah
-		|| !smbbufferputs(s->response, fid)
-		|| !smbbufferputl(s->response, action)
-		|| !smbbufferputv(s->response, mtime)
-		|| !smbbufferputv(s->response, smbplan9time2time(d->atime))
-		|| !smbbufferputv(s->response, mtime)
-		|| !smbbufferputv(s->response, mtime)
-		|| !smbbufferputl(s->response, smbplan9mode2dosattr(d->mode))
-		|| !smbbufferputv(s->response, smbl2roundupvlong(d->length, smbglobals.l2allocationsize))
-		|| !smbbufferputv(s->response, d->length)
-		|| !smbbufferputbytes(s->response, nil, 4)
-		|| !smbbufferputb(s->response, (d->qid.type & QTDIR) != 0)
-		|| !smbbufferputbytes(s->response, nil, 8)
-		|| !smbbufferputs(s->response, 0)) {
-		pr = SmbProcessResultMisc;
-		goto done;
-	}
-
-	if (andxcommand != SMB_COM_NO_ANDX_COMMAND)
-		pr = smbchaincommand(s, h, andxoffsetfixup, andxcommand, andxoffset, b);
-	else
-		pr = SmbProcessResultReply;
-
-	goto done;
-
-unimp:
-	pr = SmbProcessResultUnimp;
-
-done:
-	free(path);
-	free(d);
-
-	return pr;
-}
-
--- a/sys/src/cmd/aquarela/smbcomquery.c
+++ /dev/null
@@ -1,95 +1,0 @@
-#include "headers.h"
-
-SmbProcessResult
-smbcomqueryinformation(SmbSession *s, SmbHeader *h, uchar *, SmbBuffer *b)
-{
-	SmbTree *t;
-	uchar fmt;
-	char *path;
-	Dir *d;
-	char *fullpath;
-
-	if (!smbcheckwordcount("comqueryinformation", h, 0)
-		|| !smbbuffergetb(b, &fmt)
-		|| fmt != 4
-		|| !smbbuffergetstring(b, h, SMB_STRING_PATH, &path))
-		return SmbProcessResultFormat;
-	t = smbidmapfind(s->tidmap, h->tid);
-	if (t == nil) {
-		free(path);
-		smbseterror(s, ERRSRV, ERRinvtid);
-		return SmbProcessResultError;
-	}
-	smblogprint(h->command, "smbcomqueryinformation: %s\n", path);
-	fullpath = nil;
-	smbstringprint(&fullpath, "%s%s", t->serv->path, path);
-	d = dirstat(fullpath);
-	free(fullpath);
-	free(path);
-	if (d == nil) {
-		smbseterror(s, ERRDOS, ERRbadpath);
-		return SmbProcessResultError;
-	}
-	h->wordcount = 10;
-	if (!smbbufferputheader(s->response, h, &s->peerinfo)
-		|| !smbbufferputs(s->response, smbplan9mode2dosattr(d->mode))
-		|| !smbbufferputl(s->response, smbplan9time2utime(d->mtime, s->tzoff))
-		|| !smbbufferputl(s->response, smbplan9length2size32(d->length))
-		|| !smbbufferfill(s->response, 0, 10)
-		|| !smbbufferputs(s->response, 0)) {
-		free(d);
-		return SmbProcessResultMisc;
-	}
-	free(d);
-	return SmbProcessResultReply;
-}
-
-SmbProcessResult
-smbcomqueryinformation2(SmbSession *s, SmbHeader *h, uchar *pdata, SmbBuffer *)
-{
-	SmbTree *t;
-	Dir *d;
-	ushort fid;
-	ushort mtime, mdate;
-	ushort atime, adate;
-	SmbFile *f;
-
-	if (!smbcheckwordcount("comqueryinformation2", h, 1))
-		return SmbProcessResultFormat;
-	fid = smbnhgets(pdata);
-	t = smbidmapfind(s->tidmap, h->tid);
-	if (t == nil) {
-		smbseterror(s, ERRSRV, ERRinvtid);
-		return SmbProcessResultError;
-	}
-	f = smbidmapfind(s->fidmap, fid);
-	if (f == nil) {
-		smbseterror(s, ERRDOS, ERRbadfid);
-		return SmbProcessResultError;
-	}
-	d = dirfstat(f->fd);
-	if (d == nil) {
-		smbseterror(s, ERRDOS, ERRbadpath);
-		return SmbProcessResultError;
-	}
-	h->wordcount = 11;
-	smbplan9time2datetime(d->atime, s->tzoff, &adate, &atime);
-	smbplan9time2datetime(d->mtime, s->tzoff, &mdate, &mtime);
-	if (!smbbufferputheader(s->response, h, &s->peerinfo)
-		|| !smbbufferputs(s->response, mdate)
-		|| !smbbufferputs(s->response, mtime)
-		|| !smbbufferputs(s->response, adate)
-		|| !smbbufferputs(s->response, atime)
-		|| !smbbufferputs(s->response, mdate)
-		|| !smbbufferputs(s->response, mtime)
-		|| !smbbufferputl(s->response, smbplan9length2size32(d->length))
-		|| !smbbufferputl(s->response,
-			smbplan9length2size32(smbl2roundupvlong(d->length, smbglobals.l2allocationsize)))
-		|| !smbbufferputs(s->response, smbplan9mode2dosattr(d->mode))
-		|| !smbbufferputs(s->response, 0)) {
-		free(d);
-		return SmbProcessResultMisc;
-	}
-	free(d);
-	return SmbProcessResultReply;
-}
--- a/sys/src/cmd/aquarela/smbcomread.c
+++ /dev/null
@@ -1,84 +1,0 @@
-#include "headers.h"
-
-SmbProcessResult
-smbcomreadandx(SmbSession *s, SmbHeader *h, uchar *pdata, SmbBuffer *b)
-{
-	uchar andxcommand;
-	ushort andxoffset;
-	ulong andxoffsetfixup;
-	ulong datafixup;
-	ulong bytecountfixup;
-	ushort fid;
-	SmbTree *t;
-	SmbFile *f;
-	vlong offset;
-	ushort maxcount;
-	long toread;
-	long nb;
-
-	if (h->wordcount != 10 && h->wordcount != 12)
-		return SmbProcessResultFormat;
-
-	andxcommand = *pdata++;
-	pdata++;
-	andxoffset = smbnhgets(pdata); pdata += 2;
-	fid = smbnhgets(pdata); pdata += 2;
-	offset = smbnhgetl(pdata); pdata += 4;
-	maxcount = smbnhgets(pdata); pdata += 2;
-	pdata += 2;	// mincount
-	pdata += 4;	// timeout ?
-	pdata += 2;	// remaining
-	if (h->wordcount == 12)
-		offset |= (vlong)smbnhgetl(pdata) << 32;
-
-	t = smbidmapfind(s->tidmap, h->tid);
-	if (t == nil) {
-		smbseterror(s, ERRSRV, ERRinvtid);
-		return SmbProcessResultError;
-	}
-	f = smbidmapfind(s->fidmap, fid);
-	if (f == nil) {
-		smbseterror(s, ERRDOS, ERRbadfid);
-		return SmbProcessResultError;
-	}
-	
-	if (!f->ioallowed) {
-		smbseterror(s, ERRDOS, ERRbadaccess);
-		return SmbProcessResultError;
-	}
-
-	h->wordcount = 12;
-	if (!smbbufferputandxheader(s->response, h, &s->peerinfo, andxcommand, &andxoffsetfixup))
-		return SmbProcessResultMisc;
-	if (!smbbufferputs(s->response, -1)			// remaining
-		|| !smbbufferputs(s->response, 0)		// datacompactionmode
-		|| !smbbufferputs(s->response, 0))		// reserved
-		return SmbProcessResultMisc;
-	datafixup = smbbufferwriteoffset(s->response);
-	if (!smbbufferputbytes(s->response, nil, 6)
-		|| !smbbufferfill(s->response, 0, 8))		// reserved
-		return SmbProcessResultMisc;
-	bytecountfixup = smbbufferwriteoffset(s->response);
-	if (!smbbufferputs(s->response, 0)
-		|| !smbbufferputb(s->response, 0))
-		return SmbProcessResultMisc;
-	smbbufferwritelimit(s->response, smbbufferwriteoffset(s->response) + 65535);
-	smbbufferoffsetputs(s->response, datafixup + 2, smbbufferwriteoffset(s->response));
-	seek(f->fd, offset, 0);
-	toread = smbbufferwritespace(s->response);	
-	if (toread > maxcount)
-		toread = maxcount;
-	nb = readn(f->fd, smbbufferwritepointer(s->response), toread);
-	if (nb < 0) {
-		smbseterror(s, ERRDOS, ERRbadaccess);
-		return SmbProcessResultError;
-	}
-	if (!smbbufferputbytes(s->response, nil, nb)
-		|| !smbbufferfixuprelatives(s->response, bytecountfixup)
-		|| !smbbufferoffsetputs(s->response, datafixup, nb)
-		|| !smbbufferoffsetputs(s->response, datafixup + 4, nb >> 16))
-		return SmbProcessResultMisc;
-	if (andxcommand != SMB_COM_NO_ANDX_COMMAND)
-		return smbchaincommand(s, h, andxoffsetfixup, andxcommand, andxoffset, b);
-	return SmbProcessResultReply;
-}
--- a/sys/src/cmd/aquarela/smbcomrename.c
+++ /dev/null
@@ -1,57 +1,0 @@
-#include "headers.h"
-
-SmbProcessResult
-smbcomrename(SmbSession *s, SmbHeader *h, uchar *, SmbBuffer *b)
-{
-	int rv;
-	char *old,     *new;
-	char *oldpath = nil;
-	char *newpath = nil;
-	char *olddir, *newdir;
-	char *oldname, *newname;
-	uchar oldfmt, newfmt;
-	SmbTree *t;
-	Dir d;
-	SmbProcessResult pr;
-
-	if (h->wordcount != 1)
-		return SmbProcessResultFormat;
-	if (!smbbuffergetb(b, &oldfmt) || oldfmt != 0x04 || !smbbuffergetstring(b, h, SMB_STRING_PATH, &old)
-		|| !smbbuffergetb(b, &newfmt) || newfmt != 0x04 || !smbbuffergetstring(b, h, SMB_STRING_PATH, &new))
-		return SmbProcessResultFormat;
-
-	t = smbidmapfind(s->tidmap, h->tid);
-	if (t == nil) {
-		smbseterror(s, ERRSRV, ERRinvtid);
-		return SmbProcessResultError;
-	}
-	smbstringprint(&oldpath, "%s%s", t->serv->path, old);
-	smbstringprint(&newpath, "%s%s", t->serv->path, new);
-
-	smblogprint(h->command, "smbcomrename: %s to %s\n", oldpath, newpath);
-	smbpathsplit(oldpath, &olddir, &oldname);
-	smbpathsplit(newpath, &newdir, &newname);
-	if (strcmp(olddir, newdir) != 0) {
-		smblogprint(h->command, "smbcomrename: directories differ\n");
-		goto noaccess;
-	}
-	memset(&d, 0xff, sizeof(d));
-	d.uid = d.gid = d.muid = nil;
-	d.name = newname;
-	rv = dirwstat(oldpath, &d);
-	if (rv < 0) {
-		smblogprint(h->command, "smbcomrename failed: %r\n");
-	noaccess:
-		smbseterror(s, ERRDOS, ERRnoaccess);
-		pr =  SmbProcessResultError;
-	}
-	else
-		pr = smbbufferputack(s->response, h, &s->peerinfo);
-	free(oldpath);
-	free(olddir);
-	free(oldname);
-	free(newpath);
-	free(newdir);
-	free(newname);
-	return pr;
-}
--- a/sys/src/cmd/aquarela/smbcomsessionsetupandx.c
+++ /dev/null
@@ -1,190 +1,0 @@
-#include "headers.h"
-#include <mp.h>
-#include <libsec.h>
-
-SmbProcessResult
-smbcomsessionsetupandx(SmbSession *s, SmbHeader *h, uchar *pdata, SmbBuffer *b)
-{
-	uchar andxcommand;
-	ushort andxoffset;
-	ulong andxfixupoffset;
-	ushort vcnumber;
-	ulong sessionkey;
-	ushort caseinsensitivepasswordlength;
-	ushort casesensitivepasswordlength;
-	ushort bytecountfixup, offset;
-	uchar *mschapreply;
-	AuthInfo *ai;
-	char *sp;
-	SmbProcessResult pr;
-	char *accountname = nil;
-	char *primarydomain = nil;
-	char *nativeos = nil;
-	char *nativelanman = nil;
-
-	if (!smbcheckwordcount("comsessionsetupandx", h, 13)) {
-	fmtfail:
-		pr = SmbProcessResultFormat;
-		goto done;
-	}
-
-	andxcommand = *pdata++;
-	switch (andxcommand) {
-	case SMB_COM_TREE_CONNECT_ANDX:
-	case SMB_COM_OPEN_ANDX:
-	case SMB_COM_CREATE_NEW:
-	case SMB_COM_DELETE:
-	case SMB_COM_FIND:
-	case SMB_COM_COPY:
-	case SMB_COM_NT_RENAME:
-	case SMB_COM_QUERY_INFORMATION:
-	case SMB_COM_NO_ANDX_COMMAND:
-	case SMB_COM_OPEN:
-	case SMB_COM_CREATE:
-	case SMB_COM_CREATE_DIRECTORY:
-	case SMB_COM_DELETE_DIRECTORY:
-	case SMB_COM_FIND_UNIQUE:
-	case SMB_COM_RENAME:
-	case SMB_COM_CHECK_DIRECTORY:
-	case SMB_COM_SET_INFORMATION:
-	case SMB_COM_OPEN_PRINT_FILE:
-		break;
-	default:
-		smblogprint(h->command, "smbcomsessionsetupandx: invalid andxcommand %s (0x%.2ux)\n",
-			smboptable[andxcommand].name, andxcommand);
-		goto fmtfail;
-	}
-	pdata++;
-	andxoffset = smbnhgets(pdata); pdata += 2;
-	s->peerinfo.maxlen = smbnhgets(pdata); pdata += 2;
-	smbresponseinit(s, s->peerinfo.maxlen);
-	s->client.maxmpxcount = smbnhgets(pdata); pdata += 2;
-	vcnumber = smbnhgets(pdata); pdata += 2;
-	sessionkey = smbnhgetl(pdata); pdata += 4;
-	caseinsensitivepasswordlength = smbnhgets(pdata); pdata += 2;
-	casesensitivepasswordlength = smbnhgets(pdata); pdata += 2;
-	pdata += 4;
-	s->peerinfo.capabilities = smbnhgetl(pdata); /*pdata += 4;*/
-smbloglock();
-smblogprint(h->command, "andxcommand: %s offset %ud\n", smboptable[andxcommand].name, andxoffset);
-smblogprint(h->command, "client.maxbuffersize: %ud\n", s->peerinfo.maxlen);
-smblogprint(h->command, "client.maxmpxcount: %ud\n", s->client.maxmpxcount);
-smblogprint(h->command, "vcnumber: %ud\n", vcnumber);
-smblogprint(h->command, "sessionkey: 0x%.8lux\n", sessionkey);
-smblogprint(h->command, "caseinsensitivepasswordlength: %ud\n", caseinsensitivepasswordlength);
-smblogprint(h->command, "casesensitivepasswordlength: %ud\n", casesensitivepasswordlength);
-smblogprint(h->command, "clientcapabilities: 0x%.8lux\n", s->peerinfo.capabilities);
-smblogunlock();
-
-	mschapreply = smbbufferreadpointer(b);
-
-	if (!smbbuffergetbytes(b, nil, caseinsensitivepasswordlength + casesensitivepasswordlength)) {
-		smblogprint(h->command, "smbcomsessionsetupandx: not enough bdata for passwords\n");
-		goto fmtfail;
-	}
-	if (!smbbuffergetstring(b, h, 0, &accountname)
-		|| !smbbuffergetstring(b, h, 0, &primarydomain)
-		|| !smbbuffergetstring(b, h, 0, &nativeos)
-		|| !smbbuffergetstring(b, h, 0, &nativelanman)) {
-		smblogprint(h->command, "smbcomsessionsetupandx: not enough bytes for strings\n");
-		goto fmtfail;
-	}
-
-	for (sp = accountname; *sp; sp++)
-		*sp = tolower(*sp);
-
-smblogprint(h->command, "account: %s\n", accountname);
-smblogprint(h->command, "primarydomain: %s\n", primarydomain);
-smblogprint(h->command, "nativeos: %s\n", nativeos);
-smblogprint(h->command, "nativelanman: %s\n", nativelanman);
-
-	if (s->client.accountname && accountname[0] && strcmp(s->client.accountname, accountname) != 0) {
-		smblogprint(h->command, "smbcomsessionsetupandx: more than one user on VC (before %s, now %s)\n",
-			s->client.accountname, accountname);
-		smbseterror(s, ERRSRV, ERRtoomanyuids);
-	errordone:
-		pr = SmbProcessResultError;
-		goto done;
-	}
-
-	if (s->client.accountname == nil) {
-		/* first time */
-		if (accountname[0] == 0) {
-			smbseterror(s, ERRSRV, ERRbaduid);
-			goto errordone;
-		}
-		if ((casesensitivepasswordlength != 24 || caseinsensitivepasswordlength != 24)) {
-			smblogprint(h->command,
-				"smbcomsessionsetupandx: case sensitive/insensitive password length not 24\n");
-			smbseterror(s, ERRSRV, ERRbadpw);
-			goto errordone;
-		}
-		memcpy(&s->client.mschapreply, mschapreply, sizeof(s->client.mschapreply));
-		if(s->cs == nil){
-			smbseterror(s, ERRSRV, ERRerror);
-			goto errordone;
-		}
-		s->cs->user = accountname;
-		s->cs->resp = &s->client.mschapreply;
-		s->cs->nresp = sizeof(MSchapreply);
-		ai = auth_response(s->cs);
-		if (ai == nil) {
-			smblogprint(h->command, "authentication failed\n");
-			smbseterror(s, ERRSRV, ERRbadpw);
-			goto errordone;
-		}
-		smblogprint(h->command, "authentication succeeded\n");
-		if (auth_chuid(ai, nil) < 0) {
-			smblogprint(h->command, "smbcomsessionsetupandx: chuid failed: %r\n");
-			auth_freeAI(ai);
-		miscerror:
-			pr = SmbProcessResultMisc;
-			goto done;
-		}
-		auth_freeAI(ai);
-		h->uid = 1;
-		s->client.accountname = accountname;
-		s->client.primarydomain = primarydomain;
-		s->client.nativeos = nativeos;
-		s->client.nativelanman = nativelanman;
-		accountname = nil;
-		primarydomain = nil;
-		nativeos = nil;
-		nativelanman = nil;
-	}
-	else {
-		if (caseinsensitivepasswordlength == 24 && casesensitivepasswordlength == 24
-			&& memcmp(&s->client.mschapreply, mschapreply, sizeof(MSchapreply)) != 0) {
-			smblogprint(h->command, "second time authentication failed\n");
-			smbseterror(s, ERRSRV, ERRbadpw);
-			goto errordone;
-		}
-	}
-
-	/* CIFS says 4 with or without extended security, samba/ms says 3 without */
-	h->wordcount = 3;
-	if (!smbresponseputandxheader(s, h, andxcommand, &andxfixupoffset))
-		goto miscerror;
-	if (!smbresponseputs(s, 0))
-		goto miscerror;
-	bytecountfixup = smbresponseoffset(s);
-	if (!smbresponseputs(s, 0))
-		goto miscerror;
-	if (!smbresponseputstring(s, 1, smbglobals.nativeos)
-		|| !smbresponseputstring(s, 1, smbglobals.serverinfo.nativelanman)
-		|| !smbresponseputstring(s, 1, smbglobals.primarydomain))
-		goto miscerror;
-	offset = smbresponseoffset(s);
-	smbresponseoffsetputs(s, bytecountfixup, offset - bytecountfixup - 2);
-	s->state = SmbSessionEstablished;
-	if (andxcommand != SMB_COM_NO_ANDX_COMMAND)
-		pr = smbchaincommand(s, h, andxfixupoffset, andxcommand, andxoffset, b);
-	else
-		pr = SmbProcessResultReply;
-done:
-	free(accountname);
-	free(primarydomain);
-	free(nativeos);
-	free(nativelanman);
-	return pr;
-}
--- a/sys/src/cmd/aquarela/smbcomsetinfo.c
+++ /dev/null
@@ -1,107 +1,0 @@
-#include "headers.h"
-
-SmbProcessResult
-smbcomsetinformation2(SmbSession *s, SmbHeader *h, uchar *pdata, SmbBuffer *)
-{
-	ushort fid, adate, atime, mdate, mtime;
-	SmbTree *t;
-	SmbFile *f;
-	Dir d;
-
-	if (h->wordcount != 7)
-		return SmbProcessResultFormat;
-	fid = smbnhgets(pdata);
-	adate = smbnhgets(pdata + 6);
-	atime = smbnhgets(pdata + 8);
-	mdate = smbnhgets(pdata + 10);
-	mtime = smbnhgets(pdata + 12);
-	smblogprint(h->command,
-		"smbcomsetinformation2: fid 0x%.4ux adate 0x%.4ux atime 0x%.4ux mdate 0x%.4ux mtime 0x%.4ux\n",
-		fid, adate, atime, mdate, mtime);
-	t = smbidmapfind(s->tidmap, h->tid);
-	if (t == nil) {
-		smbseterror(s, ERRSRV, ERRinvtid);
-		return SmbProcessResultError;
-	}
-	f = smbidmapfind(s->fidmap, fid);
-	if (f == nil) {
-		smbseterror(s, ERRDOS, ERRbadfid);
-		return SmbProcessResultError;
-	}
-	memset(&d, 0xff, sizeof(d));
-	d.name = d.uid = d.gid = d.muid = nil;
-	if (adate || atime || mdate || mtime) {
-//smblogprint(-1, "smbcomsetinformation2: changing times not implemented\n");
-//		return SmbProcessResultUnimp;
-		/* something to change */
-		if (!(adate && atime && mdate && mtime)) {
-			/* some null entries */
-			ushort odate, otime;
-			Dir *od = dirfstat(f->fd);
-			if (od == nil) {
-				smbseterror(s, ERRDOS, ERRnoaccess);
-				return SmbProcessResultError;
-			}
-			if (adate || atime) {
-				/* something changed in access time */
-				if (!(adate && atime)) {
-					/* some nulls in access time */
-					smbplan9time2datetime(d.atime, s->tzoff, &odate, &otime);
-					if (adate == 0)
-						adate = odate;
-					if (atime == 0)
-						atime = otime;
-				}
-				d.atime = smbdatetime2plan9time(adate, atime, s->tzoff);
-			}
-			if (mdate || mtime) {
-				/* something changed in modify time */
-				if (!(mdate && mtime)) {
-					/* some nulls in modify time */
-					smbplan9time2datetime(d.mtime, s->tzoff, &odate, &otime);
-					if (mdate == 0)
-						mdate = odate;
-					if (mtime == 0)
-						mtime = otime;
-				}
-				d.mtime = smbdatetime2plan9time(mdate, mtime, s->tzoff);
-			}
-			free(od);
-		}
-		if (dirfwstat(f->fd, &d) < 0) {
-			smbseterror(s, ERRDOS, ERRnoaccess);
-			return SmbProcessResultError;
-		}
-	}
-	return smbbufferputack(s->response, h, &s->peerinfo);
-}
-
-SmbProcessResult
-smbcomsetinformation(SmbSession *s, SmbHeader *h, uchar *pdata, SmbBuffer *b)
-{
-	ushort attr;
-	ulong utime;
-	char *name;
-	if (h->wordcount != 8)
-		return SmbProcessResultFormat;
-	attr = smbnhgets(pdata); pdata += 2;
-	utime = smbnhgetl(pdata);
-	if (!smbbuffergetstring(b, h, SMB_STRING_PATH, &name))
-		return SmbProcessResultFormat;
-	smblogprint(h->command,
-		"smbcomsetinformation: attr 0x%.4ux utime %lud path %s\n",
-		attr, utime, name);
-	if (utime) {
-		Dir d;
-		memset(&d, 0xff, sizeof(d));
-		d.name = d.uid = d.gid = d.muid = nil;
-		d.mtime = smbutime2plan9time(utime, s->tzoff);
-		if (dirwstat(name, &d) < 0) {
-			smbseterror(s, ERRDOS, ERRnoaccess);
-			free(name);
-			return SmbProcessResultError;
-		}
-	}
-	free(name);		
-	return smbbufferputack(s->response, h, &s->peerinfo);
-}
--- a/sys/src/cmd/aquarela/smbcomtransaction.c
+++ /dev/null
@@ -1,137 +1,0 @@
-#include "headers.h"
-
-static int
-sendresponse(void *magic, SmbBuffer *, char **errmsgp)
-{
-	int rv;
-	SmbSession *s = magic;
-	rv = smbresponsesend(s);
-	if (rv < 0) {
-		smbstringprint(errmsgp, "sendresponse failed");
-		return 0;
-	}
-	return 1;
-}
-
-SmbTransactionMethod smbtransactionmethod = {
-	.encoderesponse = smbtransactionencoderesponse,
-	.sendresponse = sendresponse,
-};
-
-SmbTransactionMethod smbtransactionmethod2 = {
-	.encoderesponse = smbtransactionencoderesponse2,
-	.sendresponse = sendresponse,
-};
-
-int
-smbcomtransaction(SmbSession *s, SmbHeader *h, uchar *pdata, SmbBuffer *b)
-{
-	int rv;
-	char *errmsg;
-	SmbProcessResult pr = SmbProcessResultDie;
-	errmsg = nil;
-	rv = smbtransactiondecodeprimary(&s->transaction, h, pdata, b, &errmsg);
-	if (rv < 0) {
-		pr = SmbProcessResultFormat;
-		goto done;
-	}
-	if (rv == 0) {
-		h->wordcount = 0;
-		if (smbbufferputack(s->response, h, &s->peerinfo)) {
-			pr = SmbProcessResultReply;
-			s->nextcommand = SMB_COM_TRANSACTION_SECONDARY;
-		}
-		goto done;
-	}
-	smblogprint(h->command, "smbcomtransaction: %s scount %ud tpcount %lud tdcount %lud maxscount %lud maxpcount %lud maxdcount %lud\n",
-		s->transaction.in.name, s->transaction.in.scount, s->transaction.in.tpcount, s->transaction.in.tdcount,
-		s->transaction.in.maxscount, s->transaction.in.maxpcount, s->transaction.in.maxdcount);
-	smbbufferfree(&s->transaction.out.parameters);
-	smbbufferfree(&s->transaction.out.data);
-	s->transaction.out.parameters = smbbuffernew(s->transaction.in.maxpcount);
-	s->transaction.out.data = smbbuffernew(s->transaction.in.maxdcount);
-	if (strcmp(s->transaction.in.name, smbglobals.pipelanman) == 0)
-		pr = smbrap2(s);
-	else {
-		smbseterror(s, ERRDOS, ERRbadpath);
-		pr = SmbProcessResultError;
-		goto done;
-	}
-	if (pr == SmbProcessResultReply) {
-		char *errmsg;
-		errmsg = nil;
-		rv = smbtransactionrespond(&s->transaction, h, &s->peerinfo, s->response, &smbtransactionmethod, s, &errmsg);
-		if (!rv) {
-			smblogprint(h->command, "smbcomtransaction: failed: %s\n", errmsg);
-			pr = SmbProcessResultMisc;
-		}
-		else
-			pr = SmbProcessResultOk;
-	}
-done:
-	free(errmsg);
-	return pr;
-}
-
-int
-smbcomtransaction2(SmbSession *s, SmbHeader *h, uchar *pdata, SmbBuffer *b)
-{
-	int rv;
-	char *errmsg;
-	SmbProcessResult pr = SmbProcessResultDie;
-	ushort op;
-
-	errmsg = nil;
-	rv = smbtransactiondecodeprimary2(&s->transaction, h, pdata, b, &errmsg);
-	if (rv < 0) {
-	fmtfail:
-		pr = SmbProcessResultFormat;
-		goto done;
-	}
-	if (rv == 0) {
-		h->wordcount = 0;
-		if (smbbufferputack(s->response, h, &s->peerinfo)) {
-			pr = SmbProcessResultReply;
-			s->nextcommand = SMB_COM_TRANSACTION2_SECONDARY;
-		}
-		goto done;
-	}
-	smblogprint(h->command, "smbcomtransaction2: scount %ud tpcount %lud tdcount %lud maxscount %lud maxpcount %lud maxdcount %lud\n",
-		s->transaction.in.scount, s->transaction.in.tpcount, s->transaction.in.tdcount,
-		s->transaction.in.maxscount, s->transaction.in.maxpcount, s->transaction.in.maxdcount);
-	smbbufferfree(&s->transaction.out.parameters);
-	smbbufferfree(&s->transaction.out.data);
-	s->transaction.out.parameters = smbbuffernew(s->transaction.in.maxpcount);
-	s->transaction.out.data = smbbuffernew(s->transaction.in.maxdcount);
-	if (s->transaction.in.scount != 1)
-		goto fmtfail;
-	op = s->transaction.in.setup[0];
-	if (op >= smbtrans2optablesize || smbtrans2optable[op].name == nil) {
-		smblogprint(-1, "smbcomtransaction2: function %d unknown\n", op);
-		pr = SmbProcessResultUnimp;
-		goto done;
-	}
-	if (smbtrans2optable[op].process == nil) {
-		smblogprint(-1, "smbcomtransaction2: %s unimplemented\n", smbtrans2optable[op].name);
-		pr = SmbProcessResultUnimp;
-		goto done;
-	}
-	pr = (*smbtrans2optable[op].process)(s, h);
-	if (pr == SmbProcessResultReply) {
-		char *errmsg;
-		errmsg = nil;
-		rv = smbtransactionrespond(&s->transaction, h, &s->peerinfo, s->response, &smbtransactionmethod2, s, &errmsg);
-		if (!rv) {
-			smblogprint(h->command, "smbcomtransaction2: failed: %s\n", errmsg);
-			pr = SmbProcessResultMisc;
-		}
-		else
-			pr = SmbProcessResultOk;
-	}
-done:
-	free(errmsg);
-	return pr;
-}
-
-
-
--- a/sys/src/cmd/aquarela/smbcomtreeconnectandx.c
+++ /dev/null
@@ -1,116 +1,0 @@
-#include "headers.h"
-
-static char *s9p2000 = "9p2000";
-
-SmbProcessResult
-smbcomtreeconnectandx(SmbSession *s, SmbHeader *h, uchar *pdata, SmbBuffer *b)
-{
-	uchar andxcommand;
-	ushort andxoffset;
-	char *path = nil;
-	char *service = nil;
-	ushort flags;
-	ushort passwordlength;
-//	ushort bytecount;
-	uchar errclass;
-	ushort error;
-	SmbService *serv;
-	SmbTree *tree;
-	ulong andxfixupoffset, bytecountfixup;
-	SmbProcessResult pr;
-
-	if (!smbcheckwordcount("comtreeconnectandx", h, 4)) {
-	fmtfail:
-		pr = SmbProcessResultFormat;
-		goto done;
-	}
-
-	switch (s->state) {
-	case SmbSessionNeedNegotiate:
-		smblogprint(-1, "smbcomtreeconnectandx: called when negotiate expected\n");
-		return SmbProcessResultUnimp;
-	case SmbSessionNeedSetup:
-		smbseterror(s, ERRDOS, ERRbadpw);
-		return SmbProcessResultError;
-	}
-
-	andxcommand = *pdata++;
-	switch (andxcommand) {
-	case SMB_COM_OPEN:
-	case SMB_COM_CREATE_NEW:
-	case SMB_COM_DELETE_DIRECTORY:
-	case SMB_COM_FIND_UNIQUE:
-	case SMB_COM_CHECK_DIRECTORY:
-	case SMB_COM_GET_PRINT_QUEUE:
-	case SMB_COM_TRANSACTION:
-	case SMB_COM_SET_INFORMATION:
-	case SMB_COM_OPEN_ANDX:
-	case SMB_COM_CREATE_DIRECTORY:
-	case SMB_COM_FIND:
-	case SMB_COM_RENAME:
-	case SMB_COM_QUERY_INFORMATION:
-	case SMB_COM_OPEN_PRINT_FILE:
-	case SMB_COM_NO_ANDX_COMMAND:
-	case SMB_COM_NT_RENAME:
-	case SMB_COM_CREATE:
-	case SMB_COM_DELETE:
-	case SMB_COM_COPY:
-		break;
-	default:
-		smblogprint(h->command, "smbcomtreeconnectandx: invalid andxcommand %s (0x%.2ux)\n",
-			smboptable[andxcommand].name, andxcommand);
-		goto fmtfail;
-	}
-	pdata++;
-	andxoffset = smbnhgets(pdata); pdata += 2;
-	flags = smbnhgets(pdata); pdata += 2;
-	passwordlength = smbnhgets(pdata); //pdata += 2;
-//	bytecount = smbnhgets(pdata); pdata += 2;
-smblogprint(h->command, "passwordlength: %ud\n", passwordlength);
-smblogprint(h->command, "flags: 0x%.4ux\n", flags);
-	if (!smbbuffergetbytes(b, nil, passwordlength)) {
-		smblogprint(h->command, "smbcomtreeconnectandx: not enough bytes for password\n");
-		goto fmtfail;
-	}
-smblogprint(h->command, "offset %lud limit %lud\n", smbbufferreadoffset(b), smbbufferwriteoffset(b));
-	if (!smbbuffergetstring(b, h, SMB_STRING_PATH, &path)
-		|| !smbbuffergetstr(b, 0, &service)) {
-		smblogprint(h->command, "smbcomtreeconnectandx: not enough bytes for strings\n");
-		goto fmtfail;
-	}
-smblogprint(h->command, "path: %s\n", path);
-smblogprint(h->command, "service: %s\n", service);
-	if (flags & 1)
-		smbtreedisconnectbyid(s, h->tid);
-	serv = smbservicefind(s, path, service, &errclass, &error);
-	if (serv == nil) {
-		pr = SmbProcessResultError;
-		smbseterror(s, errclass, error);
-		goto done;
-	}
-	tree = smbtreeconnect(s, serv);
-	h->tid = tree->id;
-	h->wordcount = 3;
-	if (!smbresponseputandxheader(s, h, andxcommand, &andxfixupoffset)
-		|| !smbresponseputs(s, 1)) {
-	misc:
-		pr = SmbProcessResultMisc;
-		goto done;
-	}
-	bytecountfixup = smbresponseoffset(s);
-	if (!smbresponseputs(s, 0)
-		|| !smbresponseputstr(s, serv->type)
-		|| !smbresponseputstring(s, 1, s9p2000))
-		goto misc;
-	if (!smbbufferfixuprelatives(s->response, bytecountfixup))
-		goto misc;
-	if (andxcommand != SMB_COM_NO_ANDX_COMMAND) {
-		pr = smbchaincommand(s, h, andxfixupoffset, andxcommand, andxoffset, b);
-	}
-	else
-		pr = SmbProcessResultReply;
-done:
-	free(path);
-	free(service);
-	return pr;
-}
--- a/sys/src/cmd/aquarela/smbcomtreedisconnect.c
+++ /dev/null
@@ -1,10 +1,0 @@
-#include "headers.h"
-
-SmbProcessResult
-smbcomtreedisconnect(SmbSession *s, SmbHeader *h, uchar *, SmbBuffer *)
-{
-	if (!smbcheckwordcount("comtreedisconnect", h, 0))
-		return SmbProcessResultFormat;
-	smbtreedisconnectbyid(s, h->tid);
-	return smbbufferputack(s->response, h, &s->peerinfo);
-}
--- a/sys/src/cmd/aquarela/smbcomwrite.c
+++ /dev/null
@@ -1,229 +1,0 @@
-#include "headers.h"
-
-#define INMEMORYTRUNCTHRESH (256 * 1024)
-
-static int
-dirfwstatlength(int fd, vlong offset)
-{
-	Dir d;
-	memset(&d, 0xff, sizeof(d));
-	d.name = d.uid = d.gid = d.muid = nil;
-	d.length = offset;
-	return dirfwstat(fd, &d);
-}
-
-SmbProcessResult
-smbtruncatefile(SmbSession *s, SmbFile *f, vlong offset)
-{
-	Dir *d;
-	ulong o;
-	uchar *db = nil;
-	vlong length;
-	int rv;
-	SmbProcessResult pr;
-
-	d = dirfstat(f->fd);
-	assert(d);
-	length = d->length;
-	free(d);
-
-	if (length == offset)
-		return SmbProcessResultReply;
-
-	rv = dirfwstatlength(f->fd, offset);
-	if (rv == 0) {
-		pr = SmbProcessResultReply;
-		goto done;
-	}
-//smblogprint(-1, "dirfwstatlength failed: %r\n");
-	if (length > offset) {
-		int nfd;
-		char *fullpath;
-		if (offset > INMEMORYTRUNCTHRESH) {
-			smblogprint(-1, "smbcomwrite: truncation beyond %lud not supported\n", offset);
-			pr = SmbProcessResultUnimp;
-			goto done;
-		}
-		db = smbemalloc(offset);
-		if (pread(f->fd, db, offset, 0) != offset) {
-			pr = SmbProcessResultMisc;
-			goto done;
-		}
-		fullpath = nil;
-		smbstringprint(&fullpath, "%s%s", f->t->serv->path, f->name);
-		nfd = open(fullpath, f->p9mode | OTRUNC);
-		free(fullpath);
-		if (nfd < 0) {
-			smbseterror(s, ERRDOS, ERRnoaccess);
-			pr = SmbProcessResultError;
-			goto done;
-		}
-		close(nfd);
-		if (pwrite(f->fd, db, offset, 0) != offset) {
-			pr = SmbProcessResultMisc;
-			goto done;
-		}
-		pr = SmbProcessResultReply;
-	}
-	else {
-		db = smbemalloc(16384);
-		memset(db, 0, 16384);
-		o = length;
-		while (o < offset) {
-			long tt = 16384;
-			if (tt > offset - o)
-				tt = offset - o;
-			if (pwrite(f->fd, db, tt, o) != tt) {
-				smbseterror(s, ERRDOS, ERRnoaccess);
-				pr = SmbProcessResultError;
-				goto done;
-			}
-			o += tt;
-		}
-		pr = SmbProcessResultReply;
-	}
-done:
-	free(db);
-	return pr;
-}
-
-SmbProcessResult
-smbcomwrite(SmbSession *s, SmbHeader *h, uchar *pdata, SmbBuffer *b)
-{
-	SmbTree *t;
-	SmbFile *f;
-	ushort fid;
-	ushort count;
-	ulong offset;
-	long nb;
-	ushort yacount;
-	uchar fmt;
-
-	if (h->wordcount != 5)
-		return SmbProcessResultFormat;
-
-	fid = smbnhgets(pdata); pdata += 2;
-	count = smbnhgets(pdata); pdata += 2;
-	offset = smbnhgetl(pdata);
-
-	smblogprint(SMB_COM_WRITE, "smbcomwrite: fid 0x%.4ux count 0x%.4ux offset 0x%.8lux\n",
-		fid, count, offset);
-
-	if (!smbbuffergetb(b, &fmt)
-		|| fmt != 1
-		|| !smbbuffergets(b, &yacount)
-		|| yacount != count
-		|| smbbufferreadspace(b) < count)
-		return SmbProcessResultFormat;
-	
-	t = smbidmapfind(s->tidmap, h->tid);
-	if (t == nil) {
-		smbseterror(s, ERRSRV, ERRinvtid);
-		return SmbProcessResultError;
-	}
-	f = smbidmapfind(s->fidmap, fid);
-	if (f == nil) {
-		smbseterror(s, ERRDOS, ERRbadfid);
-		return SmbProcessResultError;
-	}
-	
-	if (!f->ioallowed) {
-		smbseterror(s, ERRDOS, ERRbadaccess);
-		return SmbProcessResultError;
-	}
-
-	if (count == 0) {
-		SmbProcessResult pr = smbtruncatefile(s, f, offset);
-		if (pr != SmbProcessResultReply)
-			return pr;
-		nb = 0;
-	}
-	else {
-		seek(f->fd, offset, 0);
-		nb = write(f->fd, smbbufferreadpointer(b), count);
-		if (nb < 0) {
-			smbseterror(s, ERRDOS, ERRnoaccess);
-			return SmbProcessResultError;
-		}
-	}
-	h->wordcount = 1;
-	if (!smbbufferputheader(s->response, h, &s->peerinfo)
-		|| !smbbufferputs(s->response, nb)
-		|| !smbbufferputs(s->response, 0))
-		return SmbProcessResultMisc;
-	return SmbProcessResultReply;
-}
-
-SmbProcessResult
-smbcomwriteandx(SmbSession *s, SmbHeader *h, uchar *pdata, SmbBuffer *b)
-{
-	uchar andxcommand;
-	ushort andxoffset;
-	ulong andxoffsetfixup;
-	SmbTree *t;
-	SmbFile *f;
-	ushort dataoff, fid, count;
-	vlong offset;
-	long nb;
-
-	if (h->wordcount != 12 && h->wordcount != 14)
-		return SmbProcessResultFormat;
-
-	andxcommand = *pdata++;				// andx command
-	pdata++;					// reserved 
-	andxoffset = smbnhgets(pdata); pdata += 2;	// andx offset
-	fid = smbnhgets(pdata); pdata += 2;		// fid
-	offset = smbnhgetl(pdata); pdata += 4;		// offset in file
-	pdata += 4;					// timeout
-	pdata += 2;					// write mode
-	pdata += 2;					// (Remaining) bytes waiting to be written
-	pdata += 2;					// Reserved
-	count = smbnhgets(pdata); pdata += 2;		// LSBs of length
-	dataoff = smbnhgets(pdata); pdata += 2;		// offset to data in packet
-	if (dataoff + count > smbbufferwriteoffset(b))
-		return SmbProcessResultFormat;
-	if(h->wordcount == 14)
-		offset |= (vlong)smbnhgetl(pdata)<<32;
-
-	smblogprint(SMB_COM_WRITE_ANDX, "smbcomwriteandx: fid 0x%.4ux count 0x%.4ux offset 0x%.llux\n",
-		fid, count, offset);
-
-
-	t = smbidmapfind(s->tidmap, h->tid);
-	if (t == nil) {
-		smbseterror(s, ERRSRV, ERRinvtid);
-		return SmbProcessResultError;
-	}
-	f = smbidmapfind(s->fidmap, fid);
-	if (f == nil) {
-		smbseterror(s, ERRDOS, ERRbadfid);
-		return SmbProcessResultError;
-	}
-
-	if (!f->ioallowed) {
-		smbseterror(s, ERRDOS, ERRbadaccess);
-		return SmbProcessResultError;
-	}
-
-	seek(f->fd, offset, 0);
-	nb = write(f->fd, smbbufferpointer(b, dataoff), count);
-	if (nb < 0) {
-		smbseterror(s, ERRDOS, ERRnoaccess);
-		return SmbProcessResultError;
-	}
-
-	h->wordcount = 6;
-	if (!smbbufferputandxheader(s->response, h, &s->peerinfo, andxcommand, &andxoffsetfixup))
-		return SmbProcessResultMisc;
-
-	if (!smbbufferputs(s->response, nb)			// Count
-		|| !smbbufferputs(s->response, 0)		// Available
-		|| !smbbufferputl(s->response, 0)		// Reserved
-		|| !smbbufferputs(s->response, 0))		// byte count in reply
-		return SmbProcessResultMisc;
-
-	if (andxcommand != SMB_COM_NO_ANDX_COMMAND)
-		return smbchaincommand(s, h, andxoffsetfixup, andxcommand, andxoffset, b);
-
-	return SmbProcessResultReply;
-}
--- a/sys/src/cmd/aquarela/smbconnect.c
+++ /dev/null
@@ -1,275 +1,0 @@
-#include "headers.h"
-
-SmbClient *
-smbconnect(char *to, char *share, char **errmsgp)
-{
-	NbSession *nbs;
-	SmbBuffer *b;
-	SmbHeader h, rh;
-	long n;
-	ushort bytecountfixupoffset;
-	ushort andxfixupoffset;
-	uchar *pdata;
-	SmbPeerInfo peerinfo;
-	ushort index;
-	vlong utcintenthsofaus;
-	ulong secssince1970;
-	ushort bytecount;
-	int x;
-	MSchapreply mschapreply;
-	NbName nbto;
-	SmbClient *c;
-	char namebuf[100];
-	ushort ipctid, sharetid;
-
-	nbmknamefromstringandtype(nbto, to, 0x20);
-
-	peerinfo.encryptionkey = nil;
-	peerinfo.oemdomainname = nil;
-	assert(smbglobals.nbname[0] != 0);
-	nbs = nbssconnect(nbto, smbglobals.nbname);
-	if (nbs == nil)
-		return nil;
-print("netbios session established\n");
-	b = smbbuffernew(65535);
-	memset(&h, 0, sizeof(h));
-	h.command = SMB_COM_NEGOTIATE;
-	h.flags2 = SMB_FLAGS2_KNOWS_LONG_NAMES | SMB_FLAGS2_IS_LONG_NAME | SMB_FLAGS2_UNICODE;
-	h.wordcount = 0;
-	h.pid = 42;
-	smbbufferputheader(b, &h, &peerinfo);
-	bytecountfixupoffset = smbbufferwriteoffset(b);
-	smbbufferputbytes(b, nil, 2);
-	smbbufferputb(b, 2);
-	smbbufferputstring(b, nil, SMB_STRING_ASCII, "NT LM 0.12");
-	smbbufferoffsetputs(b, bytecountfixupoffset, smbbufferwriteoffset(b) - bytecountfixupoffset - 2);
-	nbdumpdata(smbbufferreadpointer(b), smbbufferwriteoffset(b));
-	nbsswrite(nbs, smbbufferreadpointer(b), smbbufferwriteoffset(b));
-	/*
-	 * now receive a reply
-	 */
-	smbbufferreset(b);
-	n = nbssread(nbs, smbbufferwritepointer(b), smbbufferwritespace(b));
-	if (n < 0) {
-		smbstringprint(errmsgp, "smbconnect: read error: %r");
-		goto fail;
-	}
-	smbbuffersetreadlen(b, n);
-	nbdumpdata(smbbufferreadpointer(b), smbbufferwriteoffset(b));
-	if (!smbbuffergetandcheckheader(b, &rh, h.command, 1, &pdata, &bytecount, errmsgp))
-		goto fail;
-	if (!smbsuccess(&rh, errmsgp))
-		goto fail;
-	if (rh.wordcount == 0) {
-		smbstringprint(errmsgp, "no parameters in negotiate response");
-		goto fail;
-	}
-	index = smbnhgets(pdata); pdata += 2;
-	if (index != 0) {
-		smbstringprint(errmsgp, "no agreement on protocol");
-		goto fail;
-	}
-	if (rh.wordcount != 17) {
-		smbstringprint(errmsgp, "wrong number of parameters for negotiate response");
-		goto fail;
-	}
-	peerinfo.securitymode = *pdata++;
-	peerinfo.maxmpxcount = smbnhgets(pdata); pdata += 2;
-	peerinfo.maxnumbervcs = smbnhgets(pdata); pdata += 2;
-	peerinfo.maxbuffersize = smbnhgetl(pdata); pdata += 4;
-	peerinfo.maxrawsize = smbnhgetl(pdata); pdata += 4;
-	peerinfo.sessionkey = smbnhgets(pdata); pdata += 4;
-	peerinfo.capabilities = smbnhgets(pdata); pdata += 4;
-	utcintenthsofaus = smbnhgetv(pdata); pdata += 8;
-	secssince1970 = utcintenthsofaus / 10000000 - 11644473600LL;
-	peerinfo.utc =  (vlong)secssince1970 * (vlong)1000000000 + (utcintenthsofaus % 10000000) * 100;
-	peerinfo.tzoff = -smbnhgets(pdata) * 60; pdata += 2;
-	peerinfo.encryptionkeylength = *pdata++;
-	print("securitymode: 0x%.2ux\n", peerinfo.securitymode);
-	print("maxmpxcount: 0x%.4ux\n", peerinfo.maxmpxcount);
-	print("maxnumbervcs: 0x%.4ux\n", peerinfo.maxnumbervcs);
-	print("maxbuffersize: 0x%.8lux\n", peerinfo.maxbuffersize);
-	print("maxrawsize: 0x%.8lux\n", peerinfo.maxrawsize);
-	print("sessionkey: 0x%.8lux\n", peerinfo.sessionkey);
-	print("capabilities: 0x%.8lux\n", peerinfo.capabilities);
-	print("utc: %s(and %lld μs)\n", asctime(gmtime(peerinfo.utc / 1000000000)), peerinfo.utc % 1000000000);
-	print("tzoff: %d\n", peerinfo.tzoff);
-	print("encryptionkeylength: %d\n", peerinfo.encryptionkeylength);
-	smberealloc(&peerinfo.encryptionkey, peerinfo.encryptionkeylength);
-	if (!smbbuffergetbytes(b, peerinfo.encryptionkey, peerinfo.encryptionkeylength)) {
-		smbstringprint(errmsgp, "not enough data for encryption key");
-		goto fail;
-	}
-	print("encryptionkey: ");
-	for (x = 0; x < peerinfo.encryptionkeylength; x++)
-		print("%.2ux", peerinfo.encryptionkey[x]);
-	print("\n");
-	if (!smbbuffergetucs2(b, 0, &peerinfo.oemdomainname)) {
-		smbstringprint(errmsgp, "not enough data for oemdomainname");
-		goto fail;
-	}
-	print("oemdomainname: %s\n", peerinfo.oemdomainname);
-	if (peerinfo.capabilities & CAP_EXTENDED_SECURITY) {
-		smbstringprint(errmsgp, "server wants extended security");
-		goto fail;
-	}
-	/*
-	 * ok - now send SMB_COM_SESSION_SETUP_ANDX
-	 * fix the flags to reflect what the peer can do
-	 */
-	smbbufferreset(b);
-	h.command = SMB_COM_SESSION_SETUP_ANDX;
-	h.wordcount = 13;
-	h.flags2 &= ~SMB_FLAGS2_UNICODE;
-	if (smbsendunicode(&peerinfo))
-		h.flags2 |= SMB_FLAGS2_UNICODE;
-	smbbufferputheader(b, &h, &peerinfo);
-	smbbufferputb(b, SMB_COM_TREE_CONNECT_ANDX);
-	smbbufferputb(b, 0);
-	andxfixupoffset = smbbufferwriteoffset(b);
-	smbbufferputs(b, 0);
-	smbbufferputs(b, 0xffff);
-	smbbufferputs(b, 1);
-	smbbufferputs(b, 0);
-	smbbufferputl(b, peerinfo.sessionkey);
-	smbbufferputs(b, sizeof(mschapreply.LMresp));
-	smbbufferputs(b, sizeof(mschapreply.NTresp));
-	smbbufferputl(b, 0);
-	smbbufferputl(b, CAP_UNICODE | CAP_LARGE_FILES);
-	bytecountfixupoffset = smbbufferwriteoffset(b);
-	smbbufferputs(b, 0);
-	if (auth_respond(peerinfo.encryptionkey, peerinfo.encryptionkeylength,
-		nil, 0,
-		&mschapreply, sizeof(mschapreply), auth_getkey,
-		"proto=mschap role=client server=%s", "cher") != sizeof(mschapreply)) {
-		print("auth_respond failed: %r\n");
-		goto fail;
-	}
-	smbbufferputbytes(b, &mschapreply, sizeof(mschapreply));
-	smbbufferputstring(b, &peerinfo, 0, smbglobals.accountname);
-	smbbufferputstring(b, &peerinfo, 0, smbglobals.primarydomain);
-	smbbufferputstring(b, &peerinfo, 0, smbglobals.nativeos);
-	smbbufferputstring(b, &peerinfo, 0, "");
-	smbbufferoffsetputs(b, bytecountfixupoffset, smbbufferwriteoffset(b) - bytecountfixupoffset - 2);
-	smbbufferalignl2(b, 2);
-	smbbufferoffsetputs(b, andxfixupoffset, smbbufferwriteoffset(b));
-	smbbufferputb(b, 4);
-	smbbufferputb(b, SMB_COM_NO_ANDX_COMMAND);
-	smbbufferputb(b, 0);
-	smbbufferputs(b, 0);
-	smbbufferputs(b, 0);
-	smbbufferputs(b, 0);
-	bytecountfixupoffset = smbbufferwriteoffset(b);
-	smbbufferputs(b, 0);
-	strcpy(namebuf, "\\\\");
-	strcat(namebuf, to);
-	strcat(namebuf, "\\IPC$");
-	smbbufferputstring(b, &peerinfo, SMB_STRING_UPCASE, namebuf);
-	smbbufferputstring(b, nil, SMB_STRING_ASCII, "?????");
-	smbbufferoffsetputs(b, bytecountfixupoffset, smbbufferwriteoffset(b) - bytecountfixupoffset - 2);
-	nbdumpdata(smbbufferreadpointer(b), smbbufferwriteoffset(b));
-	nbsswrite(nbs, smbbufferreadpointer(b), smbbufferwriteoffset(b));
-	smbbufferreset(b);
-	n = nbssread(nbs, smbbufferwritepointer(b), smbbufferwritespace(b));
-	if (n < 0) {
-		smbstringprint(errmsgp, "read error: %r");
-		goto fail;
-	}
-	smbbuffersetreadlen(b, n);
-	nbdumpdata(smbbufferreadpointer(b), smbbufferwriteoffset(b));
-	if (!smbbuffergetandcheckheader(b, &rh, h.command, 1, &pdata, &bytecount, errmsgp))
-		goto fail;
-	if (!smbsuccess(&rh, errmsgp))
-		goto fail;
-	h.uid = rh.uid;
-	ipctid = rh.tid;
-	/*
-	 * now do another TREE_CONNECT if needed
-	 */
-	if (share) {
-		smbbufferreset(b);
-		h.command = SMB_COM_TREE_CONNECT_ANDX;
-		h.wordcount = 4;
-		h.tid = 0;
-		smbbufferputheader(b, &h, &peerinfo);
-		smbbufferputb(b, SMB_COM_NO_ANDX_COMMAND);
-		smbbufferputb(b, 0);
-		smbbufferputs(b, 0);
-		smbbufferputs(b, 0);
-		smbbufferputs(b, 0);
-		bytecountfixupoffset = smbbufferwriteoffset(b);
-		smbbufferputs(b, 0);
-		strcpy(namebuf, "\\\\");
-		strcat(namebuf, to);
-		strcat(namebuf, "\\");
-		strcat(namebuf, share);
-		smbbufferputstring(b, &peerinfo, SMB_STRING_UPCASE, namebuf);
-		smbbufferputstring(b, nil, SMB_STRING_ASCII, "A:");
-		smbbufferoffsetputs(b, bytecountfixupoffset, smbbufferwriteoffset(b) - bytecountfixupoffset - 2);
-		nbdumpdata(smbbufferreadpointer(b), smbbufferwriteoffset(b));
-		nbsswrite(nbs, smbbufferreadpointer(b), smbbufferwriteoffset(b));
-		smbbufferreset(b);
-		n = nbssread(nbs, smbbufferwritepointer(b), smbbufferwritespace(b));
-		if (n < 0) {
-			smbstringprint(errmsgp, "read error: %r");
-			goto fail;
-		}
-		smbbuffersetreadlen(b, n);
-		nbdumpdata(smbbufferreadpointer(b), smbbufferwriteoffset(b));
-		if (!smbbuffergetandcheckheader(b, &rh, h.command, 3, &pdata, &bytecount, errmsgp))
-			goto fail;
-		if (!smbsuccess(&rh, errmsgp))
-			goto fail;
-		sharetid = rh.tid;
-	}
-	else
-		sharetid = -2;
-	c = smbemalloc(sizeof(*c));
-	c->peerinfo = peerinfo;
-	c->ipctid = ipctid;
-	c->sharetid = sharetid;
-	c->b = b;
-	c->protoh = h;
-	c->nbss = nbs;
-	return c;
-fail:
-	smbbufferfree(&b);
-	free(peerinfo.encryptionkey);
-	free(peerinfo.oemdomainname);
-	return nil;
-}
-
-void
-smbclientfree(SmbClient *c)
-{
-	if (c) {
-		free(c->peerinfo.encryptionkey);
-		free(c->peerinfo.oemdomainname);
-		free(c);
-		smbbufferfree(&c->b);
-	}
-}
-
-int
-smbtransactionclientsend(void *magic, SmbBuffer *ob, char **)
-{
-	SmbClient *c = magic;
-smblogprint(-1, "sending:\n");
-smblogdata(-1, smblogprint, smbbufferreadpointer(ob), smbbufferwriteoffset(ob), 256);
-	return nbsswrite(c->nbss, smbbufferreadpointer(ob), smbbufferwriteoffset(ob)) == 0;
-}
-
-int
-smbtransactionclientreceive(void *magic, SmbBuffer *ib, char **)
-{
-	long n; 
-	SmbClient *c = magic;
-	smbbufferreset(ib);
-	n = nbssread(c->nbss, smbbufferwritepointer(ib), smbbufferwritespace(ib));
-	if (n >= 0) {
-		assert(smbbufferputbytes(ib, nil, n));
-		return 1;
-	}
-	return 0;
-}
-
--- a/sys/src/cmd/aquarela/smbconv.c
+++ /dev/null
@@ -1,42 +1,0 @@
-#include "headers.h"
-
-ushort
-smbnhgets(uchar *p)
-{
-	return p[0] | (p[1] << 8);
-}
-
-ulong
-smbnhgetl(uchar *p)
-{
-	return p[0] | (p[1] << 8) | (p[2] << 16) | (p[3] << 24);
-}
-
-void
-smbhnputs(uchar *p, ushort v)
-{
-	p[0] = v;
-	p[1] = v >> 8;
-}
-
-void
-smbhnputl(uchar *p, ulong v)
-{
-	p[0] = v;
-	p[1] = v >> 8;
-	p[2] = v >> 16;
-	p[3] = v >> 24;
-}
-
-void
-smbhnputv(uchar *p, vlong v)
-{
-	smbhnputl(p, v);
-	smbhnputl(p + 4, (v >> 32) & 0xffffffff);
-}
-
-vlong
-smbnhgetv(uchar *p)
-{
-	return (vlong)smbnhgetl(p) | ((vlong)smbnhgetl(p + 4) << 32);
-}
--- a/sys/src/cmd/aquarela/smbdat.h
+++ /dev/null
@@ -1,325 +1,0 @@
-typedef struct SmbSession SmbSession;
-typedef struct SmbTree SmbTree;
-typedef struct SmbService SmbService;
-typedef struct SmbPeerInfo SmbPeerInfo;
-typedef struct SmbTransaction SmbTransaction;
-typedef struct SmbBuffer SmbBuffer;
-typedef struct SmbIdMap SmbIdMap;
-typedef struct SmbSearch SmbSearch;
-typedef struct SmbDirCache SmbDirCache;
-typedef struct SmbFile SmbFile;
-typedef struct SmbSharedFile SmbSharedFile;
-typedef struct SmbCifsSession SmbCifsSession;
-typedef struct SmbServerInfo SmbServerInfo;
-typedef struct SmbRapServerInfo1 SmbRapServerInfo1;
-typedef struct SmbFindFileBothDirectoryInfo SmbFindFileBothDirectoryInfo;
-typedef struct SmbLock SmbLock;
-typedef struct SmbLockList SmbLockList;
-typedef struct SmbSlut SmbSlut;
-
-#pragma incomplete SmbIdMap
-#pragma incomplete SmbBuffer
-#pragma incomplete SmbLockList
-
-typedef int SMBCIFSWRITEFN(SmbCifsSession *cifs, void *buf, long n);
-typedef int SMBCIFSACCEPTFN(SmbCifsSession *cifs, SMBCIFSWRITEFN **fnp);
-typedef void SMBIDMAPAPPLYFN(void *magic, void *p);
-
-struct SmbPeerInfo {
-	ulong capabilities;
-	ushort maxlen;
-	uchar securitymode;
-	ushort maxmpxcount;
-	ushort maxnumbervcs;
-	ulong maxbuffersize;
-	ulong maxrawsize;
-	ulong sessionkey;
-	vlong utc;
-	short tzoff;
-	uchar encryptionkeylength;
-	uchar *encryptionkey;
-	char *oemdomainname;
-};
-
-struct SmbTransaction {
-	struct {
-		char *name;
-		ulong tpcount;
-		uchar *parameters;
-		ulong pcount;
-		ulong tdcount;
-		uchar *data;
-		ulong maxpcount;
-		ulong maxdcount;
-		ulong maxscount;
-		ulong dcount;
-		ushort scount;
-		ushort *setup;
-		ushort flags;
-	} in;
-	struct {
-		ulong tpcount;
-		ulong tdcount;
-		SmbBuffer *parameters;
-		SmbBuffer *data;
-		ushort *setup;
-	} out;
-};
-
-enum {
-	SmbSessionNeedNegotiate,
-	SmbSessionNeedSetup,
-	SmbSessionEstablished,
-};
-
-struct SmbSession {
-	NbSession *nbss;
-	SmbCifsSession *cifss;
-	uchar nextcommand;
-	SmbBuffer *response;
-	SmbPeerInfo peerinfo;
-	Chalstate *cs;
-	struct {
-		char *accountname;	
-		char *primarydomain;
-		char *nativeos;
-		char *nativelanman;
-		ushort maxmpxcount;
-		MSchapreply mschapreply;
-	} client;
-	SmbTransaction transaction;
-	SmbIdMap *fidmap;
-	SmbIdMap *tidmap;
-	SmbIdMap *sidmap;
-	int state;
-	uchar errclass;
-	ushort error;
-	int tzoff;		// as passed to client during negotiation
-	SmbService *serv;
-};
-
-typedef struct SmbHeader {
-	uchar command;
-	union {
-		struct {
-			uchar errclass;
-			ushort error;
-		};
-		ulong status;
-	};
-	uchar flags;
-	ushort flags2;
-	union {
-		struct {
-			ushort pidhigh;
-			uchar securitysignature[8];
-		};
-	};
-	ushort tid;
-	ushort pid;
-	ushort uid;
-	ushort mid;
-	uchar wordcount;
-} SmbHeader;
-
-typedef enum SmbProcessResult {
-	SmbProcessResultOk,
-	SmbProcessResultUnimp,
-	SmbProcessResultFormat,
-	SmbProcessResultMisc,
-	SmbProcessResultError,
-	SmbProcessResultReply,
-	SmbProcessResultDie,
-} SmbProcessResult;
-
-typedef SmbProcessResult SMBPROCESSFN(SmbSession *s, SmbHeader *h, uchar *pdata, SmbBuffer *);
-typedef struct SmbOpTableEntry SmbOpTableEntry;
-struct SmbOpTableEntry {
-	char *name;
-	SMBPROCESSFN *process;
-	int debug;
-};
-
-extern SmbOpTableEntry smboptable[256];
-
-typedef struct SmbGlobals SmbGlobals;
-
-extern SmbGlobals smbglobals;
-
-struct SmbServerInfo {
-	char *name;
-	char *nativelanman;
-	uchar vmaj, vmin;
-	ulong stype;
-	char *remark;
-};
-
-struct SmbGlobals {
-	int maxreceive;
-	int unicode;
-	SmbServerInfo serverinfo;
-	char *nativeos;
-	char *primarydomain;
-	NbName nbname;
-	char *accountname;
-	char *mailslotbrowse;
-	char *pipelanman;
-	int l2sectorsize;
-	int l2allocationsize;
-	int convertspace;
-	struct {
-		int fd;
-		int print;
-		int tids;
-		int sids;
-		int fids;
-		int rap2;
-		int find;
-		int query;
-		int sharedfiles;
-		int sessions;
-		int rep;
-		int poolparanoia;
-		int locks;
-	} log;
-};
-
-struct SmbTree {
-	long id;
-	SmbService *serv;
-};
-
-struct SmbService {
-	Ref;
-	char *name;
-	char *type;
-	ushort stype;
-	char *path;
-	char *remark;
-	SmbService *next;
-};
-
-extern SmbService *smbservices;
-
-typedef struct SmbClient SmbClient;
-
-
-typedef struct SmbTransactionMethod {
-	int (*encodeprimary)(SmbTransaction *t, SmbHeader *h, SmbPeerInfo *p,
-		SmbBuffer *ob, uchar *wordcount, ushort *bytecount, char **errmsgp);
-	int (*encodesecondary)(SmbTransaction *t, SmbHeader *h, SmbBuffer *ob, char **errmsgp);
-	int (*sendrequest)(void *magic, SmbBuffer *ob, char **errmsgp);
-	int (*receiveintermediate)(void *magic, uchar *wordcountp, ushort *bytecountp, char **errmsgp);
-	int (*receiveresponse)(void *magic, SmbBuffer *ib, char **errmsgp);
-	int (*decoderesponse)(SmbTransaction *t, SmbHeader *h, uchar *pdata, SmbBuffer *b, char **errmsgp);
-	int (*encoderesponse)(SmbTransaction *t, SmbHeader *h, SmbPeerInfo *p,
-		SmbBuffer *ob, char **errmsgp);
-	int (*sendresponse)(void *magic, SmbBuffer *ob, char **errmsgp);
-} SmbTransactionMethod;
-
-extern SmbTransactionMethod smbtransactionmethoddgram;
-
-struct SmbSearch {
-	long id;
-	SmbTree *t;
-	SmbDirCache *dc;
-	Reprog *rep;
-	ushort tid;
-};
-
-struct SmbFile {
-	long id;
-	SmbTree *t;		// tree this belongs to
-	int fd;
-	char *name;
-	int p9mode;		// how it was opened
-	int share;			// additional sharing restictions added by this fid
-	int ioallowed;
-	SmbSharedFile *sf;
-};
-
-struct SmbSharedFile {
-	ushort type;
-	ulong dev;
-	vlong path;
-//	char *name;
-	int share;			// current share level
-	int deleteonclose;
-	SmbLockList *locklist;
-};
-
-struct SmbLock {
-	vlong base;
-	vlong limit;
-	SmbSession *s;		// owning session
-	ushort pid;		// owning pid
-};
-
-struct SmbCifsSession {
-	int fd;
-	void *magic;
-};
-
-struct SmbClient {
-	SmbPeerInfo peerinfo;
-	NbSession *nbss;
-	SmbBuffer *b;
-	ushort ipctid;
-	ushort sharetid;
-	SmbHeader protoh;
-};
-
-struct SmbRapServerInfo1 {
-	char name[16];
-	uchar vmaj;
-	uchar vmin;
-	ulong type;
-	char *remark;
-};
-
-struct SmbFindFileBothDirectoryInfo {
-	ulong fileindex;
-	vlong creationtime;
-	vlong lastaccesstime;
-	vlong lastwritetime;
-	vlong changetime;
-	vlong endoffile;
-	vlong allocationsize;
-	ulong extfileattributes;
-	char *filename;
-};
-
-enum {
-	SMB_STRING_UNALIGNED = 1,
-	SMB_STRING_UPCASE = 2,
-	SMB_STRING_UNTERMINATED = 4,
-	SMB_STRING_UNICODE = 8,
-	SMB_STRING_ASCII = 16,
-	SMB_STRING_REVPATH = 32,
-	SMB_STRING_PATH = 64,
-	SMB_STRING_CONVERT_MASK = SMB_STRING_PATH | SMB_STRING_REVPATH | SMB_STRING_UPCASE,
-};
-
-struct SmbDirCache {
-	Dir *buf;
-	long n;
-	long i;
-};
-
-typedef struct SmbTrans2OpTableEntry SmbTrans2OpTableEntry;
-typedef SmbProcessResult SMBTRANS2PROCESSFN(SmbSession *s, SmbHeader *h);
-struct SmbTrans2OpTableEntry {
-	char *name;
-	SMBTRANS2PROCESSFN *process;
-	int debug;
-};
-extern SmbTrans2OpTableEntry smbtrans2optable[];
-extern int smbtrans2optablesize;
-
-struct SmbSlut {
-	char *name;
-	int val;
-};
-
-extern SmbSlut smbopenmodeslut[];
-extern SmbSlut smbsharemodeslut[];
--- a/sys/src/cmd/aquarela/smbdircache.c
+++ /dev/null
@@ -1,43 +1,0 @@
-#include "headers.h"
-
-SmbDirCache *
-smbmkdircache(SmbTree *t, char *path)
-{
-	long n;
-	SmbDirCache *c;
-	Dir *buf;
-	int fd;
-	char *fullpath = nil;
-
-	smbstringprint(&fullpath, "%s%s", t->serv->path, path);
-//smblogprintif(1, "smbmkdircache: path %s\n", fullpath);
-	fd = open(fullpath, OREAD);
-	free(fullpath);
-
-	if (fd < 0)
-		return nil;
-	n = dirreadall(fd, &buf);
-	close(fd);
-	if (n < 0) {
-		free(buf);
-		return nil;
-	}
-	c = smbemalloc(sizeof(SmbDirCache));
-	c->buf = buf;
-	c->n = n;
-	c->i = 0;
-	return c;
-}
-
-void
-smbdircachefree(SmbDirCache **cp)
-{
-	SmbDirCache *c;
-	c = *cp;
-	if (c) {
-		free(c->buf);
-		free(c);
-		*cp = nil;
-	}
-}
-
--- a/sys/src/cmd/aquarela/smbfile.c
+++ /dev/null
@@ -1,25 +1,0 @@
-#include "headers.h"
-
-static void
-smbfilefree(SmbFile **fp)
-{
-	SmbFile *f;
-	f = *fp;
-	if (f) {
-		smbsharedfileput(f, f->sf, f->share);
-		if (f->fd >= 0)
-			close(f->fd);
-		free(f->name);
-		free(f);
-		*fp = nil;
-	}
-}
-
-void
-smbfileclose(SmbSession *s, SmbFile *f)
-{
-	smblogprintif(smbglobals.log.fids, "smbfileclose: 0x%.4ux/0x%.4ux %s%s\n",
-		f->t->id, f->id, f->t->serv->path, f->name);
-	smbidmapremove(s->fidmap, f);
-	smbfilefree(&f);
-}
--- a/sys/src/cmd/aquarela/smbfns.h
+++ /dev/null
@@ -1,260 +1,0 @@
-ushort smbnhgets(uchar *);
-ulong smbnhgetl(uchar *);
-vlong smbnhgetv(uchar *);
-void smbhnputs(uchar *, ushort);
-void smbhnputl(uchar *, ulong);
-void smbhnputv(uchar *, vlong);
-
-SMBPROCESSFN smbnegotiate;
-SMBPROCESSFN smbcomsessionsetupandx;
-SMBPROCESSFN smbcomtreeconnectandx;
-SMBPROCESSFN smbcomtransaction;
-SMBPROCESSFN smbcomcheckdirectory;
-SMBPROCESSFN smbcomtransaction2;
-SMBPROCESSFN smbcomecho;
-SMBPROCESSFN smbcomopenandx;
-SMBPROCESSFN smbcomcreate;
-SMBPROCESSFN smbcomopen;
-SMBPROCESSFN smbcomclose;
-SMBPROCESSFN smbcomreadandx;
-SMBPROCESSFN smbcomwriteandx;
-SMBPROCESSFN smbcomqueryinformation;
-SMBPROCESSFN smbcomfindclose2;
-SMBPROCESSFN smbcomtreedisconnect;
-SMBPROCESSFN smbcomqueryinformation2;
-SMBPROCESSFN smbcomdelete;
-SMBPROCESSFN smbcomflush;
-SMBPROCESSFN smbcomwrite;
-SMBPROCESSFN smbcomsetinformation2;
-SMBPROCESSFN smbcomcreatedirectory;
-SMBPROCESSFN smbcomdeletedirectory;
-SMBPROCESSFN smbcomrename;
-SMBPROCESSFN smbcomlockingandx;
-SMBPROCESSFN smbcomsetinformation;
-SMBPROCESSFN smbcomntcreateandx;
-
-void *smbemalloc(ulong size);
-void *smbemallocz(ulong size, int clear);
-void smberealloc(void **pp, ulong size);
-char *smbestrdup(char *s);
-void smbfree(void **pp);
-
-int smbcheckwordcount(char *name, SmbHeader *h, ushort wordcount);
-int smbcheckwordandbytecount(char *name, SmbHeader *h, ushort wordcount, uchar **bdatap, uchar **edatap);
-int smbsendunicode(SmbPeerInfo *i);
-
-char *smbstringdup(SmbHeader *h, uchar *base, uchar **bdatap, uchar *edata);
-char *smbstrdup(uchar **bdatap, uchar *edata);
-char *smbstrinline(uchar **bdatap, uchar *edata);
-int smbstrlen(char *string);
-int smbstringlen(SmbPeerInfo *i, char *string);
-void smbstringprint(char **p, char *fmt, ...);
-
-int smbucs2len(char *string);
-int smbstringput(SmbPeerInfo *p, ulong flags, uchar *buf, ushort n, ushort maxlen, char *string);
-int smbstrput(ulong flags, uchar *buf, ushort n, ushort maxlen, char *string);
-int smbstrnput(uchar *buf, ushort n, ushort maxlen, char *string, ushort size, int upcase);
-int smbucs2put(ulong flags, uchar *buf, ushort n, ushort maxlen, char *string);
-
-void smbresponseinit(SmbSession *s, ushort maxlen);
-int smbresponsealignl2(SmbSession *s, int l2a);
-ushort smbresponseoffset(SmbSession *s);
-int smbresponseputheader(SmbSession *s, SmbHeader *h, uchar errclass, ushort error);
-int smbresponseputandxheader(SmbSession *s, SmbHeader *h, ushort andxcommand, ulong *andxoffsetfixup);
-int smbresponseputb(SmbSession *s, uchar b);
-int smbresponseputs(SmbSession *s, ushort s);
-int smbresponseputl(SmbSession *s, ulong l);
-int smbresponseoffsetputs(SmbSession *s, ushort offset, ushort s);
-int smbresponseputstring(SmbSession *s, int mustalign, char *string);
-int smbresponseputstr(SmbSession *s, char *string);
-SmbProcessResult smbresponsesend(SmbSession *s);
-int smbresponseputerror(SmbSession *s, SmbHeader *h, uchar errclass, ushort error);
-int smbresponseskip(SmbSession *s, ushort amount);
-ushort smbresponsespace(SmbSession *s);
-void smbresponsereset(SmbSession *s);
-int smbresponsecpy(SmbSession *s, uchar *data, ushort datalen);
-
-void smbtreedisconnect(SmbSession *s, SmbTree *t);
-void smbtreedisconnectbyid(SmbSession *s, ushort id);
-SmbTree *smbtreeconnect(SmbSession *s, SmbService *serv);
-int smbchaincommand(SmbSession *s, SmbHeader *h, ulong andxfixupoffset, uchar cmd, ushort offset, SmbBuffer *b);
-
-SmbService *smbservicefind(SmbSession *s, char *path, char *service, uchar *errclassp, ushort *errorp);
-void smbserviceput(SmbService *serv);
-void smbserviceget(SmbService *serv);
-
-int smbrap2(SmbSession *s);
-
-void smbglobalsguess(int client);
-
-SmbBuffer *smbbuffernew(ulong maxlen);
-void smbbufferfree(SmbBuffer **bp);
-SmbBuffer *smbbufferinit(void *base, void *bdata, ulong blen);
-ulong smbbufferwriteoffset(SmbBuffer *s);
-ulong smbbufferwritemaxoffset(SmbBuffer *s);
-ulong smbbufferreadoffset(SmbBuffer *s);
-void *smbbufferwritepointer(SmbBuffer *s);
-void *smbbufferreadpointer(SmbBuffer *s);
-int smbbufferputheader(SmbBuffer *s, SmbHeader *h, SmbPeerInfo *p);
-int smbbufferputandxheader(SmbBuffer *s, SmbHeader *h, SmbPeerInfo *p, uchar andxcommand, ulong *andxoffsetfixup);
-int smbbufferputb(SmbBuffer *s, uchar b);
-int smbbufferputs(SmbBuffer *s, ushort s);
-int smbbufferputl(SmbBuffer *s, ulong l);
-int smbbufferoffsetputs(SmbBuffer *s, ulong offset, ushort s);
-int smbbufferputstring(SmbBuffer *b, SmbPeerInfo *p, ulong flags, char *string);
-int smbbufferpututstring(SmbBuffer *b, SmbPeerInfo *p, int mustalign, char *string);
-int smbbufferputucs2(SmbBuffer *b, int mustalign, char *string);
-int smbbufferputstr(SmbBuffer *s, char *string);
-int smbbufferputstrn(SmbBuffer *s, char *string, int len, int upcase);
-int smbbufferputerror(SmbBuffer *s, SmbHeader *h, SmbPeerInfo *p, uchar errclass, ushort error);
-int smbbufferskip(SmbBuffer *s, ulong amount);
-ulong smbbufferspace(SmbBuffer *s);
-void smbbufferreset(SmbBuffer *s);
-int smbbufferputbytes(SmbBuffer *s, void *data, ulong datalen);
-int smbbuffergetbytes(SmbBuffer *b, void *buf, ulong len);
-void smbbuffersetreadlen(SmbBuffer *b, ulong len);
-int smbbuffertrimreadlen(SmbBuffer *b, ulong len);
-ulong smbbufferwritespace(SmbBuffer *b);
-int smbbuffergets(SmbBuffer *b, ushort *sp);
-int smbbuffergetstr(SmbBuffer *b, ulong flags, char **sp);
-int smbbuffergetstrinline(SmbBuffer *b, char **sp);
-int smbbuffergetstrn(SmbBuffer *b, ushort size, char **sp);
-int smbbuffergetstring(SmbBuffer *b, SmbHeader *h, ulong flags, char **sp);
-int smbbuffergetucs2(SmbBuffer *b, ulong flags, char **sp);
-void *smbbufferpointer(SmbBuffer *b, ulong offset);
-int smbbuffergetb(SmbBuffer *b, uchar *bp);
-int smbbuffergetl(SmbBuffer *b, ulong *lp);
-int smbbuffergetv(SmbBuffer *b, vlong *vp);
-ulong smbbufferreadspace(SmbBuffer *b);
-void smbbufferwritelimit(SmbBuffer *b, ulong limit);
-int smbbufferreadskipto(SmbBuffer *b, ulong offset);
-int smbbufferpushreadlimit(SmbBuffer *b, ulong offset);
-int smbbufferpopreadlimit(SmbBuffer *b);
-int smbbufferalignl2(SmbBuffer *b, int al2);
-int smbbufferwritebackup(SmbBuffer *b, ulong offset);
-int smbbufferreadbackup(SmbBuffer *b, ulong offset);
-int smbbufferfixuprelatives(SmbBuffer *b, ulong fixupoffset);
-int smbbufferfixuprelativel(SmbBuffer *b, ulong fixupoffset);
-int smbbufferfixuprelativeinclusivel(SmbBuffer *b, ulong fixupoffset);
-int smbbufferfixupabsolutes(SmbBuffer *b, ulong fixupoffset);
-int smbbufferfixupabsolutel(SmbBuffer *b, ulong fixupoffset);
-int smbbufferfixupl(SmbBuffer *b, ulong fixupoffset, ulong val);
-int smbbufferputv(SmbBuffer *b, vlong v);
-int smbbufferputack(SmbBuffer *b, SmbHeader *h, SmbPeerInfo *p);
-int smbbufferfill(SmbBuffer *b, uchar c, ulong len);
-int smbbufferoffsetgetb(SmbBuffer *b, ulong offset, uchar *bp);
-int smbbuffercopy(SmbBuffer *to, SmbBuffer *from, ulong amount);
-int smbbufferoffsetcopystr(SmbBuffer *b, ulong offset, char *buf, int buflen, int *lenp);
-
-SmbClient *smbconnect(char *to, char *share, char **errmsgp);
-void smbclientfree(SmbClient *s);
-int smbsuccess(SmbHeader *h, char **errmsgp);
-
-int smbtransactiondecodeprimary(SmbTransaction *t, SmbHeader *h, uchar *pdata, SmbBuffer *b, char **errmsgp);
-int smbtransactiondecodeprimary2(SmbTransaction *t, SmbHeader *h, uchar *pdata, SmbBuffer *b, char **errmsgp);
-void smbtransactionfree(SmbTransaction *t);
-int smbtransactionencoderesponse(SmbTransaction *t, SmbHeader *h, SmbPeerInfo *p, SmbBuffer *ob, char **errmsgp);
-int smbtransactionencoderesponse2(SmbTransaction *t, SmbHeader *h, SmbPeerInfo *p, SmbBuffer *ob, char **errmsgp);
-int smbtransactionencodeprimary(SmbTransaction *t, SmbHeader *h, SmbPeerInfo *p, SmbBuffer *ob,
-	uchar *wordcountp, ushort *bytecountp, char **errmsgp);
-int smbtransactionencodeprimary2(SmbTransaction *t, SmbHeader *h, SmbPeerInfo *p, SmbBuffer *ob,
-	uchar *wordcountp, ushort *bytecountp, char **errmsgp);
-int smbtransactiondecoderesponse(SmbTransaction *t, SmbHeader *h, uchar *pdata, SmbBuffer *b, char **errmsgp);
-int smbtransactiondecoderesponse2(SmbTransaction *t, SmbHeader *h, uchar *pdata, SmbBuffer *b, char **errmsgp);
-int smbtransactionclientsend(void *magic, SmbBuffer *ob, char **errmsgp);
-int smbtransactionclientreceive(void *magic, SmbBuffer *ib, char **errmsgp);
-
-int smbtransactionexecute(SmbTransaction *t, SmbHeader *h, SmbPeerInfo *p,
-	SmbBuffer *ob, SmbTransactionMethod *method, void *magic, SmbHeader *rh, char **errmsgp);
-int smbtransactionrespond(SmbTransaction *t, SmbHeader *h, SmbPeerInfo *p, SmbBuffer *ob,
-	SmbTransactionMethod *method, void *magic, char **errmsgp);
-
-SmbProcessResult smbtrans2findfirst2(SmbSession *s, SmbHeader *h);
-SmbProcessResult smbtrans2findnext2(SmbSession *s, SmbHeader *h);
-SmbProcessResult smbtrans2queryfileinformation(SmbSession *s, SmbHeader *h);
-SmbProcessResult smbtrans2queryfsinformation(SmbSession *s, SmbHeader *h);
-SmbProcessResult smbtrans2querypathinformation(SmbSession *s, SmbHeader *h);
-SmbProcessResult smbtrans2setfileinformation(SmbSession *s, SmbHeader *h);
-SmbProcessResult smbtrans2setpathinformation(SmbSession *s, SmbHeader *h);
-
-SmbIdMap *smbidmapnew(void);
-long smbidmapadd(SmbIdMap *m, void *p);
-void smbidmapremovebyid(SmbIdMap *m, long id);
-void smbidmapremove(SmbIdMap *m, void *thing);
-void smbidmapfree(SmbIdMap **mp, SMBIDMAPAPPLYFN *free, void *magic);
-void smbidmapapply(SmbIdMap *mp, SMBIDMAPAPPLYFN *free, void *magic);
-void *smbidmapfind(SmbIdMap *m, long id);
-void smbidmapremoveif(SmbIdMap *m, int (*f)(void *p, void *arg), void *arg);
-
-void smbsearchfree(SmbSearch **searchp);
-void smbsearchclose(SmbSession *s, SmbSearch *search);
-void smbsearchclosebyid(SmbSession *s, ushort sid);
-
-void smbseterror(SmbSession *s, uchar errclass, ushort error);
-
-void smbplan9time2datetime(ulong time, int tzoff, ushort *datep, ushort *timep);
-ulong smbdatetime2plan9time(ushort date, ushort time, int tzoff);
-vlong smbplan9time2time(ulong time);
-ulong smbplan9time2utime(ulong time, int tzoff);
-ulong smbutime2plan9time(ulong time, int tzoff);
-ulong smbtime2plan9time(vlong);
-void smbpathcanon(char *path);
-void smbpathsplit(char *path, char **dirp, char **namep);
-
-ushort smbplan9mode2dosattr(ulong mode);
-ulong smbdosattr2plan9wstatmode(ulong oldmode, ushort attr);
-ulong smbdosattr2plan9mode(ushort attr);
-
-ulong smbplan9length2size32(vlong size);
-
-void smbfileclose(SmbSession *s, SmbFile *f);
-
-void smbloglock(void);
-void smblogunlock(void);
-int smblogvprint(int cmd, char *fmt, va_list ap);
-int translogprint(int cmd, char *fmt, ...);
-int smblogprint(int cmd, char *fmt, ...);
-int smblogprintif(int v, char *fmt, ...);
-void smblogdata(int cmd, int (*print)(int cmd, char *fmt, ...), void *p, long data, long limit);
-
-SmbSharedFile *smbsharedfileget(Dir *d, int p9mode, int *sharep);
-void smbsharedfileput(SmbFile *f, SmbSharedFile *sf, int share);
-int smbsharedfilelock(SmbSharedFile *sf, SmbSession *s, ushort pid, vlong base, vlong limit);
-int smbsharedfileunlock(SmbSharedFile *sf, SmbSession *s, ushort pid, vlong base, vlong limit);
-
-vlong smbl2roundupvlong(vlong v, int l2);
-
-int smblistencifs(SMBCIFSACCEPTFN *accept);
-
-int smbnetserverenum2(SmbClient *c, ulong stype, char *domain, int *entriesp, SmbRapServerInfo1 **sip, char **errmsgp);
-
-int smbbuffergetheader(SmbBuffer *b, SmbHeader *h, uchar **parametersp, ushort *bytecountp);
-int smbbuffergetandcheckheader(SmbBuffer *b, SmbHeader *h, uchar command, int response,
-	uchar **pdatap, ushort *bytecountp, char **errmsgp);
-int smbcheckheader(SmbHeader *h, uchar command, int response, char **errmsgp);
-int smbcheckheaderdirection(SmbHeader *h, int response, char **errmsgp);
-
-SmbDirCache *smbmkdircache(SmbTree *t, char *path);
-void smbdircachefree(SmbDirCache **cp);
-
-int smbmatch(char *name, Reprog *rep);
-Reprog *smbmkrep(char *pattern);
-
-int smbclientopen(SmbClient *c, ushort mode, char *name, uchar *errclassp, ushort *errorp, ushort *fid, ushort *attrp,
-ulong *mtimep, ulong *sizep, ushort *accessallowedp, char **errmsgp);
-
-Rune smbruneconvert(Rune r, ulong flags);
-
-int smbslut(SmbSlut *table, char *name);
-char *smbrevslut(SmbSlut *table, int val);
-
-SmbProcessResult smbtruncatefile(SmbSession *s, SmbFile *f, vlong offset);
-
-#ifdef LEAK
-#define smbemallocz(n, z) mallocz(n, z)
-#define smbemalloc(n) malloc(n)
-#define smbestrdup(p) strcpy(malloc(strlen(p) + 1), p)
-#endif
-
-int smbremovefile(SmbTree *t, char *dir, char *name);
-int smbbrowsesendhostannouncement(char *name, ulong periodms, ulong type, char *comment, char **errmsgp);
--- a/sys/src/cmd/aquarela/smbglobals.c
+++ /dev/null
@@ -1,46 +1,0 @@
-#include "headers.h"
-
-SmbGlobals smbglobals = {
-	.maxreceive = 0x1ffff,
-	.unicode = 1,
-	.nativeos = "Plan 9 4th edition",
-	.serverinfo = {
-		.nativelanman = "Aquarela",
-		.vmaj = 0,
-		.vmin = 5,
-		.stype = SV_TYPE_SERVER,
-	},
-	.mailslotbrowse = "/MAILSLOT/BROWSE",
-	.pipelanman = "/PIPE/LANMAN",
-	.l2sectorsize = 9,
-	.l2allocationsize = 14,
-	.convertspace = 0,
-	.log = {
-		.fd = -1,
-		.print = 0,
-		.poolparanoia = 1,
-	},
-};
-
-void
-smbglobalsguess(int client)
-{
-	if (smbglobals.serverinfo.name == 0)
-		smbglobals.serverinfo.name = sysname();
-	if (smbglobals.nbname[0] == 0)
-		nbmknamefromstring(smbglobals.nbname, smbglobals.serverinfo.name);
-	if (smbglobals.accountname == nil)
-		smbglobals.accountname = strdup(getuser());
-	if (smbglobals.primarydomain == nil)
-		smbglobals.primarydomain = "PLAN9";
-	if (smbglobals.serverinfo.remark == nil)
-		smbglobals.serverinfo.remark = "This is a default server comment";
-	if (smbglobals.log.fd < 0)
-		if (client){
-			smbglobals.log.fd = create("client.log", OWRITE|OTRUNC, 0666);
-		}
-		else{
-			if (access("/sys/log/aquarela", 2) == 0)
-				smbglobals.log.fd = open("/sys/log/aquarela", OWRITE);
-		}
-}
--- a/sys/src/cmd/aquarela/smbidmap.c
+++ /dev/null
@@ -1,128 +1,0 @@
-#include "headers.h"
-
-#define INITIALCHUNKSIZE 10
-
-typedef struct Entry {
-	void *p;
-	long freechain;
-} Entry;
-
-struct SmbIdMap {
-	Entry *array;
-	ulong entries;
-	long freeindex;
-};
-
-SmbIdMap *
-smbidmapnew(void)
-{
-	SmbIdMap *m;
-	m = smbemallocz(sizeof(SmbIdMap), 1);
-	m->freeindex = -1;
-	return m;
-}
-
-void
-smbidmapremovebyid(SmbIdMap *m, long id)
-{
-	if (m == nil)
-		return;
-	assert(id > 0);
-	id--;
-	assert(id >= 0 && id < m->entries);
-	assert(m->array[id].freechain == -2);
-	m->array[id].freechain = m->freeindex;
-	m->freeindex = id;
-}
-
-void
-smbidmapremove(SmbIdMap *m, void *thing)
-{
-	long id;
-	if (m == nil)
-		return;
-	id = *(long *)thing;
-	smbidmapremovebyid(m, id);
-}
-
-void
-smbidmapremoveif(SmbIdMap *m, int (*f)(void *p, void *arg), void *arg)
-{
-	int i;
-	if (m == nil)
-		return;
-	for (i = 0; i < m->entries; i++)
-		if (m->array[i].freechain == -2 && (*f)(m->array[i].p, arg))
-			smbidmapremovebyid(m, i + 1);
-}
-
-static void
-grow(SmbIdMap *m)
-{
-	long x;
-	long oldentries = m->entries;
-	if (m->entries == 0)
-		m->entries = INITIALCHUNKSIZE;
-	else
-		m->entries *= 2;
-	smberealloc(&m->array, sizeof(Entry) * m->entries);
-	for (x = m->entries - 1; x >= oldentries; x--) {
-		m->array[x].freechain = m->freeindex;
-		m->freeindex = x;
-	}
-}
-
-long
-smbidmapadd(SmbIdMap *m, void *p)
-{
-	long i;
-	if (m->freeindex < 0)
-		grow(m);
-	i = m->freeindex;
-	m->freeindex = m->array[i].freechain;
-	m->array[i].freechain = -2;
-	m->array[i].p = p;
-	*(long *)p = i + 1;
-	return i + 1;
-}
-
-void *
-smbidmapfind(SmbIdMap *m, long id)
-{
-	if (m == nil)
-		return nil;
-	if (id <= 0)
-		return nil;
-	id--;
-	if (id < 0 || id > m->entries || m->array[id].freechain != -2)
-		return nil;
-	return m->array[id].p;
-}
-
-void
-smbidmapfree(SmbIdMap **mp, SMBIDMAPAPPLYFN *freefn, void *magic)
-{
-	SmbIdMap *m = *mp;
-	if (m) {
-		long i;
-		if (freefn) {
-			for (i = 0; i < m->entries; i++)
-				if (m->array[i].freechain == -2)
-					(*freefn)(magic, m->array[i].p);
-		}
-		free(m->array);
-		free(m);
-		*mp = nil;
-	}
-}
-
-void
-smbidmapapply(SmbIdMap *m, SMBIDMAPAPPLYFN *applyfn, void *magic)
-{
-	if (m) {
-		long i;
-		for (i = 0; i < m->entries; i++)
-			if (m->array[i].freechain == -2)
-				(*applyfn)(magic, m->array[i].p);
-	}
-}
--- a/sys/src/cmd/aquarela/smblisten.c
+++ /dev/null
@@ -1,155 +1,0 @@
-#include "headers.h"
-
-static struct {
-	int thread;
-	QLock;
-	char adir[NETPATHLEN];
-	int acfd;
-	char ldir[NETPATHLEN];
-	int lcfd;
-	SMBCIFSACCEPTFN *accept;
-} tcp = { -1 };
-
-typedef struct Session Session;
-
-enum { Connected, Dead };
-
-struct Session {
-	SmbCifsSession;
-	int thread;
-	Session *next;
-	int state;
-	SMBCIFSWRITEFN *write;
-};
-
-static struct {
-	QLock;
-	Session *head;
-} sessions;
-
-typedef struct Listen Listen;
-
-static void
-deletesession(Session *s)
-{
-	Session **sp;
-	close(s->fd);
-	qlock(&sessions);
-	for (sp = &sessions.head; *sp && *sp != s; sp = &(*sp)->next)
-		;
-	if (*sp)
-		*sp = s->next;
-	qunlock(&sessions);
-	free(s);
-}
-
-static void
-tcpreader(void *a)
-{
-	Session *s = a;
-	uchar *buf;
-	int buflen = smbglobals.maxreceive + 4;
-	buf = nbemalloc(buflen);
-	for (;;) {
-		int n;
-		uchar flags;
-		ushort length;
-
-		n = readn(s->fd, buf, 4);
-		if (n != 4) {
-		die:
-			free(buf);
-			if (s->state == Connected)
-				(*s->write)(s, nil, -1);
-			deletesession(s);
-			return;
-		}
-		flags = buf[1];
-		length = nhgets(buf + 2) | ((flags & 1) << 16);
-		if (length > buflen - 4) {
-			print("nbss: too much data (%ud)\n", length);
-			goto die;
-		}
-		n = readn(s->fd, buf + 4, length);
-		if (n != length)
-			goto die;
-		if (s->state == Connected) {
-			if ((*s->write)(s, buf + 4, length) != 0) {
-				s->state = Dead;
-				goto die;
-			}
-		}
-	}
-}
-
-static Session *
-createsession(int fd)
-{
-	Session *s;
-	s = smbemalloc(sizeof(Session));
-	s->fd = fd;
-	s->state = Connected;
-	qlock(&sessions);
-	if (!(*tcp.accept)(s, &s->write)) {
-		qunlock(&sessions);
-		free(s);
-		return nil;
-	}
-	s->thread = procrfork(tcpreader, s, 32768, RFNAMEG);
-	if (s->thread < 0) {
-		qunlock(&sessions);
-		(*s->write)(s, nil, -1);
-		free(s);
-		return nil;
-	}
-	s->next = sessions.head;
-	sessions.head = s;
-	qunlock(&sessions);
-	return s;
-}
-
-static void
-tcplistener(void *)
-{
-	for (;;) {
-		int dfd;
-		char ldir[NETPATHLEN];
-		int lcfd;
-//print("cifstcplistener: listening\n");
-		lcfd = listen(tcp.adir, ldir);
-//print("cifstcplistener: contact\n");
-		if (lcfd < 0) {
-		die:
-			qlock(&tcp);
-			close(tcp.acfd);
-			tcp.thread = -1;
-			qunlock(&tcp);
-			return;
-		}
-		dfd = accept(lcfd, ldir);
-		close(lcfd);
-		if (dfd < 0)
-			goto die;
-		if (createsession(dfd) == nil)
-			close(dfd);
-	}
-}
-
-int
-smblistencifs(SMBCIFSACCEPTFN *accept)
-{
-	qlock(&tcp);
-	if (tcp.thread < 0) {
-		tcp.acfd = announce("tcp!*!cifs", tcp.adir);
-		if (tcp.acfd < 0) {
-			print("smblistentcp: can't announce: %r\n");
-			qunlock(&tcp);
-			return -1;
-		}
-		tcp.thread = proccreate(tcplistener, nil, 16384);
-	}
-	tcp.accept = accept;
-	qunlock(&tcp);
-	return 0;
-}
-	
\ No newline at end of file
--- a/sys/src/cmd/aquarela/smblog.c
+++ /dev/null
@@ -1,119 +1,0 @@
-#include "headers.h"
-
-static QLock logreflock, logprintlock;
-static int locked;
-
-void
-smbloglock(void)
-{
-	qlock(&logreflock);
-	if (locked++ == 0)
-		qlock(&logprintlock);
-	qunlock(&logreflock);
-}
-
-void
-smblogunlock(void)
-{
-	qlock(&logreflock);
-	if (locked && --locked == 0)
-		qunlock(&logprintlock);
-	qunlock(&logreflock);
-}
-
-static int
-smbloglockedvprint(char *fmt, va_list ap)
-{
-	if (smbglobals.log.fd >= 0)
-		vfprint(smbglobals.log.fd, fmt, ap);
-	if (smbglobals.log.print)
-		vfprint(2, fmt, ap);
-	return 0;
-}
-
-int
-smblogvprint(int cmd, char *fmt, va_list ap)
-{
-	if (cmd < 0 || smboptable[cmd].debug) {
-		smbloglock();
-		smbloglockedvprint(fmt, ap);
-		smblogunlock();
-	}
-	return 0;
-}
-
-int
-smblogprint(int cmd, char *fmt, ...)
-{
-	if (cmd < 0 || smbtrans2optable[cmd].debug) {
-		va_list ap;
-		va_start(ap, fmt);
-		smblogvprint(cmd, fmt, ap);
-		va_end(ap);
-	}
-	return 0;
-}
-
-int
-translogprint(int cmd, char *fmt, ...)
-{
-	if (cmd < 0 || smboptable[cmd].debug) {
-		va_list ap;
-		va_start(ap, fmt);
-		smblogvprint(cmd, fmt, ap);
-		va_end(ap);
-	}
-	return 0;
-}
-
-int
-smblogprintif(int v, char *fmt, ...)
-{
-	if (v) {
-		va_list ap;
-		va_start(ap, fmt);
-		smbloglock();
-		smbloglockedvprint(fmt, ap);
-		smblogunlock();
-		va_end(ap);
-	}
-	return 0;
-}
-
-void
-smblogdata(int cmd, int (*print)(int cmd, char *fmt, ...), void *ap, long n, long limit)
-{
-	uchar *p = ap;
-	long i;
-	long saven;
-	i = 0;
-	saven = n;
-	if (saven > limit)
-		n = limit;
-	while (i < n) {
-		int l = n - i < 16 ? n - i : 16;
-		int b;
-		(*print)(cmd, "0x%.4lux  ", i);
-		for (b = 0; b < l; b += 2) {
-			(*print)(cmd, " %.2ux", p[i + b]);
-			if (b < l - 1)
-				(*print)(cmd, "%.2ux", p[i + b + 1]);
-			else
-				(*print)(cmd, "  ");
-		}
-		while (b < 16) {
-			(*print)(cmd, "     ");
-			b += 2;
-		}
-		(*print)(cmd, "        ");
-		for (b = 0; b < l; b++)
-			if (p[i + b] >= ' ' && p[i + b] <= '~')
-				(*print)(cmd, "%c", p[i + b]);
-			else
-				(*print)(cmd, ".");
-		(*print)(cmd, "\n");
-		i += l;
-	}
-	if (saven > limit)
-		(*print)(cmd, "0x%.4ux   ...\n0x%.4ux\n", limit, saven);
-}
--- a/sys/src/cmd/aquarela/smbnegotiate.c
+++ /dev/null
@@ -1,89 +1,0 @@
-#include "headers.h"
-
-SmbProcessResult
-smbnegotiate(SmbSession *s, SmbHeader *h, uchar *, SmbBuffer *b)
-{
-	ushort index;
-	int i;
-	uchar bufferformat;
-
-	if (!smbcheckwordcount("negotiate", h, 0))
-		return SmbProcessResultFormat;
-	if (s->state != SmbSessionNeedNegotiate) {
-		/* this acts as a complete session reset */
-		smblogprint(-1, "smbnegotiate: called when already negotiated\n");
-		return SmbProcessResultUnimp;
-	}
-	i = 0;
-	index = 0xffff;
-	while (smbbuffergetb(b, &bufferformat)) {
-		char *s;
-		if (bufferformat != 0x02) {
-			smblogprint(-1, "smbnegotiate: unrecognised buffer format 0x%.2ux\n", bufferformat);
-			return SmbProcessResultFormat;
-		}
-		if (!smbbuffergetstr(b, 0, &s)) {
-			smblogprint(-1, "smbnegotiate: no null found\n");
-			return SmbProcessResultFormat;
-		}
-		smblogprint(h->command, "smbnegotiate: '%s'\n", s);
-		if (index == 0xffff && strcmp(s, "NT LM 0.12") == 0)
-			index = i;
-		i++;
-		free(s);
-	}
-	if (index != 0xffff) {
-		Tm *tm;
-		ulong capabilities;
-		ulong bytecountfixupoffset;
-
-		h->wordcount = 17;
-		if (!smbbufferputheader(s->response, h, nil)
-			|| !smbbufferputs(s->response, index)
-			|| !smbbufferputb(s->response, 3)			/* user security, encrypted */
-			|| !smbbufferputs(s->response, 1)			/* max mux */
-			|| !smbbufferputs(s->response, 1)			/* max vc */
-			|| !smbbufferputl(s->response, smbglobals.maxreceive)		/* max buffer size */
-			|| !smbbufferputl(s->response, 0x10000)		/* max raw */
-			|| !smbbufferputl(s->response, threadid()))	/* session key */
-			goto die;
-		/* <= Win2k insist upon this being set to ensure that they observe the prototol (!) */
-		capabilities = CAP_NT_SMBS;
-		if (smbglobals.unicode)
-			capabilities |= CAP_UNICODE;
-		tm = localtime(time(nil));
-		s->tzoff = tm->tzoff;
-		if (!smbbufferputl(s->response, capabilities)
-			|| !smbbufferputv(s->response, nsec() / 100 + (vlong)10000000 * 11644473600LL)
-			|| !smbbufferputs(s->response, -s->tzoff / 60)
-			|| !smbbufferputb(s->response, 8))	/* crypt len */
-			goto die;
-		bytecountfixupoffset = smbbufferwriteoffset(s->response);
-		if (!smbbufferputs(s->response, 0))
-			goto die;
-		s->cs = auth_challenge("proto=mschap role=server");
-		if (s->cs == nil) {
-			smblogprint(h->command, "smbnegotiate: couldn't get mschap challenge\n");
-			return SmbProcessResultMisc;
-		}
-		if (s->cs->nchal != 8) {
-			smblogprint(h->command, "smbnegotiate: nchal %d\n", s->cs->nchal);
-			return SmbProcessResultMisc;
-		}
-		if (!smbbufferputbytes(s->response, s->cs->chal, s->cs->nchal)
-			|| !smbbufferputstring(s->response, nil, SMB_STRING_UNICODE, smbglobals.primarydomain)
-			|| !smbbufferfixuprelatives(s->response, bytecountfixupoffset))
-			goto die;
-	}
-	else {
-		h->wordcount = 1;
-		if (!smbbufferputheader(s->response, h, nil)
-			|| !smbbufferputs(s->response, index)
-			|| !smbbufferputs(s->response, 0))
-			goto die;
-	}
-	s->state = SmbSessionNeedSetup;
-	return SmbProcessResultReply;
-die:
-	return SmbProcessResultDie;
-}
--- a/sys/src/cmd/aquarela/smboptable.c
+++ /dev/null
@@ -1,98 +1,0 @@
-#include "headers.h"
-
-SmbOpTableEntry smboptable[256] = {
-[SMB_COM_CREATE_DIRECTORY] { "SMB_COM_CREATE_DIRECTORY", smbcomcreatedirectory },
-[SMB_COM_DELETE_DIRECTORY] { "SMB_COM_DELETE_DIRECTORY", smbcomdeletedirectory },
-[SMB_COM_OPEN] { "SMB_COM_OPEN", smbcomopen },
-[SMB_COM_CREATE] { "SMB_COM_CREATE", smbcomcreate },
-[SMB_COM_CLOSE] { "SMB_COM_CLOSE", smbcomclose },
-[SMB_COM_FLUSH] { "SMB_COM_FLUSH", smbcomflush },
-[SMB_COM_DELETE] { "SMB_COM_DELETE", smbcomdelete },
-[SMB_COM_RENAME] { "SMB_COM_RENAME", smbcomrename },
-[SMB_COM_QUERY_INFORMATION] { "SMB_COM_QUERY_INFORMATION", smbcomqueryinformation },
-[SMB_COM_SET_INFORMATION] { "SMB_COM_SET_INFORMATION", smbcomsetinformation },
-[SMB_COM_READ] { "SMB_COM_READ", nil },
-[SMB_COM_WRITE] { "SMB_COM_WRITE", smbcomwrite },
-[SMB_COM_LOCK_BYTE_RANGE] { "SMB_COM_LOCK_BYTE_RANGE", nil },
-[SMB_COM_UNLOCK_BYTE_RANGE] { "SMB_COM_UNLOCK_BYTE_RANGE", nil },
-[SMB_COM_CREATE_TEMPORARY] { "SMB_COM_CREATE_TEMPORARY", nil },
-[SMB_COM_CREATE_NEW] { "SMB_COM_CREATE_NEW", nil },
-[SMB_COM_CHECK_DIRECTORY] { "SMB_COM_CHECK_DIRECTORY", smbcomcheckdirectory },
-[SMB_COM_PROCESS_EXIT] { "SMB_COM_PROCESS_EXIT", nil },
-[SMB_COM_SEEK] { "SMB_COM_SEEK", nil },
-[SMB_COM_LOCK_AND_READ] { "SMB_COM_LOCK_AND_READ", nil },
-[SMB_COM_WRITE_AND_UNLOCK] { "SMB_COM_WRITE_AND_UNLOCK", nil },
-[SMB_COM_READ_RAW] { "SMB_COM_READ_RAW", nil },
-[SMB_COM_READ_MPX] { "SMB_COM_READ_MPX", nil },
-[SMB_COM_READ_MPX_SECONDARY] { "SMB_COM_READ_MPX_SECONDARY", nil },
-[SMB_COM_WRITE_RAW] { "SMB_COM_WRITE_RAW", nil },
-[SMB_COM_WRITE_MPX] { "SMB_COM_WRITE_MPX", nil },
-[SMB_COM_WRITE_MPX_SECONDARY] { "SMB_COM_WRITE_MPX_SECONDARY", nil },
-[SMB_COM_WRITE_COMPLETE] { "SMB_COM_WRITE_COMPLETE", nil },
-[SMB_COM_QUERY_SERVER] { "SMB_COM_QUERY_SERVER", nil },
-[SMB_COM_SET_INFORMATION2] { "SMB_COM_SET_INFORMATION2", smbcomsetinformation2 },
-[SMB_COM_QUERY_INFORMATION2] { "SMB_COM_QUERY_INFORMATION2", smbcomqueryinformation2 },
-[SMB_COM_LOCKING_ANDX] { "SMB_COM_LOCKING_ANDX", smbcomlockingandx },
-[SMB_COM_TRANSACTION] { "SMB_COM_TRANSACTION", smbcomtransaction },
-[SMB_COM_TRANSACTION_SECONDARY] { "SMB_COM_TRANSACTION_SECONDARY", nil },
-[SMB_COM_IOCTL] { "SMB_COM_IOCTL", nil },
-[SMB_COM_IOCTL_SECONDARY] { "SMB_COM_IOCTL_SECONDARY", nil },
-[SMB_COM_COPY] { "SMB_COM_COPY", nil },
-[SMB_COM_MOVE] { "SMB_COM_MOVE", nil },
-[SMB_COM_ECHO] { "SMB_COM_ECHO", smbcomecho },
-[SMB_COM_WRITE_AND_CLOSE] { "SMB_COM_WRITE_AND_CLOSE", nil },
-[SMB_COM_OPEN_ANDX] { "SMB_COM_OPEN_ANDX", smbcomopenandx },
-[SMB_COM_READ_ANDX] { "SMB_COM_READ_ANDX", smbcomreadandx },
-[SMB_COM_WRITE_ANDX] { "SMB_COM_WRITE_ANDX", smbcomwriteandx },
-[SMB_COM_NEW_FILE_SIZE] { "SMB_COM_NEW_FILE_SIZE", nil },
-[SMB_COM_CLOSE_AND_TREE_DISC] { "SMB_COM_CLOSE_AND_TREE_DISC", nil },
-[SMB_COM_TRANSACTION2] { "SMB_COM_TRANSACTION2", smbcomtransaction2 },
-[SMB_COM_TRANSACTION2_SECONDARY] { "SMB_COM_TRANSACTION2_SECONDARY", nil },
-[SMB_COM_FIND_CLOSE2] { "SMB_COM_FIND_CLOSE2", smbcomfindclose2 },
-[SMB_COM_FIND_NOTIFY_CLOSE] { "SMB_COM_FIND_NOTIFY_CLOSE", nil },
-[SMB_COM_TREE_CONNECT] { "SMB_COM_TREE_CONNECT", nil },
-[SMB_COM_TREE_DISCONNECT] { "SMB_COM_TREE_DISCONNECT", smbcomtreedisconnect },
-[SMB_COM_NEGOTIATE] { "SMB_COM_NEGOTIATE", smbnegotiate },
-[SMB_COM_SESSION_SETUP_ANDX] { "SMB_COM_SESSION_SETUP_ANDX", smbcomsessionsetupandx },
-[SMB_COM_LOGOFF_ANDX] { "SMB_COM_LOGOFF_ANDX", nil },
-[SMB_COM_TREE_CONNECT_ANDX] { "SMB_COM_TREE_CONNECT_ANDX", smbcomtreeconnectandx },
-[SMB_COM_QUERY_INFORMATION_DISK] { "SMB_COM_QUERY_INFORMATION_DISK", nil },
-[SMB_COM_SEARCH] { "SMB_COM_SEARCH", nil },
-[SMB_COM_FIND] { "SMB_COM_FIND", nil },
-[SMB_COM_FIND_UNIQUE] { "SMB_COM_FIND_UNIQUE", nil },
-[SMB_COM_FIND_CLOSE] { "SMB_COM_FIND_CLOSE", nil },
-[SMB_COM_NT_TRANSACT] { "SMB_COM_NT_TRANSACT", nil },
-[SMB_COM_NT_TRANSACT_SECONDARY] { "SMB_COM_NT_TRANSACT_SECONDARY", nil },
-[SMB_COM_NT_CREATE_ANDX] { "SMB_COM_NT_CREATE_ANDX", smbcomntcreateandx },
-[SMB_COM_NT_CANCEL] { "SMB_COM_NT_CANCEL", nil },
-[SMB_COM_NT_RENAME] { "SMB_COM_NT_RENAME", nil },
-[SMB_COM_OPEN_PRINT_FILE] { "SMB_COM_OPEN_PRINT_FILE", nil },
-[SMB_COM_WRITE_PRINT_FILE] { "SMB_COM_WRITE_PRINT_FILE", nil },
-[SMB_COM_CLOSE_PRINT_FILE] { "SMB_COM_CLOSE_PRINT_FILE", nil },
-[SMB_COM_GET_PRINT_QUEUE] { "SMB_COM_GET_PRINT_QUEUE", nil },
-[SMB_COM_READ_BULK] { "SMB_COM_READ_BULK", nil },
-[SMB_COM_WRITE_BULK] { "SMB_COM_WRITE_BULK", nil },
-[SMB_COM_NO_ANDX_COMMAND] { "SMB_COM_NO_ANDX_COMMAND", nil },
-};
-
-SmbTrans2OpTableEntry
-smbtrans2optable[] = {
-[SMB_TRANS2_OPEN] { "SMB_TRANS2_OPEN", nil },
-[SMB_TRANS2_FIND_FIRST2] { "SMB_TRANS2_FIND_FIRST2", smbtrans2findfirst2 },
-[SMB_TRANS2_FIND_NEXT2] { "SMB_TRANS2_FIND_NEXT2", smbtrans2findnext2 },
-[SMB_TRANS2_QUERY_FS_INFORMATION] { "SMB_TRANS2_QUERY_FS_INFORMATION", smbtrans2queryfsinformation },
-[SMB_TRANS2_SET_FS_INFORMATION] { "SMB_TRANS2_SET_FS_INFORMATION", nil },
-[SMB_TRANS2_QUERY_PATH_INFORMATION] { "SMB_TRANS2_QUERY_PATH_INFORMATION", smbtrans2querypathinformation },
-[SMB_TRANS2_SET_PATH_INFORMATION] { "SMB_TRANS2_SET_PATH_INFORMATION", smbtrans2setpathinformation },
-[SMB_TRANS2_QUERY_FILE_INFORMATION] { "SMB_TRANS2_QUERY_FILE_INFORMATION", smbtrans2queryfileinformation },
-[SMB_TRANS2_SET_FILE_INFORMATION] { "SMB_TRANS2_SET_FILE_INFORMATION", smbtrans2setfileinformation },
-[SMB_TRANS2_FSCTL] { "SMB_TRANS2_FSCTL", nil },
-[SMB_TRANS2_IOCTL2] { "SMB_TRANS2_IOCTL2", nil },
-[SMB_TRANS2_FIND_NOTIFY_FIRST] { "SMB_TRANS2_FIND_NOTIFY_FIRST", nil },
-[SMB_TRANS2_FIND_NOTIFY_NEXT] { "SMB_TRANS2_FIND_NOTIFY_NEXT", nil },
-[SMB_TRANS2_CREATE_DIRECTORY] { "SMB_TRANS2_CREATE_DIRECTORY", nil },
-[SMB_TRANS2_SESSION_SETUP] { "SMB_TRANS2_SESSION_SETUP", nil },
-[SMB_TRANS2_GET_DFS_REFERRAL] { "SMB_TRANS2_GET_DFS_REFERRAL", nil },
-[SMB_TRANS2_REPORT_DFS_INCONSISTENCY] { "SMB_TRANS2_REPORT_DFS_INCONSISTENCY", nil },
-};
-int smbtrans2optablesize = nelem(smbtrans2optable);
--- a/sys/src/cmd/aquarela/smbpath.c
+++ /dev/null
@@ -1,22 +1,0 @@
-#include "headers.h"
-
-void
-smbpathsplit(char *path, char **dirp, char **namep)
-{
-	char *dir;
-	char *p = strrchr(path, '/');
-	if (p == nil) {
-		*dirp = smbestrdup("/");
-		*namep = smbestrdup(path);
-		return;
-	}
-	if (p == path)
-		dir = smbestrdup("/");
-	else {
-		dir = smbemalloc(p - path + 1);
-		memcpy(dir, path, p - path);
-		dir[p - path] = 0;
-	}
-	*dirp = dir;
-	*namep = smbestrdup(p + 1);
-}
--- a/sys/src/cmd/aquarela/smbrap2.c
+++ /dev/null
@@ -1,467 +1,0 @@
-#include "headers.h"
-
-typedef struct RapTableEntry RapTableEntry;
-
-struct RapTableEntry {
-	char *name;
-	SmbProcessResult (*procedure)(SmbBuffer *inparam, SmbBuffer *outparam, SmbBuffer *outdata);
-};
-
-typedef int INFOSIZEFN(ushort level, void *data);
-typedef int INFOPUTFN(SmbBuffer *b, ushort level, void *data);
-typedef int INFOPUTSTRINGSFN(SmbBuffer *b, ushort level, int instance, void *data);
-typedef void *INFOENUMERATEFN(void *magic, int i);
-
-typedef struct InfoMethod {
-	INFOSIZEFN *size;
-	INFOPUTFN *put;
-	INFOPUTSTRINGSFN *putstrings;
-	INFOENUMERATEFN *enumerate;
-} InfoMethod;
-
-static int
-serverinfosize(ushort level, void *data)
-{
-	SmbServerInfo *si = data;
-	switch (level) {
-	case 0:
-		return 16;
-	case 1:
-		return 26 + smbstrlen(si->remark);
-	default:
-		return 0;
-	}
-}
-
-static int
-serverinfoput(SmbBuffer *b, ushort level, void *data)
-{
-	SmbServerInfo *si = data;
-	if (!smbbufferputstrn(b, si->name, 16, 1))
-		return 0;
-	if (level > 0) {
-		if (!smbbufferputb(b, si->vmaj)
-			|| !smbbufferputb(b, si->vmin)
-			|| !smbbufferputl(b, si->stype)
-			|| !smbbufferputl(b, 0))
-			return 0;
-	}
-	if (level > 1)
-		return 0;
-	return 1;
-}
-
-static int
-serverinfoputstrings(SmbBuffer *b, ushort level, int instance, void *data)
-{
-	SmbServerInfo *si = data;
-	if (level == 1) {
-		if (!smbbufferfixupabsolutel(b, instance * 26 + 22)
-			|| !smbbufferputstring(b, nil, SMB_STRING_ASCII, si->remark))
-			return 0;
-	}
-	return 1;
-}
-
-static void *
-serverinfoenumerate(void *magic, int i)
-{
-	if (magic) {
-		SmbServerInfo **si = magic;
-		return si[i];
-	}
-	if (i == 0)
-		return &smbglobals.serverinfo;
-	return nil;
-}
-
-InfoMethod serverinfo = {
-	serverinfosize,
-	serverinfoput,
-	serverinfoputstrings,
-	serverinfoenumerate,
-};
-
-static int
-shareinfosize(ushort level, void *data)
-{
-	SmbService *serv = data;
-	switch (level) {
-	case 0:
-		return 13;
-	case 1:
-		return 20 + smbstrlen(serv->remark);
-	case 2:
-		return 40 + smbstrlen(serv->remark) + smbstrlen(serv->path);
-	default:
-		return 0;
-	}
-}
-
-static int
-shareinfoput(SmbBuffer *b, ushort level, void *data)
-{
-	SmbService *serv = data;
-	if (!smbbufferputstrn(b, serv->name, 13, 0))
-		return 0;
-	if (level > 0) {
-		if (!smbbufferputb(b, 0)
-			|| !smbbufferputs(b, serv->stype)
-			|| !smbbufferputl(b, 0))
-			return 0;
-	}
-	if (level > 1) {
-		if (!smbbufferputs(b, 7)
-			|| !smbbufferputs(b, -1)
-			|| !smbbufferputs(b, serv->ref)
-			|| !smbbufferputl(b, 0)
-			|| !smbbufferfill(b, 0, 10))
-			return 0;
-	}
-	if (level > 2)
-		return 0;
-	return 1;
-}
-
-static int
-shareinfoputstrings(SmbBuffer *b, ushort level, int instance, void *data)
-{
-	SmbService *serv = data;
-	switch (level) {
-	case 0:
-		break;
-	case 1:
-		if (!smbbufferfixupabsolutel(b, instance * 20 + 16)
-			|| !smbbufferputstring(b, nil, SMB_STRING_ASCII, serv->remark))
-			return 0;
-		break;
-	case 2:
-		if (!smbbufferfixupabsolutel(b, instance * 40 + 16)
-			|| !smbbufferputstring(b, nil, SMB_STRING_ASCII, serv->remark)
-			|| !smbbufferfixupabsolutel(b, instance * 40 + 26)
-			|| !smbbufferputstring(b, nil, SMB_STRING_ASCII, serv->path))
-			return 0;
-		break;
-	default:
-		return 0;
-	}
-	return 1;
-}
-
-static void *
-shareinfoenumerate(void *, int i)
-{
-	SmbService *serv;
-	for (serv = smbservices; i-- > 0 && serv; serv = serv->next)
-		;
-	return serv;
-}
-
-static InfoMethod shareinfo = {
-	shareinfosize,
-	shareinfoput,
-	shareinfoputstrings,
-	shareinfoenumerate,
-};
-
-static SmbProcessResult
-thingfill(SmbBuffer *outparam, SmbBuffer *outdata, InfoMethod *m, ushort level, void *magic)
-{
-	int sentthings, totalthings;
-	int i;
-	int totalbytes;
-
-	sentthings = 0;
-	totalbytes = 0;
-	for (i = 0; ; i++) {
-		int len;
-		void *thing = (*m->enumerate)(magic, i);
-		if (thing == nil)
-			break;
-		len = (*m->size)(level, thing);
-		if (totalbytes + len <= smbbufferspace(outdata)) {
-			assert((*m->put)(outdata, level, thing));
-			sentthings++;
-		}
-		totalbytes += len;
-	}
-	totalthings = i;
-	for (i = 0; i < sentthings; i++) {
-		void *thing = (*m->enumerate)(magic, i);
-		assert(thing);
-		assert((*m->putstrings)(outdata, level, i, thing));
-	}
-	if (!smbbufferputs(outparam, sentthings < totalthings ? SMB_RAP_ERROR_MORE_DATA : SMB_RAP_NERR_SUCCESS)
-		|| !smbbufferputs(outparam, 0)
-		|| !smbbufferputs(outparam, totalthings)
-		|| !smbbufferputs(outparam, sentthings))
-		return SmbProcessResultFormat;
-	return SmbProcessResultReply;
-}
-
-static SmbProcessResult
-onethingfill(SmbBuffer *outparam, SmbBuffer *outdata, InfoMethod *m, ushort level, void *thing)
-{
-	int moredata;
-	int totalbytes = (*m->size)(level, thing);
-	if (totalbytes <= smbbufferspace(outdata)) {
-		assert((*m->put)(outdata, level, thing));
-		assert((*m->putstrings)(outdata, level, 0, thing));
-		moredata = 0;
-	}
-	else
-		moredata = 1;
-	if (!smbbufferputs(outparam, moredata ? SMB_RAP_ERROR_MORE_DATA : SMB_RAP_NERR_SUCCESS)
-		|| !smbbufferputs(outparam, 0)
-		|| !smbbufferputs(outparam, totalbytes))
-		return SmbProcessResultFormat;
-	return SmbProcessResultReply;
-}
-
-static SmbProcessResult
-netshareenum(SmbBuffer *inparam, SmbBuffer *outparam, SmbBuffer *outdata)
-{
-	ushort level;
-
-	/* WrLeh */
-	/* ushort sLevel, RCVBUF pbBuffer, RCVBUFLEN cbBuffer, ENTCOUNT pcEntriesRead, ushort *pcTotalAvail */
-
-	if (!smbbuffergets(inparam, &level))
-		return SmbProcessResultFormat;
-	
-	smblogprintif(smbglobals.log.rap2, "netshareenum(%lud, %lud)\n",
-		level, smbbufferwritespace(outdata));
-
-	if (level != 1)
-		return SmbProcessResultFormat;
-
-	return thingfill(outparam, outdata, &shareinfo, level, nil);
-}
-
-static SmbProcessResult
-netserverenum2(SmbBuffer *inparam, SmbBuffer *outparam, SmbBuffer *outdata)
-{
-	ushort level, rbl;
-	char *domain;
-	ulong servertype;
-	SmbProcessResult pr;
-	SmbServerInfo *si[3];
-	SmbServerInfo domainsi;
-	int entries;
-
-	/* WrLehDz
-	 * ushort sLevel, RCVBUF pbBuffer, RCVBUFLEN cbBuffer, ENTCOUNT pcEntriesRead, ushort *pcTotalAvail,
-	 * ulong fServerType, char *pszDomain
-	*/
-
-	if (!smbbuffergets(inparam, &level)
-		|| !smbbuffergets(inparam, &rbl)
-		|| !smbbuffergetl(inparam, &servertype)
-		|| !smbbuffergetstr(inparam, 0, &domain)) {
-	fmtfail:
-		pr = SmbProcessResultFormat;
-		goto done;
-	}
-	
-	smblogprintif(smbglobals.log.rap2, "netserverenum2(%lud, %lud, 0x%.8lux, %s)\n",
-		level, smbbufferwritespace(outdata), servertype, domain);
-
-	if (level > 1)
-		goto fmtfail;
-
-	if (servertype == 0xffffffff)
-		servertype &= ~(SV_TYPE_DOMAIN_ENUM | SV_TYPE_LOCAL_LIST_ONLY);
-
-	if ((servertype & SV_TYPE_LOCAL_LIST_ONLY) != 0 && (servertype & SV_TYPE_DOMAIN_ENUM) == 0) 
-		servertype = SV_TYPE_ALL & ~(SV_TYPE_DOMAIN_ENUM);
-
-	entries = 0;
-
-	if ((servertype & SV_TYPE_SERVER) != 0
-		&& (domain[0] == 0 || cistrcmp(domain, smbglobals.primarydomain) == 0)) {
-		si[entries++] = &smbglobals.serverinfo;
-	}
-
-	if ((servertype & SV_TYPE_DOMAIN_ENUM) != 0) {
-		/* there's only one that I know about */
-		memset(&domainsi, 0, sizeof(domainsi));
-		domainsi.name = smbglobals.primarydomain;
-		domainsi.stype = SV_TYPE_DOMAIN_ENUM;
-		si[entries++] = &domainsi;
-	}
-	si[entries] = 0;
-
-	pr = thingfill(outparam, outdata, &serverinfo, level, si);
-			
-done:
-	free(domain);
-	return pr;
-}
-
-static SmbProcessResult
-netsharegetinfo(SmbBuffer *inparam, SmbBuffer *outparam, SmbBuffer *outdata)
-{
-	char *netname;
-	ushort level;
-	SmbProcessResult pr;
-	SmbService *serv;
-
-	/*
-	 * zWrLh
-	 * char *pszNetName, ushort sLevel, RCVBUF pbBuffer, RCVBUFLEN cbBuffer, ushort *pcbTotalAvail
-	*/
-
-	if (!smbbuffergetstrinline(inparam, &netname)
-		|| !smbbuffergets(inparam, &level)) {
-	fmtfail:
-		pr = SmbProcessResultFormat;
-		goto done;
-	}
-	
-	smblogprintif(smbglobals.log.rap2, "netsharegetinfo(%s, %lud, %lud)\n",
-		netname, level, smbbufferwritespace(outdata));
-
-	if (level > 2)
-		goto fmtfail;
-
-	for (serv = smbservices; serv; serv = serv->next)
-		if (cistrcmp(serv->name, netname) == 0)
-			break;
-
-	if (serv == nil) {
-		smblogprint(-1, "netsharegetinfo: service %s unimplemented\n", netname);
-		pr = SmbProcessResultUnimp;
-		goto done;
-	}
-
-	pr = onethingfill(outparam, outdata, &shareinfo, level, serv);
-
-done:
-	return pr;
-}
-
-static SmbProcessResult
-netservergetinfo(SmbBuffer *inparam, SmbBuffer *outparam, SmbBuffer *outdata)
-{
-	ushort level;
-	SmbProcessResult pr;
-
-	/* WrLh
-	 * ushort sLevel, RCVBUF pbBuffer, RCVBUFLEN cbBuffer, ushort *pcbTotalAvail
-	*/
-
-	if (!smbbuffergets(inparam, &level)) {
-	fmtfail:
-		pr = SmbProcessResultFormat;
-		goto done;
-	}
-	
-	smblogprintif(smbglobals.log.rap2, "netservergetinfo(%lud, %lud)\n",
-		level, smbbufferwritespace(outdata));
-
-	if (level > 1)
-		goto fmtfail;
-
-	pr = onethingfill(outparam, outdata, &shareinfo, level, &smbglobals.serverinfo);
-			
-done:
-	return pr;
-}
-
-static SmbProcessResult
-netwkstagetinfo(SmbBuffer *inparam, SmbBuffer *outparam, SmbBuffer *outdata)
-{
-	ushort level;
-	ushort usefulbytes;
-	SmbProcessResult pr;
-	int moredata;
-
-	/* WrLh
-	 * ushort sLevel, RCVBUF pbBuffer, RCVBUFLEN cbBuffer, ushort *pcbTotalAvail
-	*/
-
-	if (!smbbuffergets(inparam, &level)) {
-	fmtfail:
-		pr = SmbProcessResultFormat;
-		goto done;
-	}
-	
-	smblogprintif(smbglobals.log.rap2, "netwkstagetinfo(%lud, %lud)\n",
-		level, smbbufferwritespace(outdata));
-
-	if (level != 10)
-		goto fmtfail;
-
-	usefulbytes = 22 + smbstrlen(smbglobals.serverinfo.name) + smbstrlen(getuser())
-		+ 3 * smbstrlen(smbglobals.primarydomain);
-
-	moredata = usefulbytes > smbbufferwritespace(outdata);
-
-	assert(smbbufferputl(outdata, 0));
-	assert(smbbufferputl(outdata, 0));
-	assert(smbbufferputl(outdata, 0));
-	assert(smbbufferputb(outdata, smbglobals.serverinfo.vmaj));
-	assert(smbbufferputb(outdata, smbglobals.serverinfo.vmin));
-	assert(smbbufferputl(outdata, 0));
-	assert(smbbufferputl(outdata, 0));
-	assert(smbbufferfixupabsolutel(outdata, 0));
-	assert(smbbufferputstring(outdata, nil, SMB_STRING_ASCII, smbglobals.serverinfo.name));
-	assert(smbbufferfixupabsolutel(outdata, 4));
-	assert(smbbufferputstring(outdata, nil, SMB_STRING_ASCII, getuser()));
-	assert(smbbufferfixupabsolutel(outdata, 8));
-	assert(smbbufferputstring(outdata, nil, SMB_STRING_ASCII, smbglobals.primarydomain));
-	assert(smbbufferfixupabsolutel(outdata, 14));
-	assert(smbbufferputstring(outdata, nil, SMB_STRING_ASCII, smbglobals.primarydomain));
-	assert(smbbufferfixupabsolutel(outdata, 18));
-	assert(smbbufferputstring(outdata, nil, SMB_STRING_ASCII, smbglobals.primarydomain));
-
-	if (!smbbufferputs(outparam, moredata ? SMB_RAP_ERROR_MORE_DATA : SMB_RAP_NERR_SUCCESS)
-		|| !smbbufferputs(outparam, 0)
-		|| !smbbufferputs(outparam, usefulbytes)) {
-		pr = SmbProcessResultFormat;
-		goto done;
-	}
-	
-	pr = SmbProcessResultReply;
-			
-done:
-	return pr;
-}
-
-static RapTableEntry raptable[] = {
-[RapNetShareGetInfo] { "NetShareGetInfo", netsharegetinfo },
-[RapNetShareEnum] { "NetShareEnum", netshareenum },
-[RapNetServerGetInfo] {"NetServerGetInfo", netservergetinfo },
-[RapNetWkstaGetInfo] { "NetWkstaGetInfo", netwkstagetinfo },
-[RapNetServerEnum2] { "NetServerEnum2", netserverenum2 },
-};
-
-SmbProcessResult
-smbrap2(SmbSession *s)
-{
-	char *pstring;
-	char *dstring;
-	ushort pno;
-	RapTableEntry *e;
-	SmbProcessResult pr;
-	SmbBuffer *inparam;
-
-	inparam = smbbufferinit(s->transaction.in.parameters, s->transaction.in.parameters, s->transaction.in.tpcount);
-	if (!smbbuffergets(inparam, &pno)
-		|| !smbbuffergetstrinline(inparam, &pstring)
-		|| !smbbuffergetstrinline(inparam, &dstring)) {
-		smblogprintif(smbglobals.log.rap2, "smbrap2: not enough parameters\n");
-		pr = SmbProcessResultFormat;
-		goto done;
-	}
-	if (pno > nelem(raptable) || raptable[pno].name == nil) {
-		smblogprint(-1, "smbrap2: unsupported procedure %ud\n", pno);
-		pr = SmbProcessResultUnimp;
-		goto done;
-	}
-	e = raptable + pno;
-	pr = (*e->procedure)(inparam, s->transaction.out.parameters, s->transaction.out.data);
-done:
-	smbbufferfree(&inparam);
-	return pr;
-}
--- a/sys/src/cmd/aquarela/smbrap2client.c
+++ /dev/null
@@ -1,100 +1,0 @@
-#include "headers.h"
-
-static SmbTransactionMethod smbtransactionmethodrap = {
-	.encodeprimary = smbtransactionencodeprimary,
-	.sendrequest = smbtransactionclientsend,
-	.receiveresponse = smbtransactionclientreceive,
-	.decoderesponse = smbtransactiondecoderesponse,
-};
-
-int
-smbclientrap(SmbClient *c, SmbBuffer *inparam, SmbBuffer *outparam, SmbBuffer *outdata, char **errmsgp)
-{
-	SmbTransaction transaction;
-	SmbHeader h;
-	memset(&transaction, 0, sizeof(transaction));
-	transaction.in.name = smbglobals.pipelanman;
-	transaction.in.parameters = smbbufferreadpointer(inparam);
-	transaction.in.tpcount = smbbufferreadspace(inparam);
-	transaction.in.maxpcount = smbbufferwritespace(outparam);
-	transaction.in.maxdcount = smbbufferwritespace(outdata);
-	transaction.out.parameters = outparam;
-	transaction.out.data = outdata;
-	h = c->protoh;
-	h.tid = c->ipctid;
-	h.mid = 0;
-	return smbtransactionexecute(&transaction, &h, &c->peerinfo, c->b, &smbtransactionmethodrap, c, nil, errmsgp);
-}
-
-int
-smbnetserverenum2(SmbClient *c, ulong stype, char *domain, int *entriesp, SmbRapServerInfo1 **sip, char **errmsgp)
-{
-	int rv;
-	ushort ec, entries, total, converter;
-	SmbRapServerInfo1 *si = nil;
-	SmbBuffer *ipb = smbbuffernew(512);
-	SmbBuffer *odb = smbbuffernew(65535);
-	SmbBuffer *opb = smbbuffernew(8);
-	smbbufferputs(ipb, 104);
-	smbbufferputstring(ipb, nil, SMB_STRING_ASCII, "WrLehDz");
-	smbbufferputstring(ipb, nil, SMB_STRING_ASCII, "B16BBDz");
-	smbbufferputs(ipb, 1);
-	smbbufferputs(ipb, smbbufferwritespace(odb));
-	smbbufferputl(ipb, stype);
-	smbbufferputstring(ipb, nil, SMB_STRING_ASCII, domain);
-	rv = !smbclientrap(c, ipb, opb, odb, errmsgp);
-	smbbufferfree(&ipb);
-	if (rv == 0) {
-		char *remark, *eremark;
-		int remarkspace;
-		int i;
-		if (!smbbuffergets(opb, &ec)
-			|| !smbbuffergets(opb, &converter)
-			|| !smbbuffergets(opb, &entries)
-			|| !smbbuffergets(opb, &total)) {
-			smbstringprint(errmsgp, "smbnetserverenum2: not enough return parameters");
-			rv = -1;
-			goto done;
-		}
-		if (ec != 0) {
-			rv = ec;
-			goto done;
-		}
-		if (smbbufferreadspace(odb) < entries * 26) {
-			smbstringprint(errmsgp, "smbnetserverenum2: not enough return data");
-			rv = -1;
-			goto done;
-		}
-		remarkspace = smbbufferreadspace(odb) - entries * 26;
-		si = smbemalloc(entries * sizeof(SmbRapServerInfo1) + remarkspace);
-		remark = (char *)&si[entries];
-		eremark = remark + remarkspace;
-		for (i = 0; i < entries; i++) {
-			ulong offset;
-			int remarklen;
-			assert(smbbuffergetbytes(odb, si[i].name, 16));
-			assert(smbbuffergetb(odb, &si[i].vmaj));
-			assert(smbbuffergetb(odb, &si[i].vmin));
-			assert(smbbuffergetl(odb, &si[i].type));
-			assert(smbbuffergetl(odb, &offset));
-			offset -= converter;
-			if (!smbbufferoffsetcopystr(odb, offset, remark, eremark - remark, &remarklen)) {
-				smbstringprint(errmsgp, "smbnetserverenum2: invalid string offset");
-				rv = -1;
-				goto done;
-			}
-			si[i].remark = remark;
-			remark += remarklen;
-		}
-		*sip = si;
-		si = nil;
-		*entriesp = entries;
-	}
-	else
-		rv = -1;	
-done:
-	free(si);
-	smbbufferfree(&opb);
-	smbbufferfree(&odb);
-	return rv;
-}
--- a/sys/src/cmd/aquarela/smbrep.c
+++ /dev/null
@@ -1,67 +1,0 @@
-#include "headers.h"
-
-int
-smbmatch(char *name, Reprog *rep)
-{
-	Resub sub;
-	sub.sp = nil;
-	sub.ep = nil;
-	if (regexec(rep, name, &sub, 1) && sub.sp == name && *sub.ep == 0)
-		return 1;
-	return 0;
-}
-
-Reprog *
-smbmkrep(char *pattern)
-{
-	Reprog *r;
-	int l;
-	char *tmp, *p, *q, *t;
-	l = strlen(pattern);
-	tmp = smbemalloc(l * 5 + 1);
-	t = tmp;
-	p = pattern;
-	while (*p) {
-		if (*p == '*') {
-			if (p[1] == '.') {
-				strcpy(t, "[^.]*");
-				t += 5;
-				p++;
-			}
-			else {
-				*t++ = '.';
-				*t++ = '*';
-				p++;
-			}
-		}
-		else if (*p == '?') {
-			for (q = p + 1; *q && *q == '?'; q++)
-				;
-			if (*q == 0 || *q == '.') {
-				/* at most n copies */
-				strcpy(t, "[^.]?");
-				t += 5;
-				p++;
-			}
-			else {
-				/* exactly n copies */
-				strcpy(t, "[^.]");
-				t += 4;
-				p++;
-			}
-		}
-		else if (strchr(".+{}()|\\^$", *p) != 0) {
-			/* regexp meta */
-			*t++ = '\\';
-			*t++ = *p++;
-		}
-		else
-			*t++ = *p++;
-	}
-	*t = 0;
-	smblogprintif(smbglobals.log.rep, "%s => %s\n", pattern, tmp);
-	r = regcomp(tmp);
-	free(tmp);
-	return r;
-}
-
--- a/sys/src/cmd/aquarela/smbresponse.c
+++ /dev/null
@@ -1,135 +1,0 @@
-#include "headers.h"
-
-void
-smbresponsereset(SmbSession *s)
-{
-	smbbufferreset(s->response);
-}
-
-void
-smbresponseinit(SmbSession *s, ushort maxlen)
-{
-	smbbufferfree(&s->response);
-	s->response = smbbuffernew(maxlen);
-}
-
-int
-smbresponsealignl2(SmbSession *s, int l2a)
-{
-	return smbbufferalignl2(s->response, l2a);
-}
-
-int
-smbresponseputheader(SmbSession *s, SmbHeader *h, uchar errclass, ushort error)
-{
-	h->errclass = errclass;
-	h->error = error;
-	return smbbufferputheader(s->response, h, &s->peerinfo);
-}
-
-int
-smbresponseputb(SmbSession *s, uchar b)
-{
-	return smbbufferputb(s->response, b);
-}
-
-ushort
-smbresponsespace(SmbSession *sess)
-{
-	return smbbufferwritespace(sess->response);
-}
-
-int
-smbresponseskip(SmbSession *sess, ushort amount)
-{
-	return smbbufferputbytes(sess->response, nil, amount);
-}
-
-int
-smbresponseoffsetputs(SmbSession *sess, ushort offset, ushort s)
-{
-	return smbbufferoffsetputs(sess->response, offset, s);
-}
-
-int
-smbresponseputs(SmbSession *sess, ushort s)
-{
-	return smbbufferputs(sess->response, s);
-}
-
-int
-smbresponseputl(SmbSession *s, ulong l)
-{
-	return smbbufferputl(s->response, l);
-}
-
-int
-smbresponsecpy(SmbSession *s, uchar *data, ushort datalen)
-{
-	return smbbufferputbytes(s->response, data, datalen);
-}
-
-int
-smbresponseputstring(SmbSession *s, int mustalign, char *string)
-{
-	return smbbufferputstring(s->response, &s->peerinfo, mustalign ? 0 : SMB_STRING_UNALIGNED, string);
-}
-
-int
-smbresponseputstr(SmbSession *s, char *string)
-{
-	return smbbufferputstring(s->response, nil, SMB_STRING_ASCII, string);
-}
-
-ushort
-smbresponseoffset(SmbSession *s)
-{
-	return smbbufferwriteoffset(s->response);
-}
-
-SmbProcessResult
-smbresponsesend(SmbSession *s)
-{
-	uchar cmd;
-	SmbProcessResult pr;
-
-	assert(smbbufferoffsetgetb(s->response, 4, &cmd));
-smbloglock();
-smblogprint(cmd, "sending:\n");
-smblogdata(cmd, smblogprint, smbbufferreadpointer(s->response), smbbufferreadspace(s->response), 256);
-smblogunlock();
-	if (s->nbss) {
-		NbScatterGather a[2];
-		a[0].p = smbbufferreadpointer(s->response);
-		a[0].l = smbbufferreadspace(s->response);
-		a[1].p = nil;
-		nbssgatherwrite(s->nbss, a);
-		pr = SmbProcessResultOk;
-	}
-	else if (s->cifss) {
-		ulong l = smbbufferreadspace(s->response);
-		uchar nl[4];
-		hnputl(nl, l);
-		write(s->cifss->fd, nl, 4);
-		write(s->cifss->fd, smbbufferreadpointer(s->response), l);
-		pr = SmbProcessResultOk;
-	}
-	else
-		pr = SmbProcessResultDie;
-	smbbufferreset(s->response);
-	return pr;
-}
-
-int
-smbresponseputandxheader(SmbSession *s, SmbHeader *h, ushort andxcommand, ulong *andxoffsetfixupp)
-{
-	return smbbufferputandxheader(s->response, h, &s->peerinfo, andxcommand, andxoffsetfixupp);
-}
-
-int
-smbresponseputerror(SmbSession *s, SmbHeader *h, uchar errclass, ushort error)
-{
-	h->wordcount = 0;
-	return smbresponseputheader(s, h, errclass, error)
-		&& smbresponseputs(s, 0);
-}
--- a/sys/src/cmd/aquarela/smbservice.c
+++ /dev/null
@@ -1,116 +1,0 @@
-#include "headers.h"
-
-static SmbService local = {
-	.name = "local",
-	.type = "A:",
-	.stype = STYPE_DISKTREE,
-	.remark = "The standard namespace",
-	.path = "/n/local",
-};
-
-static SmbService ipc = {
-	.name = "IPC$",
-	.type = "IPC",
-	.stype = STYPE_IPC,
-	.remark = "The aquarela IPC service",
-	.path = nil,
-	.next = &local,
-};
-
-SmbService *smbservices = &ipc;
-
-static int
-run9fs(char *arg)
-{
-	int rv;
-	Waitmsg *w;
-
-	rv = fork();
-	if (rv < 0)
-		return -1;
-	if (rv == 0) {
-		char *argv[3];
-		argv[0] = "/rc/bin/9fs";
-		argv[1] = arg;
-		argv[2] = 0;
-		exec(argv[0], argv);
-		exits("failed to exec 9fs");
-	}
-	for (;;) {
-		w = wait();
-		if (w == nil)
-			return -1;
-		if (w->pid == rv)
-			break;
-		free(w);
-	}
-	if (w->msg[0]) {
-		smblogprint(SMB_COM_TREE_CONNECT_ANDX, "smbservicefind: %s\n", w->msg);
-		free(w);
-		return -1;
-	}
-	free(w);
-	smblogprint(SMB_COM_TREE_CONNECT_ANDX, "smbservicefind: 9fs %s executed successfully\n", arg);
-	return 0;
-}
-
-SmbService *
-smbservicefind(SmbSession *s, char *uncpath, char *servicetype, uchar *errclassp, ushort *errorp)
-{
-	char *p, *q;
-	if ((uncpath[0] == '/' && uncpath[1] == '/')
-	||  (uncpath[0] == '\\' && uncpath[1] == '\\')) {
-		/* check that the server name matches mine */
-		p = uncpath + 2;
-		q = strchr(p, uncpath[0]);
-		if (q == nil)
-			goto bad;
-		*q++ = 0;
-//		if (cistrcmp(p, smbglobals.serverinfo.name) != 0)
-//			goto bad;
-	}
-	else
-		q = uncpath + 1;
-	if (strcmp(servicetype, "?????") == 0 && strcmp(q, "IPC$") == 0)
-		return &ipc;
-	if ((strcmp(servicetype, "?????") == 0 || strcmp(servicetype, "A:") == 0)) {
-		SmbService *serv;
-		if (cistrcmp(q, local.name) == 0)
-			return &local;
-		/* try the session specific list */
-		for (serv = s->serv; serv; serv = serv->next)
-			if (cistrcmp(q, serv->name) == 0)
-				return serv;
-		/* exec "9fs q" in case it invents /n/q */
-		for (p = q; *p; p++)
-			if (*p >= 'A' && *p <= 'Z')
-				*p = tolower(*p);
-		if (run9fs(q) >= 0) {
-			serv = smbemallocz(sizeof(*serv), 1);
-			serv->name = smbestrdup(q);
-			serv->type = smbestrdup("A:");
-			serv->stype = STYPE_DISKTREE;
-			smbstringprint(&serv->remark, "9fs %s", q);
-			smbstringprint(&serv->path, "/n/%s", q);
-			serv->next = s->serv;
-			s->serv = serv;
-			return serv;
-		}
-	}
-bad:
-	*errclassp = ERRDOS;
-	*errorp = ERRbadpath;
-	return nil;
-}
-
-void
-smbserviceget(SmbService *serv)
-{
-	incref(serv);
-}
-
-void
-smbserviceput(SmbService *serv)
-{
-	decref(serv);
-}
--- a/sys/src/cmd/aquarela/smbsharedfile.c
+++ /dev/null
@@ -1,271 +1,0 @@
-#include "headers.h"
-
-typedef struct SmbSharedFileEntry SmbSharedFileEntry;
-struct SmbSharedFileEntry {
-	SmbSharedFile;
-	Ref;
-	SmbSharedFileEntry *next;
-};
-
-static struct {
-	QLock;
-	SmbSharedFileEntry *list;
-} sharedfiletable;
-
-typedef struct SmbLockListEntry SmbLockListEntry;
-
-struct SmbLockListEntry {
-	SmbLock;
-	SmbLockListEntry *next;
-};
-
-struct SmbLockList {
-	SmbLockListEntry *head;
-};
-
-static int
-lockconflict(SmbLock *l1, SmbLock *l2)
-{
-	return l1->base < l2->limit && l2->base < l1->limit;
-}
-
-static int
-lockorder(SmbLock *l1, SmbLock *l2)
-{
-	if (l1->base < l2->base)
-		return -1;
-	if (l1->base > l2->base)
-		return 1;
-	if (l1->limit > l2->limit)
-		return -1;
-	if (l1->limit < l2->limit)
-		return 1;
-	return 0;
-}
-
-static void
-locklistfree(SmbLockList **llp)
-{
-	SmbLockList *ll = *llp;
-	if (ll) {
-		while (ll->head) {
-			SmbLockListEntry *next = ll->head->next;
-			free(ll->head);
-			ll->head = next;
-		}
-		free(ll);
-		*llp = nil;
-	}
-}
-
-int
-smbsharedfilelock(SmbSharedFile *sf, SmbSession *s, ushort pid, vlong base, vlong limit)
-{
-	SmbLockListEntry smblock;
-	SmbLockListEntry *l, *nl, **lp;
-	smblock.s = s;
-	smblock.pid = pid;
-	smblock.base = base;
-	smblock.limit = limit;
-	if (sf->locklist) {
-		for (l = sf->locklist->head; l; l = l->next)
-			if (lockconflict(l, &smblock)) {
-				smblogprintif(smbglobals.log.locks, "smbsharedfilelock: lock [%lld, %lld) failed because conflicts with [%lld, %lld)\n",
-					base, limit, l->base, l->limit);
-				return 0;
-			}
-	}
-	if (sf->locklist == nil)
-		sf->locklist = smbemallocz(sizeof(SmbLockList), 1);
-	for (lp = &sf->locklist->head; (l = *lp) != nil; lp = &l->next)
-		if (lockorder(&smblock, l) <= 0)
-			break;
-	smblogprintif(smbglobals.log.locks, "smbsharedfilelock: lock [%lld, %lld) succeeded\n", base, limit);
-	nl = smbemalloc(sizeof(*nl));
-	*nl = smblock;
-	nl->next = *lp;
-	*lp = nl;
-//{
-//	smblogprintif(smbglobals.log.locks,"smbsharedfilelock: list\n");
-//	for (l = sf->locklist->head; l; l = l->next)
-//		smblogprintif(smbglobals.log.locks, "smbsharedfilelock: [%lld, %lld)\n", l->base, l->limit);
-//}
-	return 1;
-}
-
-int
-smbsharedfileunlock(SmbSharedFile *sf, SmbSession *s, ushort pid, vlong base, vlong limit)
-{
-	SmbLockListEntry smblock;
-	SmbLockListEntry *l, **lp;
-	smblock.s = s;
-	smblock.pid = pid;
-	smblock.base = base;
-	smblock.limit = limit;
-	if (sf->locklist == nil)
-		goto failed;
-	for (lp = &sf->locklist->head; (l = *lp) != nil; lp = &l->next) {
-		if (l->s != s || l->pid != pid)
-			continue;
-		switch (lockorder(&smblock, l)) {
-		case 0:
-			*lp = l->next;
-			free(l);
-			smblogprintif(smbglobals.log.locks, "smbsharedfilelock: unlock [%lld, %lld) succeeded\n", base, limit);
-			return 1;
-		case -1:
-			goto failed;
-		}
-	}
-failed:
-	smblogprintif(smbglobals.log.locks, "smbsharedfilelock: unlock [%lld, %lld) failed\n", base, limit);
-	return 0;
-}
-
-static int
-p9denied(int p9mode, int share)
-{
-//smblogprint(-1, "p9denied(%d, %d)\n", p9mode, share);
-	if (share == SMB_OPEN_MODE_SHARE_EXCLUSIVE)
-		return 1;
-	switch (p9mode & 3) {
-	case OREAD:
-	case OEXEC:
-		if (share == SMB_OPEN_MODE_SHARE_DENY_READOREXEC)
-			return 1;
-		break;
-	case OWRITE:
-		if (share == SMB_OPEN_MODE_SHARE_DENY_WRITE)
-			return 1;
-		break;
-	case ORDWR:
-		if (share != SMB_OPEN_MODE_SHARE_DENY_NONE)
-			return 1;
-		break;
-	}
-	return 0;
-}
-
-static void
-sharesplit(int share, int *denyread, int *denywrite)
-{
-	switch (share) {
-	case SMB_OPEN_MODE_SHARE_EXCLUSIVE:
-		*denyread = 1;
-		*denywrite = 1;
-		break;
-	case SMB_OPEN_MODE_SHARE_DENY_READOREXEC:
-		*denyread = 1;
-		*denywrite = 0;
-		break;
-	case SMB_OPEN_MODE_SHARE_DENY_WRITE:
-		*denywrite = 0;
-		*denywrite = 1;
-		break;
-	default:
-		*denyread = 0;
-		*denywrite = 0;
-	}
-}
-
-static int
-sharemake(int denyread, int denywrite)
-{
-	if (denyread)
-		if (denywrite)
-			return SMB_OPEN_MODE_SHARE_EXCLUSIVE;
-		else
-			return SMB_OPEN_MODE_SHARE_DENY_READOREXEC;
-	else if (denywrite)
-		return SMB_OPEN_MODE_SHARE_DENY_WRITE;
-	else
-		return SMB_OPEN_MODE_SHARE_DENY_NONE;
-}
-
-static ushort
-sharesubtract(int share1, int share2)
-{
-	int dr1, dw1;
-	int dr2, dw2;
-	sharesplit(share1, &dr1, &dw1);
-	sharesplit(share2, &dr2, &dw2);
-	if (dw2)
-		dw1 = 0;
-	if (dr2)
-		dr1 = 0;
-	return sharemake(dr1, dw1);
-}
-
-static int
-shareadd(int share1, int share2)
-{
-	int dr1, dw1;
-	int dr2, dw2;
-	sharesplit(share1, &dr1, &dw1);
-	sharesplit(share2, &dr2, &dw2);
-	if (dw2)
-		dw1 = 1;
-	if (dr2)
-		dr1 = 1;
-	return sharemake(dr1, dw1);
-}
-
-SmbSharedFile *
-smbsharedfileget(Dir *d, int p9mode, int *sharep)
-{
-	SmbSharedFileEntry *sfe;
-	qlock(&sharedfiletable);
-	for (sfe = sharedfiletable.list; sfe; sfe = sfe->next) {
-		if (sfe->type == d->type && sfe->dev == d->dev && sfe->path == d->qid.path) {
-			if (p9denied(p9mode, sfe->share)) {
-				qunlock(&sharedfiletable);
-				return nil;
-			}
-			*sharep = sharesubtract(*sharep, sfe->share);
-			sfe->share = shareadd(sfe->share, *sharep);
-			sfe->ref++;
-			goto done;
-		}
-	}
-	sfe = smbemallocz(sizeof(SmbSharedFileEntry), 1);
-	sfe->type = d->type;
-	sfe->dev = d->dev;
-	sfe->path = d->qid.path;
-//	sfe->name = smbestrdup(name);
-	sfe->ref = 1;
-	sfe->share = *sharep;
-	sfe->next = sharedfiletable.list;
-	sharedfiletable.list = sfe;
-done:
-	smblogprintif(smbglobals.log.sharedfiles, "smbsharedfileget: ref %d share %d\n",
-		sfe->ref, sfe->share);
-	qunlock(&sharedfiletable);
-	return sfe;
-}
-
-void
-smbsharedfileput(SmbFile *f, SmbSharedFile *sf, int share)
-{
-	SmbSharedFileEntry *sfe, **sfep;
-	qlock(&sharedfiletable);
-	for (sfep = &sharedfiletable.list; (sfe = *sfep) != nil; sfep = &sfe->next) {
-		if (sfe == sf) {
-			sfe->ref--;
-			if (sfe->ref == 0) {
-				*sfep = sfe->next;
-				if (sfe->deleteonclose && f)
-					smbremovefile(f->t, nil, f->name);
-				smblogprintif(smbglobals.log.sharedfiles, "smbsharedfileput: removed\n");
-				locklistfree(&sfe->locklist);
-				free(sfe);
-			}
-			else {
-				sfe->share = sharesubtract(sfe->share, share);
-				smblogprintif(smbglobals.log.sharedfiles,
-					"smbsharedfileput: ref %d share %d\n", sfe->ref, sfe->share);
-			}
-			break;
-		}
-	}
-	qunlock(&sharedfiletable);
-}
--- a/sys/src/cmd/aquarela/smbstring.c
+++ /dev/null
@@ -1,201 +1,0 @@
-#include "headers.h"
-
-Rune
-smbruneconvert(Rune r, ulong flags)
-{
-	if (r >= 'a' && r <= 'z' && (flags & SMB_STRING_UPCASE))
-		r = toupper(r);
-	else if (r == '/' && (flags & SMB_STRING_REVPATH))
-		r = '\\';
-	else if (r == '\\' && (flags & SMB_STRING_PATH))
-		r = '/';
-	else if (r == 0xa0 && (flags & SMB_STRING_REVPATH) && smbglobals.convertspace)
-		r = ' ';
-	else if (r == ' ' && (flags & SMB_STRING_PATH) && smbglobals.convertspace)
-		r = 0xa0;
-	return r;
-}
-
-int
-smbucs2len(char *string)
-{
-	return (string ? utflen(string) : 0) * 2 + 2;
-}
-
-int
-smbstrlen(char *string)
-{
-	return (string ? strlen(string) : 0) + 1;
-}
-
-int
-smbstringlen(SmbPeerInfo *i, char *string)
-{
-	if (smbglobals.unicode && (i == nil || (i->capabilities & CAP_UNICODE) != 0))
-		return smbucs2len(string);
-	return  smbstrlen(string);
-}
-
-char *
-smbstrinline(uchar **bdatap, uchar *edata)
-{
-	char *p;
-	uchar *np;
-	np = memchr(*bdatap, 0, edata - *bdatap);
-	if (np == nil)
-		return nil;
-	p = (char *)*bdatap;
-	*bdatap = np + 1;
-	return p;
-}
-
-char *
-smbstrdup(uchar **bdatap, uchar *edata)
-{
-	char *p;
-	uchar *np;
-	np = memchr(*bdatap, 0, edata - *bdatap);
-	if (np == nil)
-		return nil;
-	p = smbestrdup((char *)(*bdatap));
-	*bdatap = np + 1;
-	return p;
-}
-
-char *
-smbstringdup(SmbHeader *h, uchar *base, uchar **bdatap, uchar *edata)
-{
-	char *p;
-	if (h && h->flags2 & SMB_FLAGS2_UNICODE) {
-		uchar *bdata = *bdatap;
-		uchar *savebdata;
-		Rune r;
-		int l;
-		char *q;
-
-		l = 0;
-		if ((bdata - base) & 1)
-			bdata++;
-		savebdata = bdata;
-		do {
-			if (bdata + 2 > edata)
-				return nil;
-			r = smbnhgets(bdata); bdata += 2;
-			l += runelen(r);
-		} while (r != 0);
-		p = smbemalloc(l);
-		bdata = savebdata;
-		q = p;
-		do {
-			r = smbnhgets(bdata); bdata += 2;
-			q += runetochar(q, &r);
-		} while (r != 0);
-		*bdatap = bdata;
-		return p;
-	}
-	return smbstrdup(bdatap, edata);
-}
-
-int
-smbstrnput(uchar *buf, ushort n, ushort maxlen, char *string, ushort size, int upcase)
-{
-	uchar *p = buf + n;
-	int l;
-	l = strlen(string);
-	if (l + 1 > size)
-		l = size - 1;
-	if (n + l + 1 > maxlen)
-		return 0;
-	if (upcase) {
-		int x;
-		for (x = 0; x < l; x++)
-			p[x] = toupper(string[x]);
-	}
-	else
-		memcpy(p, string, l);
-	
-	p += l;
-	while (l++ < size)
-		*p++ = 0;
-	return size;
-}
-
-int
-smbstrput(ulong flags, uchar *buf, ushort n, ushort maxlen, char *string)
-{
-	uchar *p = buf + n;
-	int l;
-	l = string ? strlen(string) : 0;
-	if (n + l + ((flags & SMB_STRING_UNTERMINATED) == 0 ? 1 : 0) > maxlen)
-		return 0;
-	memcpy(p, string, l);
-	if (flags & (SMB_STRING_UPCASE | SMB_STRING_PATH | SMB_STRING_REVPATH)) {
-		uchar *q;
-		for (q = p; q < p + l; q++)
-			if (*q >= 'a' && *q <= 'z' && (flags & SMB_STRING_UPCASE))
-				*q = toupper(*q);
-			else if (*q == '/' && (flags & SMB_STRING_REVPATH))
-				*q = '\\';
-			else if (*q == '\\' && (flags & SMB_STRING_PATH))
-				*q = '/';
-	}
-	p += l;
-	if ((flags & SMB_STRING_UNTERMINATED) == 0)
-		*p++ = 0;
-	return p - (buf + n);
-}
-
-int
-smbucs2put(ulong flags, uchar *buf, ushort n, ushort maxlen, char *string)
-{
-	uchar *p = buf + n;
-	int l;
-	int align;
-	align = (flags & SMB_STRING_UNALIGNED) == 0 && (n & 1) != 0;
-	l = string ? utflen(string) * 2 : 0;
-	if (n + l + ((flags & SMB_STRING_UNTERMINATED) ? 0 : 2) + align > maxlen)
-		return 0;
-	if (align)
-		*p++ = 0;
-	while (string && *string) {
-		Rune r;
-		int i;
-		i = chartorune(&r, string);
-		if (flags & SMB_STRING_CONVERT_MASK)
-			r = smbruneconvert(r, flags);
-		smbhnputs(p, r);
-		p += 2;
-		string += i;
-	}
-	if ((flags & SMB_STRING_UNTERMINATED) == 0) {
-		smbhnputs(p, 0);
-		p += 2;
-	}
-	assert(p <= buf + maxlen);
-	return p - (buf + n);
-}
-
-int
-smbstringput(SmbPeerInfo *p, ulong flags, uchar *buf, ushort n, ushort maxlen, char *string)
-{
-	if (flags & SMB_STRING_UNICODE)
-		return smbucs2put(flags, buf, n, maxlen, string);
-	if (flags & SMB_STRING_ASCII)
-		return smbstrput(flags, buf, n, maxlen, string);
-	if (p && (p->capabilities & CAP_UNICODE) != 0)
-		return smbucs2put(flags, buf, n, maxlen, string);
-	return smbstrput(flags, buf, n, maxlen, string);
-}
-
-void
-smbstringprint(char **p, char *fmt, ...)
-{
-	va_list arg;
-	if (*p) {
-		free(*p);
-		*p = nil;
-	}
-	va_start(arg, fmt);
-	*p = vsmprint(fmt, arg);
-	va_end(arg);
-}
--- a/sys/src/cmd/aquarela/smbtime.c
+++ /dev/null
@@ -1,63 +1,0 @@
-#include "headers.h"
-
-void
-smbplan9time2datetime(ulong time, int tzoff, ushort *datep, ushort *timep)
-{
-	Tm *tm;
-	if (tzoff < 0)
-		time -= (ulong)-tzoff;
-	else
-		time += tzoff;
-	tm = gmtime(time);
-	*datep = (tm->mday) | ((tm->mon + 1) << 5) | ((tm->year - 80) << 9);
-	*timep = (tm->sec >> 1) | (tm->min << 5) | (tm->hour << 11);
-}
-
-ulong
-smbdatetime2plan9time(ushort date, ushort time, int tzoff)
-{
-	Tm tm;
-	strcpy(tm.zone, "GMT");
-	tm.mday = date & 0x1f;
-	tm.mon = ((date >> 5) & 0xf) - 1;
-	tm.year = (date >> 9) + 80;
-	tm.yday = 0;
-	tm.sec = (time & 0x1f) << 1;
-	tm.min = (time >> 5) & 0x3f;
-	tm.hour = time >> 11;
-	smblogprint(-1, "smbdatetime2plan9time: converting %d/%d/%d %d:%d:%d\n",
-		tm.year + 1900, tm.mon + 1, tm.mday, tm.hour, tm.min, tm.sec);
-	return tm2sec(&tm) - tzoff;
-}
-
-vlong
-smbplan9time2time(ulong time)
-{
-	return ((vlong)time + 11644473600LL) * 10000000;
-}
-
-ulong
-smbtime2plan9time(vlong nttime)
-{
-	return (nttime / 10000000 - 11644473600LL);
-}
-
-ulong
-smbplan9time2utime(ulong time, int tzoff)
-{
-	if (tzoff < 0)
-		time -= (ulong)-tzoff;
-	else
-		time += tzoff;
-	return time;
-}
-
-ulong
-smbutime2plan9time(ulong utime, int tzoff)
-{
-	if (tzoff < 0)
-		utime += (ulong)-tzoff;
-	else
-		utime -= tzoff;
-	return utime;
-}
--- a/sys/src/cmd/aquarela/smbtrans2client.c
+++ /dev/null
@@ -1,108 +1,0 @@
-#include "headers.h"
-
-static SmbTransactionMethod method = {
-	.encodeprimary = smbtransactionencodeprimary2,
-	.sendrequest = smbtransactionclientsend,
-	.receiveresponse = smbtransactionclientreceive,
-	.decoderesponse = smbtransactiondecoderesponse2,
-};
-
-int
-smbclienttrans2(SmbClient *c, uchar scount, ushort *setup, SmbBuffer *inparam, SmbBuffer *outparam, SmbBuffer *outdata, SmbHeader *rh, char **errmsgp)
-{
-	SmbTransaction transaction;
-	SmbHeader h;
-	memset(&transaction, 0, sizeof(transaction));
-	transaction.in.scount = scount;
-	transaction.in.setup = setup;
-	transaction.in.parameters = smbbufferreadpointer(inparam);
-	transaction.in.tpcount = smbbufferreadspace(inparam);
-	transaction.in.maxpcount = smbbufferwritespace(outparam);
-	transaction.in.maxdcount = smbbufferwritespace(outdata);
-	transaction.out.parameters = outparam;
-	transaction.out.data = outdata;
-	h = c->protoh;
-	h.tid = c->sharetid;
-	h.mid = 0;
-	return smbtransactionexecute(&transaction, &h, &c->peerinfo, c->b, &method, c, rh, errmsgp);
-}
-
-int
-smbclienttrans2findfirst2(SmbClient *c, ushort searchcount, char *filename,
-	ushort *sidp, ushort *searchcountp, ushort *endofsearchp,SmbFindFileBothDirectoryInfo *ip, char **errmsgp)
-{
-	int rv;
-	ushort setup;
-	SmbBuffer *inparam;
-	SmbBuffer *outparam;
-	SmbBuffer *outdata;
-	SmbHeader rh;
-	setup = SMB_TRANS2_FIND_FIRST2;
-	inparam = smbbuffernew(512);
-	smbbufferputs(inparam, 0x16);
-	smbbufferputs(inparam, searchcount);
-	smbbufferputs(inparam, 7);
-	smbbufferputs(inparam, SMB_FIND_FILE_BOTH_DIRECTORY_INFO);
-	smbbufferputl(inparam, 0);
-	smbbufferputstring(inparam, &c->peerinfo, 0, filename);
-	outparam = smbbuffernew(10);
-	outdata = smbbuffernew(65535);
-	rv = smbclienttrans2(c, 1, &setup, inparam, outparam, outdata, &rh, errmsgp);
-	smbbufferfree(&inparam);
-	if (rv) {
-		ushort eaerroroffset, lastnameoffset;
-		ulong nextentry;
-		int i;
-
-		if (!smbbuffergets(outparam, sidp)
-			|| !smbbuffergets(outparam, searchcountp)
-			|| !smbbuffergets(outparam, endofsearchp)
-			|| !smbbuffergets(outparam, &eaerroroffset)
-			|| !smbbuffergets(outparam, &lastnameoffset)) {
-			smbstringprint(errmsgp, "smbclienttrans2findfirst2: not enough parameters returned");
-			rv = 0;
-			goto done;
-		}
-		nextentry = 0;
-smblogprint(-1, "returned data:\n");
-smblogdata(-1, smblogprint, smbbufferreadpointer(outdata), smbbufferreadspace(outdata), 256);
-		for (i = 0; i < *searchcountp; i++) {
-			SmbFindFileBothDirectoryInfo *info = ip + i;
-			ulong neo, filenamelength, easize;
-			uchar shortnamelength;
-			if (i && !smbbufferreadskipto(outdata, nextentry)) {
-			underflow:
-				smbstringprint(errmsgp, "smbclientrans2findfirst2: not enough data returned");
-				rv = 0;
-				goto done;
-			}
-			if (!smbbuffergetl(outdata, &neo))
-				goto underflow;
-			nextentry = smbbufferreadoffset(outdata) + neo - 4;
-print("neo 0x%.8lux\n", neo);
-			if (!smbbuffergetl(outdata, &info->fileindex)
-				|| !smbbuffergetv(outdata, &info->creationtime)
-				|| !smbbuffergetv(outdata, &info->lastaccesstime)
-				|| !smbbuffergetv(outdata, &info->lastwritetime)
-				|| !smbbuffergetv(outdata, &info->changetime)
-				|| !smbbuffergetv(outdata, &info->endoffile)
-				|| !smbbuffergetv(outdata, &info->allocationsize))
-				goto underflow;
-print("got here\n");
-			if (!smbbuffergetl(outdata, &info->extfileattributes)
-				|| !smbbuffergetl(outdata, &filenamelength)
-				|| !smbbuffergetl(outdata, &easize)
-				|| !smbbuffergetb(outdata, &shortnamelength)
-				|| !smbbuffergetbytes(outdata, nil, 1)
-				|| !smbbuffergetbytes(outdata, nil, 24)
-				|| !smbbuffergetstring(outdata, &rh, SMB_STRING_REVPATH, &info->filename))
-				goto underflow;
-print("got here as well\n");
-		}
-	}
-done:
-	smbbufferfree(&outparam);
-	smbbufferfree(&outdata);
-	return rv;
-}
-
--- a/sys/src/cmd/aquarela/smbtrans2find.c
+++ /dev/null
@@ -1,333 +1,0 @@
-#include "headers.h"
-#include <pool.h>
-
-void
-smbsearchfree(SmbSearch **searchp)
-{
-	SmbSearch *search = *searchp;
-	if (search) {
-		smbdircachefree(&search->dc);
-		free(search->rep);
-		free(search);
-		*searchp = nil;
-	}
-}
-
-void
-smbsearchclose(SmbSession *s, SmbSearch *search)
-{
-	if (search) {
-		smblogprintif(smbglobals.log.sids, "smbsearchclose: tid 0x%.4ux sid 0x%.4ux\n", search->t->id, search->id);
-		smbidmapremove(s->sidmap, search);
-		smbsearchfree(&search);
-	}
-}
-
-void
-smbsearchclosebyid(SmbSession *s, ushort sid)
-{
-	smbsearchclose(s,  smbidmapfind(s->sidmap, sid));
-}
-
-SmbSearch *
-smbsearchnew(SmbSession *s, SmbDirCache *dc, Reprog *r, SmbTree *t)
-{
-	SmbSearch *search;
-	if (s->sidmap == nil)
-		s->sidmap = smbidmapnew();
-	search = smbemalloc(sizeof(SmbSearch));
-	smbidmapadd(s->sidmap, search);
-	search->dc = dc;
-	search->rep = r;
-	search->t = t;
-	smblogprintif(smbglobals.log.sids, "smbsearchnew: 0x%.4ux\n", search->id);
-	return search;
-}
-
-static int
-standardflatten(SmbSession *s, SmbBuffer *b, Dir *d, ulong *nameoffsetp)
-{
-	ushort mdate, mtime;
-	ushort adate, atime;
-	ushort fnlfixupoffset;
-
-	smbplan9time2datetime(d->mtime, s->tzoff, &mdate, &mtime);
-	smbplan9time2datetime(d->atime, s->tzoff, &adate, &atime);
-	if (!smbbufferputs(b, mdate)
-		|| !smbbufferputs(b, mtime)
-		|| !smbbufferputs(b, adate)
-		|| !smbbufferputs(b, atime)
-		|| !smbbufferputs(b, mdate)
-		|| !smbbufferputs(b, mtime)
-		|| !smbbufferputl(b, d->length)
-		|| !smbbufferputl(b, 512)			// ha
-		|| !smbbufferputs(b, (d->qid.type & QTDIR) ? 0x10 : 0))
-		return 0;
-	fnlfixupoffset = smbbufferwriteoffset(b);
-	if (!smbbufferputs(b, 0))
-		return 0;
-	*nameoffsetp = smbbufferwriteoffset(b);
-	if (!smbbufferputstring(b, &s->peerinfo, 0, d->name))
-		return 0;
-	return smbbufferfixuprelatives(b, fnlfixupoffset);
-}
-
-static int
-findbothflatten(SmbBuffer *b, SmbPeerInfo *p, Dir *d, ulong resumekey, ulong *nameoffsetp)
-{
-	vlong mtime, atime;
-	ulong fixup;
-
-	fixup = smbbufferwriteoffset(b);
-	mtime = smbplan9time2time(d->mtime);
-	atime = smbplan9time2time(d->atime);
-poolcheck(mainmem);
-	if (!smbbufferputl(b, 0)
-		|| !smbbufferputl(b, resumekey)
-		|| !smbbufferputv(b, mtime)
-		|| !smbbufferputv(b, atime)
-		|| !smbbufferputv(b, mtime)
-		|| !smbbufferputv(b, mtime)
-		|| !smbbufferputv(b, d->length)
-		|| !smbbufferputv(b, smbl2roundupvlong(d->length, smbglobals.l2allocationsize))			// ha
-		|| !smbbufferputl(b, (d->qid.type & QTDIR) ? 0x10 : 0x80)
-		|| !smbbufferputl(b, smbstringlen(p, d->name))
-		|| !smbbufferputl(b, 0)
-		|| !smbbufferputb(b, 0)
-		|| !smbbufferputb(b, 0)
-		|| !smbbufferfill(b, 0, 24))
-		return 0;
-poolcheck(mainmem);
-	*nameoffsetp = smbbufferwriteoffset(b);
-	if (!smbbufferputstring(b, p, 0, d->name) || !smbbufferalignl2(b, 2))
-		return 0;
-poolcheck(mainmem);
-	return smbbufferfixuprelativeinclusivel(b, fixup);
-}
-
-static void
-populate(SmbSession *s, SmbDirCache *dc, Reprog *r, ushort informationlevel, ushort flags, ushort scount,
-	ushort *ep, ulong *nameoffsetp)
-{
-	ushort e;
-	ulong nameoffset;
-	e = 0;
-	nameoffset = 0;
-	while (dc->i < dc->n && e < scount) {
-		ulong backup;
-		int rv;
-		
-		if (!smbmatch(dc->buf[dc->i].name, r)) {
-			dc->i++;
-			continue;
-		}
-		rv = 0;
-		backup = smbbufferwriteoffset(s->transaction.out.data);
-		switch (informationlevel) {
-		case SMB_INFO_STANDARD:
-			if (flags & SMB_FIND_RETURN_RESUME_KEYS) {
-				if (!smbbufferputl(s->transaction.out.data, dc->i)) {
-					rv = 0;
-					break;
-				}
-			}
-			rv = standardflatten(s, s->transaction.out.data, dc->buf + dc->i, &nameoffset);
-			break;
-		case SMB_FIND_FILE_BOTH_DIRECTORY_INFO:
-			rv = findbothflatten(s->transaction.out.data, &s->peerinfo, dc->buf + dc->i, dc->i, &nameoffset);
-			break;
-		}
-		if (rv == 0) {
-			smbbufferwritebackup(s->transaction.out.data, backup);
-			break;
-		}
-		dc->i++;
-		e++;
-	}
-	*ep = e;
-	*nameoffsetp = nameoffset;
-}
-
-SmbProcessResult
-smbtrans2findfirst2(SmbSession *s, SmbHeader *h)
-{
-	SmbBuffer *b;
-	char *pattern = nil;
-	char *dir = nil;
-	char *name = nil;
-	ushort searchattributes, searchcount, flags, informationlevel;
-	ulong searchstoragetype;
-	SmbDirCache *dc = nil;
-	ushort e;
-	ulong nameoffset;
-	ushort eos;
-	SmbSearch *search;
-	SmbProcessResult pr;
-	Reprog *r = nil;
-	SmbTree *t;
-	int debug;
-
-	debug = smboptable[h->command].debug
-		|| smbtrans2optable[SMB_TRANS2_FIND_FIRST2].debug
-		|| smbglobals.log.find;
-poolcheck(mainmem);
-	b = smbbufferinit(s->transaction.in.parameters, s->transaction.in.parameters, s->transaction.in.tpcount);
-	if (!smbbuffergets(b, &searchattributes)
-		|| !smbbuffergets(b, &searchcount)
-		|| !smbbuffergets(b, &flags)
-		|| !smbbuffergets(b, &informationlevel)
-		|| !smbbuffergetl(b, &searchstoragetype)
-		|| !smbbuffergetstring(b, h, SMB_STRING_PATH, &pattern)) {
-		pr = SmbProcessResultFormat;
-		goto done;
-	}
-	smbloglock();
-	smblogprintif(debug, "searchattributes: 0x%.4ux\n", searchattributes);
-	smblogprintif(debug, "searchcount: 0x%.4ux\n", searchcount);
-	smblogprintif(debug, "flags: 0x%.4ux\n", flags);
-	smblogprintif(debug, "informationlevel: 0x%.4ux\n", informationlevel);
-	smblogprintif(debug, "searchstoragetype: 0x%.8lux\n", searchstoragetype);
-	smblogprintif(debug, "pattern: %s\n", pattern);
-	smblogunlock();
-	smbpathsplit(pattern, &dir, &name);
-	if (informationlevel != SMB_INFO_STANDARD && informationlevel != SMB_FIND_FILE_BOTH_DIRECTORY_INFO) {
-		smblogprint(-1, "smbtrans2findfirst2: infolevel 0x%.4ux not implemented\n", informationlevel);
-		smbseterror(s, ERRDOS, ERRunknownlevel);
-		pr = SmbProcessResultError;
-		goto done;
-	}
-
-	t = smbidmapfind(s->tidmap, h->tid);
-	if (t == nil) {
-		smbseterror(s, ERRSRV, ERRinvtid);
-		pr = SmbProcessResultError;
-		goto done;
-	}
-
-	dc = smbmkdircache(t, dir);
-	if (dc == nil) {
-		smbseterror(s, ERRDOS, ERRnoaccess);
-		pr = SmbProcessResultError;
-		goto done;
-	}
-poolcheck(mainmem);
-	r = smbmkrep(name);
-	populate(s, dc, r, informationlevel, flags, searchcount, &e, &nameoffset);
-poolcheck(mainmem);
-	eos = dc->i >= dc->n;
-	if ((flags & SMB_FIND_CLOSE) != 0 || ((flags & SMB_FIND_CLOSE_EOS) != 0 && eos))
-		smbdircachefree(&dc);
-poolcheck(mainmem);
-	if (dc) {
-		/* create a search handle */
-		search = smbsearchnew(s, dc, r, t);
-		r = nil;
-		dc = nil;
-	}
-	else
-		search = nil;
-	smbbufferputs(s->transaction.out.parameters, search ? search->id : 0);
-	smbbufferputs(s->transaction.out.parameters, e);
-	smbbufferputs(s->transaction.out.parameters, eos);
-	smbbufferputs(s->transaction.out.parameters, 0);
-	smbbufferputs(s->transaction.out.parameters, nameoffset);
-	pr = SmbProcessResultReply;
-done:
-	smbbufferfree(&b);
-	free(pattern);
-	free(dir);
-	free(name);
-	smbdircachefree(&dc);
-	free(r);
-	return pr;
-}
-
-SmbProcessResult
-smbtrans2findnext2(SmbSession *s, SmbHeader *h)
-{
-	SmbBuffer *b;
-	int debug;
-	ushort sid, scount, infolevel;
-	ulong resumekey;
-	ushort flags;
-	char *filename = nil;
-	SmbProcessResult pr;
-	ushort e;
-	ulong nameoffset;
-	ushort eos;
-	SmbTree *t;
-	SmbSearch *search;
-
-	debug = smboptable[h->command].debug
-		|| smbtrans2optable[SMB_TRANS2_FIND_NEXT2].debug
-		|| smbglobals.log.find;
-	b = smbbufferinit(s->transaction.in.parameters, s->transaction.in.parameters, s->transaction.in.tpcount);
-	if (!smbbuffergets(b, &sid)
-		|| !smbbuffergets(b, &scount)
-		|| !smbbuffergets(b, &infolevel)
-		|| !smbbuffergetl(b, &resumekey)
-		|| !smbbuffergets(b, &flags)
-		|| !smbbuffergetstring(b, h, 0, &filename)) {
-		pr = SmbProcessResultFormat;
-		goto done;
-	}
-	smblogprintif(debug,
-		"smbtrans2findnext2: sid %d scount %d infolevel 0x%.4ux resumekey %lud flags 0x%.4ux filename %s\n",
-		sid, scount, infolevel, resumekey, flags, filename);
-
-	if (infolevel != SMB_INFO_STANDARD && infolevel != SMB_FIND_FILE_BOTH_DIRECTORY_INFO) {
-		smblogprint(-1, "smbtrans2findnext2: infolevel 0x%.4ux not implemented\n", infolevel);
-		smbseterror(s, ERRDOS, ERRunknownlevel);
-		pr = SmbProcessResultError;
-		goto done;
-	}
-
-	t = smbidmapfind(s->tidmap, h->tid);
-	if (t == nil) {
-		smbseterror(s, ERRSRV, ERRinvtid);
-		pr = SmbProcessResultError;
-		goto done;
-	}
-
-	search = smbidmapfind(s->sidmap, sid);
-	if (search == nil) {
-		smbseterror(s, ERRDOS, ERRnofiles);
-		pr = SmbProcessResultError;
-		goto done;
-	}
-
-	if (search->t != t) {
-		smbseterror(s, ERRSRV, ERRinvtid);
-		pr = SmbProcessResultError;
-		goto done;
-	}
-
-	if ((flags & (1 << 3)) == 0) {
-		long i;
-		if (filename == nil) {
-			smbseterror(s, ERRDOS, ERRnofiles);
-			pr = SmbProcessResultError;
-			goto done;
-		}
-		for (i = 0; i < search->dc->n; i++)
-			if (strcmp(search->dc->buf[i].name, filename) == 0) {
-				search->dc->i = i + 1;
-				break;
-			}
-	}
-
-	populate(s, search->dc, search->rep, infolevel, flags, scount, &e, &nameoffset);
-	
-	eos = search->dc->i >= search->dc->n;
-	if ((flags & SMB_FIND_CLOSE) != 0 || ((flags & SMB_FIND_CLOSE_EOS) != 0 && eos))
-		smbsearchclose(s, search);
-	smbbufferputs(s->transaction.out.parameters, e);
-	smbbufferputs(s->transaction.out.parameters, eos);
-	smbbufferputs(s->transaction.out.parameters, 0);
-	smbbufferputs(s->transaction.out.parameters, nameoffset);
-	pr = SmbProcessResultReply;
-done:
-	smbbufferfree(&b);
-	free(filename);
-	return pr;
-}
--- a/sys/src/cmd/aquarela/smbtrans2query.c
+++ /dev/null
@@ -1,276 +1,0 @@
-#include "headers.h"
-
-static SmbProcessResult
-query(SmbSession *s, char *cmdname, char *filename, ushort infolevel, vlong cbo, Dir *d)
-{
-	vlong ntatime, ntmtime;
-	ushort dosmode;
-	ulong fnlfixupoffset;
-	vlong allocsize;
-
-	if (d == nil) {
-		smbseterror(s, ERRDOS, ERRbadfile);
-		return SmbProcessResultError;
-	}
-
-	switch (infolevel) {
-	case SMB_QUERY_FILE_BASIC_INFO:
-		ntatime = smbplan9time2time(d->atime);
-		ntmtime = smbplan9time2time(d->mtime);
-		dosmode = smbplan9mode2dosattr(d->mode);
-
-		translogprint(s->transaction.in.setup[0], "SMB_QUERY_FILE_BASIC_INFO\n");
-		translogprint(s->transaction.in.setup[0], "REPLY:\n");
-		translogprint(s->transaction.in.setup[0], "atime=%s", ctime(d->atime));
-		translogprint(s->transaction.in.setup[0], "atime=%s", ctime(d->mtime));
-		translogprint(s->transaction.in.setup[0], "mode=0%o -> dosmode=0x%x\n", d->mode, dosmode);
-
-		if (!smbbufferputv(s->transaction.out.data, ntmtime)
-			|| !smbbufferputv(s->transaction.out.data, ntatime)
-			|| !smbbufferputv(s->transaction.out.data, ntmtime)
-			|| !smbbufferputv(s->transaction.out.data, ntmtime)
-			|| !smbbufferputl(s->transaction.out.data, dosmode))
-			return SmbProcessResultMisc;
-		break;
-	case SMB_QUERY_FILE_ALL_INFO:
-		ntatime = smbplan9time2time(d->atime);
-		ntmtime = smbplan9time2time(d->mtime);
-		dosmode = smbplan9mode2dosattr(d->mode);
-		allocsize = (d->length + (1 << smbglobals.l2allocationsize) - 1) & ~((1 << smbglobals.l2allocationsize) - 1);
-
-		translogprint(s->transaction.in.setup[0], "SMB_QUERY_FILE_ALL_INFO\n");
-		translogprint(s->transaction.in.setup[0], "REPLY:\n");
-		translogprint(s->transaction.in.setup[0], "atime=%s", ctime(d->atime));
-		translogprint(s->transaction.in.setup[0], "atime=%s", ctime(d->mtime));
-		translogprint(s->transaction.in.setup[0], "mode=0%o -> dosmode=0x%x\n", d->mode, dosmode);
-		translogprint(s->transaction.in.setup[0], "allocsize=%d\n", allocsize);
-		translogprint(s->transaction.in.setup[0], "isdir=%d\n", (d->mode & DMDIR) != 0);
-
-		if (!smbbufferputv(s->transaction.out.data, ntmtime)
-			|| !smbbufferputv(s->transaction.out.data, ntatime)
-			|| !smbbufferputv(s->transaction.out.data, ntmtime)
-			|| !smbbufferputv(s->transaction.out.data, ntmtime)
-			|| !smbbufferputs(s->transaction.out.data, dosmode)
-			|| !smbbufferputbytes(s->transaction.out.data, nil, 6)
-			|| !smbbufferputv(s->transaction.out.data, allocsize)
-			|| !smbbufferputv(s->transaction.out.data, d->length)
-			|| !smbbufferputl(s->transaction.out.data, 0)		// hard links - ha
-			|| !smbbufferputb(s->transaction.out.data, 0)		// TODO delete pending
-			|| !smbbufferputb(s->transaction.out.data, (d->mode & DMDIR) != 0)
-			|| !smbbufferputv(s->transaction.out.data, d->qid.path)
-			|| !smbbufferputl(s->transaction.out.data, 0)		// EA size
-			|| !smbbufferputl(s->transaction.out.data, (dosmode & SMB_ATTR_READ_ONLY) ? 0xa1 : 0x1a7)
-			|| !smbbufferputv(s->transaction.out.data, cbo)
-			|| !smbbufferputs(s->transaction.out.data, dosmode)
-			|| !smbbufferputl(s->transaction.out.data, 0))	// alignment
-			return SmbProcessResultMisc;
-		fnlfixupoffset = smbbufferwriteoffset(s->transaction.out.data);
-		if (!smbbufferputl(s->transaction.out.data, 0)
-		    || !smbbufferputstring(s->transaction.out.data, &s->peerinfo, SMB_STRING_REVPATH, filename)
-		    || !smbbufferfixuprelativel(s->transaction.out.data, fnlfixupoffset))
-			return SmbProcessResultMisc;
-		break;
-	case SMB_QUERY_FILE_STANDARD_INFO:
-		translogprint(s->transaction.in.setup[0], "SMB_QUERY_FILE_STANDARD_INFO\n");
-		translogprint(s->transaction.in.setup[0], "REPLY:\n");
-		translogprint(s->transaction.in.setup[0], "length=%lld", d->length);
-		translogprint(s->transaction.in.setup[0], "isdir=%d\n", (d->qid.type & QTDIR) != 0);
-
-		if (!smbbufferputv(s->transaction.out.data, smbl2roundupvlong(d->length, smbglobals.l2allocationsize))
-			|| !smbbufferputv(s->transaction.out.data, d->length)
-			|| !smbbufferputl(s->transaction.out.data, 1)
-			|| !smbbufferputb(s->transaction.out.data, 0)
-			|| !smbbufferputb(s->transaction.out.data, (d->qid.type & QTDIR) != 0))
-			return SmbProcessResultMisc;
-		break;
-	case SMB_QUERY_FILE_EA_INFO:
-		translogprint(s->transaction.in.setup[0], "SMB_QUERY_FILE_EA_INFO\n");
-		translogprint(s->transaction.in.setup[0], "REPLY:\n");
-		translogprint(s->transaction.in.setup[0], "ea_len=0\n");
-		if (!smbbufferputl(s->transaction.out.data, 0))
-			return SmbProcessResultMisc;
-		break;
-	case SMB_QUERY_FILE_STREAM_INFO:
-		translogprint(s->transaction.in.setup[0], "SMB_QUERY_FILE_STREAM_INFO\n");
-		translogprint(s->transaction.in.setup[0], "REPLY: failed\n");
-		/* don't do it, never will */
-		goto unknownlevel;
-	default:
-		smblogprint(-1, "smbtrans2query%sinformation: infolevel 0x%.4ux not implemented\n", cmdname, infolevel);
-	unknownlevel:
-		translogprint(s->transaction.in.setup[0], "[not supported]\n");
-		smbseterror(s, ERRDOS, ERRunknownlevel);
-		return SmbProcessResultError;
-	}
-	return SmbProcessResultReply;
-}
-
-SmbProcessResult
-smbtrans2querypathinformation(SmbSession *s, SmbHeader *h)
-{
-	SmbTree *t;
-	SmbBuffer *b = nil;
-	SmbProcessResult pr;
-	ushort infolevel;
-	Dir *d;
-	char *path = nil;
-	char *fullpath;
-
-	t = smbidmapfind(s->tidmap, h->tid);
-	if (t == nil) {
-		smbseterror(s, ERRSRV, ERRinvtid);
-		pr = SmbProcessResultError;
-		goto done;
-	}
-	b = smbbufferinit(s->transaction.in.parameters, s->transaction.in.parameters, s->transaction.in.tpcount);
-	if (!smbbuffergets(b, &infolevel) || !smbbuffergetbytes(b, nil, 4)
-		|| !smbbuffergetstring(b, h, SMB_STRING_PATH, &path)) {
-		pr = SmbProcessResultMisc;
-		goto done;
-	}
-	translogprint(s->transaction.in.setup[0], "infolevel 0x%.4ux\n", infolevel);
-	translogprint(s->transaction.in.setup[0], "path %s\n", path);
-	fullpath = nil;
-	smbstringprint(&fullpath, "%s%s", t->serv->path, path);
-	translogprint(s->transaction.in.setup[0], "fullpath %s\n", fullpath);
-	d = dirstat(fullpath);
-	pr = query(s, "path", path, infolevel, 0, d);
-	free(d);
-	free(fullpath);
-done:
-	free(path);
-	smbbufferfree(&b);
-	return pr;
-}
-
-SmbProcessResult
-smbtrans2queryfileinformation(SmbSession *s, SmbHeader *h)
-{
-	SmbTree *t;
-	SmbFile *f;
-	SmbBuffer *b = nil;
-	SmbProcessResult pr;
-	ushort fid;
-	ushort infolevel;
-	vlong o;
-	Dir *d;
-
-	t = smbidmapfind(s->tidmap, h->tid);
-	if (t == nil) {
-		smbseterror(s, ERRSRV, ERRinvtid);
-		pr = SmbProcessResultError;
-		goto done;
-	}
-	b = smbbufferinit(s->transaction.in.parameters, s->transaction.in.parameters, s->transaction.in.tpcount);
-	if (!smbbuffergets(b, &fid) || !smbbuffergets(b, &infolevel)) {
-		pr = SmbProcessResultMisc;
-		goto done;
-	}
-	translogprint(s->transaction.in.setup[0], "fid 0x%.4ux\n", fid);
-	translogprint(s->transaction.in.setup[0], "infolevel 0x%.4ux\n", infolevel);
-	f = smbidmapfind(s->fidmap, fid);
-	if (f == nil) {
-		smbseterror(s, ERRDOS, ERRbadfid);
-		pr = SmbProcessResultError;
-		goto done;
-	}
-	if(f->fd >= 0){
-		o = seek(f->fd, 0, 1);
-		d = dirfstat(f->fd);
-	} else {
-		char *fullpath = nil;
-
-		o = 0;
-		smbstringprint(&fullpath, "%s%s", f->t->serv->path, f->name);
-		d = dirstat(fullpath);
-		free(fullpath);
-	}
-	pr = query(s, "file", f->name, infolevel, o, d);
-	free(d);
-done:
-	smbbufferfree(&b);
-	return pr;
-}
-
-SmbProcessResult
-smbtrans2queryfsinformation(SmbSession *s, SmbHeader *h)
-{
-	SmbTree *t;
-	ushort infolevel;
-	SmbBuffer *b;
-	SmbProcessResult pr;
-	ulong fixup;
-	ulong vnbase;
-
-	t = smbidmapfind(s->tidmap, h->tid);
-	if (t == nil) {
-		smbseterror(s, ERRSRV, ERRinvtid);
-		pr = SmbProcessResultError;
-		goto done;
-	}
-	b = smbbufferinit(s->transaction.in.parameters, s->transaction.in.parameters, s->transaction.in.tpcount);
-	if (!smbbuffergets(b, &infolevel)) {
-	misc:
-		pr = SmbProcessResultMisc;
-		goto done;
-	}
-	pr = SmbProcessResultReply;
-	switch (infolevel) {
-	case SMB_INFO_ALLOCATION:
-		translogprint(s->transaction.in.setup[0], "SMB_INFO_ALLOCATION\n");
-		if (!smbbufferputl(s->transaction.out.data, 0)
-			|| !smbbufferputl(s->transaction.out.data, 1 << (smbglobals.l2allocationsize - smbglobals.l2sectorsize))
-			|| !smbbufferputl(s->transaction.out.data, 0xffffffff)
-			|| !smbbufferputl(s->transaction.out.data, 0xffffffff)
-			|| !smbbufferputs(s->transaction.out.data, 1 << smbglobals.l2sectorsize))
-			goto misc;
-		break;
-	case SMB_INFO_VOLUME:
-		translogprint(s->transaction.in.setup[0], "SMB_INFO_VOLUME\n");
-		if (!smbbufferputl(s->transaction.out.data, 0xdeadbeef)
-			|| !smbbufferputstring(s->transaction.out.data, &s->peerinfo, 0, t->serv->name))
-			goto misc;
-		break;
-	case SMB_QUERY_FS_VOLUME_INFO:
-		translogprint(s->transaction.in.setup[0], "SMB_QUERY_FS_VOLUME_INFO\n");
-		if (!smbbufferputv(s->transaction.out.data, 0)
-			|| !smbbufferputl(s->transaction.out.data, 0xdeadbeef))
-			goto misc;
-		fixup = smbbufferwriteoffset(s->transaction.out.data);
-		if (!smbbufferputl(s->transaction.out.data, 0)
-			|| !smbbufferputs(s->transaction.out.data, 0))
-			goto misc;
-		vnbase = smbbufferwriteoffset(s->transaction.out.data);
-		if (!smbbufferputstring(s->transaction.out.data, &s->peerinfo, 0, t->serv->name)
-			|| !smbbufferfixupl(s->transaction.out.data, fixup,
-				smbbufferwriteoffset(s->transaction.out.data) - vnbase))
-			goto misc;
-		break;
-	case SMB_QUERY_FS_SIZE_INFO:
-		translogprint(s->transaction.in.setup[0], "SMB_QUERY_FS_SIZE_INFO\n");
-		if (!smbbufferputv(s->transaction.out.data, 0LL)
-			|| !smbbufferputv(s->transaction.out.data, 0LL)
-			|| !smbbufferputl(s->transaction.out.data, 1 << (smbglobals.l2allocationsize - smbglobals.l2sectorsize))
-			|| !smbbufferputl(s->transaction.out.data, 1 << smbglobals.l2sectorsize))
-			goto misc;
-		break;
-	case SMB_QUERY_FS_ATTRIBUTE_INFO:
-		translogprint(s->transaction.in.setup[0], "SMB_QUERY_FS_ATTRIBUTE_INFO\n");
-		if (!smbbufferputl(s->transaction.out.data, 3)
-			|| !smbbufferputl(s->transaction.out.data, 255))
-			goto misc;
-		fixup = smbbufferwriteoffset(s->transaction.out.data);
-		if (!smbbufferputl(s->transaction.out.data, 0)
-			|| !smbbufferputstring(s->transaction.out.data, &s->peerinfo, SMB_STRING_UNTERMINATED, smbglobals.serverinfo.nativelanman)
-			|| !smbbufferfixuprelativel(s->transaction.out.data, fixup))
-			goto misc;
-		break;
-	default:
-		smblogprint(-1, "smbtrans2queryfsinformation: infolevel 0x%.4ux not implemented\n", infolevel);
-		smbseterror(s, ERRDOS, ERRunknownlevel);
-		pr = SmbProcessResultError;
-	}
-done:
-	smbbufferfree(&b);
-	return pr;
-}
--- a/sys/src/cmd/aquarela/smbtrans2set.c
+++ /dev/null
@@ -1,201 +1,0 @@
-#include "headers.h"
-
-SmbProcessResult
-smbtrans2setfileinformation(SmbSession *s, SmbHeader *h)
-{
-	SmbTree *t;
-	ushort infolevel;
-	SmbBuffer *b;
-	SmbProcessResult pr;
-	ushort fid;
-	SmbFile *f;
-	vlong newsize;
-	uvlong atime, mtime;
-	ulong attr;
-	ulong mode;
-
-	t = smbidmapfind(s->tidmap, h->tid);
-	if (t == nil) {
-		smbseterror(s, ERRSRV, ERRinvtid);
-		pr = SmbProcessResultError;
-		goto done;
-	}
-	b = smbbufferinit(s->transaction.in.parameters, s->transaction.in.parameters, s->transaction.in.tpcount);
-	if (!smbbuffergets(b, &fid) || !smbbuffergets(b, &infolevel)) {
-	misc:
-		pr = SmbProcessResultMisc;
-		goto done;
-	}
-
-	f = smbidmapfind(s->fidmap, fid);
-	if (f == nil) {
-		smbseterror(s, ERRDOS, ERRbadfid);
-		pr = SmbProcessResultError;
-		goto done;
-	}
-
-	switch (infolevel) {
-	case SMB_SET_FILE_ALLOCATION_INFO:
-	case SMB_SET_FILE_END_OF_FILE_INFO:
-		if (s->transaction.in.tdcount < 8)
-			goto misc;
-		newsize = smbnhgetv(s->transaction.in.data);
-		pr = smbtruncatefile(s, f, newsize);
-		if (pr == SmbProcessResultReply && !smbbufferputs(s->transaction.out.parameters, 0))
-			goto misc;
-		break;
-
-	case SMB_SET_FILE_BASIC_INFO:
-		if (s->transaction.in.tdcount < 4 * 8 + 4)
-			goto misc;
-		atime = smbnhgetv(s->transaction.in.data + 8);
-		mtime = smbnhgetv(s->transaction.in.data + 24);
-		attr = smbnhgetv(s->transaction.in.data + 32);
-		if (attr) {
-			Dir *od = dirfstat(f->fd);
-			if (od == nil)
-				goto noaccess;
-			mode = smbdosattr2plan9wstatmode(od->mode, attr);
-			free(od);
-		}
-		else
-			mode = 0xffffffff;
-		if (atime || mtime || mode != 0xffffffff) {
-			Dir d;
-			memset(&d, 0xff, sizeof(d));
-			d.name = d.uid = d.gid = d.muid = nil;
-			if (atime)
-				d.atime = smbtime2plan9time(atime);
-			if (mtime)
-				d.mtime = smbtime2plan9time(mtime);
-			d.mode = mode;
-			if (dirfwstat(f->fd, &d) < 0) {
-			noaccess:
-				smbseterror(s, ERRDOS, ERRnoaccess);
-				pr = SmbProcessResultError;
-				goto done;
-			}
-		}
-		if (!smbbufferputs(s->transaction.out.parameters, 0))
-			goto misc;
-		pr = SmbProcessResultReply;
-		break;
-
-	case SMB_SET_FILE_DISPOSITION_INFO:
-		if (s->transaction.in.tdcount < 1)
-			goto misc;
-		f->sf->deleteonclose = *s->transaction.in.data;
-		if (!smbbufferputs(s->transaction.out.parameters, 0))
-			goto misc;
-		pr = SmbProcessResultReply;
-		break;
-
-	default:
-		smblogprint(-1, "smbtrans2setfileinformation: infolevel 0x%.4ux not implemented\n", infolevel);
-		smbseterror(s, ERRDOS, ERRunknownlevel);
-		pr = SmbProcessResultError;
-		break;
-	}
-done:
-	smbbufferfree(&b);
-	return pr;
-}
-
-SmbProcessResult
-smbtrans2setpathinformation(SmbSession *s, SmbHeader *h)
-{
-	char *fullpath, *path;
-	SmbTree *t;
-	ushort infolevel;
-	SmbBuffer *b;
-	SmbProcessResult pr;
-	ushort atime, adate, mtime, mdate;
-	ulong attr;
-	ulong mode;
-	ulong size;
-//	uvlong length;
-
-	t = smbidmapfind(s->tidmap, h->tid);
-	if (t == nil) {
-		smbseterror(s, ERRSRV, ERRinvtid);
-		pr = SmbProcessResultError;
-		goto done;
-	}
-	b = smbbufferinit(s->transaction.in.parameters, s->transaction.in.parameters, s->transaction.in.tpcount);
-	path = nil;
-	if (!smbbuffergets(b, &infolevel) || !smbbuffergetbytes(b, nil, 4)
-		|| !smbbuffergetstring(b, h, SMB_STRING_PATH, &path)) {
-	misc:
-		pr = SmbProcessResultMisc;
-		goto done;
-	}
-
-	fullpath = nil;
-	smbstringprint(&fullpath, "%s%s", t->serv->path, path);
-
-	translogprint(s->transaction.in.setup[0], "path %s\n", path);
-	translogprint(s->transaction.in.setup[0], "infolevel 0x%.4ux\n", infolevel);
-	translogprint(s->transaction.in.setup[0], "fullpath %s\n", fullpath);
-
-	switch (infolevel) {
-	case SMB_INFO_STANDARD:
-		if (s->transaction.in.tdcount < 6 * 4 + 2 * 2)
-			goto misc;
-		adate = smbnhgets(s->transaction.in.data + 6);
-		atime = smbnhgets(s->transaction.in.data + 4);
-		mdate = smbnhgets(s->transaction.in.data + 10);
-		mtime = smbnhgets(s->transaction.in.data + 8);
-		size = smbnhgetl(s->transaction.in.data + 12);
-		attr = smbnhgets(s->transaction.in.data + 20);
-		if (attr) {
-			Dir *od = dirstat(fullpath);
-			if (od == nil)
-				goto noaccess;
-			mode = smbdosattr2plan9wstatmode(od->mode, attr);
-			free(od);
-		}
-		else
-			mode = 0xffffffff;
-		translogprint(s->transaction.in.setup[0], "mode 0%od\n", mode);
-
-//		if (size)
-//			length = size;
-//		else
-//			length = ~0LL;
-	
-		translogprint(s->transaction.in.setup[0], "size %lld\n", size);
-		translogprint(s->transaction.in.setup[0], "adate %d atime %d", adate, atime);
-		translogprint(s->transaction.in.setup[0], "mdate %d mtime %d\n", mdate, mtime);
-
-		if (size || adate || atime || mdate || mtime || mode != 0xffffffff) {
-			Dir d;
-			memset(&d, 0xff, sizeof(d));
-			d.name = d.uid = d.gid = d.muid = nil;
-			if (adate || atime)
-				d.atime = smbdatetime2plan9time(adate, atime, s->tzoff);
-			if (mdate || mtime)
-				d.mtime = smbdatetime2plan9time(mdate, mtime, s->tzoff);
-			d.mode = mode;
-			d.length = size;
-			if (dirwstat(fullpath, &d) < 0) {
-			noaccess:
-				smbseterror(s, ERRDOS, ERRnoaccess);
-				pr = SmbProcessResultError;
-				goto done;
-			}
-		}
-		if (!smbbufferputs(s->transaction.out.parameters, 0))
-			goto misc;
-		pr = SmbProcessResultReply;
-		break;
-
-	default:
-		smblogprint(-1, "smbtrans2setpathinformation: infolevel 0x%.4ux not implemented\n", infolevel);
-		smbseterror(s, ERRDOS, ERRunknownlevel);
-		pr = SmbProcessResultError;
-		break;
-	}
-done:
-	smbbufferfree(&b);
-	return pr;
-}
--- a/sys/src/cmd/aquarela/smbtransaction.c
+++ /dev/null
@@ -1,507 +1,0 @@
-#include "headers.h"
-
-typedef struct Args Args;
-
-struct Args {
-	ulong pcount;
-	ulong poffset;
-	ulong pdisplacement;
-	ulong dcount;
-	ulong doffset;
-	ulong ddisplacement;
-	uchar scount;
-};
-
-int
-_smbtransactiondecodeprimary(SmbTransaction *t, SmbHeader *h, uchar *pdata, SmbBuffer *b, int hasname, char **errmsgp)
-{
-	ushort poffset, doffset;
-
-	if (h->wordcount < 14) {
-		smbstringprint(errmsgp, "word count less than 14");
-		return -1;
-	}
-	t->in.scount = pdata[13 * 2];
-	if (h->wordcount != 14 + t->in.scount) {
-		smbstringprint(errmsgp, "smbcomtransaction: word count invalid\n");
-		return -1;
-	}
-	t->in.tpcount = smbnhgets(pdata); pdata += 2;
-	t->in.tdcount = smbnhgets(pdata); pdata += 2;
-	t->in.maxpcount = smbnhgets(pdata); pdata += 2;
-	t->in.maxdcount = smbnhgets(pdata); pdata += 2;
-	t->in.maxscount = *pdata++;
-	pdata++;
-	t->in.flags = smbnhgets(pdata); pdata += 2;
-	pdata += 4; /* timeout */
-	pdata += 2;
-	t->in.pcount = smbnhgets(pdata); pdata += 2;
-	poffset = smbnhgets(pdata); pdata += 2;
-	t->in.dcount = smbnhgets(pdata); pdata += 2;
-	doffset = smbnhgets(pdata); pdata += 2;
-	pdata++; /* scount */
-	pdata++; /* reserved */
-	smbfree(&t->in.setup);
-	if (t->in.scount) {
-		int x;
-		t->in.setup = smbemalloc(t->in.scount * sizeof(ushort));
-		for (x = 0; x < t->in.scount; x++) {
-			t->in.setup[x] = smbnhgets(pdata);
-			pdata += 2;
-		}
-	}
-	smbfree(&t->in.name);
-	if (hasname && !smbbuffergetstring(b, h, SMB_STRING_PATH, &t->in.name)) {
-		smbstringprint(errmsgp, "not enough bdata for name");
-		return -1;
-	}
-	if (poffset + t->in.pcount > smbbufferwriteoffset(b)) {
-		smbstringprint(errmsgp, "not enough bdata for parameters");
-		return -1;
-	}
-	if (t->in.pcount > t->in.tpcount) {
-		smbstringprint(errmsgp, "too many parameters");
-		return -1;
-	}
-	smbfree(&t->in.parameters);
-	t->in.parameters = smbemalloc(t->in.tpcount);
-	memcpy(t->in.parameters, smbbufferpointer(b, poffset), t->in.pcount);
-	if (doffset + t->in.dcount > smbbufferwriteoffset(b)) {
-		smbstringprint(errmsgp, "not enough bdata for data");
-		return -1;
-	}
-	if (t->in.dcount > t->in.tdcount) {
-		smbstringprint(errmsgp, "too much data");
-		return -1;
-	}
-	smbfree(&t->in.data);
-	t->in.data = smbemalloc(t->in.tdcount);
-	memcpy(t->in.data, smbbufferpointer(b, doffset), t->in.dcount);
-	if (t->in.dcount < t->in.tdcount || t->in.pcount < t->in.tpcount)
-		return 0;
-	return 1;
-}
-
-int
-decoderesponse(SmbTransaction *t, Args *a, SmbBuffer *b, char **errmsgp)
-{
-	if (t->out.tpcount > smbbufferwritemaxoffset(t->out.parameters)) {
-		smbstringprint(errmsgp, "decoderesponse: too many parameters for buffer");
-		return 0;
-	}
-	if (t->out.tdcount > smbbufferwritemaxoffset(t->out.data)) {
-		smbstringprint(errmsgp, "decoderesponse: too much data for buffer");
-		return 0;
-	}
-	if (a->pdisplacement + a->pcount > t->out.tpcount) {
-		smbstringprint(errmsgp, "decoderesponse: more parameters than tpcount");
-		return 0;
-	}
-	if (a->pdisplacement != smbbufferwriteoffset(t->out.parameters)) {
-		smbstringprint(errmsgp, "decoderesponse: parameter displacement inconsistent");
-		return 0;
-	}
-	if (a->ddisplacement + a->dcount > t->out.tdcount) {
-		smbstringprint(errmsgp, "decoderesponse: more data than tdcount");
-		return 0;
-	}
-	if (a->ddisplacement != smbbufferwriteoffset(t->out.data)) {
-		smbstringprint(errmsgp, "decoderesponse: data displacement inconsistent");
-		return 0;
-	}
-	assert(a->scount == 0);
-	if (a->pcount) {
-		if (!smbbufferreadskipto(b, a->poffset)) {
-			smbstringprint(errmsgp, "smbtransactiondecoderesponse: invalid parameter offset");
-			return 0;
-		}
-		if (!smbbuffercopy(t->out.parameters, b, a->pcount)) {
-			smbstringprint(errmsgp, "smbtransactiondecoderesponse: not enough data for parameters");
-			return 0;
-		}
-	}
-	if (a->dcount) {
-		if (!smbbufferreadskipto(b, a->doffset)) {
-			smbstringprint(errmsgp, "smbtransactiondecoderesponse: invalid data offset");
-			return 0;
-		}
-		if (!smbbuffercopy(t->out.data, b, a->dcount)) {
-			smbstringprint(errmsgp, "smbtransactiondecoderesponse: not enough data for data");
-			return 0;
-		}
-	}
-	return 1;
-}
-
-int
-smbtransactiondecoderesponse(SmbTransaction *t, SmbHeader *h, uchar *pdata, SmbBuffer *b, char **errmsgp)
-{
-	Args a;
-
-	if (h->command != SMB_COM_TRANSACTION) {
-		smbstringprint(errmsgp, "smbtransactiondecoderesponse: not an SMB_COM_TRANSACTION");
-		return 0;
-	}
-	if (h->wordcount < 10) {
-		smbstringprint(errmsgp, "smbtransactiondecoderesponse: word count less than 10");
-		return -1;
-	}
-	t->out.tpcount = smbnhgets(pdata); pdata += 2;
-	t->out.tdcount = smbnhgets(pdata); pdata += 2;
-	pdata += 2;
-	a.pcount = smbnhgets(pdata); pdata += 2;
-	a.poffset =  smbnhgets(pdata); pdata += 2;
-	a.pdisplacement = smbnhgets(pdata); pdata += 2;
-	a.dcount = smbnhgets(pdata); pdata += 2;
-	a.doffset =  smbnhgets(pdata); pdata += 2;
-	a.ddisplacement = smbnhgets(pdata); pdata += 2;
-	a.scount = *pdata;
-	if (a.scount != h->wordcount - 10) {
-		smbstringprint(errmsgp, "smbtransactiondecoderesponse: scount inconsistent");
-		return 0;
-	}
-	return decoderesponse(t, &a, b, errmsgp);
-}
-
-int
-smbtransactiondecoderesponse2(SmbTransaction *t, SmbHeader *h, uchar *pdata, SmbBuffer *b, char **errmsgp)
-{
-	Args a;
-
-	if (h->command != SMB_COM_TRANSACTION2) {
-		smbstringprint(errmsgp, "smbtransactiondecoderesponse2: not an SMB_COM_TRANSACTION2");
-		return 0;
-	}
-	if (h->wordcount < 10) {
-		smbstringprint(errmsgp, "smbtransactiondecoderesponse2: word count less than 10");
-		return -1;
-	}
-	t->out.tpcount = smbnhgets(pdata); pdata += 2;
-	t->out.tdcount = smbnhgets(pdata); pdata += 2;
-	pdata += 2;
-	a.pcount = smbnhgets(pdata); pdata += 2;
-	a.poffset =  smbnhgets(pdata); pdata += 2;
-	a.pdisplacement = smbnhgets(pdata); pdata += 2;
-	a.dcount = smbnhgets(pdata); pdata += 2;
-	a.doffset =  smbnhgets(pdata); pdata += 2;
-	a.ddisplacement = smbnhgets(pdata); pdata += 2;
-	a.scount = *pdata;
-	if (a.scount != h->wordcount - 10) {
-		smbstringprint(errmsgp, "smbtransactiondecoderesponse2: scount inconsistent");
-		return 0;
-	}
-	return decoderesponse(t, &a, b, errmsgp);
-}
-
-int
-smbtransactiondecodeprimary(SmbTransaction *t, SmbHeader *h, uchar *pdata, SmbBuffer *b, char **errmsgp)
-{
-	return _smbtransactiondecodeprimary(t, h, pdata, b, 1, errmsgp);
-}
-
-int
-smbtransactiondecodeprimary2(SmbTransaction *t, SmbHeader *h, uchar *pdata, SmbBuffer *b, char **errmsgp)
-{
-	return _smbtransactiondecodeprimary(t, h, pdata, b, 0, errmsgp);
-}
-
-void
-smbtransactionfree(SmbTransaction *t)
-{
-	free(t->in.parameters);
-	free(t->in.data);
-	free(t->in.setup);
-	free(t->in.name);
-	smbbufferfree(&t->out.parameters);
-	smbbufferfree(&t->out.data);
-}
-
-static int
-_transactionencodeprimary(SmbTransaction *t, uchar cmd, SmbHeader *h, SmbPeerInfo *p, SmbBuffer *ob,
-	uchar *wordcountp, ushort *bytecountp, char **errmsgp)
-{
-	SmbHeader mh;
-	ulong countsfixupoffset, bytecountfixupoffset;
-	int x;
-	mh = *h;
-	*wordcountp = mh.wordcount = 14 + t->in.scount;
-	mh.flags &= ~SMB_FLAGS_SERVER_TO_REDIR;
-	mh.command = cmd;
-	if (!smbbufferputheader(ob, &mh, p)) {
-	toosmall:
-		smbstringprint(errmsgp, "output buffer too small");
-		return 0;
-	}
-	if (t->in.tpcount > 65535 || t->in.tdcount > 65535 || t->in.maxpcount > 65535 || t->in.maxdcount > 65535) {
-		smbstringprint(errmsgp, "counts too big");
-		return 0;
-	}
-	if (!smbbufferputs(ob, t->in.tpcount)
-		|| !smbbufferputs(ob, t->in.tdcount)
-		|| !smbbufferputs(ob, t->in.maxpcount)
-		|| !smbbufferputs(ob, t->in.maxdcount)
-		|| !smbbufferputb(ob, t->in.maxscount)
-		|| !smbbufferputb(ob, 0)
-		|| !smbbufferputs(ob, t->in.flags)
-		|| !smbbufferputl(ob, 0)
-		|| !smbbufferputs(ob, 0))
-		goto toosmall;
-	countsfixupoffset = smbbufferwriteoffset(ob);
-	if (!smbbufferputs(ob, 0)
-		|| !smbbufferputs(ob, 0)
-		|| !smbbufferputs(ob, 0)
-		|| !smbbufferputs(ob, 0))
-		goto toosmall;
-	if (!smbbufferputb(ob, t->in.scount)
-		|| !smbbufferputb(ob, 0))
-		goto toosmall;
-	for (x = 0; x < t->in.scount; x++)
-		if (!smbbufferputs(ob, t->in.setup[x]))
-			goto toosmall;
-	bytecountfixupoffset = smbbufferwriteoffset(ob);
-	if (!smbbufferputs(ob, 0))
-		goto toosmall;
-	smbbufferwritelimit(ob, smbbufferwriteoffset(ob) + 65535);
-	if (!smbbufferputstring(ob, p, SMB_STRING_UPCASE, t->in.name))
-		goto toosmall;
-	if (t->in.pcount < t->in.tpcount) {
-		ulong align = smbbufferwriteoffset(ob) & 1;
-		ulong pthistime;
-		pthistime = smbbufferwritespace(ob) - align;
-		if (pthistime > t->in.tpcount - t->in.pcount)
-			pthistime = t->in.tpcount - t->in.pcount;
-		if (pthistime > 65535)
-			pthistime = 65535;
-		if (smbbufferwriteoffset(ob) > 65535)
-			pthistime = 0;
-		if (pthistime) {
-			assert(smbbufferalignl2(ob, 0));
-			assert(smbbufferoffsetputs(ob, countsfixupoffset, pthistime));
-			assert(smbbufferoffsetputs(ob, countsfixupoffset + 2, smbbufferwriteoffset(ob)));
-			assert(smbbufferputbytes(ob, t->in.parameters + t->in.pcount, pthistime));
-		}
-		t->in.pcount += pthistime;
-	}
-	if (t->in.dcount < t->in.tdcount) {
-		ulong align = smbbufferwriteoffset(ob) & 1;
-		ulong dthistime;
-		dthistime = smbbufferwritespace(ob) - align;
-		if (dthistime > t->in.tdcount - t->in.dcount)
-			dthistime = t->in.tdcount - t->in.dcount;
-		if (dthistime > 65535)
-			dthistime = 65535;
-		if (smbbufferwriteoffset(ob) > 65535)
-			dthistime = 0;
-		if (dthistime) {
-			assert(smbbufferalignl2(ob, 0));
-			assert(smbbufferoffsetputs(ob, countsfixupoffset + 4, dthistime));
-			assert(smbbufferoffsetputs(ob, countsfixupoffset + 6, smbbufferwriteoffset(ob)));
-			assert(smbbufferputbytes(ob, t->in.data + t->in.dcount, dthistime));
-		}
-		t->in.dcount += dthistime;
-	}
-	*bytecountp = smbbufferwriteoffset(ob) - bytecountfixupoffset - 2;
-	assert(smbbufferoffsetputs(ob, bytecountfixupoffset, *bytecountp));
-	return 1;
-}
-
-int
-smbtransactionencodeprimary(SmbTransaction *t, SmbHeader *h, SmbPeerInfo *p, SmbBuffer *ob,
-	uchar *wordcountp, ushort *bytecountp, char **errmsgp)
-{
-	return _transactionencodeprimary(t, SMB_COM_TRANSACTION, h, p,ob, wordcountp, bytecountp, errmsgp);
-};
-
-int
-smbtransactionencodeprimary2(SmbTransaction *t, SmbHeader *h, SmbPeerInfo *p, SmbBuffer *ob,
-	uchar *wordcountp, ushort *bytecountp, char **errmsgp)
-{
-	return _transactionencodeprimary(t, SMB_COM_TRANSACTION2, h, p,ob, wordcountp, bytecountp, errmsgp);
-};
-
-int
-_transactionencoderesponse(SmbTransaction *t, SmbHeader *h, SmbPeerInfo *p, SmbBuffer *ob, uchar cmd,
-	char **errmsgp)
-{
-	SmbHeader mh;
-	ulong countsfixupoffset, bytecountfixupoffset;
-	int palign, dalign;
-	ulong pbytecount, dbytecount;
-	ulong poffset, doffset;
-
-	if (t->in.maxpcount > 65535 || t->in.maxdcount > 65535) {
-		smbstringprint(errmsgp, "counts too big");
-		return 0;
-	}
-	mh = *h;
-	mh.wordcount = 10;
-	mh.flags &= ~SMB_FLAGS_SERVER_TO_REDIR;
-	mh.command = cmd;
-	mh.errclass = SUCCESS;
-	mh.error = SUCCESS;
-	if (!smbbufferputheader(ob, &mh, p)
-		|| !smbbufferputs(ob, smbbufferwriteoffset(t->out.parameters))
-		|| !smbbufferputs(ob, smbbufferwriteoffset(t->out.data))
-		|| !smbbufferputs(ob, 0)) {
-	toosmall:
-		smbstringprint(errmsgp, "output buffer too small");
-		goto toosmall;
-	}
-	countsfixupoffset = smbbufferwriteoffset(ob);
-	if (!smbbufferputbytes(ob, nil, 6 * sizeof(ushort))
-		|| !smbbufferputb(ob, 0)	// scount == 0
-		|| !smbbufferputb(ob, 0))	// reserved2
-		goto toosmall;
-	/* now the byte count */
-	bytecountfixupoffset = smbbufferwriteoffset(ob);
-	if (!smbbufferputs(ob, 0))
-		goto toosmall;
-	smbbufferwritelimit(ob, smbbufferwriteoffset(ob) + 65535);
-	palign = bytecountfixupoffset & 1;
-	if (palign && !smbbufferputb(ob, 0))
-		goto toosmall;
-	pbytecount = smbbufferreadspace(t->out.parameters);
-	if (pbytecount > smbbufferwritespace(ob))
-		pbytecount = smbbufferwritespace(ob);
-	poffset = smbbufferwriteoffset(ob);
-	if (poffset > 65535)
-		goto toosmall;
-	if (!smbbufferputbytes(ob, smbbufferreadpointer(t->out.parameters), pbytecount))
-		goto toosmall;
-	dalign = smbbufferwritespace(ob) > 0 && (smbbufferwriteoffset(ob) & 1) != 0;
-	if (dalign && !smbbufferputb(ob, 0))
-		goto toosmall;
-	dbytecount = smbbufferreadspace(t->out.data);
-	if (dbytecount > smbbufferwritespace(ob))
-		dbytecount = smbbufferwritespace(ob);
-	doffset = smbbufferwriteoffset(ob);
-	if (doffset > 65535)
-		goto toosmall;
-	if (!smbbufferputbytes(ob, smbbufferreadpointer(t->out.data), dbytecount))
-		goto toosmall;
-	if (!smbbufferoffsetputs(ob, bytecountfixupoffset, palign + pbytecount + dalign + dbytecount)
-		|| !smbbufferoffsetputs(ob, countsfixupoffset, pbytecount)
-		|| !smbbufferoffsetputs(ob, countsfixupoffset + 2, poffset)
-		|| !smbbufferoffsetputs(ob, countsfixupoffset + 4, smbbufferreadoffset(t->out.parameters))
-		|| !smbbufferoffsetputs(ob, countsfixupoffset + 6, dbytecount)
-		|| !smbbufferoffsetputs(ob, countsfixupoffset + 8, doffset)
-		|| !smbbufferoffsetputs(ob, countsfixupoffset + 10, smbbufferreadoffset(t->out.data)))
-		goto toosmall;
-	assert(smbbufferoffsetputs(ob, bytecountfixupoffset, smbbufferwriteoffset(ob) - bytecountfixupoffset - 2));
-	smbbuffergetbytes(t->out.parameters, nil, pbytecount);
-	smbbuffergetbytes(t->out.data, nil, dbytecount);
-	return 1;
-}
-
-int
-smbtransactionencoderesponse(SmbTransaction *t, SmbHeader *h, SmbPeerInfo *p, SmbBuffer *ob, char **errmsgp)
-{
-	return _transactionencoderesponse(t, h, p, ob, SMB_COM_TRANSACTION, errmsgp);
-}
-
-int
-smbtransactionencoderesponse2(SmbTransaction *t, SmbHeader *h, SmbPeerInfo *p, SmbBuffer *ob, char **errmsgp)
-{
-	return _transactionencoderesponse(t, h, p, ob, SMB_COM_TRANSACTION2, errmsgp);
-}
-
-int
-smbtransactionrespond(SmbTransaction *t, SmbHeader *h, SmbPeerInfo *p, SmbBuffer *ob, SmbTransactionMethod *method, void *magic, char **errmsgp)
-{
-	/* generate one or more responses */
-	while (smbbufferreadspace(t->out.parameters) || smbbufferreadspace(t->out.data)) {
-		assert(method->encoderesponse);
-		if (!(*method->encoderesponse)(t, h, p, ob, errmsgp))
-			return 0;
-		assert(method->sendresponse);
-		if (!(*method->sendresponse)(magic, ob, errmsgp))
-			return 0;
-	}
-	return 1;
-}
-
-int
-smbtransactionnbdgramsend(void *magic, SmbBuffer *ob, char **errmsgp)
-{
-	NbDgramSendParameters *p = magic;
-//print("sending to %B\n", p->to);
-//nbdumpdata(smbbufferreadpointer(ob), smbbufferreadspace(ob));
-	if (!nbdgramsend(p, smbbufferreadpointer(ob), smbbufferreadspace(ob))) {
-		smbstringprint(errmsgp, "dgram send failed");
-		return 0;
-	}
-	return 1;
-}
-
-SmbTransactionMethod smbtransactionmethoddgram = {
-	.encodeprimary = smbtransactionencodeprimary,
-	.sendrequest = smbtransactionnbdgramsend,
-	.encoderesponse = smbtransactionencoderesponse,
-};
-
-int
-smbtransactionexecute(SmbTransaction *t, SmbHeader *h, SmbPeerInfo *p, SmbBuffer *iob, SmbTransactionMethod *method, void *magic, SmbHeader *rhp, char **errmsgp)
-{
-	uchar sentwordcount;
-	ushort sentbytecount;
-	SmbHeader rh;
-	smbbufferreset(iob);
-	if (!(*method->encodeprimary)(t, h, p, iob, &sentwordcount, &sentbytecount, errmsgp))
-		return 0;
-//	smblogprint(-1, "sent...\n");
-//	smblogdata(-1, smblogprint, smbbufferreadpointer(iob), smbbufferreadspace(iob));
-	if (!(*method->sendrequest)(magic, iob, errmsgp))
-		return 0;
-	if (t->in.pcount < t->in.tpcount || t->in.dcount < t->in.tdcount) {
-		uchar wordcount;
-		ushort bytecount;
-		/* secondary needed */
-		if (method->encodesecondary == nil || method->receiveintermediate == nil) {
-			smbstringprint(errmsgp, "buffer too small and secondaries not allowed");
-			return 0;
-		}
-		if (!(*method->receiveintermediate)(magic, &wordcount, &bytecount, errmsgp))
-			return 0;
-		if (sentwordcount != wordcount || sentbytecount != bytecount) {
-			smbstringprint(errmsgp, "server intermediate reply counts differ");
-			return 0;
-		}
-		do {
-			if (!(*method->encodesecondary)(t, h, iob, errmsgp))
-				return 0;
-			if (!(*method->sendrequest)(magic, iob, errmsgp))
-				return 0;
-		} while (t->in.pcount < t->in.tpcount || t->in.dcount < t->in.tdcount);
-	}
-	if (method->receiveresponse == nil || method->decoderesponse == nil)
-		return 1;
-	do {
-		uchar *pdata;
-		ushort bytecount;
-
-		if (!(*method->receiveresponse)(magic, iob, errmsgp))
-			return 0;
-		if (!smbbuffergetheader(iob, &rh, &pdata, &bytecount)) {
-			smbstringprint(errmsgp, "smbtransactionexecute: invalid response header");
-			return 0;
-		}
-		if (!smbcheckheaderdirection(&rh, 1, errmsgp))
-			return 0;
-		if (rh.errclass != SUCCESS) {
-			smbstringprint(errmsgp, "smbtransactionexecute: remote error %d/%d", rh.errclass, rh.error);
-			return 0;
-		}
-		if (!smbbuffertrimreadlen(iob, bytecount)) {
-			smbstringprint(errmsgp, "smbtransactionexecute: invalid bytecount");
-			return 0;
-		}
-//		smblogprint(-1, "received...\n");
-//		smblogdata(-1, smblogprint, smbbufferreadpointer(iob), smbbufferreadspace(iob));
-		if (!(*method->decoderesponse)(t, &rh, pdata, iob, errmsgp))
-			return 0;
-	} while (smbbufferwriteoffset(t->out.parameters) < t->out.tpcount || smbbufferwriteoffset(t->out.data) < t->out.tdcount);
-	if (rhp)
-		*rhp = rh;
-	return 1;
-}
-
--- a/sys/src/cmd/aquarela/smbtree.c
+++ /dev/null
@@ -1,73 +1,0 @@
-#include "headers.h"
-
-typedef struct DisconnectData {
-	SmbSession *s;
-	SmbTree *t;
-} DisconnectData;
-
-static void
-smbtreefree(SmbTree **tp)
-{
-	SmbTree *t = *tp;
-	if (t) {
-		smbserviceput(t->serv);
-		free(t);
-		*tp = nil;
-	}
-}
-
-static void
-closesearch(void *magic, void *a)
-{
-	SmbSearch *search = a;
-	DisconnectData *d = magic;
-	if (search->t == d->t)
-		smbsearchclose(d->s, search);
-}
-
-static void
-closefile(void *magic, void *a)
-{
-	SmbFile *f = a;
-	DisconnectData *d = magic;
-	if (f->t == d->t)
-		smbfileclose(d->s, f);
-}
-
-void
-smbtreedisconnect(SmbSession *s, SmbTree *t)
-{
-	if (t) {
-		DisconnectData data;
-		smblogprintif(smbglobals.log.tids, "smbtreedisconnect: 0x%.4ux\n", t->id);
-		data.s = s;
-		data.t = t;
-		smbserviceput(t->serv);
-		smbidmapapply(s->sidmap, closesearch, &data);
-		smbidmapapply(s->fidmap, closefile, &data);
-		smbidmapremove(s->tidmap, t);
-		smbtreefree(&t);
-	}
-}
-
-void
-smbtreedisconnectbyid(SmbSession *s, ushort id)
-{
-	smbtreedisconnect(s, smbidmapfind(s->tidmap, id));
-}
-
-SmbTree *
-smbtreeconnect(SmbSession *s, SmbService *serv)
-{
-	SmbTree *t;
-
-	if (s->tidmap == nil)
-		s->tidmap = smbidmapnew();
-
-	t = smbemallocz(sizeof(*t), 1);
-	smbidmapadd(s->tidmap, t);
-	t->serv = serv;
-	smbserviceget(serv);
-	smblogprintif(smbglobals.log.tids, "smbtreeconnect: 0x%.4ux\n", t->id);
-	return t;
-}
--- a/sys/src/cmd/aquarela/testconnect.c
+++ /dev/null
@@ -1,56 +1,0 @@
-#include "headers.h"
-
-void
-threadmain(int argc, char *argv[])
-{
-	SmbClient *c;
-	char *errmsg;
-	if (argc != 2 && argc != 3) {
-		print("usage: testconnect to [share]\n");
-		exits("args");
-	}
-	smbglobalsguess(1);
-	errmsg = nil;
-	c = smbconnect(argv[1], argc == 3 ? argv[2] : nil, &errmsg);
-	if (c) {
-		int i, rv;
-		int entries;
-		SmbRapServerInfo1 *si = nil;
-		SmbFindFileBothDirectoryInfo ip[10];
-		char *errmsg;
-		ushort sid, searchcount, endofsearch;
-		errmsg = nil;
-		rv = smbnetserverenum2(c, SV_TYPE_SERVER, "PLAN9", &entries, &si, &errmsg);
-		if (rv < 0)
-			print("error: %s\n", errmsg);
-		else if (rv > 0)
-			print("error code %d\n", rv);
-		else
-			for (i = 0; i < entries; i++)
-				print("%s: %d.%d 0x%.8lux %s\n", si[i].name, si[i].vmaj, si[i].vmin, si[i].type, si[i].remark);
-		free(si);
-		if (rv == 0) {
-			rv = smbnetserverenum2(c, SV_TYPE_DOMAIN_ENUM, nil, &entries, &si, &errmsg);
-			if (rv < 0)
-				print("error: %s\n", errmsg);
-			else if (rv > 0)
-				print("error code %d\n", rv);
-			else
-				for (i = 0; i < entries; i++)
-					print("%s: %d.%d 0x%.8lux %s\n", si[i].name, si[i].vmaj, si[i].vmin, si[i].type, si[i].remark);
-			free(si);
-		}
-		rv = smbclienttrans2findfirst2(c, nelem(ip), "\\LICENSE",
-			&sid, &searchcount, &endofsearch, ip, &errmsg);
-		if (rv) {
-			print("sid 0x%.4ux\n", sid);
-			print("searchcount 0x%.4ux\n", searchcount);
-			print("endofsearch 0x%.4ux\n", endofsearch);
-		}
-		else
-			print("search failed %s\n", errmsg);
-		smbclientfree(c);
-	}
-	else
-		print("failed to connect: %s\n", errmsg);
-}
--- a/sys/src/cmd/aquarela/testnbdgram.c
+++ /dev/null
@@ -1,114 +1,0 @@
-#include "headers.h"
-
-static int
-deliver(void *, NbDgram *s)
-{
-	SmbHeader h;
-	uchar *pdata;
-	ushort bytecount;
-	SmbBuffer *b;
-	char *errmsg;
-	SmbTransaction transaction;
-	int rv;
-//	int x;
-	char *comment, *servername;
-	unsigned char opcode, updatecount, versionminor, versionmajor;
-	ulong periodicity, signature, type;
-
-	errmsg = nil;
-	comment = nil;
-	servername = nil;
-//	nbdumpdata(s->datagram.data, s->datagram.length);
-	b = smbbufferinit(s->datagram.data, s->datagram.data, s->datagram.length);
-	if (!smbbuffergetandcheckheader(b, &h, SMB_COM_TRANSACTION, 0, &pdata, &bytecount, &errmsg)) {
-		print("ignored: %s\n", errmsg);
-		goto done;
-	}
-	memset(&transaction, 0, sizeof(transaction));
-	rv = smbtransactiondecodeprimary(&transaction, &h, pdata, b, &errmsg);
-	if (rv < 0) {
-		print("transaction decode fail: %s\n", errmsg);
-		goto done;
-	}
-	if (rv == 0) {
-		print("transaction too big\n");
-		goto done;
-	}
-/*
-	print("name: %s\n", transaction.in.name);
-	print("setup:");
-	for (x = 0; x < transaction.in.scount; x++)
-		print(" 0x%.4ux", transaction.in.setup[x]);
-	print("\n");
-	print("parameters:\n");
-	nbdumpdata(transaction.in.parameters, transaction.in.tpcount);
-	print("data:\n");
-	nbdumpdata(transaction.in.data, transaction.in.tdcount);
-*/
-	if (strcmp(transaction.in.name, "\\MAILSLOT\\BROWSE") != 0) {
-		print("not a supported mailslot\n");
-		goto done;
-	}
-	
-	if (!smbbuffergetb(b, &opcode)) {
-		print("not enough data for opcode\n");
-		goto done;
-	}
-
-	if (opcode != 1) {
-		print("not a supported mailslot opcode %d\n", opcode);
-		goto done;
-	}
-	
-	if (!smbbuffergetb(b, &updatecount)
-		|| !smbbuffergetl(b, &periodicity)
-		|| !smbbuffergetstrn(b, 16, &servername)
-		|| !smbbuffergetb(b, &versionmajor)
-		|| !smbbuffergetb(b, &versionminor)
-		|| !smbbuffergetl(b, &type)
-		|| !smbbuffergetl(b, &signature)
-		|| !smbbuffergetstr(b, &comment)) {
-		print("mailslot parse failed\n");
-		goto done;
-	}
-/*
- * not advisable to check this! Netgear printservers send 0x55aa
-	if ((signature & 0xffff0000) != 0xaa550000) {
-		print("wrong signature\n");
-		goto done;
-	}
-*/
-	print("%s: period %ludms version %d.%d type 0x%.8lux browserversion %d.%d comment %s\n",
-		servername, periodicity, versionmajor, versionminor, type, (signature >> 8) & 0xff, signature & 0xff, comment);
-done:
-	free(errmsg);
-	free(comment);
-	free(servername);
-	smbtransactionfree(&transaction);
-	smbbufferfree(&b);
-	return 1;
-}
-
-void
-threadmain(int, char **)
-{
-	char *e;
-	NbDgramSendParameters p;
-	nbinit();
-	smbglobalsguess(1);
-	nbmknamefromstringandtype(p.to, smbglobals.primarydomain, 0x1d);
-	e = nbdgramlisten(p.to, deliver, nil);
-	if (e) {
-		print("listen failed: %s\n", e);
-		threadexitsall("net");
-	}
-	p.type = NbDgramDirectUnique;
-	for (;;) {
-		if (!smbbrowsesendhostannouncement(smbglobals.serverinfo.name, 3 * 60 * 1000,
-			SV_TYPE_SERVER,
-			"Testing testing", &e)) {
-			print("hostannounce failed: %s\n", e);
-		}
-		sleep(60 * 1000);
-	}
-}
--- a/sys/src/cmd/aquarela/testtime.c
+++ /dev/null
@@ -1,23 +1,0 @@
-#include "headers.h"
-
-void
-threadmain(int argc, char **argv)
-{
-	ulong now, now2;
-	vlong nttime;
-	if (argc > 1) {
-		nttime = strtoull(argv[1], 0, 0);
-		now2 = smbtime2plan9time(nttime);
-		print("%ld %s", now2, ctime(now2));
-	}
-	else {
-		now = 1032615845;
-		nttime = smbplan9time2time(now);
-		print("0x%.llux\n", nttime);
-		now2 = smbtime2plan9time(nttime);
-		print("now %ld %s", now, ctime(now));
-		print("now2 %ld %s", now2, ctime(now2));
-	}
-}
-
-
--- a/sys/src/cmd/ip/mkfile
+++ b/sys/src/cmd/ip/mkfile
@@ -22,7 +22,7 @@
 	udpecho\
 	wol\
 
-DIRS=ftpfs dhcpd httpd ipconfig ppp imap4d snoopy
+DIRS=ftpfs cifsd dhcpd httpd ipconfig ppp imap4d snoopy
 
 BIN=/$objtype/bin/ip
 HFILES=dhcp.h arp.h glob.h icmp.h telnet.h
--