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

📄 cifscmd.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
字号:
#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 intparse(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 longcmdhelp(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 intslut(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 longcmdopen(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 },};voidthreadmain(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);}

⌨️ 快捷键说明

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