smbcomsetinfo.c

来自「这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易」· C语言 代码 · 共 108 行

C
108
字号
#include "headers.h"SmbProcessResultsmbcomsetinformation2(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);}SmbProcessResultsmbcomsetinformation(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);}

⌨️ 快捷键说明

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