⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 smbcomwrite.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
字号:
#include "headers.h"#define INMEMORYTRUNCTHRESH (256 * 1024)static intdirfwstatlength(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);}SmbProcessResultsmbtruncatefile(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;}SmbProcessResultsmbcomwrite(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;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -