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

📄 smbctool.c

📁 samba-3.0.22.tar.gz 编译smb服务器的源码
💻 C
📖 第 1 页 / 共 5 页
字号:
	/* 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);	strftime(mode_str, sizeof(mode_str), "%F %T %z", localtime(&sbuf.st_mtime));	d_printf("Modify: %s\n", mode_str);	strftime(mode_str, sizeof(mode_str), "%F %T %z", localtime(&sbuf.st_ctime));	d_printf("Change: %s\n", mode_str);		return 0;}/**************************************************************************** UNIX chown.****************************************************************************/static int cmd_chown(void){	pstring src;	uid_t uid;	gid_t gid;	pstring buf, buf2, buf3;	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)) ||		!next_token_nr(NULL,buf3,NULL, sizeof(buf3))) {		d_printf("chown uid gid file\n");		return 1;	}	uid = (uid_t)atoi(buf);	gid = (gid_t)atoi(buf2);	pstrcat(src,buf3);	if ( !cli_resolve_path( "", cli, src, &targetcli, targetname ) ) {		d_printf("chown %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_chown(targetcli, targetname, uid, gid)) {		d_printf("%s chown file %s uid=%d, gid=%d\n",			cli_errstr(targetcli), src, (int)uid, (int)gid);		return 1;	} 	return 0;}/**************************************************************************** Rename some file.****************************************************************************/static int cmd_rename(void){	int err;	pstring src, dest;	pstring oname, nname;  	pstrcpy(src, "smb:");	pstrcat(src, service);	pstrcat(src, cur_dir);	pstrcpy(dest, src);		if (!next_token_nr(NULL,oname,NULL,sizeof(oname)) || 		!next_token_nr(NULL,nname,NULL, sizeof(nname))) {		d_printf("rename <src> <dest>\n");		return 1;	}	pstrcat(src, oname);	pstrcat(dest, nname);		DEBUG(4, ("O: %s\nN: %s\n", src, dest));	err = smbc_rename(src, dest);	if (err < 0)	{		d_printf("%s renaming files\n", strerror(errno));		return 1;	}		return 0;}/**************************************************************************** Print the volume name.****************************************************************************/static int cmd_volume(void){	fstring volname;	uint32 serial_num;	time_t create_date;  	if (!cli_get_fs_volume_info(cli, volname, &serial_num, &create_date)) {		d_printf("Errr %s getting volume info\n",cli_errstr(cli));		return 1;	}		d_printf("Volume: |%s| serial number 0x%x\n", volname, (unsigned int)serial_num);	return 0;}/**************************************************************************** Hard link files using the NT call.****************************************************************************/static int cmd_hardlink(void){	pstring src,dest;	pstring buf,buf2;	struct cli_state *targetcli;	pstring targetname;  	pstrcpy(src,cur_dir);	pstrcpy(dest,cur_dir);		if (!next_token_nr(NULL,buf,NULL,sizeof(buf)) || 		!next_token_nr(NULL,buf2,NULL, sizeof(buf2))) {		d_printf("hardlink <src> <dest>\n");		return 1;	}	pstrcat(src,buf);	pstrcat(dest,buf2);	if ( !cli_resolve_path( "", cli, src, &targetcli, targetname ) ) {		d_printf("hardlink %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_nt_hardlink(targetcli, targetname, dest)) {		d_printf("%s doing an NT hard link of files\n",cli_errstr(targetcli));		return 1;	}		return 0;}/**************************************************************************** Toggle the prompt flag.****************************************************************************/static int cmd_prompt(void){	prompt = !prompt;	DEBUG(2,("prompting is now %s\n",prompt?"on":"off"));		return 1;}/**************************************************************************** Set the newer than time.****************************************************************************/static int cmd_newer(void){	pstring buf;	BOOL ok;	SMB_STRUCT_STAT sbuf;	ok = next_token_nr(NULL,buf,NULL,sizeof(buf));	if (ok && (sys_stat(buf,&sbuf) == 0)) {		newer_than = sbuf.st_mtime;		DEBUG(1,("Getting files newer than %s",			 asctime(localtime(&newer_than))));	} else {		newer_than = 0;	}	if (ok && newer_than == 0) {		d_printf("Error setting newer-than time\n");		return 1;	}	return 0;}/**************************************************************************** Set the archive level.****************************************************************************/static int cmd_archive(void){	pstring buf;	if (next_token_nr(NULL,buf,NULL,sizeof(buf))) {		archive_level = atoi(buf);	} else		d_printf("Archive level is %d\n",archive_level);	return 0;}/**************************************************************************** Toggle the lowercaseflag.****************************************************************************/static int cmd_lowercase(void){	lowercase = !lowercase;	DEBUG(2,("filename lowercasing is now %s\n",lowercase?"on":"off"));	return 0;}/**************************************************************************** Toggle the case sensitive flag.****************************************************************************/static int cmd_setcase(void){	BOOL orig_case_sensitive = cli_set_case_sensitive(cli, False);	cli_set_case_sensitive(cli, !orig_case_sensitive);	DEBUG(2,("filename case sensitivity is now %s\n",!orig_case_sensitive ?		"on":"off"));	return 0;}/**************************************************************************** Toggle the recurse flag.****************************************************************************/static int cmd_recurse(void){	recurse = !recurse;	DEBUG(2,("directory recursion is now %s\n",recurse?"on":"off"));	return 0;}/**************************************************************************** Toggle the translate flag.****************************************************************************/static int cmd_translate(void){	translation = !translation;	DEBUG(2,("CR/LF<->LF and print text translation now %s\n",		 translation?"on":"off"));	return 0;}/**************************************************************************** Do the lcd command. ****************************************************************************/static int cmd_lcd(void){	pstring buf;	pstring d;		if (next_token_nr(NULL,buf,NULL,sizeof(buf)))		chdir(buf);	DEBUG(2,("the local directory is now %s\n",sys_getwd(d)));	return 0;}/**************************************************************************** Get a file restarting at end of local file. ****************************************************************************/static int cmd_reget(void){	pstring local_name;	pstring remote_name;	char *p;	pstrcpy(remote_name, cur_dir);	pstrcat(remote_name, "/");		p = remote_name + strlen(remote_name);		if (!next_token_nr(NULL, p, NULL, sizeof(remote_name) - strlen(remote_name))) {		d_printf("reget <filename>\n");		return 1;	}	pstrcpy(local_name, p);	dos_clean_name(remote_name);		next_token_nr(NULL, local_name, NULL, sizeof(local_name));		return do_get(remote_name, local_name, True);}/**************************************************************************** Put a file restarting at end of local file. ****************************************************************************/static int cmd_reput(void){	pstring local_name;	pstring remote_name;	pstring buf;	char *p = buf;	SMB_STRUCT_STAT st;		pstrcpy(remote_name, cur_dir);	pstrcat(remote_name, "/");  	if (!next_token_nr(NULL, p, NULL, sizeof(buf))) {		d_printf("reput <filename>\n");		return 1;	}	pstrcpy(local_name, p);  	if (!file_exist(local_name, &st)) {		d_printf("%s does not exist\n", local_name);		return 1;	}	if (next_token_nr(NULL, p, NULL, sizeof(buf)))		pstrcat(remote_name, p);	else		pstrcat(remote_name, local_name);		dos_clean_name(remote_name);	return do_put(remote_name, local_name, True);}/**************************************************************************** List a share name. ****************************************************************************/static void browse_fn(const char *name, uint32 m,                       const char *comment, void *state){        fstring typestr;        *typestr=0;        switch (m)        {          case STYPE_DISKTREE:            fstrcpy(typestr,"Disk"); break;          case STYPE_PRINTQ:            fstrcpy(typestr,"Printer"); break;          case STYPE_DEVICE:            fstrcpy(typestr,"Device"); break;          case STYPE_IPC:            fstrcpy(typestr,"IPC"); break;        }	/* FIXME: If the remote machine returns non-ascii characters	   in any of these fields, they can corrupt the output.  We	   should remove them. */	if (!grepable) {		d_printf("\t%-15s %-10.10s%s\n",               		name,typestr,comment);	} else {		d_printf ("%s|%s|%s\n",typestr,name,comment);	}}/**************************************************************************** Try and browse available connections on a host.************************************************************

⌨️ 快捷键说明

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