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

📄 client.c

📁 samba最新软件
💻 C
📖 第 1 页 / 共 5 页
字号:
					lname[strlen(lname)-1] = '/';					if (!seek_list(temp_list, lname))						break;		    				} else { /* Yes */	      				SAFE_FREE(rname);					if(asprintf(&rname, "%s%s", ctx->remote_cur_dir, lname) < 0) break;					dos_format(rname);					if (NT_STATUS_IS_ERR(smbcli_chkpath(ctx->cli->tree, rname)) && 					    NT_STATUS_IS_ERR(do_mkdir(ctx, rname))) {						DEBUG (0, ("Unable to make dir, skipping..."));						/* Skip the directory */						lname[strlen(lname)-1] = '/';						if (!seek_list(temp_list, lname))							break;					}				}				continue;			} else {				SAFE_FREE(quest);				if (asprintf(&quest,"Put file %s? ", lname) < 0) break;				if (ctx->prompt && !yesno(quest)) /* No */					continue;								/* Yes */				SAFE_FREE(rname);				if (asprintf(&rname, "%s%s", ctx->remote_cur_dir, lname) < 0) break;			}			dos_format(rname);			do_put(ctx, rname, lname, false);		}		free_file_list(file_list);		SAFE_FREE(quest);		SAFE_FREE(lname);		SAFE_FREE(rname);	}	return 0;}/****************************************************************************  print a file  ****************************************************************************/static int cmd_print(struct smbclient_context *ctx, const char **args){	char *lname, *rname;	char *p;	if (!args[1]) {		d_printf("print <filename>\n");		return 1;	}	lname = talloc_strdup(ctx, args[1]);	rname = talloc_strdup(ctx, lname);	p = strrchr_m(rname,'/');	if (p) {		slprintf(rname, sizeof(rname)-1, "%s-%d", p+1, (int)getpid());	}	if (strequal(lname,"-")) {		slprintf(rname, sizeof(rname)-1, "stdin-%d", (int)getpid());	}	return do_put(ctx, rname, lname, false);}static int cmd_rewrite(struct smbclient_context *ctx, const char **args){	d_printf("REWRITE: command not implemented (FIXME!)\n");		return 0;}/****************************************************************************delete some files****************************************************************************/static int cmd_del(struct smbclient_context *ctx, const char **args){	char *mask;	uint16_t attribute = FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_HIDDEN;	if (ctx->recurse)		attribute |= FILE_ATTRIBUTE_DIRECTORY;		if (!args[1]) {		d_printf("del <filename>\n");		return 1;	}	mask = talloc_asprintf(ctx,"%s%s", ctx->remote_cur_dir, args[1]);	if (NT_STATUS_IS_ERR(smbcli_unlink(ctx->cli->tree, mask))) {		d_printf("%s deleting remote file %s\n",smbcli_errstr(ctx->cli->tree),mask);	}		return 0;}/****************************************************************************delete a whole directory tree****************************************************************************/static int cmd_deltree(struct smbclient_context *ctx, const char **args){	char *dname;	int ret;	if (!args[1]) {		d_printf("deltree <dirname>\n");		return 1;	}	dname = talloc_asprintf(ctx, "%s%s", ctx->remote_cur_dir, args[1]);		ret = smbcli_deltree(ctx->cli->tree, dname);	if (ret == -1) {		printf("Failed to delete tree %s - %s\n", dname, smbcli_errstr(ctx->cli->tree));		return -1;	}	printf("Deleted %d files in %s\n", ret, dname);		return 0;}typedef struct {	const char  *level_name;	enum smb_fsinfo_level level;} fsinfo_level_t;fsinfo_level_t fsinfo_levels[] = {	{"dskattr", RAW_QFS_DSKATTR},	{"allocation", RAW_QFS_ALLOCATION},	{"volume", RAW_QFS_VOLUME},	{"volumeinfo", RAW_QFS_VOLUME_INFO},	{"sizeinfo", RAW_QFS_SIZE_INFO},	{"deviceinfo", RAW_QFS_DEVICE_INFO},	{"attributeinfo", RAW_QFS_ATTRIBUTE_INFO},	{"unixinfo", RAW_QFS_UNIX_INFO},	{"volume-information", RAW_QFS_VOLUME_INFORMATION},	{"size-information", RAW_QFS_SIZE_INFORMATION},	{"device-information", RAW_QFS_DEVICE_INFORMATION},	{"attribute-information", RAW_QFS_ATTRIBUTE_INFORMATION},	{"quota-information", RAW_QFS_QUOTA_INFORMATION},	{"fullsize-information", RAW_QFS_FULL_SIZE_INFORMATION},	{"objectid", RAW_QFS_OBJECTID_INFORMATION},	{NULL, RAW_QFS_GENERIC}};static int cmd_fsinfo(struct smbclient_context *ctx, const char **args){	union smb_fsinfo fsinfo;	NTSTATUS status;	fsinfo_level_t *fsinfo_level;		if (!args[1]) {		d_printf("fsinfo <level>, where level is one of following:\n");		fsinfo_level = fsinfo_levels;		while(fsinfo_level->level_name) {			d_printf("%s\n", fsinfo_level->level_name);			fsinfo_level++;		}		return 1;	}		fsinfo_level = fsinfo_levels;	while(fsinfo_level->level_name && !strequal(args[1],fsinfo_level->level_name)) {		fsinfo_level++;	}  	if (!fsinfo_level->level_name) {		d_printf("wrong level name!\n");		return 1;	}  	fsinfo.generic.level = fsinfo_level->level;	status = smb_raw_fsinfo(ctx->cli->tree, ctx, &fsinfo);	if (!NT_STATUS_IS_OK(status)) {		d_printf("fsinfo-level-%s - %s\n", fsinfo_level->level_name, nt_errstr(status));		return 1;	}	d_printf("fsinfo-level-%s:\n", fsinfo_level->level_name);	switch(fsinfo.generic.level) {	case RAW_QFS_DSKATTR:		d_printf("\tunits_total:                %hu\n", 			 (unsigned short) fsinfo.dskattr.out.units_total);		d_printf("\tblocks_per_unit:            %hu\n", 			 (unsigned short) fsinfo.dskattr.out.blocks_per_unit);		d_printf("\tblocks_size:                %hu\n", 			 (unsigned short) fsinfo.dskattr.out.block_size);		d_printf("\tunits_free:                 %hu\n", 			 (unsigned short) fsinfo.dskattr.out.units_free);		break;	case RAW_QFS_ALLOCATION:		d_printf("\tfs_id:                      %lu\n", 			 (unsigned long) fsinfo.allocation.out.fs_id);		d_printf("\tsectors_per_unit:           %lu\n", 			 (unsigned long) fsinfo.allocation.out.sectors_per_unit);		d_printf("\ttotal_alloc_units:          %lu\n", 			 (unsigned long) fsinfo.allocation.out.total_alloc_units);		d_printf("\tavail_alloc_units:          %lu\n", 			 (unsigned long) fsinfo.allocation.out.avail_alloc_units);		d_printf("\tbytes_per_sector:           %hu\n", 			 (unsigned short) fsinfo.allocation.out.bytes_per_sector);		break;	case RAW_QFS_VOLUME:		d_printf("\tserial_number:              %lu\n", 			 (unsigned long) fsinfo.volume.out.serial_number);		d_printf("\tvolume_name:                %s\n", fsinfo.volume.out.volume_name.s);		break;	case RAW_QFS_VOLUME_INFO:	case RAW_QFS_VOLUME_INFORMATION:		d_printf("\tcreate_time:                %s\n",			 nt_time_string(ctx,fsinfo.volume_info.out.create_time));		d_printf("\tserial_number:              %lu\n", 			 (unsigned long) fsinfo.volume_info.out.serial_number);		d_printf("\tvolume_name:                %s\n", fsinfo.volume_info.out.volume_name.s);		break;	case RAW_QFS_SIZE_INFO:	case RAW_QFS_SIZE_INFORMATION:		d_printf("\ttotal_alloc_units:          %llu\n", 			 (unsigned long long) fsinfo.size_info.out.total_alloc_units);		d_printf("\tavail_alloc_units:          %llu\n", 			 (unsigned long long) fsinfo.size_info.out.avail_alloc_units);		d_printf("\tsectors_per_unit:           %lu\n", 			 (unsigned long) fsinfo.size_info.out.sectors_per_unit);		d_printf("\tbytes_per_sector:           %lu\n", 			 (unsigned long) fsinfo.size_info.out.bytes_per_sector);		break;	case RAW_QFS_DEVICE_INFO:	case RAW_QFS_DEVICE_INFORMATION:		d_printf("\tdevice_type:                %lu\n", 			 (unsigned long) fsinfo.device_info.out.device_type);		d_printf("\tcharacteristics:            0x%lx\n", 			 (unsigned long) fsinfo.device_info.out.characteristics);		break;	case RAW_QFS_ATTRIBUTE_INFORMATION:	case RAW_QFS_ATTRIBUTE_INFO:		d_printf("\tfs_attr:                    0x%lx\n", 			 (unsigned long) fsinfo.attribute_info.out.fs_attr);		d_printf("\tmax_file_component_length:  %lu\n", 			 (unsigned long) fsinfo.attribute_info.out.max_file_component_length);		d_printf("\tfs_type:                    %s\n", fsinfo.attribute_info.out.fs_type.s);		break;	case RAW_QFS_UNIX_INFO:		d_printf("\tmajor_version:              %hu\n", 			 (unsigned short) fsinfo.unix_info.out.major_version);		d_printf("\tminor_version:              %hu\n", 			 (unsigned short) fsinfo.unix_info.out.minor_version);		d_printf("\tcapability:                 0x%llx\n", 			 (unsigned long long) fsinfo.unix_info.out.capability);		break;	case RAW_QFS_QUOTA_INFORMATION:		d_printf("\tunknown[3]:                 [%llu,%llu,%llu]\n", 			 (unsigned long long) fsinfo.quota_information.out.unknown[0],			 (unsigned long long) fsinfo.quota_information.out.unknown[1],			 (unsigned long long) fsinfo.quota_information.out.unknown[2]);		d_printf("\tquota_soft:                 %llu\n", 			 (unsigned long long) fsinfo.quota_information.out.quota_soft);		d_printf("\tquota_hard:                 %llu\n", 			 (unsigned long long) fsinfo.quota_information.out.quota_hard);		d_printf("\tquota_flags:                0x%llx\n", 			 (unsigned long long) fsinfo.quota_information.out.quota_flags);		break;	case RAW_QFS_FULL_SIZE_INFORMATION:		d_printf("\ttotal_alloc_units:          %llu\n", 			 (unsigned long long) fsinfo.full_size_information.out.total_alloc_units);		d_printf("\tcall_avail_alloc_units:     %llu\n", 			 (unsigned long long) fsinfo.full_size_information.out.call_avail_alloc_units);		d_printf("\tactual_avail_alloc_units:   %llu\n", 			 (unsigned long long) fsinfo.full_size_information.out.actual_avail_alloc_units);		d_printf("\tsectors_per_unit:           %lu\n", 			 (unsigned long) fsinfo.full_size_information.out.sectors_per_unit);		d_printf("\tbytes_per_sector:           %lu\n", 			 (unsigned long) fsinfo.full_size_information.out.bytes_per_sector);		break;	case RAW_QFS_OBJECTID_INFORMATION:		d_printf("\tGUID:                       %s\n", 			 GUID_string(ctx,&fsinfo.objectid_information.out.guid));		d_printf("\tunknown[6]:                 [%llu,%llu,%llu,%llu,%llu,%llu]\n", 			 (unsigned long long) fsinfo.objectid_information.out.unknown[0],			 (unsigned long long) fsinfo.objectid_information.out.unknown[1],			 (unsigned long long) fsinfo.objectid_information.out.unknown[2],			 (unsigned long long) fsinfo.objectid_information.out.unknown[3],			 (unsigned long long) fsinfo.objectid_information.out.unknown[4],			 (unsigned long long) fsinfo.objectid_information.out.unknown[5] );		break;	case RAW_QFS_GENERIC:		d_printf("\twrong level returned\n");		break;	}  	return 0;}/****************************************************************************show as much information as possible about a file****************************************************************************/static int cmd_allinfo(struct smbclient_context *ctx, const char **args){	char *fname;	union smb_fileinfo finfo;	NTSTATUS status;	int fnum;	if (!args[1]) {		d_printf("allinfo <filename>\n");		return 1;	}	fname = talloc_asprintf(ctx, "%s%s", ctx->remote_cur_dir, args[1]);	/* first a ALL_INFO QPATHINFO */	finfo.generic.level = RAW_FILEINFO_ALL_INFO;	finfo.generic.in.file.path = fname;	status = smb_raw_pathinfo(ctx->cli->tree, ctx, &finfo);	if (!NT_STATUS_IS_OK(status)) {		d_printf("%s - %s\n", fname, nt_errstr(status));		return 1;	}	d_printf("\tcreate_time:    %s\n", nt_time_string(ctx, finfo.all_info.out.create_time));	d_printf("\taccess_time:    %s\n", nt_time_string(ctx, finfo.all_info.out.access_time));	d_printf("\twrite_time:     %s\n", nt_time_string(ctx, finfo.all_info.out.write_time));	d_printf("\tchange_time:    %s\n", nt_time_string(ctx, finfo.all_info.out.change_time));	d_printf("\tattrib:         0x%x\n", finfo.all_info.out.attrib);	d_printf("\talloc_size:     %lu\n", (unsigned long)finfo.all_info.out.alloc_size);	d_printf("\tsize:           %lu\n", (unsigned long)finfo.all_info.out.size);	d_printf("\tnlink:          %u\n", finfo.all_info.out.nlink);	d_printf("\tdelete_pending: %u\n", finfo.all_info.out.delete_pending);	d_printf("\tdirectory:      %u\n", finfo.all_info.out.directory);	d_printf("\tea_size:        %u\n", finfo.all_info.out.ea_size);	d_printf("\tfname:          '%s'\n", finfo.all_info.out.fname.s);	/* 8.3 name if any */	finfo.generic.level = RAW_FILEINFO_ALT_NAME_INFO;	status = smb_raw_pathinfo(ctx->cli->tree, ctx, &finfo);	if (NT_STATUS_IS_OK(status)) {		d_printf("\talt_name:       %s\n", finfo.alt_name_info.out.fname.s);	}	/* file_id if available */	finfo.generic.level = RAW_FILEINFO_INTERNAL_INFORMATION;	status = smb_raw_pathinfo(ctx->cli->tree, ctx, &finfo);	if (NT_STATUS_IS_OK(status)) {		d_printf("\tfile_id         %.0f\n", 			 (double)finfo.internal_information.out.file_id);	}	/* the EAs, if any */	finfo.generic.level = RAW_FILEINFO_ALL_EAS;	status = smb_raw_pathinfo(ctx->cli->tree, ctx, &finfo);	if (NT_STATUS_IS_OK(status)) {		int i;		for (i=0;i<finfo.all_eas.out.num_eas;i++) {			d_printf("\tEA[%d] flags=%d len=%d '%s'\n", i,				 finfo.all_eas.out.eas[i].flags,				 (int)finfo.all_eas.out.eas[i].value.length,				 finfo.all_eas.out.eas[i].name.s);		}	}	/* streams, if available */	finfo.generic.level = RAW_FILEINFO_STREAM_INFO;	status = smb_raw_pathinfo(ctx->cli->tree, ctx, &finfo);	if (NT_STATUS_IS_OK(status)) {		int i;		for (i=0;i<finfo.stream_info.out.num_streams;i++) {			d_printf("\tstream %d:\n", i);			d_printf("\t\tsize       %ld\n", 				 (long)finfo.stream_info.out.streams[i].size);			d_printf("\t\talloc size %ld\n", 				 (long)finfo.stream_info.out.streams[i].alloc_size);			d_printf("\t\tname       %s\n", finfo.stream_info.out.streams[i].stream_name.s);		}	}		/* dev/inode if available */	finfo.generic.level = RAW_FILEINFO_COMPRESSION_INFORMATION;	status = smb_raw_pathinfo(ctx->cli->tree, ctx, &finfo);	if (NT_STATUS_IS_OK(status)) {		d_printf("\tcompressed size %ld\n", (long)finfo.compression_info.out.compressed_size);		d_printf("\tformat          %ld\n", (long)finfo.compression_info.out.format);		d_printf("\tunit_shift      %ld\n", (long)finfo.compression_info.out.unit_shift);		d_printf("\tchunk_shift     %ld\n", (long)finfo.compression_info.out.chunk_shift);		d_printf("\tcluster_shift   %ld\n", (long)finfo.compression_info.out.cluster_shift);	}	/* shadow copies if available */	fnum = smbcli_open(ctx->cli->tree, fname, O_RDONLY, DENY_NONE);	if (fnum != -1) {		struct smb_shadow_copy info;		int i;		info.in.file.fnum = fnum;		info.in.max_data = ~0;		status = smb_raw_shadow_data(ctx->cli->tree, ctx, &info);		if (NT_STATUS_IS_OK(status)) {			d_printf("\tshadow_copy: %u volumes  %u names\n",				 info.out.num_volumes, info.out.num_names);			for (i=0;i<info.out.num_names;i++) {				d_printf("\t%s\n", info.out.names[i]);				finfo.generic.level = RAW_FILEINFO_ALL_INFO;				finfo.generic.in.file.path = talloc_asprintf(ctx, "%s%s", 									     info.out.names[i], fname); 				status = smb_raw_pathinfo(ctx->cli->tree, ctx, &finfo);				if (NT_STATUS_EQUAL(status, NT_STATUS_OBJECT_PATH_NOT_FOUND) ||				    NT_STATUS_EQUAL(status, NT_STATUS_OBJECT_NAME_NOT_FOUND)) {					continue;				}				if (!NT_STATUS_IS_OK(status)) {					d_printf("%s - %s\n", finfo.generic.in.file.path, 						 nt_errstr(status));					return 1;				}								d_printf("\t\tcreate_time:    %s\n", nt_time_string(ctx, finfo.all_info.out.create_time));				d_printf("\t\twrite_time:     %s\n", nt_time_string(ctx, finfo.all_info.out.write_time));				d_printf("\t\tchange_time:    %s\n", nt_time_string(ctx, finfo.all_info.out.change_time));				d_printf("\t\tsize:           %lu\n", (unsigned long)finfo.all_info.out.size);			}		}	}		return 0;}/****************************************************************************shows EA contents****************************************************************************/static int cmd_eainfo(struct smbclient_context *ctx, const char **args){	char *fname;	union smb_fileinfo finfo;	NTSTATUS status;	int i;	if (!args[1]) {		d_printf("eainfo <filename>\n");		return 1;	}	fname = talloc_strdup(ctx, args[1]);	finfo.generic.level = RAW_FILEINFO_ALL_EAS;	finfo.generic.in.file.path = fname;	status = smb_raw_pathinfo(ctx->cli->tree, ctx, &finfo);		if (!NT_STATUS_IS_OK(status)) {		d_printf("RAW_FILEINFO_ALL_EAS - %s\n", nt_errstr(status));		return 1;	}	d_printf("%s has %d EAs\n", fname, finfo.all_eas.out.num_eas);	for (i=0;i<finfo.all_eas.out.num_eas;i++) {		d_printf("\tEA[%d] flags=%d len=%d '%s'\n", i,			 finfo.all_eas.out.eas[i].flags,			 (int)finfo.all_eas.out.eas[i].value.length,			 finfo.all_eas.out.eas[i].name.s);		fflush(stdout);		dump_data(0, 			  finfo.all_eas.out.eas[i].value.data,			  finfo.all_eas.out.eas[i].value.length);	}	return 0;}/****************************************************************************show any ACL on a file

⌨️ 快捷键说明

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