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

📄 smbctool.c

📁 samba-3.0.22.tar.gz 编译smb服务器的源码
💻 C
📖 第 1 页 / 共 5 页
字号:
		ret = file_find(&file_list, ".", p, True);		if (ret) {			free_file_list(file_list);			continue;		}				quest = NULL;		lname = NULL;		rname = NULL;						for (temp_list = file_list; temp_list; 			 temp_list = temp_list->next) {			SAFE_FREE(lname);			if (asprintf(&lname, "%s/", temp_list->file_path) <= 0)				continue;			trim_string(lname, "./", "/");						/* check if it's a directory */			if (temp_list->isdir) {				/* if (!recurse) continue; */								SAFE_FREE(quest);				if (asprintf(&quest, "Put directory %s? ", lname) < 0) break;				if (prompt && !yesno(quest)) { /* No */					/* Skip the directory */					lname[strlen(lname)-1] = '/';					if (!seek_list(temp_list, lname))						break;							} else { /* Yes */					SAFE_FREE(rname);					if(asprintf(&rname, "smb:%s%s%s", service, cur_dir, lname) < 0) break;					/*dos_format(rname);*/										/* test if the directory exists by opening it */					/*if (!((dh=smbc_opendir(rname)) < 0)) {						smbc_closedir(dh);						continue;					}*/					/* test if the directory exists by making it */					ret = smbc_mkdir(rname, 755);					if ((ret != 0) && (errno != EEXIST))					{						d_printf("Error: %s. Unable to open or create dir %s, skipping...\n", strerror(errno), rname);						/* 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 (prompt && !yesno(quest)) /* No */					continue;								/* Yes */				SAFE_FREE(rname);				if (asprintf(&rname, "smb:%s%s%s", service, cur_dir, lname) < 0) break;			}			/*d_printf("PUT: rname: %s, lname: %s\n", rname, lname);*/			do_put(rname, lname, False);		}		free_file_list(file_list);		SAFE_FREE(quest);		SAFE_FREE(lname);		SAFE_FREE(rname);	}	return 0;}/**************************************************************************** Cancel a print job.****************************************************************************/static int do_cancel(int job){	if (cli_printjob_del(cli, job)) {		d_printf("Job %d cancelled\n",job);		return 0;	} else {		d_printf("Error cancelling job %d : %s\n",job,cli_errstr(cli));		return 1;	}}/**************************************************************************** Cancel a print job.****************************************************************************/static int cmd_cancel(void){	pstring buf;	int job; 	if (!next_token_nr(NULL,buf,NULL,sizeof(buf))) {		d_printf("cancel <jobid> ...\n");		return 1;	}	do {		job = atoi(buf);		do_cancel(job);	} while (next_token_nr(NULL,buf,NULL,sizeof(buf)));		return 0;}/**************************************************************************** Print a file.****************************************************************************/static int cmd_print(void){	pstring lname;	pstring rname;	char *p;	if (!next_token_nr(NULL,lname,NULL, sizeof(lname))) {		d_printf("print <filename>\n");		return 1;	}	pstrcpy(rname,lname);	p = strrchr_m(rname,'/');	if (p) {		slprintf(rname, sizeof(rname)-1, "%s-%d", p+1, (int)sys_getpid());	}	if (strequal(lname,"-")) {		slprintf(rname, sizeof(rname)-1, "stdin-%d", (int)sys_getpid());	}	return do_put(rname, lname, False);}/**************************************************************************** Show a print queue entry.****************************************************************************/static void queue_fn(struct print_job_info *p){	d_printf("%-6d	 %-9d	 %s\n", (int)p->id, (int)p->size, p->name);}/**************************************************************************** Show a print queue.****************************************************************************/static int cmd_queue(void){	cli_print_queue(cli, queue_fn);		return 0;}/**************************************************************************** Delete some files.****************************************************************************/static void do_del(file_info *finfo){	pstring mask;	pstrcpy(mask,cur_dir);	pstrcat(mask,finfo->name);	if (finfo->mode & aDIR) 		return;	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, "smb:");	pstrcat(mask, service);	pstrcat(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);	}*/		if (smbc_rmdir(mask) < 0)		d_printf("Error: %s removing remote directory file %s\n", strerror(errno), 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;	} 

⌨️ 快捷键说明

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