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

📄 client.c

📁 samba-3.0.22.tar.gz 编译smb服务器的源码
💻 C
📖 第 1 页 / 共 5 页
字号:
	if (!cli_unlink(cli, mask)) {		d_printf("%s deleting remote file %s\n",cli_errstr(cli),mask);	}}/**************************************************************************** Delete some files.****************************************************************************/static int cmd_del(void){	pstring mask;	pstring buf;	uint16 attribute = aSYSTEM | aHIDDEN;	if (recurse)		attribute |= aDIR;		pstrcpy(mask,cur_dir);		if (!next_token_nr(NULL,buf,NULL,sizeof(buf))) {		d_printf("del <filename>\n");		return 1;	}	pstrcat(mask,buf);	do_list(mask, attribute,do_del,False,False);		return 0;}/********************************************************************************************************************************************************/static int cmd_open(void){	pstring mask;	pstring buf;	struct cli_state *targetcli;	pstring targetname;		pstrcpy(mask,cur_dir);		if (!next_token_nr(NULL,buf,NULL,sizeof(buf))) {		d_printf("open <filename>\n");		return 1;	}	pstrcat(mask,buf);	if ( !cli_resolve_path( "", cli, mask, &targetcli, targetname ) ) {		d_printf("open %s: %s\n", mask, cli_errstr(cli));		return 1;	}		cli_nt_create(targetcli, targetname, FILE_READ_DATA);	return 0;}/**************************************************************************** Remove a directory.****************************************************************************/static int cmd_rmdir(void){	pstring mask;	pstring buf;	struct cli_state *targetcli;	pstring targetname;  	pstrcpy(mask,cur_dir);		if (!next_token_nr(NULL,buf,NULL,sizeof(buf))) {		d_printf("rmdir <dirname>\n");		return 1;	}	pstrcat(mask,buf);	if ( !cli_resolve_path( "", cli, mask, &targetcli, targetname ) ) {		d_printf("rmdir %s: %s\n", mask, cli_errstr(cli));		return 1;	}		if (!cli_rmdir(targetcli, targetname)) {		d_printf("%s removing remote directory file %s\n",			 cli_errstr(targetcli),mask);	}		return 0;}/**************************************************************************** UNIX hardlink.****************************************************************************/static int cmd_link(void){	pstring oldname,newname;	pstring buf,buf2;	struct cli_state *targetcli;	pstring targetname;  	pstrcpy(oldname,cur_dir);	pstrcpy(newname,cur_dir);  	if (!next_token_nr(NULL,buf,NULL,sizeof(buf)) || 	    !next_token_nr(NULL,buf2,NULL, sizeof(buf2))) {		d_printf("link <oldname> <newname>\n");		return 1;	}	pstrcat(oldname,buf);	pstrcat(newname,buf2);	if ( !cli_resolve_path( "", cli, oldname, &targetcli, targetname ) ) {		d_printf("link %s: %s\n", oldname, cli_errstr(cli));		return 1;	}		if (!SERVER_HAS_UNIX_CIFS(targetcli)) {		d_printf("Server doesn't support UNIX CIFS calls.\n");		return 1;	}		if (!cli_unix_hardlink(targetcli, targetname, newname)) {		d_printf("%s linking files (%s -> %s)\n", cli_errstr(targetcli), newname, oldname);		return 1;	}  	return 0;}/**************************************************************************** UNIX symlink.****************************************************************************/static int cmd_symlink(void){	pstring oldname,newname;	pstring buf,buf2;  	if (!SERVER_HAS_UNIX_CIFS(cli)) {		d_printf("Server doesn't support UNIX CIFS calls.\n");		return 1;	}	pstrcpy(newname,cur_dir);		if (!next_token_nr(NULL,buf,NULL,sizeof(buf)) || 	    !next_token_nr(NULL,buf2,NULL, sizeof(buf2))) {		d_printf("symlink <oldname> <newname>\n");		return 1;	}	pstrcpy(oldname,buf);	pstrcat(newname,buf2);	if (!cli_unix_symlink(cli, oldname, newname)) {		d_printf("%s symlinking files (%s -> %s)\n",			cli_errstr(cli), newname, oldname);		return 1;	} 	return 0;}/**************************************************************************** UNIX chmod.****************************************************************************/static int cmd_chmod(void){	pstring src;	mode_t mode;	pstring buf, buf2;	struct cli_state *targetcli;	pstring targetname;  	pstrcpy(src,cur_dir);		if (!next_token_nr(NULL,buf,NULL,sizeof(buf)) || 	    !next_token_nr(NULL,buf2,NULL, sizeof(buf2))) {		d_printf("chmod mode file\n");		return 1;	}	mode = (mode_t)strtol(buf, NULL, 8);	pstrcat(src,buf2);	if ( !cli_resolve_path( "", cli, src, &targetcli, targetname ) ) {		d_printf("chmod %s: %s\n", src, cli_errstr(cli));		return 1;	}		if (!SERVER_HAS_UNIX_CIFS(targetcli)) {		d_printf("Server doesn't support UNIX CIFS calls.\n");		return 1;	}		if (!cli_unix_chmod(targetcli, targetname, mode)) {		d_printf("%s chmod file %s 0%o\n",			cli_errstr(targetcli), src, (unsigned int)mode);		return 1;	} 	return 0;}static const char *filetype_to_str(mode_t mode){	if (S_ISREG(mode)) {		return "regular file";	} else if (S_ISDIR(mode)) {		return "directory";	} else #ifdef S_ISCHR	if (S_ISCHR(mode)) {		return "character device";	} else#endif#ifdef S_ISBLK	if (S_ISBLK(mode)) {		return "block device";	} else#endif#ifdef S_ISFIFO	if (S_ISFIFO(mode)) {		return "fifo";	} else#endif#ifdef S_ISLNK	if (S_ISLNK(mode)) {		return "symbolic link";	} else#endif#ifdef S_ISSOCK	if (S_ISSOCK(mode)) {		return "socket";	} else#endif	return "";}static char rwx_to_str(mode_t m, mode_t bt, char ret){	if (m & bt) {		return ret;	} else {		return '-';	}}static char *unix_mode_to_str(char *s, mode_t m){	char *p = s;	const char *str = filetype_to_str(m);	switch(str[0]) {		case 'd':			*p++ = 'd';			break;		case 'c':			*p++ = 'c';			break;		case 'b':			*p++ = 'b';			break;		case 'f':			*p++ = 'p';			break;		case 's':			*p++ = str[1] == 'y' ? 'l' : 's';			break;		case 'r':		default:			*p++ = '-';			break;	}	*p++ = rwx_to_str(m, S_IRUSR, 'r');	*p++ = rwx_to_str(m, S_IWUSR, 'w');	*p++ = rwx_to_str(m, S_IXUSR, 'x');	*p++ = rwx_to_str(m, S_IRGRP, 'r');	*p++ = rwx_to_str(m, S_IWGRP, 'w');	*p++ = rwx_to_str(m, S_IXGRP, 'x');	*p++ = rwx_to_str(m, S_IROTH, 'r');	*p++ = rwx_to_str(m, S_IWOTH, 'w');	*p++ = rwx_to_str(m, S_IXOTH, 'x');	*p++ = '\0';	return s;}/**************************************************************************** Utility function for UNIX getfacl.****************************************************************************/static char *perms_to_string(fstring permstr, unsigned char perms){	fstrcpy(permstr, "---");	if (perms & SMB_POSIX_ACL_READ) {		permstr[0] = 'r';	}	if (perms & SMB_POSIX_ACL_WRITE) {		permstr[1] = 'w';	}	if (perms & SMB_POSIX_ACL_EXECUTE) {		permstr[2] = 'x';	}	return permstr;}/**************************************************************************** UNIX getfacl.****************************************************************************/static int cmd_getfacl(void){	pstring src, name;	uint16 major, minor;	uint32 caplow, caphigh;	char *retbuf = NULL;	size_t rb_size = 0;	SMB_STRUCT_STAT sbuf;	uint16 num_file_acls = 0;	uint16 num_dir_acls = 0;	uint16 i;	struct cli_state *targetcli;	pstring targetname; 	pstrcpy(src,cur_dir);		if (!next_token_nr(NULL,name,NULL,sizeof(name))) {		d_printf("stat file\n");		return 1;	}	pstrcat(src,name);		if ( !cli_resolve_path( "", cli, src, &targetcli, targetname ) ) {		d_printf("stat %s: %s\n", src, cli_errstr(cli));		return 1;	}		if (!SERVER_HAS_UNIX_CIFS(targetcli)) {		d_printf("Server doesn't support UNIX CIFS calls.\n");		return 1;	}		if (!cli_unix_extensions_version(targetcli, &major, &minor, &caplow, &caphigh)) {		d_printf("Can't get UNIX CIFS version from server.\n");		return 1;	}	if (!(caplow & CIFS_UNIX_POSIX_ACLS_CAP)) {		d_printf("This server supports UNIX extensions but doesn't support POSIX ACLs.\n");		return 1;	}	if (!cli_unix_stat(targetcli, targetname, &sbuf)) {		d_printf("%s getfacl doing a stat on file %s\n",			cli_errstr(targetcli), src);		return 1;	} 	if (!cli_unix_getfacl(targetcli, targetname, &rb_size, &retbuf)) {		d_printf("%s getfacl file %s\n",			cli_errstr(targetcli), src);		return 1;	} 	/* ToDo : Print out the ACL values. */	if (SVAL(retbuf,0) != SMB_POSIX_ACL_VERSION || rb_size < 6) {		d_printf("getfacl file %s, unknown POSIX acl version %u.\n",			src, (unsigned int)CVAL(retbuf,0) );		SAFE_FREE(retbuf);		return 1;	}	num_file_acls = SVAL(retbuf,2);	num_dir_acls = SVAL(retbuf,4);	if (rb_size != SMB_POSIX_ACL_HEADER_SIZE + SMB_POSIX_ACL_ENTRY_SIZE*(num_file_acls+num_dir_acls)) {		d_printf("getfacl file %s, incorrect POSIX acl buffer size (should be %u, was %u).\n",			src,			(unsigned int)(SMB_POSIX_ACL_HEADER_SIZE + SMB_POSIX_ACL_ENTRY_SIZE*(num_file_acls+num_dir_acls)),			(unsigned int)rb_size);		SAFE_FREE(retbuf);		return 1;	}	d_printf("# file: %s\n", src);	d_printf("# owner: %u\n# group: %u\n", (unsigned int)sbuf.st_uid, (unsigned int)sbuf.st_gid);	if (num_file_acls == 0 && num_dir_acls == 0) {		d_printf("No acls found.\n");	}	for (i = 0; i < num_file_acls; i++) {		uint32 uorg;		fstring permstring;		unsigned char tagtype = CVAL(retbuf, SMB_POSIX_ACL_HEADER_SIZE+(i*SMB_POSIX_ACL_ENTRY_SIZE));		unsigned char perms = CVAL(retbuf, SMB_POSIX_ACL_HEADER_SIZE+(i*SMB_POSIX_ACL_ENTRY_SIZE)+1);		switch(tagtype) {			case SMB_POSIX_ACL_USER_OBJ:				d_printf("user::");				break;			case SMB_POSIX_ACL_USER:				uorg = IVAL(retbuf,SMB_POSIX_ACL_HEADER_SIZE+(i*SMB_POSIX_ACL_ENTRY_SIZE)+2);				d_printf("user:%u:", uorg);				break;			case SMB_POSIX_ACL_GROUP_OBJ:				d_printf("group::");				break;			case SMB_POSIX_ACL_GROUP:				uorg = IVAL(retbuf,SMB_POSIX_ACL_HEADER_SIZE+(i*SMB_POSIX_ACL_ENTRY_SIZE)+2);				d_printf("group:%u", uorg);				break;			case SMB_POSIX_ACL_MASK:				d_printf("mask::");				break;			case SMB_POSIX_ACL_OTHER:				d_printf("other::");				break;			default:				d_printf("getfacl file %s, incorrect POSIX acl tagtype (%u).\n",					src, (unsigned int)tagtype );				SAFE_FREE(retbuf);				return 1;		}		d_printf("%s\n", perms_to_string(permstring, perms));	}	for (i = 0; i < num_dir_acls; i++) {		uint32 uorg;		fstring permstring;		unsigned char tagtype = CVAL(retbuf, SMB_POSIX_ACL_HEADER_SIZE+((i+num_file_acls)*SMB_POSIX_ACL_ENTRY_SIZE));		unsigned char perms = CVAL(retbuf, SMB_POSIX_ACL_HEADER_SIZE+((i+num_file_acls)*SMB_POSIX_ACL_ENTRY_SIZE)+1);		switch(tagtype) {			case SMB_POSIX_ACL_USER_OBJ:				d_printf("default:user::");				break;			case SMB_POSIX_ACL_USER:				uorg = IVAL(retbuf,SMB_POSIX_ACL_HEADER_SIZE+((i+num_file_acls)*SMB_POSIX_ACL_ENTRY_SIZE)+2);				d_printf("default:user:%u:", uorg);				break;			case SMB_POSIX_ACL_GROUP_OBJ:				d_printf("default:group::");				break;			case SMB_POSIX_ACL_GROUP:				uorg = IVAL(retbuf,SMB_POSIX_ACL_HEADER_SIZE+((i+num_file_acls)*SMB_POSIX_ACL_ENTRY_SIZE)+2);				d_printf("default:group:%u", uorg);				break;			case SMB_POSIX_ACL_MASK:				d_printf("default:mask::");				break;			case SMB_POSIX_ACL_OTHER:				d_printf("default:other::");				break;			default:				d_printf("getfacl file %s, incorrect POSIX acl tagtype (%u).\n",					src, (unsigned int)tagtype );				SAFE_FREE(retbuf);				return 1;		}		d_printf("%s\n", perms_to_string(permstring, perms));	}	SAFE_FREE(retbuf);	return 0;}/**************************************************************************** UNIX stat.****************************************************************************/static int cmd_stat(void){	pstring src, name;	fstring mode_str;	SMB_STRUCT_STAT sbuf;	struct cli_state *targetcli;	pstring targetname; 	if (!SERVER_HAS_UNIX_CIFS(cli)) {		d_printf("Server doesn't support UNIX CIFS calls.\n");		return 1;	}	pstrcpy(src,cur_dir);		if (!next_token_nr(NULL,name,NULL,sizeof(name))) {		d_printf("stat file\n");		return 1;	}	pstrcat(src,name);		if ( !cli_resolve_path( "", cli, src, &targetcli, targetname ) ) {		d_printf("stat %s: %s\n", src, cli_errstr(cli));		return 1;	}		if (!cli_unix_stat(targetcli, targetname, &sbuf)) {		d_printf("%s stat file %s\n",			cli_errstr(targetcli), src);		return 1;	} 	/* Print out the stat values. */	d_printf("File: %s\n", src);	d_printf("Size: %-12.0f\tBlocks: %u\t%s\n",		(double)sbuf.st_size,		(unsigned int)sbuf.st_blocks,		filetype_to_str(sbuf.st_mode));#if defined(S_ISCHR) && defined(S_ISBLK)	if (S_ISCHR(sbuf.st_mode) || S_ISBLK(sbuf.st_mode)) {		d_printf("Inode: %.0f\tLinks: %u\tDevice type: %u,%u\n",			(double)sbuf.st_ino,			(unsigned int)sbuf.st_nlink,			unix_dev_major(sbuf.st_rdev),			unix_dev_minor(sbuf.st_rdev));	} else #endif		d_printf("Inode: %.0f\tLinks: %u\n",			(double)sbuf.st_ino,			(unsigned int)sbuf.st_nlink);	d_printf("Access: (0%03o/%s)\tUid: %u\tGid: %u\n",		((int)sbuf.st_mode & 0777),		unix_mode_to_str(mode_str, sbuf.st_mode),		(unsigned int)sbuf.st_uid, 		(unsigned int)sbuf.st_gid);	strftime(mode_str, sizeof(mode_str), "%F %T %z", localtime(&sbuf.st_atime));	d_printf("Access: %s\n", mode_str);

⌨️ 快捷键说明

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