📄 smbctool.c
字号:
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 + -