Beispiel #1
0
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);
}
Beispiel #2
0
SmbProcessResult
smbcomdelete(SmbSession *s, SmbHeader *h, uint8_t *pdata, SmbBuffer *b)
{
	SmbProcessResult pr;
	uint16_t sattr;
	uint8_t 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%.4x\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;
}