summaryrefslogtreecommitdiff
path: root/os
diff options
context:
space:
mode:
Diffstat (limited to 'os')
-rw-r--r--os/port/devssl.c64
1 files changed, 30 insertions, 34 deletions
diff --git a/os/port/devssl.c b/os/port/devssl.c
index 23c3fec5..64938bac 100644
--- a/os/port/devssl.c
+++ b/os/port/devssl.c
@@ -76,7 +76,6 @@ Lock dslock;
int dshiwat;
int maxdstate = 20;
Dstate** dstate;
-char** dsname;
enum
{
@@ -118,7 +117,7 @@ static Block* digestb(Dstate*, Block*, int);
static void checkdigestb(Dstate*, Block*);
static Chan* buftochan(char*);
static void sslhangup(Dstate*);
-static Dstate* dsclone(Chan *c);
+static void dsclone(Chan *c);
static void dsnew(Chan *c, Dstate **);
static int
@@ -126,7 +125,7 @@ sslgen(Chan *c, char*, Dirtab *d, int nd, int s, Dir *dp)
{
Qid q;
Dstate *ds;
- char name[16], *p, *nm;
+ char *p, *nm;
USED(nd);
USED(d);
@@ -148,11 +147,8 @@ sslgen(Chan *c, char*, Dirtab *d, int nd, int s, Dir *dp)
nm = ds->user;
else
nm = eve;
- if(dsname[s] == nil){
- sprint(name, "%d", s);
- kstrdup(&dsname[s], name);
- }
- devdir(c, q, dsname[s], 0, nm, DMDIR|0555, dp);
+ snprint(up->genbuf, sizeof(up->genbuf), "%d", s);
+ devdir(c, q, up->genbuf, 0, nm, DMDIR|0555, dp);
return 1;
}
if(s > dshiwat)
@@ -207,8 +203,6 @@ sslinit(void)
{
if((dstate = malloc(sizeof(Dstate*) * maxdstate)) == 0)
panic("sslinit");
- if((dsname = malloc(sizeof(*dsname) * maxdstate)) == 0)
- panic("sslinit");
alglistinit();
}
@@ -265,9 +259,7 @@ sslopen(Chan *c, int omode)
error(Eperm);
break;
case Qclonus:
- s = dsclone(c);
- if(s == 0)
- error(Enodev);
+ dsclone(c);
break;
case Qctl:
case Qdata:
@@ -306,24 +298,32 @@ sslopen(Chan *c, int omode)
}
static int
-sslwstat(Chan *c, uchar *dp, int n)
+sslwstat(Chan *c, uchar *db, int n)
{
- Dir d;
+ Dir *dir;
Dstate *s;
+ int m;
- n = convM2D(dp, n, &d, nil);
- if(n == 0)
- error(Eshortstat);
s = dstate[CONV(c->qid)];
if(s == 0)
error(Ebadusefd);
if(strcmp(s->user, up->env->user) != 0)
error(Eperm);
- if(!emptystr(d.uid))
- kstrdup(&s->user, d.uid);
- if(d.mode != ~0UL)
- s->perm = d.mode;
- return n;
+
+ dir = smalloc(sizeof(Dir)+n);
+ m = convM2D(db, n, &dir[0], (char*)&dir[1]);
+ if(m == 0){
+ free(dir);
+ error(Eshortstat);
+ }
+
+ if(!emptystr(dir->uid))
+ kstrdup(&s->user, dir->uid);
+ if(dir->mode != ~0UL)
+ s->perm = dir->mode;
+
+ free(dir);
+ return m;
}
static void
@@ -1371,17 +1371,17 @@ sslhangup(Dstate *s)
extern void rbcheck(char*);
-static Dstate*
+static void
dsclone(Chan *ch)
{
Dstate **pp, **ep, **np;
int newmax;
+ lock(&dslock);
if(waserror()) {
unlock(&dslock);
nexterror();
}
- lock(&dslock);
ep = &dstate[maxdstate];
for(pp = dstate; pp < ep; pp++) {
if(*pp == 0) {
@@ -1390,11 +1390,8 @@ dsclone(Chan *ch)
}
}
if(pp >= ep) {
- if(maxdstate >= Maxdstate) {
- unlock(&dslock);
- poperror();
- return 0;
- }
+ if(maxdstate >= Maxdstate)
+ error(Enodev);
newmax = 2 * maxdstate;
if(newmax > Maxdstate)
newmax = Maxdstate;
@@ -1407,9 +1404,8 @@ dsclone(Chan *ch)
maxdstate = newmax;
dsnew(ch, pp);
}
- unlock(&dslock);
poperror();
- return *pp;
+ unlock(&dslock);
}
static void
@@ -1418,8 +1414,8 @@ dsnew(Chan *ch, Dstate **pp)
Dstate *s;
int t;
- *pp = s = malloc(sizeof(*s));
- if(!s)
+ *pp = s = mallocz(sizeof(*s), 1);
+ if(s == nil)
error(Enomem);
if(pp - dstate >= dshiwat)
dshiwat++;