diff options
author | cinap_lenrek <cinap_lenrek@centraldogma> | 2011-05-09 10:38:45 +0000 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@centraldogma> | 2011-05-09 10:38:45 +0000 |
commit | 7dfb8b6ec5832d48da20a91c41540c9dd0eeeda1 (patch) | |
tree | 0b3898025026631b776291647d9bba9a55d45300 | |
parent | d763dcc91b6dbafab7b663b7c5043f4bded8abe1 (diff) | |
download | plan9front-7dfb8b6ec5832d48da20a91c41540c9dd0eeeda1.tar.xz |
replace aquarela with ip/cifsd
80 files changed, 1 insertions, 11766 deletions
diff --git a/sys/man/8/aquarela b/sys/man/8/aquarela deleted file mode 100644 index 68e57082d..000000000 --- a/sys/man/8/aquarela +++ /dev/null @@ -1,225 +0,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 . diff --git a/sys/src/cmd/aquarela/COPYRIGHT b/sys/src/cmd/aquarela/COPYRIGHT deleted file mode 100644 index 31ba2b2d5..000000000 --- a/sys/src/cmd/aquarela/COPYRIGHT +++ /dev/null @@ -1 +0,0 @@ -Contributed by Nigel Roles <nigel@9fs.org> diff --git a/sys/src/cmd/aquarela/addname.c b/sys/src/cmd/aquarela/addname.c deleted file mode 100644 index 6b3e0d01c..000000000 --- a/sys/src/cmd/aquarela/addname.c +++ /dev/null @@ -1,69 +0,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; -} diff --git a/sys/src/cmd/aquarela/alarm.c b/sys/src/cmd/aquarela/alarm.c deleted file mode 100644 index 0ed4ea560..000000000 --- a/sys/src/cmd/aquarela/alarm.c +++ /dev/null @@ -1,125 +0,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; - } -} diff --git a/sys/src/cmd/aquarela/alloc.c b/sys/src/cmd/aquarela/alloc.c deleted file mode 100644 index 77024fb33..000000000 --- a/sys/src/cmd/aquarela/alloc.c +++ /dev/null @@ -1,17 +0,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; -} diff --git a/sys/src/cmd/aquarela/aquarela.c b/sys/src/cmd/aquarela/aquarela.c deleted file mode 100644 index 064a08054..000000000 --- a/sys/src/cmd/aquarela/aquarela.c +++ /dev/null @@ -1,308 +0,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; - } -} - diff --git a/sys/src/cmd/aquarela/cifscmd.c b/sys/src/cmd/aquarela/cifscmd.c deleted file mode 100644 index 6d259ba27..000000000 --- a/sys/src/cmd/aquarela/cifscmd.c +++ /dev/null @@ -1,239 +0,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); -} diff --git a/sys/src/cmd/aquarela/client.c b/sys/src/cmd/aquarela/client.c deleted file mode 100644 index 88fac27b4..000000000 --- a/sys/src/cmd/aquarela/client.c +++ /dev/null @@ -1,145 +0,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); -} diff --git a/sys/src/cmd/aquarela/dump.c b/sys/src/cmd/aquarela/dump.c deleted file mode 100644 index 9866f2a52..000000000 --- a/sys/src/cmd/aquarela/dump.c +++ /dev/null @@ -1,137 +0,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; - } -} diff --git a/sys/src/cmd/aquarela/findname.c b/sys/src/cmd/aquarela/findname.c deleted file mode 100644 index 518e5b434..000000000 --- a/sys/src/cmd/aquarela/findname.c +++ /dev/null @@ -1,73 +0,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; -} diff --git a/sys/src/cmd/aquarela/headers.h b/sys/src/cmd/aquarela/headers.h deleted file mode 100644 index d4b657402..000000000 --- a/sys/src/cmd/aquarela/headers.h +++ /dev/null @@ -1,10 +0,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" diff --git a/sys/src/cmd/aquarela/message.c b/sys/src/cmd/aquarela/message.c deleted file mode 100644 index 8940360de..000000000 --- a/sys/src/cmd/aquarela/message.c +++ /dev/null @@ -1,55 +0,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; -} diff --git a/sys/src/cmd/aquarela/mkfile b/sys/src/cmd/aquarela/mkfile deleted file mode 100644 index c75583a17..000000000 --- a/sys/src/cmd/aquarela/mkfile +++ /dev/null @@ -1,114 +0,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 diff --git a/sys/src/cmd/aquarela/nb.c b/sys/src/cmd/aquarela/nb.c deleted file mode 100644 index f4235ebdd..000000000 --- a/sys/src/cmd/aquarela/nb.c +++ /dev/null @@ -1,25 +0,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; -} diff --git a/sys/src/cmd/aquarela/nbdgram.c b/sys/src/cmd/aquarela/nbdgram.c deleted file mode 100644 index 613942f3c..000000000 --- a/sys/src/cmd/aquarela/nbdgram.c +++ /dev/null @@ -1,216 +0,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); -} diff --git a/sys/src/cmd/aquarela/nbdgramconv.c b/sys/src/cmd/aquarela/nbdgramconv.c deleted file mode 100644 index 5cea1d637..000000000 --- a/sys/src/cmd/aquarela/nbdgramconv.c +++ /dev/null @@ -1,116 +0,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; -} diff --git a/sys/src/cmd/aquarela/nbdgramdump.c b/sys/src/cmd/aquarela/nbdgramdump.c deleted file mode 100644 index f63dd0383..000000000 --- a/sys/src/cmd/aquarela/nbdgramdump.c +++ /dev/null @@ -1,19 +0,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; - } -} diff --git a/sys/src/cmd/aquarela/nblistener.c b/sys/src/cmd/aquarela/nblistener.c deleted file mode 100644 index 24a825084..000000000 --- a/sys/src/cmd/aquarela/nblistener.c +++ /dev/null @@ -1,32 +0,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; -} diff --git a/sys/src/cmd/aquarela/nbname.c b/sys/src/cmd/aquarela/nbname.c deleted file mode 100644 index 3fb9d3f3b..000000000 --- a/sys/src/cmd/aquarela/nbname.c +++ /dev/null @@ -1,299 +0,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; -} diff --git a/sys/src/cmd/aquarela/nbns.c b/sys/src/cmd/aquarela/nbns.c deleted file mode 100644 index 195898356..000000000 --- a/sys/src/cmd/aquarela/nbns.c +++ /dev/null @@ -1,156 +0,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; - } -} diff --git a/sys/src/cmd/aquarela/nbnsconv.c b/sys/src/cmd/aquarela/nbnsconv.c deleted file mode 100644 index 0e761ad48..000000000 --- a/sys/src/cmd/aquarela/nbnsconv.c +++ /dev/null @@ -1,314 +0,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; -} - diff --git a/sys/src/cmd/aquarela/nbresolve.c b/sys/src/cmd/aquarela/nbresolve.c deleted file mode 100644 index a56706ac2..000000000 --- a/sys/src/cmd/aquarela/nbresolve.c +++ /dev/null @@ -1,31 +0,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; -} diff --git a/sys/src/cmd/aquarela/nbss.c b/sys/src/cmd/aquarela/nbss.c deleted file mode 100644 index 8e75ee78d..000000000 --- a/sys/src/cmd/aquarela/nbss.c +++ /dev/null @@ -1,428 +0,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); -} diff --git a/sys/src/cmd/aquarela/netbios.h b/sys/src/cmd/aquarela/netbios.h deleted file mode 100644 index 48b6a0524..000000000 --- a/sys/src/cmd/aquarela/netbios.h +++ /dev/null @@ -1,251 +0,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; diff --git a/sys/src/cmd/aquarela/smb.h b/sys/src/cmd/aquarela/smb.h deleted file mode 100644 index 6af8acca3..000000000 --- a/sys/src/cmd/aquarela/smb.h +++ /dev/null @@ -1,387 +0,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, -}; - diff --git a/sys/src/cmd/aquarela/smballoc.c b/sys/src/cmd/aquarela/smballoc.c deleted file mode 100644 index 7da8e78e6..000000000 --- a/sys/src/cmd/aquarela/smballoc.c +++ /dev/null @@ -1,43 +0,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); -} diff --git a/sys/src/cmd/aquarela/smbbrowse.c b/sys/src/cmd/aquarela/smbbrowse.c deleted file mode 100644 index 4f4fd0bd9..000000000 --- a/sys/src/cmd/aquarela/smbbrowse.c +++ /dev/null @@ -1,56 +0,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; -} diff --git a/sys/src/cmd/aquarela/smbbuffer.c b/sys/src/cmd/aquarela/smbbuffer.c deleted file mode 100644 index 5b9899016..000000000 --- a/sys/src/cmd/aquarela/smbbuffer.c +++ /dev/null @@ -1,597 +0,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; -} diff --git a/sys/src/cmd/aquarela/smbclientopen.c b/sys/src/cmd/aquarela/smbclientopen.c deleted file mode 100644 index 86b6e01b8..000000000 --- a/sys/src/cmd/aquarela/smbclientopen.c +++ /dev/null @@ -1,53 +0,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; -} - diff --git a/sys/src/cmd/aquarela/smbcomclose.c b/sys/src/cmd/aquarela/smbcomclose.c deleted file mode 100644 index 9a47a3066..000000000 --- a/sys/src/cmd/aquarela/smbcomclose.c +++ /dev/null @@ -1,24 +0,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); -} diff --git a/sys/src/cmd/aquarela/smbcomcreatedir.c b/sys/src/cmd/aquarela/smbcomcreatedir.c deleted file mode 100644 index 90e1d919f..000000000 --- a/sys/src/cmd/aquarela/smbcomcreatedir.c +++ /dev/null @@ -1,34 +0,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); -} diff --git a/sys/src/cmd/aquarela/smbcomdelete.c b/sys/src/cmd/aquarela/smbcomdelete.c deleted file mode 100644 index 7d0eb99a9..000000000 --- a/sys/src/cmd/aquarela/smbcomdelete.c +++ /dev/null @@ -1,76 +0,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; -} diff --git a/sys/src/cmd/aquarela/smbcomdeletedir.c b/sys/src/cmd/aquarela/smbcomdeletedir.c deleted file mode 100644 index 3006e0536..000000000 --- a/sys/src/cmd/aquarela/smbcomdeletedir.c +++ /dev/null @@ -1,34 +0,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); -} diff --git a/sys/src/cmd/aquarela/smbcomdir.c b/sys/src/cmd/aquarela/smbcomdir.c deleted file mode 100644 index 72bf827ad..000000000 --- a/sys/src/cmd/aquarela/smbcomdir.c +++ /dev/null @@ -1,49 +0,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; -} diff --git a/sys/src/cmd/aquarela/smbcomecho.c b/sys/src/cmd/aquarela/smbcomecho.c deleted file mode 100644 index 0ec94d2be..000000000 --- a/sys/src/cmd/aquarela/smbcomecho.c +++ /dev/null @@ -1,25 +0,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; -} diff --git a/sys/src/cmd/aquarela/smbcomfindclose2.c b/sys/src/cmd/aquarela/smbcomfindclose2.c deleted file mode 100644 index 3197e6e97..000000000 --- a/sys/src/cmd/aquarela/smbcomfindclose2.c +++ /dev/null @@ -1,12 +0,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); -} diff --git a/sys/src/cmd/aquarela/smbcomflush.c b/sys/src/cmd/aquarela/smbcomflush.c deleted file mode 100644 index 8922d344f..000000000 --- a/sys/src/cmd/aquarela/smbcomflush.c +++ /dev/null @@ -1,28 +0,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); -} diff --git a/sys/src/cmd/aquarela/smbcomlocking.c b/sys/src/cmd/aquarela/smbcomlocking.c deleted file mode 100644 index 8fc33146d..000000000 --- a/sys/src/cmd/aquarela/smbcomlocking.c +++ /dev/null @@ -1,132 +0,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; -} diff --git a/sys/src/cmd/aquarela/smbcommon.c b/sys/src/cmd/aquarela/smbcommon.c deleted file mode 100644 index 3b0465d62..000000000 --- a/sys/src/cmd/aquarela/smbcommon.c +++ /dev/null @@ -1,335 +0,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; -} diff --git a/sys/src/cmd/aquarela/smbcomopen.c b/sys/src/cmd/aquarela/smbcomopen.c deleted file mode 100644 index a927f764c..000000000 --- a/sys/src/cmd/aquarela/smbcomopen.c +++ /dev/null @@ -1,712 +0,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; -} - diff --git a/sys/src/cmd/aquarela/smbcomquery.c b/sys/src/cmd/aquarela/smbcomquery.c deleted file mode 100644 index daea6c78e..000000000 --- a/sys/src/cmd/aquarela/smbcomquery.c +++ /dev/null @@ -1,95 +0,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; -} diff --git a/sys/src/cmd/aquarela/smbcomread.c b/sys/src/cmd/aquarela/smbcomread.c deleted file mode 100644 index 11a358bdc..000000000 --- a/sys/src/cmd/aquarela/smbcomread.c +++ /dev/null @@ -1,84 +0,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; -} diff --git a/sys/src/cmd/aquarela/smbcomrename.c b/sys/src/cmd/aquarela/smbcomrename.c deleted file mode 100644 index 417804e8c..000000000 --- a/sys/src/cmd/aquarela/smbcomrename.c +++ /dev/null @@ -1,57 +0,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; -} diff --git a/sys/src/cmd/aquarela/smbcomsessionsetupandx.c b/sys/src/cmd/aquarela/smbcomsessionsetupandx.c deleted file mode 100644 index f2b84e518..000000000 --- a/sys/src/cmd/aquarela/smbcomsessionsetupandx.c +++ /dev/null @@ -1,190 +0,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; -} diff --git a/sys/src/cmd/aquarela/smbcomsetinfo.c b/sys/src/cmd/aquarela/smbcomsetinfo.c deleted file mode 100644 index cb001f439..000000000 --- a/sys/src/cmd/aquarela/smbcomsetinfo.c +++ /dev/null @@ -1,107 +0,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); -} diff --git a/sys/src/cmd/aquarela/smbcomtransaction.c b/sys/src/cmd/aquarela/smbcomtransaction.c deleted file mode 100644 index bc156b08a..000000000 --- a/sys/src/cmd/aquarela/smbcomtransaction.c +++ /dev/null @@ -1,137 +0,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; -} - - - diff --git a/sys/src/cmd/aquarela/smbcomtreeconnectandx.c b/sys/src/cmd/aquarela/smbcomtreeconnectandx.c deleted file mode 100644 index 26a9f654d..000000000 --- a/sys/src/cmd/aquarela/smbcomtreeconnectandx.c +++ /dev/null @@ -1,116 +0,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; -} diff --git a/sys/src/cmd/aquarela/smbcomtreedisconnect.c b/sys/src/cmd/aquarela/smbcomtreedisconnect.c deleted file mode 100644 index 8196a4ca5..000000000 --- a/sys/src/cmd/aquarela/smbcomtreedisconnect.c +++ /dev/null @@ -1,10 +0,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); -} diff --git a/sys/src/cmd/aquarela/smbcomwrite.c b/sys/src/cmd/aquarela/smbcomwrite.c deleted file mode 100644 index 8021ca1ff..000000000 --- a/sys/src/cmd/aquarela/smbcomwrite.c +++ /dev/null @@ -1,229 +0,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; -} diff --git a/sys/src/cmd/aquarela/smbconnect.c b/sys/src/cmd/aquarela/smbconnect.c deleted file mode 100644 index 6e6ce3550..000000000 --- a/sys/src/cmd/aquarela/smbconnect.c +++ /dev/null @@ -1,275 +0,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; -} - diff --git a/sys/src/cmd/aquarela/smbconv.c b/sys/src/cmd/aquarela/smbconv.c deleted file mode 100644 index 0160f3916..000000000 --- a/sys/src/cmd/aquarela/smbconv.c +++ /dev/null @@ -1,42 +0,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); -} diff --git a/sys/src/cmd/aquarela/smbdat.h b/sys/src/cmd/aquarela/smbdat.h deleted file mode 100644 index ca88f7ce5..000000000 --- a/sys/src/cmd/aquarela/smbdat.h +++ /dev/null @@ -1,325 +0,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[]; diff --git a/sys/src/cmd/aquarela/smbdircache.c b/sys/src/cmd/aquarela/smbdircache.c deleted file mode 100644 index d7ee3c412..000000000 --- a/sys/src/cmd/aquarela/smbdircache.c +++ /dev/null @@ -1,43 +0,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; - } -} - diff --git a/sys/src/cmd/aquarela/smbfile.c b/sys/src/cmd/aquarela/smbfile.c deleted file mode 100644 index 075d3cfda..000000000 --- a/sys/src/cmd/aquarela/smbfile.c +++ /dev/null @@ -1,25 +0,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); -} diff --git a/sys/src/cmd/aquarela/smbfns.h b/sys/src/cmd/aquarela/smbfns.h deleted file mode 100644 index f69f5d87c..000000000 --- a/sys/src/cmd/aquarela/smbfns.h +++ /dev/null @@ -1,260 +0,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); diff --git a/sys/src/cmd/aquarela/smbglobals.c b/sys/src/cmd/aquarela/smbglobals.c deleted file mode 100644 index 7146a12ff..000000000 --- a/sys/src/cmd/aquarela/smbglobals.c +++ /dev/null @@ -1,46 +0,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); - } -} diff --git a/sys/src/cmd/aquarela/smbidmap.c b/sys/src/cmd/aquarela/smbidmap.c deleted file mode 100644 index e68586cc8..000000000 --- a/sys/src/cmd/aquarela/smbidmap.c +++ /dev/null @@ -1,128 +0,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); - } -} diff --git a/sys/src/cmd/aquarela/smblisten.c b/sys/src/cmd/aquarela/smblisten.c deleted file mode 100644 index e2f55dcd8..000000000 --- a/sys/src/cmd/aquarela/smblisten.c +++ /dev/null @@ -1,155 +0,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 diff --git a/sys/src/cmd/aquarela/smblog.c b/sys/src/cmd/aquarela/smblog.c deleted file mode 100644 index 763ac268a..000000000 --- a/sys/src/cmd/aquarela/smblog.c +++ /dev/null @@ -1,119 +0,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); -} diff --git a/sys/src/cmd/aquarela/smbnegotiate.c b/sys/src/cmd/aquarela/smbnegotiate.c deleted file mode 100644 index a79a46e1a..000000000 --- a/sys/src/cmd/aquarela/smbnegotiate.c +++ /dev/null @@ -1,89 +0,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; -} diff --git a/sys/src/cmd/aquarela/smboptable.c b/sys/src/cmd/aquarela/smboptable.c deleted file mode 100644 index c054ba84d..000000000 --- a/sys/src/cmd/aquarela/smboptable.c +++ /dev/null @@ -1,98 +0,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); diff --git a/sys/src/cmd/aquarela/smbpath.c b/sys/src/cmd/aquarela/smbpath.c deleted file mode 100644 index 0c5f17b9c..000000000 --- a/sys/src/cmd/aquarela/smbpath.c +++ /dev/null @@ -1,22 +0,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); -} diff --git a/sys/src/cmd/aquarela/smbrap2.c b/sys/src/cmd/aquarela/smbrap2.c deleted file mode 100644 index 482be6ae5..000000000 --- a/sys/src/cmd/aquarela/smbrap2.c +++ /dev/null @@ -1,467 +0,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; -} diff --git a/sys/src/cmd/aquarela/smbrap2client.c b/sys/src/cmd/aquarela/smbrap2client.c deleted file mode 100644 index 3f3e182a3..000000000 --- a/sys/src/cmd/aquarela/smbrap2client.c +++ /dev/null @@ -1,100 +0,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; -} diff --git a/sys/src/cmd/aquarela/smbrep.c b/sys/src/cmd/aquarela/smbrep.c deleted file mode 100644 index 923ad851a..000000000 --- a/sys/src/cmd/aquarela/smbrep.c +++ /dev/null @@ -1,67 +0,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; -} - diff --git a/sys/src/cmd/aquarela/smbresponse.c b/sys/src/cmd/aquarela/smbresponse.c deleted file mode 100644 index a07ce8d70..000000000 --- a/sys/src/cmd/aquarela/smbresponse.c +++ /dev/null @@ -1,135 +0,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); -} diff --git a/sys/src/cmd/aquarela/smbservice.c b/sys/src/cmd/aquarela/smbservice.c deleted file mode 100644 index 073d9d291..000000000 --- a/sys/src/cmd/aquarela/smbservice.c +++ /dev/null @@ -1,116 +0,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); -} diff --git a/sys/src/cmd/aquarela/smbsharedfile.c b/sys/src/cmd/aquarela/smbsharedfile.c deleted file mode 100644 index 6203fe60a..000000000 --- a/sys/src/cmd/aquarela/smbsharedfile.c +++ /dev/null @@ -1,271 +0,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); -} diff --git a/sys/src/cmd/aquarela/smbstring.c b/sys/src/cmd/aquarela/smbstring.c deleted file mode 100644 index 93c8815e7..000000000 --- a/sys/src/cmd/aquarela/smbstring.c +++ /dev/null @@ -1,201 +0,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); -} diff --git a/sys/src/cmd/aquarela/smbtime.c b/sys/src/cmd/aquarela/smbtime.c deleted file mode 100644 index 3627a795b..000000000 --- a/sys/src/cmd/aquarela/smbtime.c +++ /dev/null @@ -1,63 +0,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; -} diff --git a/sys/src/cmd/aquarela/smbtrans2client.c b/sys/src/cmd/aquarela/smbtrans2client.c deleted file mode 100644 index d61f69967..000000000 --- a/sys/src/cmd/aquarela/smbtrans2client.c +++ /dev/null @@ -1,108 +0,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; -} - diff --git a/sys/src/cmd/aquarela/smbtrans2find.c b/sys/src/cmd/aquarela/smbtrans2find.c deleted file mode 100644 index c09eaed39..000000000 --- a/sys/src/cmd/aquarela/smbtrans2find.c +++ /dev/null @@ -1,333 +0,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; -} diff --git a/sys/src/cmd/aquarela/smbtrans2query.c b/sys/src/cmd/aquarela/smbtrans2query.c deleted file mode 100644 index 9d6a259d6..000000000 --- a/sys/src/cmd/aquarela/smbtrans2query.c +++ /dev/null @@ -1,276 +0,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; -} diff --git a/sys/src/cmd/aquarela/smbtrans2set.c b/sys/src/cmd/aquarela/smbtrans2set.c deleted file mode 100644 index 34f7f3e8e..000000000 --- a/sys/src/cmd/aquarela/smbtrans2set.c +++ /dev/null @@ -1,201 +0,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; -} diff --git a/sys/src/cmd/aquarela/smbtransaction.c b/sys/src/cmd/aquarela/smbtransaction.c deleted file mode 100644 index 499d42ff0..000000000 --- a/sys/src/cmd/aquarela/smbtransaction.c +++ /dev/null @@ -1,507 +0,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; -} - diff --git a/sys/src/cmd/aquarela/smbtree.c b/sys/src/cmd/aquarela/smbtree.c deleted file mode 100644 index da4c3ba0f..000000000 --- a/sys/src/cmd/aquarela/smbtree.c +++ /dev/null @@ -1,73 +0,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; -} diff --git a/sys/src/cmd/aquarela/testconnect.c b/sys/src/cmd/aquarela/testconnect.c deleted file mode 100644 index 822dbb151..000000000 --- a/sys/src/cmd/aquarela/testconnect.c +++ /dev/null @@ -1,56 +0,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); -} diff --git a/sys/src/cmd/aquarela/testnbdgram.c b/sys/src/cmd/aquarela/testnbdgram.c deleted file mode 100644 index 02b3ec8ad..000000000 --- a/sys/src/cmd/aquarela/testnbdgram.c +++ /dev/null @@ -1,114 +0,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); - } -} diff --git a/sys/src/cmd/aquarela/testtime.c b/sys/src/cmd/aquarela/testtime.c deleted file mode 100644 index 841c90709..000000000 --- a/sys/src/cmd/aquarela/testtime.c +++ /dev/null @@ -1,23 +0,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)); - } -} - - diff --git a/sys/src/cmd/ip/mkfile b/sys/src/cmd/ip/mkfile index 45bfa6f34..82b592299 100644 --- a/sys/src/cmd/ip/mkfile +++ b/sys/src/cmd/ip/mkfile @@ -22,7 +22,7 @@ TARG = 6in4\ 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 |