Changeset 988 for vendor/current/source3/client/client.c
- Timestamp:
- Nov 24, 2016, 1:14:11 PM (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
vendor/current/source3/client/client.c
r860 r988 27 27 #include "rpc_client/cli_pipe.h" 28 28 #include "client/client_proto.h" 29 #include "client/clitar_proto.h" 29 30 #include "../librpc/gen_ndr/ndr_srvsvc_c.h" 30 31 #include "../lib/util/select.h" … … 37 38 #include "trans2.h" 38 39 #include "libsmb/nmblib.h" 40 #include "include/ntioctl.h" 41 #include "../libcli/smb/smbXcli_base.h" 39 42 40 43 #ifndef REGISTER … … 45 48 46 49 extern bool override_logfile; 47 extern char tar_type;48 50 49 51 static int port = 0; 50 52 static char *service; 51 53 static char *desthost; 52 static char *calling_name;53 54 static bool grepable = false; 54 55 static char *cmdstr = NULL; 55 56 const char *cmd_ptr = NULL; 56 57 57 static int io_bufsize = 524288; 58 static int io_bufsize = 0; /* we use the default size */ 59 static int io_timeout = (CLIENT_TIMEOUT/1000); /* Per operation timeout (in seconds). */ 58 60 59 61 static int name_type = 0x20; 60 static int max_protocol = PROTOCOL_NT1;62 static int max_protocol = -1; 61 63 62 64 static int process_tok(char *tok); … … 65 67 #define CREATE_ACCESS_READ READ_CONTROL_ACCESS 66 68 67 /* 30 second timeout on most commands */68 #define CLIENT_TIMEOUT (30*1000)69 #define SHORT_TIMEOUT (5*1000)70 71 69 /* value for unused fid field in trans2 secondary request */ 72 70 #define FID_UNUSED (0xFFFF) … … 77 75 static bool translation = false; 78 76 static bool have_ip; 79 80 /* clitar bits insert */81 extern int blocksize;82 extern bool tar_inc;83 extern bool tar_reset;84 /* clitar bits end */85 77 86 78 static bool prompt = true; … … 89 81 static bool showacls = false; 90 82 bool lowercase = false; 83 static bool backup_intent = false; 91 84 92 85 static struct sockaddr_storage dest_ss; … … 234 227 235 228 i = 0; 236 while (i < (n - 1) && (i < BUFFER_SIZE)) {229 while (i < (n - 1)) { 237 230 if ((c = x_getc(f)) == EOF) { 238 231 break; … … 251 244 struct push_state { 252 245 XFILE *f; 253 SMB_OFF_Tnread;246 off_t nread; 254 247 }; 255 248 … … 306 299 static int do_dskattr(void) 307 300 { 308 int total, bsize, avail;301 uint64_t total, bsize, avail; 309 302 struct cli_state *targetcli = NULL; 310 303 char *targetpath = NULL; … … 312 305 NTSTATUS status; 313 306 314 if ( !cli_resolve_path(ctx, "", auth_info, cli, client_get_cur_dir(), &targetcli, &targetpath)) { 315 d_printf("Error in dskattr: %s\n", cli_errstr(cli)); 316 return 1; 317 } 318 319 status = cli_dskattr(targetcli, &bsize, &total, &avail); 307 status = cli_resolve_path(ctx, "", auth_info, cli, 308 client_get_cur_dir(), &targetcli, 309 &targetpath); 320 310 if (!NT_STATUS_IS_OK(status)) { 321 311 d_printf("Error in dskattr: %s\n", nt_errstr(status)); … … 323 313 } 324 314 325 d_printf("\n\t\t%d blocks of size %d. %d blocks available\n", 326 total, bsize, avail); 315 status = cli_disk_size(targetcli, targetpath, &bsize, &total, &avail); 316 if (!NT_STATUS_IS_OK(status)) { 317 d_printf("Error in dskattr: %s\n", nt_errstr(status)); 318 return 1; 319 } 320 321 d_printf("\n\t\t%" PRIu64 322 " blocks of size %" PRIu64 323 ". %" PRIu64 " blocks available\n", 324 total, bsize, avail); 327 325 328 326 return 0; … … 363 361 struct cli_state *targetcli = NULL; 364 362 SMB_STRUCT_STAT sbuf; 365 uint32 attributes;363 uint32_t attributes; 366 364 int ret = 1; 367 365 TALLOC_CTX *ctx = talloc_stackframe(); 366 NTSTATUS status; 368 367 369 368 newdir = talloc_strdup(ctx, new_dir); … … 407 406 client_set_cur_dir(new_cd); 408 407 409 if ( !cli_resolve_path(ctx, "", auth_info, cli, new_cd, &targetcli, &targetpath)) { 410 d_printf("cd %s: %s\n", new_cd, cli_errstr(cli)); 408 status = cli_resolve_path(ctx, "", auth_info, cli, new_cd, 409 &targetcli, &targetpath); 410 if (!NT_STATUS_IS_OK(status)) { 411 d_printf("cd %s: %s\n", new_cd, nt_errstr(status)); 411 412 client_set_cur_dir(saved_dir); 412 413 goto out; … … 421 422 Except Win9x doesn't support the qpathinfo_basic() call..... */ 422 423 423 if (targetcli->protocol > PROTOCOL_LANMAN2 && !targetcli->win95) { 424 NTSTATUS status; 424 if (smbXcli_conn_protocol(targetcli->conn) > PROTOCOL_LANMAN2 && !targetcli->win95) { 425 425 426 426 status = cli_qpathinfo_basic(targetcli, targetpath, &sbuf, … … 438 438 } 439 439 } else { 440 NTSTATUS status;441 440 442 441 targetpath = talloc_asprintf(ctx, … … 549 548 d_printf(" %-30s%7.7s %8.0f %s", 550 549 finfo->name, 551 attrib_string( finfo->mode),550 attrib_string(talloc_tos(), finfo->mode), 552 551 (double)finfo->size, 553 552 time_to_asc(t)); … … 571 570 /* print file meta date header */ 572 571 d_printf( "FILENAME:%s\n", finfo->name); 573 d_printf( "MODE:%s\n", attrib_string( finfo->mode));572 d_printf( "MODE:%s\n", attrib_string(talloc_tos(), finfo->mode)); 574 573 d_printf( "SIZE:%.0f\n", (double)finfo->size); 575 574 d_printf( "MTIME:%s", time_to_asc(t)); … … 577 576 CREATE_ACCESS_READ, 0, 578 577 FILE_SHARE_READ|FILE_SHARE_WRITE, 579 FILE_OPEN, 0x0, 0x0, &fnum );578 FILE_OPEN, 0x0, 0x0, &fnum, NULL); 580 579 if (!NT_STATUS_IS_OK(status)) { 581 580 DEBUG( 0, ("display_finfo() Failed to open %s: %s\n", … … 583 582 } else { 584 583 struct security_descriptor *sd = NULL; 585 sd = cli_query_secdesc(cli_state, fnum, ctx); 586 if (!sd) { 584 status = cli_query_secdesc(cli_state, fnum, 585 ctx, &sd); 586 if (!NT_STATUS_IS_OK(status)) { 587 587 DEBUG( 0, ("display_finfo() failed to " 588 "get security descriptor: %s", 589 cli_errstr(cli_state))); 590 status = cli_nt_error(cli_state); 588 "get security descriptor: %s", 589 nt_errstr(status))); 591 590 } else { 592 591 display_sec_desc(sd); … … 704 703 } 705 704 if (do_list_queue) { 706 s afe_strcpy_base(do_list_queue + do_list_queue_end,705 strlcpy_base(do_list_queue + do_list_queue_end, 707 706 entry, do_list_queue, do_list_queue_size); 708 707 do_list_queue_end = new_end; … … 815 814 816 815 NTSTATUS do_list(const char *mask, 817 uint16 attribute,816 uint16_t attribute, 818 817 NTSTATUS (*fn)(struct cli_state *cli_state, struct file_info *, 819 818 const char *dir), … … 859 858 /* check for dfs */ 860 859 861 if ( !cli_resolve_path(ctx, "", auth_info, cli, head, &targetcli, &targetpath ) ) { 862 d_printf("do_list: [%s] %s\n", head, cli_errstr(cli)); 860 status = cli_resolve_path(ctx, "", auth_info, cli, 861 head, &targetcli, 862 &targetpath); 863 if (!NT_STATUS_IS_OK(status)) { 864 d_printf("do_list: [%s] %s\n", head, 865 nt_errstr(status)); 863 866 remove_do_list_queue_head(); 864 867 continue; … … 898 901 } else { 899 902 /* check for dfs */ 900 if (cli_resolve_path(ctx, "", auth_info, cli, mask, &targetcli, &targetpath)) { 901 903 status = cli_resolve_path(ctx, "", auth_info, cli, mask, 904 &targetcli, &targetpath); 905 if (NT_STATUS_IS_OK(status)) { 902 906 status = cli_list(targetcli, targetpath, attribute, 903 907 do_list_helper, targetcli); … … 909 913 TALLOC_FREE(targetpath); 910 914 } else { 911 d_printf("do_list: [%s] %s\n", mask, cli_errstr(cli));912 ret_status = cli_nt_error(cli);915 d_printf("do_list: [%s] %s\n", mask, nt_errstr(status)); 916 ret_status = status; 913 917 } 914 918 } … … 926 930 { 927 931 TALLOC_CTX *ctx = talloc_tos(); 928 uint16 attribute = FILE_ATTRIBUTE_DIRECTORY | FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_HIDDEN;932 uint16_t attribute = FILE_ATTRIBUTE_DIRECTORY | FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_HIDDEN; 929 933 char *mask = NULL; 930 934 char *buf = NULL; … … 976 980 { 977 981 TALLOC_CTX *ctx = talloc_tos(); 978 uint16 attribute = FILE_ATTRIBUTE_DIRECTORY | FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_HIDDEN;982 uint16_t attribute = FILE_ATTRIBUTE_DIRECTORY | FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_HIDDEN; 979 983 char *mask = NULL; 980 984 char *buf = NULL; … … 1060 1064 bool newhandle = false; 1061 1065 struct timespec tp_start; 1062 uint16 attr;1063 SMB_OFF_Tsize;1066 uint16_t attr; 1067 off_t size; 1064 1068 off_t start = 0; 1065 SMB_OFF_Tnread = 0;1069 off_t nread = 0; 1066 1070 int rc = 0; 1067 1071 struct cli_state *targetcli = NULL; … … 1076 1080 1077 1081 if (lowercase) { 1078 strlower_m(lname); 1079 } 1080 1081 if (!cli_resolve_path(ctx, "", auth_info, cli, rname, &targetcli, &targetname ) ) { 1082 d_printf("Failed to open %s: %s\n", rname, cli_errstr(cli)); 1082 if (!strlower_m(lname)) { 1083 d_printf("strlower_m %s failed\n", lname); 1084 return 1; 1085 } 1086 } 1087 1088 status = cli_resolve_path(ctx, "", auth_info, cli, rname, &targetcli, 1089 &targetname); 1090 if (!NT_STATUS_IS_OK(status)) { 1091 d_printf("Failed to open %s: %s\n", rname, nt_errstr(status)); 1083 1092 return 1; 1084 1093 } … … 1097 1106 } else { 1098 1107 if (reget) { 1099 handle = sys_open(lname, O_WRONLY|O_CREAT, 0644);1108 handle = open(lname, O_WRONLY|O_CREAT, 0644); 1100 1109 if (handle >= 0) { 1101 start = sys_lseek(handle, 0, SEEK_END);1110 start = lseek(handle, 0, SEEK_END); 1102 1111 if (start == -1) { 1103 1112 d_printf("Error seeking local file\n"); … … 1106 1115 } 1107 1116 } else { 1108 handle = sys_open(lname, O_WRONLY|O_CREAT|O_TRUNC, 0644);1117 handle = open(lname, O_WRONLY|O_CREAT|O_TRUNC, 0644); 1109 1118 } 1110 1119 newhandle = true; … … 1150 1159 1151 1160 if (archive_level >= 2 && (attr & FILE_ATTRIBUTE_ARCHIVE)) { 1152 cli_setatr(cli, rname, attr & ~(uint16 )FILE_ATTRIBUTE_ARCHIVE, 0);1161 cli_setatr(cli, rname, attr & ~(uint16_t)FILE_ATTRIBUTE_ARCHIVE, 0); 1153 1162 } 1154 1163 … … 1284 1293 string_replace(finfo->name,'\\','/'); 1285 1294 if (lowercase) { 1286 strlower_m(finfo->name); 1295 if (!strlower_m(finfo->name)) { 1296 return NT_STATUS_INVALID_PARAMETER; 1297 } 1287 1298 } 1288 1299 … … 1348 1359 int fd; 1349 1360 int rc = 0; 1361 mode_t mask; 1350 1362 1351 1363 rname = talloc_strdup(ctx, client_get_cur_dir()); … … 1358 1370 return 1; 1359 1371 } 1372 mask = umask(S_IRWXO | S_IRWXG); 1360 1373 fd = mkstemp(lname); 1374 umask(mask); 1361 1375 if (fd == -1) { 1362 1376 d_printf("failed to create temporary file for more\n"); … … 1406 1420 { 1407 1421 TALLOC_CTX *ctx = talloc_tos(); 1408 uint16 attribute = FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_HIDDEN;1422 uint16_t attribute = FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_HIDDEN; 1409 1423 char *mget_mask = NULL; 1410 1424 char *buf = NULL; … … 1470 1484 NTSTATUS status; 1471 1485 1472 if (!cli_resolve_path(ctx, "", auth_info, cli, name, &targetcli, &targetname)) { 1473 d_printf("mkdir %s: %s\n", name, cli_errstr(cli)); 1486 status = cli_resolve_path(ctx, "", auth_info, cli, name, &targetcli, 1487 &targetname); 1488 if (!NT_STATUS_IS_OK(status)) { 1489 d_printf("mkdir %s: %s\n", name, nt_errstr(status)); 1474 1490 return false; 1475 1491 } … … 1526 1542 char *mask = NULL; 1527 1543 char *buf = NULL; 1544 NTSTATUS status; 1528 1545 1529 1546 mask = talloc_strdup(ctx, client_get_cur_dir()); … … 1556 1573 } 1557 1574 1558 if (!cli_resolve_path(ctx, "", auth_info, cli, mask, &targetcli, &targetname)) { 1575 status = cli_resolve_path(ctx, "", auth_info, cli, mask, 1576 &targetcli, &targetname); 1577 if (!NT_STATUS_IS_OK(status)) { 1559 1578 return 1; 1560 1579 } … … 1616 1635 static char *attr_str(TALLOC_CTX *mem_ctx, uint16_t mode) 1617 1636 { 1618 char *attrs = TALLOC_ZERO_ARRAY(mem_ctx, char, 17);1637 char *attrs = talloc_zero_array(mem_ctx, char, 17); 1619 1638 int i = 0; 1620 1639 … … 1671 1690 fstring altname; 1672 1691 struct timespec b_time, a_time, m_time, c_time; 1673 SMB_OFF_Tsize;1692 off_t size; 1674 1693 uint16_t mode; 1675 SMB_INO_T ino;1676 1694 NTTIME tmp; 1677 1695 uint16_t fnum; … … 1687 1705 d_printf("%s getting alt name for %s\n", nt_errstr(status), 1688 1706 name); 1689 return false; 1707 /* 1708 * Ignore not supported or not implemented, it does not 1709 * hurt if we can't list alternate names. 1710 */ 1711 if (NT_STATUS_EQUAL(status, NT_STATUS_NOT_SUPPORTED) || 1712 NT_STATUS_EQUAL(status, NT_STATUS_NOT_IMPLEMENTED)) { 1713 altname[0] = '\0'; 1714 } else { 1715 return false; 1716 } 1690 1717 } 1691 1718 d_printf("altname: %s\n", altname); 1692 1719 1693 status = cli_qpathinfo 2(cli, name, &b_time, &a_time, &m_time, &c_time,1694 &size, &mode, &ino);1720 status = cli_qpathinfo3(cli, name, &b_time, &a_time, &m_time, &c_time, 1721 &size, &mode, NULL); 1695 1722 if (!NT_STATUS_IS_OK(status)) { 1696 1723 d_printf("%s getting pathinfo for %s\n", nt_errstr(status), … … 1699 1726 } 1700 1727 1701 unix_timespec_to_nt_time(&tmp,b_time);1728 tmp = unix_timespec_to_nt_time(b_time); 1702 1729 d_printf("create_time: %s\n", nt_time_string(talloc_tos(), tmp)); 1703 1730 1704 unix_timespec_to_nt_time(&tmp,a_time);1731 tmp = unix_timespec_to_nt_time(a_time); 1705 1732 d_printf("access_time: %s\n", nt_time_string(talloc_tos(), tmp)); 1706 1733 1707 unix_timespec_to_nt_time(&tmp,m_time);1734 tmp = unix_timespec_to_nt_time(m_time); 1708 1735 d_printf("write_time: %s\n", nt_time_string(talloc_tos(), tmp)); 1709 1736 1710 unix_timespec_to_nt_time(&tmp,c_time);1737 tmp = unix_timespec_to_nt_time(c_time); 1711 1738 d_printf("change_time: %s\n", nt_time_string(talloc_tos(), tmp)); 1712 1739 … … 1724 1751 d_printf("stream: [%s], %lld bytes\n", streams[i].name, 1725 1752 (unsigned long long)streams[i].size); 1753 } 1754 1755 if (mode & FILE_ATTRIBUTE_REPARSE_POINT) { 1756 char *subst, *print; 1757 uint32_t flags; 1758 1759 status = cli_readlink(cli, name, talloc_tos(), &subst, &print, 1760 &flags); 1761 if (!NT_STATUS_IS_OK(status)) { 1762 d_fprintf(stderr, "cli_readlink returned %s\n", 1763 nt_errstr(status)); 1764 } else { 1765 d_printf("symlink: subst=[%s], print=[%s], flags=%x\n", 1766 subst, print, flags); 1767 TALLOC_FREE(subst); 1768 TALLOC_FREE(print); 1769 } 1726 1770 } 1727 1771 … … 1731 1775 FILE_SHARE_READ|FILE_SHARE_WRITE 1732 1776 |FILE_SHARE_DELETE, 1733 FILE_OPEN, 0x0, 0x0, &fnum );1777 FILE_OPEN, 0x0, 0x0, &fnum, NULL); 1734 1778 if (!NT_STATUS_IS_OK(status)) { 1735 1779 /* … … 1752 1796 snap_name = talloc_asprintf(talloc_tos(), "%s%s", 1753 1797 snapshots[i], name); 1754 status = cli_qpathinfo 2(cli, snap_name, &b_time, &a_time,1798 status = cli_qpathinfo3(cli, snap_name, &b_time, &a_time, 1755 1799 &m_time, &c_time, &size, 1756 1800 NULL, NULL); … … 1761 1805 continue; 1762 1806 } 1763 unix_timespec_to_nt_time(&tmp,b_time);1807 tmp = unix_timespec_to_nt_time(b_time); 1764 1808 d_printf("create_time: %s\n", nt_time_string(talloc_tos(), tmp)); 1765 unix_timespec_to_nt_time(&tmp,a_time);1809 tmp = unix_timespec_to_nt_time(a_time); 1766 1810 d_printf("access_time: %s\n", nt_time_string(talloc_tos(), tmp)); 1767 unix_timespec_to_nt_time(&tmp,m_time);1811 tmp =unix_timespec_to_nt_time(m_time); 1768 1812 d_printf("write_time: %s\n", nt_time_string(talloc_tos(), tmp)); 1769 unix_timespec_to_nt_time(&tmp,c_time);1813 tmp = unix_timespec_to_nt_time(c_time); 1770 1814 d_printf("change_time: %s\n", nt_time_string(talloc_tos(), tmp)); 1771 1815 d_printf("size: %d\n", (int)size); … … 1773 1817 1774 1818 TALLOC_FREE(snapshots); 1819 cli_close(cli, fnum); 1775 1820 1776 1821 return 0; … … 1815 1860 uint16_t fnum; 1816 1861 XFILE *f; 1817 SMB_OFF_Tstart = 0;1862 off_t start = 0; 1818 1863 int rc = 0; 1819 1864 struct timespec tp_start; … … 1823 1868 NTSTATUS status; 1824 1869 1825 if (!cli_resolve_path(ctx, "", auth_info, cli, rname, &targetcli, &targetname)) { 1826 d_printf("Failed to open %s: %s\n", rname, cli_errstr(cli)); 1870 status = cli_resolve_path(ctx, "", auth_info, cli, rname, 1871 &targetcli, &targetname); 1872 if (!NT_STATUS_IS_OK(status)) { 1873 d_printf("Failed to open %s: %s\n", rname, nt_errstr(status)); 1827 1874 return 1; 1828 1875 } … … 2049 2096 const char *expression, bool match) 2050 2097 { 2051 SMB_STRUCT_DIR *dir;2098 DIR *dir; 2052 2099 struct file_list *entry; 2053 2100 struct stat statbuf; … … 2057 2104 const char *dname; 2058 2105 2059 dir = sys_opendir(directory);2106 dir = opendir(directory); 2060 2107 if (!dir) 2061 2108 return -1; … … 2086 2133 if (ret == -1) { 2087 2134 SAFE_FREE(path); 2088 sys_closedir(dir);2135 closedir(dir); 2089 2136 return -1; 2090 2137 } … … 2093 2140 if (!entry) { 2094 2141 d_printf("Out of memory in file_find\n"); 2095 sys_closedir(dir);2142 closedir(dir); 2096 2143 return -1; 2097 2144 } … … 2104 2151 } 2105 2152 2106 sys_closedir(dir);2153 closedir(dir); 2107 2154 return 0; 2108 2155 } … … 2213 2260 return 0; 2214 2261 } else { 2215 d_printf("Error cancelling job %d : %s\n",job,cli_errstr(cli)); 2262 NTSTATUS status = cli_nt_error(cli); 2263 d_printf("Error cancelling job %d : %s\n", 2264 job, nt_errstr(status)); 2216 2265 return 1; 2217 2266 } … … 2265 2314 "%s-%d", 2266 2315 p+1, 2267 (int) sys_getpid());2316 (int)getpid()); 2268 2317 } 2269 2318 if (strequal(lname,"-")) { 2270 2319 rname = talloc_asprintf(ctx, 2271 2320 "stdin-%d", 2272 (int) sys_getpid());2321 (int)getpid()); 2273 2322 } 2274 2323 if (!rname) { … … 2342 2391 char *buf = NULL; 2343 2392 NTSTATUS status = NT_STATUS_OK; 2344 uint16 attribute = FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_HIDDEN;2393 uint16_t attribute = FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_HIDDEN; 2345 2394 2346 2395 if (recurse) { … … 2377 2426 char *mask = NULL; 2378 2427 char *buf = NULL; 2379 uint16 attribute;2428 uint16_t attribute; 2380 2429 struct cli_state *targetcli; 2381 2430 char *targetname = NULL; … … 2387 2436 } 2388 2437 2389 attribute = (uint16 )strtol(buf, (char **)NULL, 16);2438 attribute = (uint16_t)strtol(buf, (char **)NULL, 16); 2390 2439 2391 2440 if (!next_token_talloc(ctx, &cmd_ptr,&buf,NULL)) { … … 2401 2450 } 2402 2451 2403 if (!cli_resolve_path(ctx, "", auth_info, cli, mask, &targetcli, &targetname)) { 2404 d_printf("cmd_wdel %s: %s\n", mask, cli_errstr(cli)); 2452 status = cli_resolve_path(ctx, "", auth_info, cli, mask, &targetcli, 2453 &targetname); 2454 if (!NT_STATUS_IS_OK(status)) { 2455 d_printf("cmd_wdel %s: %s\n", mask, nt_errstr(status)); 2405 2456 return 1; 2406 2457 } … … 2425 2476 struct cli_state *targetcli; 2426 2477 uint16_t fnum = (uint16_t)-1; 2478 NTSTATUS status; 2427 2479 2428 2480 if (!next_token_talloc(ctx, &cmd_ptr,&buf,NULL)) { … … 2438 2490 } 2439 2491 2440 if (!cli_resolve_path(ctx, "", auth_info, cli, mask, &targetcli, &targetname)) { 2441 d_printf("open %s: %s\n", mask, cli_errstr(cli)); 2442 return 1; 2443 } 2444 2445 if (!NT_STATUS_IS_OK(cli_ntcreate(targetcli, targetname, 0, 2492 status = cli_resolve_path(ctx, "", auth_info, cli, mask, &targetcli, 2493 &targetname); 2494 if (!NT_STATUS_IS_OK(status)) { 2495 d_printf("open %s: %s\n", mask, nt_errstr(status)); 2496 return 1; 2497 } 2498 2499 status = cli_ntcreate(targetcli, targetname, 0, 2446 2500 FILE_READ_DATA|FILE_WRITE_DATA, 0, 2447 FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_OPEN, 0x0, 0x0, &fnum))) { 2448 if (NT_STATUS_IS_OK(cli_ntcreate(targetcli, targetname, 0, 2501 FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_OPEN, 2502 0x0, 0x0, &fnum, NULL); 2503 if (!NT_STATUS_IS_OK(status)) { 2504 status = cli_ntcreate(targetcli, targetname, 0, 2449 2505 FILE_READ_DATA, 0, 2450 FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_OPEN, 0x0, 0x0, &fnum))) { 2506 FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_OPEN, 2507 0x0, 0x0, &fnum, NULL); 2508 if (NT_STATUS_IS_OK(status)) { 2451 2509 d_printf("open file %s: for read/write fnum %d\n", targetname, fnum); 2452 2510 } else { 2453 d_printf("Failed to open file %s. %s\n", targetname, cli_errstr(cli)); 2511 d_printf("Failed to open file %s. %s\n", 2512 targetname, nt_errstr(status)); 2454 2513 } 2455 2514 } else { … … 2514 2573 mode_t mode; 2515 2574 uint16_t fnum; 2575 NTSTATUS status; 2516 2576 2517 2577 if (!next_token_talloc(ctx, &cmd_ptr,&buf,NULL)) { … … 2533 2593 mode = (mode_t)strtol(buf, (char **)NULL, 8); 2534 2594 2535 if (!cli_resolve_path(ctx, "", auth_info, cli, mask, &targetcli, &targetname)) { 2536 d_printf("posix_open %s: %s\n", mask, cli_errstr(cli)); 2537 return 1; 2538 } 2539 2540 if (!NT_STATUS_IS_OK(cli_posix_open(targetcli, targetname, O_CREAT|O_RDWR, mode, &fnum))) { 2541 if (NT_STATUS_IS_OK(cli_posix_open(targetcli, targetname, O_CREAT|O_RDONLY, mode, &fnum))) { 2542 d_printf("posix_open file %s: for readonly fnum %d\n", targetname, fnum); 2595 status = cli_resolve_path(ctx, "", auth_info, cli, mask, &targetcli, 2596 &targetname); 2597 if (!NT_STATUS_IS_OK(status)) { 2598 d_printf("posix_open %s: %s\n", mask, nt_errstr(status)); 2599 return 1; 2600 } 2601 2602 status = cli_posix_open(targetcli, targetname, O_CREAT|O_RDWR, mode, 2603 &fnum); 2604 if (!NT_STATUS_IS_OK(status)) { 2605 status = cli_posix_open(targetcli, targetname, 2606 O_CREAT|O_RDONLY, mode, &fnum); 2607 if (!NT_STATUS_IS_OK(status)) { 2608 d_printf("Failed to open file %s. %s\n", targetname, 2609 nt_errstr(status)); 2543 2610 } else { 2544 d_printf("Failed to open file %s. %s\n", targetname, cli_errstr(cli)); 2611 d_printf("posix_open file %s: for readonly fnum %d\n", 2612 targetname, fnum); 2545 2613 } 2546 2614 } else { 2547 d_printf("posix_open file %s: for read/write fnum %d\n", targetname, fnum); 2615 d_printf("posix_open file %s: for read/write fnum %d\n", 2616 targetname, fnum); 2548 2617 } 2549 2618 … … 2559 2628 struct cli_state *targetcli; 2560 2629 mode_t mode; 2630 NTSTATUS status; 2561 2631 2562 2632 if (!next_token_talloc(ctx, &cmd_ptr,&buf,NULL)) { … … 2578 2648 mode = (mode_t)strtol(buf, (char **)NULL, 8); 2579 2649 2580 if (!cli_resolve_path(ctx, "", auth_info, cli, mask, &targetcli, &targetname)) { 2581 d_printf("posix_mkdir %s: %s\n", mask, cli_errstr(cli)); 2582 return 1; 2583 } 2584 2585 if (!NT_STATUS_IS_OK(cli_posix_mkdir(targetcli, targetname, mode))) { 2586 d_printf("Failed to open file %s. %s\n", targetname, cli_errstr(cli)); 2650 status = cli_resolve_path(ctx, "", auth_info, cli, mask, &targetcli, 2651 &targetname); 2652 if (!NT_STATUS_IS_OK(status)) { 2653 d_printf("posix_mkdir %s: %s\n", mask, nt_errstr(status)); 2654 return 1; 2655 } 2656 2657 status = cli_posix_mkdir(targetcli, targetname, mode); 2658 if (!NT_STATUS_IS_OK(status)) { 2659 d_printf("Failed to open file %s. %s\n", 2660 targetname, nt_errstr(status)); 2587 2661 } else { 2588 2662 d_printf("posix_mkdir created directory %s\n", targetname); … … 2598 2672 char *targetname = NULL; 2599 2673 struct cli_state *targetcli; 2674 NTSTATUS status; 2600 2675 2601 2676 if (!next_token_talloc(ctx, &cmd_ptr,&buf,NULL)) { … … 2611 2686 } 2612 2687 2613 if (!cli_resolve_path(ctx, "", auth_info, cli, mask, &targetcli, &targetname)) { 2614 d_printf("posix_unlink %s: %s\n", mask, cli_errstr(cli)); 2615 return 1; 2616 } 2617 2618 if (!NT_STATUS_IS_OK(cli_posix_unlink(targetcli, targetname))) { 2619 d_printf("Failed to unlink file %s. %s\n", targetname, cli_errstr(cli)); 2688 status = cli_resolve_path(ctx, "", auth_info, cli, mask, &targetcli, 2689 &targetname); 2690 if (!NT_STATUS_IS_OK(status)) { 2691 d_printf("posix_unlink %s: %s\n", mask, nt_errstr(status)); 2692 return 1; 2693 } 2694 2695 status = cli_posix_unlink(targetcli, targetname); 2696 if (!NT_STATUS_IS_OK(status)) { 2697 d_printf("Failed to unlink file %s. %s\n", 2698 targetname, nt_errstr(status)); 2620 2699 } else { 2621 2700 d_printf("posix_unlink deleted file %s\n", targetname); … … 2632 2711 char *targetname = NULL; 2633 2712 struct cli_state *targetcli; 2713 NTSTATUS status; 2634 2714 2635 2715 if (!next_token_talloc(ctx, &cmd_ptr,&buf,NULL)) { … … 2645 2725 } 2646 2726 2647 if (!cli_resolve_path(ctx, "", auth_info, cli, mask, &targetcli, &targetname)) { 2648 d_printf("posix_rmdir %s: %s\n", mask, cli_errstr(cli)); 2649 return 1; 2650 } 2651 2652 if (!NT_STATUS_IS_OK(cli_posix_rmdir(targetcli, targetname))) { 2653 d_printf("Failed to unlink directory %s. %s\n", targetname, cli_errstr(cli)); 2727 status = cli_resolve_path(ctx, "", auth_info, cli, mask, &targetcli, 2728 &targetname); 2729 if (!NT_STATUS_IS_OK(status)) { 2730 d_printf("posix_rmdir %s: %s\n", mask, nt_errstr(status)); 2731 return 1; 2732 } 2733 2734 status = cli_posix_rmdir(targetcli, targetname); 2735 if (!NT_STATUS_IS_OK(status)) { 2736 d_printf("Failed to unlink directory %s. %s\n", 2737 targetname, nt_errstr(status)); 2654 2738 } else { 2655 2739 d_printf("posix_rmdir deleted directory %s\n", targetname); … … 2664 2748 char *buf = NULL; 2665 2749 int fnum; 2750 NTSTATUS status; 2666 2751 2667 2752 if (!next_token_talloc(ctx, &cmd_ptr,&buf,NULL)) { … … 2672 2757 fnum = atoi(buf); 2673 2758 /* We really should use the targetcli here.... */ 2674 if (!NT_STATUS_IS_OK(cli_close(cli, fnum))) { 2675 d_printf("close %d: %s\n", fnum, cli_errstr(cli)); 2759 status = cli_close(cli, fnum); 2760 if (!NT_STATUS_IS_OK(status)) { 2761 d_printf("close %d: %s\n", fnum, nt_errstr(status)); 2676 2762 return 1; 2677 2763 } … … 2682 2768 { 2683 2769 TALLOC_CTX *ctx = talloc_tos(); 2684 uint16 major, minor;2685 uint32 caplow, caphigh;2770 uint16_t major, minor; 2771 uint32_t caplow, caphigh; 2686 2772 char *caps; 2687 2773 NTSTATUS status; … … 2791 2877 enum brl_type lock_type; 2792 2878 int fnum; 2879 NTSTATUS status; 2793 2880 2794 2881 if (!next_token_talloc(ctx, &cmd_ptr,&buf,NULL)) { … … 2826 2913 len = (uint64_t)strtol(buf, (char **)NULL, 16); 2827 2914 2828 if (!NT_STATUS_IS_OK(cli_posix_lock(cli, fnum, start, len, true, lock_type))) { 2829 d_printf("lock failed %d: %s\n", fnum, cli_errstr(cli)); 2915 status = cli_posix_lock(cli, fnum, start, len, true, lock_type); 2916 if (!NT_STATUS_IS_OK(status)) { 2917 d_printf("lock failed %d: %s\n", fnum, nt_errstr(status)); 2830 2918 } 2831 2919 … … 2839 2927 uint64_t start, len; 2840 2928 int fnum; 2929 NTSTATUS status; 2841 2930 2842 2931 if (!next_token_talloc(ctx, &cmd_ptr,&buf,NULL)) { … … 2860 2949 len = (uint64_t)strtol(buf, (char **)NULL, 16); 2861 2950 2862 if (!NT_STATUS_IS_OK(cli_posix_unlock(cli, fnum, start, len))) { 2863 d_printf("unlock failed %d: %s\n", fnum, cli_errstr(cli)); 2951 status = cli_posix_unlock(cli, fnum, start, len); 2952 if (!NT_STATUS_IS_OK(status)) { 2953 d_printf("unlock failed %d: %s\n", fnum, nt_errstr(status)); 2864 2954 } 2865 2955 … … 2879 2969 char *targetname = NULL; 2880 2970 struct cli_state *targetcli; 2971 NTSTATUS status; 2881 2972 2882 2973 if (!next_token_talloc(ctx, &cmd_ptr,&buf,NULL)) { … … 2892 2983 } 2893 2984 2894 if (!cli_resolve_path(ctx, "", auth_info, cli, mask, &targetcli, &targetname)) { 2895 d_printf("rmdir %s: %s\n", mask, cli_errstr(cli)); 2896 return 1; 2897 } 2898 2899 if (!NT_STATUS_IS_OK(cli_rmdir(targetcli, targetname))) { 2985 status = cli_resolve_path(ctx, "", auth_info, cli, mask, &targetcli, 2986 &targetname); 2987 if (!NT_STATUS_IS_OK(status)) { 2988 d_printf("rmdir %s: %s\n", mask, nt_errstr(status)); 2989 return 1; 2990 } 2991 2992 status = cli_rmdir(targetcli, targetname); 2993 if (!NT_STATUS_IS_OK(status)) { 2900 2994 d_printf("%s removing remote directory file %s\n", 2901 cli_errstr(targetcli),mask);2995 nt_errstr(status), mask); 2902 2996 } 2903 2997 … … 2918 3012 char *targetname = NULL; 2919 3013 struct cli_state *targetcli; 3014 NTSTATUS status; 2920 3015 2921 3016 if (!next_token_talloc(ctx, &cmd_ptr,&buf,NULL) || … … 2939 3034 } 2940 3035 2941 if (!cli_resolve_path(ctx, "", auth_info, cli, oldname, &targetcli, &targetname)) { 2942 d_printf("link %s: %s\n", oldname, cli_errstr(cli)); 3036 status = cli_resolve_path(ctx, "", auth_info, cli, oldname, &targetcli, 3037 &targetname); 3038 if (!NT_STATUS_IS_OK(status)) { 3039 d_printf("link %s: %s\n", oldname, nt_errstr(status)); 2943 3040 return 1; 2944 3041 } … … 2949 3046 } 2950 3047 2951 if (!NT_STATUS_IS_OK(cli_posix_hardlink(targetcli, targetname, newname))) { 2952 d_printf("%s linking files (%s -> %s)\n", cli_errstr(targetcli), newname, oldname); 3048 status = cli_posix_hardlink(targetcli, targetname, newname); 3049 if (!NT_STATUS_IS_OK(status)) { 3050 d_printf("%s linking files (%s -> %s)\n", 3051 nt_errstr(status), newname, oldname); 2953 3052 return 1; 2954 3053 } … … 2968 3067 char linkname[PATH_MAX+1]; 2969 3068 struct cli_state *targetcli; 3069 NTSTATUS status; 2970 3070 2971 3071 if (!next_token_talloc(ctx, &cmd_ptr,&buf,NULL)) { … … 2981 3081 } 2982 3082 2983 if (!cli_resolve_path(ctx, "", auth_info, cli, name, &targetcli, &targetname)) { 2984 d_printf("readlink %s: %s\n", name, cli_errstr(cli)); 3083 status = cli_resolve_path(ctx, "", auth_info, cli, name, &targetcli, 3084 &targetname); 3085 if (!NT_STATUS_IS_OK(status)) { 3086 d_printf("readlink %s: %s\n", name, nt_errstr(status)); 2985 3087 return 1; 2986 3088 } … … 2991 3093 } 2992 3094 2993 if (!NT_STATUS_IS_OK(cli_posix_readlink(targetcli, name,2994 linkname, PATH_MAX+1))) {3095 status = cli_posix_readlink(targetcli, name, linkname, PATH_MAX+1); 3096 if (!NT_STATUS_IS_OK(status)) { 2995 3097 d_printf("%s readlink on file %s\n", 2996 cli_errstr(targetcli), name);3098 nt_errstr(status), name); 2997 3099 return 1; 2998 3100 } … … 3016 3118 char *buf2 = NULL; 3017 3119 struct cli_state *newcli; 3120 NTSTATUS status; 3018 3121 3019 3122 if (!next_token_talloc(ctx, &cmd_ptr,&buf,NULL) || … … 3025 3128 oldname = buf; 3026 3129 3027 newname = talloc_asprintf(ctx, 3028 "%s%s", 3029 client_get_cur_dir(), 3030 buf2); 3031 if (!newname) { 3032 return 1; 3033 } 3034 3035 /* New name must be present in share namespace. */ 3036 if (!cli_resolve_path(ctx, "", auth_info, cli, newname, &newcli, &newname)) { 3037 d_printf("link %s: %s\n", oldname, cli_errstr(cli)); 3038 return 1; 3039 } 3040 3041 if (!SERVER_HAS_UNIX_CIFS(newcli)) { 3042 d_printf("Server doesn't support UNIX CIFS calls.\n"); 3043 return 1; 3044 } 3045 3046 if (!NT_STATUS_IS_OK(cli_posix_symlink(newcli, oldname, newname))) { 3130 if (SERVER_HAS_UNIX_CIFS(cli)) { 3131 newname = talloc_asprintf(ctx, "%s%s", client_get_cur_dir(), 3132 buf2); 3133 if (!newname) { 3134 return 1; 3135 } 3136 /* New name must be present in share namespace. */ 3137 status = cli_resolve_path(ctx, "", auth_info, cli, newname, 3138 &newcli, &newname); 3139 if (!NT_STATUS_IS_OK(status)) { 3140 d_printf("link %s: %s\n", oldname, nt_errstr(status)); 3141 return 1; 3142 } 3143 status = cli_posix_symlink(newcli, oldname, newname); 3144 } else { 3145 status = cli_symlink( 3146 cli, oldname, buf2, 3147 buf2[0] == '\\' ? 0 : SYMLINK_FLAG_RELATIVE); 3148 } 3149 3150 if (!NT_STATUS_IS_OK(status)) { 3047 3151 d_printf("%s symlinking files (%s -> %s)\n", 3048 cli_errstr(newcli), newname, newname);3152 nt_errstr(status), oldname, newname); 3049 3153 return 1; 3050 3154 } … … 3066 3170 struct cli_state *targetcli; 3067 3171 mode_t mode; 3172 NTSTATUS status; 3068 3173 3069 3174 if (!next_token_talloc(ctx, &cmd_ptr,&buf,NULL) || … … 3082 3187 mode = (mode_t)strtol(buf, NULL, 8); 3083 3188 3084 if (!cli_resolve_path(ctx, "", auth_info, cli, src, &targetcli, &targetname)) { 3085 d_printf("chmod %s: %s\n", src, cli_errstr(cli)); 3189 status = cli_resolve_path(ctx, "", auth_info, cli, src, &targetcli, 3190 &targetname); 3191 if (!NT_STATUS_IS_OK(status)) { 3192 d_printf("chmod %s: %s\n", src, nt_errstr(status)); 3086 3193 return 1; 3087 3194 } … … 3092 3199 } 3093 3200 3094 if (!NT_STATUS_IS_OK(cli_posix_chmod(targetcli, targetname, mode))) { 3201 status = cli_posix_chmod(targetcli, targetname, mode); 3202 if (!NT_STATUS_IS_OK(status)) { 3095 3203 d_printf("%s chmod file %s 0%o\n", 3096 cli_errstr(targetcli), src, (unsigned int)mode);3204 nt_errstr(status), src, (unsigned int)mode); 3097 3205 return 1; 3098 3206 } … … 3214 3322 char *targetname = NULL; 3215 3323 struct cli_state *targetcli; 3216 uint16 major, minor;3217 uint32 caplow, caphigh;3324 uint16_t major, minor; 3325 uint32_t caplow, caphigh; 3218 3326 char *retbuf = NULL; 3219 3327 size_t rb_size = 0; 3220 3328 SMB_STRUCT_STAT sbuf; 3221 uint16 num_file_acls = 0;3222 uint16 num_dir_acls = 0;3223 uint16 i;3329 uint16_t num_file_acls = 0; 3330 uint16_t num_dir_acls = 0; 3331 uint16_t i; 3224 3332 NTSTATUS status; 3225 3333 … … 3236 3344 } 3237 3345 3238 if (!cli_resolve_path(ctx, "", auth_info, cli, src, &targetcli, &targetname)) { 3239 d_printf("stat %s: %s\n", src, cli_errstr(cli)); 3346 status = cli_resolve_path(ctx, "", auth_info, cli, src, &targetcli, 3347 &targetname); 3348 if (!NT_STATUS_IS_OK(status)) { 3349 d_printf("stat %s: %s\n", src, nt_errstr(status)); 3240 3350 return 1; 3241 3351 } … … 3260 3370 } 3261 3371 3372 status = cli_posix_stat(targetcli, targetname, &sbuf); 3262 3373 if (!NT_STATUS_IS_OK(cli_posix_stat(targetcli, targetname, &sbuf))) { 3263 3374 d_printf("%s getfacl doing a stat on file %s\n", 3264 cli_errstr(targetcli), src); 3265 return 1; 3266 } 3267 3268 if (!NT_STATUS_IS_OK(cli_posix_getfacl(targetcli, targetname, ctx, &rb_size, &retbuf))) { 3375 nt_errstr(status), src); 3376 return 1; 3377 } 3378 3379 status = cli_posix_getacl(targetcli, targetname, ctx, &rb_size, &retbuf); 3380 if (!NT_STATUS_IS_OK(status)) { 3269 3381 d_printf("%s getfacl file %s\n", 3270 cli_errstr(targetcli), src);3382 nt_errstr(status), src); 3271 3383 return 1; 3272 3384 } … … 3297 3409 3298 3410 for (i = 0; i < num_file_acls; i++) { 3299 uint32 uorg;3411 uint32_t uorg; 3300 3412 fstring permstring; 3301 3413 unsigned char tagtype = CVAL(retbuf, SMB_POSIX_ACL_HEADER_SIZE+(i*SMB_POSIX_ACL_ENTRY_SIZE)); … … 3334 3446 3335 3447 for (i = 0; i < num_dir_acls; i++) { 3336 uint32 uorg;3448 uint32_t uorg; 3337 3449 fstring permstring; 3338 3450 unsigned char tagtype = CVAL(retbuf, SMB_POSIX_ACL_HEADER_SIZE+((i+num_file_acls)*SMB_POSIX_ACL_ENTRY_SIZE)); … … 3373 3485 } 3374 3486 3375 static void printf_cb(const char *buf, void *private_data)3376 {3377 printf("%s", buf);3378 }3379 3380 3487 /**************************************************************************** 3381 3488 Get the EA list of a file … … 3405 3512 } 3406 3513 3407 if (!cli_resolve_path(ctx, "", auth_info, cli, src, &targetcli, 3408 &targetname)) { 3409 d_printf("stat %s: %s\n", src, cli_errstr(cli)); 3514 status = cli_resolve_path(ctx, "", auth_info, cli, src, &targetcli, 3515 &targetname); 3516 if (!NT_STATUS_IS_OK(status)) { 3517 d_printf("stat %s: %s\n", src, nt_errstr(status)); 3410 3518 return 1; 3411 3519 } … … 3420 3528 for (i=0; i<num_eas; i++) { 3421 3529 d_printf("%s (%d) =\n", eas[i].name, (int)eas[i].flags); 3422 dump_data_ cb(eas[i].value.data, eas[i].value.length, false,3423 printf_cb, NULL);3530 dump_data_file(eas[i].value.data, eas[i].value.length, false, 3531 stdout); 3424 3532 d_printf("\n"); 3425 3533 } … … 3461 3569 } 3462 3570 3463 if (!cli_resolve_path(ctx, "", auth_info, cli, src, &targetcli, 3464 &targetname)) { 3465 d_printf("stat %s: %s\n", src, cli_errstr(cli)); 3571 status = cli_resolve_path(ctx, "", auth_info, cli, src, &targetcli, 3572 &targetname); 3573 if (!NT_STATUS_IS_OK(status)) { 3574 d_printf("stat %s: %s\n", src, nt_errstr(status)); 3466 3575 return 1; 3467 3576 } … … 3492 3601 struct tm *lt; 3493 3602 time_t tmp_time; 3603 NTSTATUS status; 3494 3604 3495 3605 if (!next_token_talloc(ctx, &cmd_ptr,&name,NULL)) { … … 3505 3615 } 3506 3616 3507 if (!cli_resolve_path(ctx, "", auth_info, cli, src, &targetcli, &targetname)) { 3508 d_printf("stat %s: %s\n", src, cli_errstr(cli)); 3617 status = cli_resolve_path(ctx, "", auth_info, cli, src, &targetcli, 3618 &targetname); 3619 if (!NT_STATUS_IS_OK(status)) { 3620 d_printf("stat %s: %s\n", src, nt_errstr(status)); 3509 3621 return 1; 3510 3622 } … … 3515 3627 } 3516 3628 3517 if (!NT_STATUS_IS_OK(cli_posix_stat(targetcli, targetname, &sbuf))) { 3629 status = cli_posix_stat(targetcli, targetname, &sbuf); 3630 if (!NT_STATUS_IS_OK(status)) { 3518 3631 d_printf("%s stat file %s\n", 3519 cli_errstr(targetcli), src);3632 nt_errstr(status), src); 3520 3633 return 1; 3521 3634 } … … 3591 3704 struct cli_state *targetcli; 3592 3705 char *targetname = NULL; 3706 NTSTATUS status; 3593 3707 3594 3708 if (!next_token_talloc(ctx, &cmd_ptr,&buf,NULL) || … … 3609 3723 return 1; 3610 3724 } 3611 if (!cli_resolve_path(ctx, "", auth_info, cli, src, &targetcli, &targetname) ) { 3612 d_printf("chown %s: %s\n", src, cli_errstr(cli)); 3725 status = cli_resolve_path(ctx, "", auth_info, cli, src, &targetcli, 3726 &targetname); 3727 if (!NT_STATUS_IS_OK(status)) { 3728 d_printf("chown %s: %s\n", src, nt_errstr(status)); 3613 3729 return 1; 3614 3730 } … … 3619 3735 } 3620 3736 3621 if (!NT_STATUS_IS_OK(cli_posix_chown(targetcli, targetname, uid, gid))) { 3737 status = cli_posix_chown(targetcli, targetname, uid, gid); 3738 if (!NT_STATUS_IS_OK(status)) { 3622 3739 d_printf("%s chown file %s uid=%d, gid=%d\n", 3623 cli_errstr(targetcli), src, (int)uid, (int)gid);3740 nt_errstr(status), src, (int)uid, (int)gid); 3624 3741 return 1; 3625 3742 } … … 3640 3757 char *targetsrc; 3641 3758 char *targetdest; 3759 NTSTATUS status; 3642 3760 3643 3761 if (!next_token_talloc(ctx, &cmd_ptr,&buf,NULL) || … … 3663 3781 } 3664 3782 3665 if (!cli_resolve_path(ctx, "", auth_info, cli, src, &targetcli, &targetsrc)) { 3666 d_printf("rename %s: %s\n", src, cli_errstr(cli)); 3667 return 1; 3668 } 3669 3670 if (!cli_resolve_path(ctx, "", auth_info, cli, dest, &targetcli, &targetdest)) { 3671 d_printf("rename %s: %s\n", dest, cli_errstr(cli)); 3672 return 1; 3673 } 3674 3675 if (!NT_STATUS_IS_OK(cli_rename(targetcli, targetsrc, targetdest))) { 3783 status = cli_resolve_path(ctx, "", auth_info, cli, src, &targetcli, 3784 &targetsrc); 3785 if (!NT_STATUS_IS_OK(status)) { 3786 d_printf("rename %s: %s\n", src, nt_errstr(status)); 3787 return 1; 3788 } 3789 3790 status = cli_resolve_path(ctx, "", auth_info, cli, dest, &targetcli, 3791 &targetdest); 3792 if (!NT_STATUS_IS_OK(status)) { 3793 d_printf("rename %s: %s\n", dest, nt_errstr(status)); 3794 return 1; 3795 } 3796 3797 status = cli_rename(targetcli, targetsrc, targetdest); 3798 if (!NT_STATUS_IS_OK(status)) { 3676 3799 d_printf("%s renaming files %s -> %s \n", 3677 cli_errstr(targetcli),3800 nt_errstr(status), 3678 3801 targetsrc, 3679 3802 targetdest); … … 3684 3807 } 3685 3808 3686 /**************************************************************************** 3687 Print the volume name. 3688 ****************************************************************************/ 3689 3690 static int cmd_volume(void) 3691 { 3692 fstring volname; 3693 uint32 serial_num; 3694 time_t create_date; 3695 NTSTATUS status; 3696 3697 status = cli_get_fs_volume_info(cli, volname, &serial_num, 3698 &create_date); 3699 if (!NT_STATUS_IS_OK(status)) { 3700 d_printf("Error %s getting volume info\n", nt_errstr(status)); 3701 return 1; 3702 } 3703 3704 d_printf("Volume: |%s| serial number 0x%x\n", 3705 volname, (unsigned int)serial_num); 3706 return 0; 3707 } 3708 3709 /**************************************************************************** 3710 Hard link files using the NT call. 3711 ****************************************************************************/ 3712 3713 static int cmd_hardlink(void) 3809 struct scopy_timing { 3810 struct timespec tp_start; 3811 }; 3812 3813 static int scopy_status(off_t written, void *priv) 3814 { 3815 struct timespec tp_end; 3816 unsigned int scopy_total_time_ms; 3817 struct scopy_timing *st = priv; 3818 3819 clock_gettime_mono(&tp_end); 3820 scopy_total_time_ms = nsec_time_diff(&tp_end,&st->tp_start)/1000000; 3821 3822 DEBUG(5,("Copied %jd bytes at an average %3.1f kb/s\n", 3823 (intmax_t)written, written / (1.024*scopy_total_time_ms))); 3824 3825 return true; 3826 } 3827 3828 /**************************************************************************** 3829 Server-Side copy some file. 3830 ****************************************************************************/ 3831 3832 static int cmd_scopy(void) 3714 3833 { 3715 3834 TALLOC_CTX *ctx = talloc_tos(); … … 3717 3836 char *buf, *buf2; 3718 3837 struct cli_state *targetcli; 3719 char *targetname; 3838 char *targetsrc; 3839 char *targetdest; 3840 uint32_t DesiredAccess, ShareAccess, CreateDisposition, CreateOptions; 3841 struct smb_create_returns cr; 3842 uint16_t destfnum = (uint16_t)-1; 3843 uint16_t srcfnum = (uint16_t)-1; 3844 off_t written = 0; 3845 struct scopy_timing st; 3846 int rc = 0; 3847 NTSTATUS status; 3720 3848 3721 3849 if (!next_token_talloc(ctx, &cmd_ptr,&buf,NULL) || 3722 3723 d_printf(" hardlink<src> <dest>\n");3850 !next_token_talloc(ctx, &cmd_ptr,&buf2,NULL)) { 3851 d_printf("scopy <src> <dest>\n"); 3724 3852 return 1; 3725 3853 } … … 3741 3869 } 3742 3870 3743 if (!cli_resolve_path(ctx, "", auth_info, cli, src, &targetcli, &targetname)) { 3744 d_printf("hardlink %s: %s\n", src, cli_errstr(cli)); 3745 return 1; 3746 } 3747 3748 if (!NT_STATUS_IS_OK(cli_nt_hardlink(targetcli, targetname, dest))) { 3749 d_printf("%s doing an NT hard link of files\n",cli_errstr(targetcli)); 3871 status = cli_resolve_path(ctx, "", auth_info, cli, src, &targetcli, 3872 &targetsrc); 3873 if (!NT_STATUS_IS_OK(status)) { 3874 d_printf("scopy %s: %s\n", src, nt_errstr(status)); 3875 return 1; 3876 } 3877 3878 status = cli_resolve_path(ctx, "", auth_info, cli, dest, &targetcli, 3879 &targetdest); 3880 if (!NT_STATUS_IS_OK(status)) { 3881 d_printf("scopy %s: %s\n", dest, nt_errstr(status)); 3882 return 1; 3883 } 3884 3885 3886 DesiredAccess = (FILE_READ_DATA|FILE_READ_EA|FILE_READ_ATTRIBUTES| 3887 READ_CONTROL_ACCESS|SYNCHRONIZE_ACCESS); 3888 ShareAccess = FILE_SHARE_READ|FILE_SHARE_DELETE; 3889 CreateDisposition = FILE_OPEN; 3890 CreateOptions = (FILE_SEQUENTIAL_ONLY|FILE_NON_DIRECTORY_FILE| 3891 FILE_OPEN_REPARSE_POINT); 3892 status = cli_ntcreate(targetcli, targetsrc, 0, DesiredAccess, 0, 3893 ShareAccess, CreateDisposition, CreateOptions, 0x0, 3894 &srcfnum, &cr); 3895 if (!NT_STATUS_IS_OK(status)) { 3896 d_printf("Failed to open file %s. %s\n", 3897 targetsrc, nt_errstr(status)); 3898 return 1; 3899 } 3900 3901 DesiredAccess = (FILE_READ_DATA|FILE_WRITE_DATA|FILE_APPEND_DATA|FILE_READ_EA| 3902 FILE_WRITE_EA|FILE_READ_ATTRIBUTES|FILE_WRITE_ATTRIBUTES| 3903 DELETE_ACCESS|READ_CONTROL_ACCESS|WRITE_DAC_ACCESS|SYNCHRONIZE_ACCESS); 3904 ShareAccess = FILE_SHARE_NONE; 3905 CreateDisposition = FILE_CREATE; 3906 CreateOptions = FILE_SEQUENTIAL_ONLY|FILE_NON_DIRECTORY_FILE; 3907 status = cli_ntcreate(targetcli, targetdest, 0, DesiredAccess, 3908 FILE_ATTRIBUTE_ARCHIVE, ShareAccess, CreateDisposition, 3909 CreateOptions, 0x0, &destfnum, NULL); 3910 if (!NT_STATUS_IS_OK(status)) { 3911 d_printf("Failed to create file %s. %s\n", 3912 targetdest, nt_errstr(status)); 3913 cli_close(targetcli, srcfnum); 3914 return 1; 3915 } 3916 3917 clock_gettime_mono(&st.tp_start); 3918 status = cli_splice(targetcli, targetcli, srcfnum, destfnum, 3919 cr.end_of_file, 0, 0, &written, scopy_status, &st); 3920 if (!NT_STATUS_IS_OK(status)) { 3921 d_printf("%s copying file %s -> %s \n", 3922 nt_errstr(status), 3923 targetsrc, 3924 targetdest); 3925 rc = 1; 3926 } 3927 3928 status = cli_close(targetcli, srcfnum); 3929 if (!NT_STATUS_IS_OK(status)) { 3930 d_printf("Error %s closing remote source file\n", nt_errstr(status)); 3931 rc = 1; 3932 } 3933 status = cli_close(targetcli, destfnum); 3934 if (!NT_STATUS_IS_OK(status)) { 3935 d_printf("Error %s closing remote dest file\n", nt_errstr(status)); 3936 rc = 1; 3937 } 3938 3939 return rc; 3940 } 3941 3942 /**************************************************************************** 3943 Print the volume name. 3944 ****************************************************************************/ 3945 3946 static int cmd_volume(void) 3947 { 3948 char *volname; 3949 uint32_t serial_num; 3950 time_t create_date; 3951 NTSTATUS status; 3952 3953 status = cli_get_fs_volume_info(cli, talloc_tos(), 3954 &volname, &serial_num, 3955 &create_date); 3956 if (!NT_STATUS_IS_OK(status)) { 3957 d_printf("Error %s getting volume info\n", nt_errstr(status)); 3958 return 1; 3959 } 3960 3961 d_printf("Volume: |%s| serial number 0x%x\n", 3962 volname, (unsigned int)serial_num); 3963 return 0; 3964 } 3965 3966 /**************************************************************************** 3967 Hard link files using the NT call. 3968 ****************************************************************************/ 3969 3970 static int cmd_hardlink(void) 3971 { 3972 TALLOC_CTX *ctx = talloc_tos(); 3973 char *src, *dest; 3974 char *buf, *buf2; 3975 struct cli_state *targetcli; 3976 char *targetname; 3977 NTSTATUS status; 3978 3979 if (!next_token_talloc(ctx, &cmd_ptr,&buf,NULL) || 3980 !next_token_talloc(ctx, &cmd_ptr,&buf2,NULL)) { 3981 d_printf("hardlink <src> <dest>\n"); 3982 return 1; 3983 } 3984 3985 src = talloc_asprintf(ctx, 3986 "%s%s", 3987 client_get_cur_dir(), 3988 buf); 3989 if (!src) { 3990 return 1; 3991 } 3992 3993 dest = talloc_asprintf(ctx, 3994 "%s%s", 3995 client_get_cur_dir(), 3996 buf2); 3997 if (!dest) { 3998 return 1; 3999 } 4000 4001 status = cli_resolve_path(ctx, "", auth_info, cli, src, &targetcli, 4002 &targetname); 4003 if (!NT_STATUS_IS_OK(status)) { 4004 d_printf("hardlink %s: %s\n", src, nt_errstr(status)); 4005 return 1; 4006 } 4007 4008 status = cli_nt_hardlink(targetcli, targetname, dest); 4009 if (!NT_STATUS_IS_OK(status)) { 4010 d_printf("%s doing an NT hard link of files\n", 4011 nt_errstr(status)); 3750 4012 return 1; 3751 4013 } … … 3794 4056 3795 4057 /**************************************************************************** 4058 Watch directory changes 4059 ****************************************************************************/ 4060 4061 static int cmd_notify(void) 4062 { 4063 TALLOC_CTX *frame = talloc_stackframe(); 4064 char *name, *buf; 4065 NTSTATUS status; 4066 uint16_t fnum; 4067 4068 name = talloc_strdup(talloc_tos(), client_get_cur_dir()); 4069 if (name == NULL) { 4070 goto fail; 4071 } 4072 if (!next_token_talloc(talloc_tos(), &cmd_ptr, &buf, NULL)) { 4073 goto usage; 4074 } 4075 name = talloc_asprintf_append(name, "%s", buf); 4076 if (name == NULL) { 4077 goto fail; 4078 } 4079 status = cli_ntcreate( 4080 cli, name, 0, FILE_READ_DATA, 0, 4081 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, 4082 FILE_OPEN, 0, 0, &fnum, NULL); 4083 if (!NT_STATUS_IS_OK(status)) { 4084 d_printf("Could not open file: %s\n", nt_errstr(status)); 4085 goto fail; 4086 } 4087 4088 while (1) { 4089 uint32_t i, num_changes; 4090 struct notify_change *changes; 4091 4092 status = cli_notify(cli, fnum, 1000, FILE_NOTIFY_CHANGE_ALL, 4093 true, 4094 talloc_tos(), &num_changes, &changes); 4095 if (!NT_STATUS_IS_OK(status)) { 4096 d_printf("notify returned %s\n", 4097 nt_errstr(status)); 4098 goto fail; 4099 } 4100 for (i=0; i<num_changes; i++) { 4101 printf("%4.4x %s\n", changes[i].action, 4102 changes[i].name); 4103 } 4104 TALLOC_FREE(changes); 4105 } 4106 usage: 4107 d_printf("notify <file>\n"); 4108 fail: 4109 TALLOC_FREE(frame); 4110 return 1; 4111 } 4112 4113 /**************************************************************************** 3796 4114 Set the archive level. 3797 4115 ****************************************************************************/ … … 3812 4130 3813 4131 /**************************************************************************** 4132 Toggle the backup_intent state. 4133 ****************************************************************************/ 4134 4135 static int cmd_backup(void) 4136 { 4137 backup_intent = !backup_intent; 4138 cli_set_backup_intent(cli, backup_intent); 4139 DEBUG(2,("backup intent is now %s\n",backup_intent?"on":"off")); 4140 return 1; 4141 } 4142 4143 /**************************************************************************** 3814 4144 Toggle the lowercaseflag. 3815 4145 ****************************************************************************/ … … 3887 4217 } 3888 4218 } 3889 d = TALLOC_ARRAY(ctx, char, PATH_MAX+1);4219 d = sys_getwd(); 3890 4220 if (!d) { 3891 4221 return 1; 3892 4222 } 3893 DEBUG(2,("the local directory is now %s\n",sys_getwd(d))); 4223 DEBUG(2,("the local directory is now %s\n",d)); 4224 SAFE_FREE(d); 3894 4225 return 0; 3895 4226 } … … 3984 4315 ****************************************************************************/ 3985 4316 3986 static void browse_fn(const char *name, uint32 m,4317 static void browse_fn(const char *name, uint32_t m, 3987 4318 const char *comment, void *state) 3988 4319 { … … 4027 4358 struct dcerpc_binding_handle *b; 4028 4359 4029 status = cli_rpc_pipe_open_noauth(cli, &ndr_table_srvsvc .syntax_id,4360 status = cli_rpc_pipe_open_noauth(cli, &ndr_table_srvsvc, 4030 4361 &pipe_hnd); 4031 4362 … … 4085 4416 } 4086 4417 4087 if((ret = cli_RNetShareEnum(cli, browse_fn, NULL)) == -1) 4088 d_printf("Error returning browse list: %s\n", cli_errstr(cli)); 4418 if((ret = cli_RNetShareEnum(cli, browse_fn, NULL)) == -1) { 4419 NTSTATUS status = cli_nt_error(cli); 4420 d_printf("Error returning browse list: %s\n", 4421 nt_errstr(status)); 4422 } 4089 4423 4090 4424 return (ret != -1); … … 4095 4429 ****************************************************************************/ 4096 4430 4097 static void server_fn(const char *name, uint32 m,4431 static void server_fn(const char *name, uint32_t m, 4098 4432 const char *comment, void *state) 4099 4433 { … … 4146 4480 4147 4481 if (!next_token_talloc(ctx, &cmd_ptr,&buf,NULL)) { 4148 d_printf("Current VUID is %d\n", cli->vuid); 4482 d_printf("Current VUID is %d\n", 4483 cli_state_get_uid(cli)); 4149 4484 return 0; 4150 4485 } 4151 4486 4152 cli ->vuid = atoi(buf);4487 cli_state_set_uid(cli, atoi(buf)); 4153 4488 return 0; 4154 4489 } … … 4170 4505 4171 4506 if (!next_token_talloc(ctx, &cmd_ptr,&l_password,NULL)) { 4172 char *pass = getpass("Password: "); 4173 if (pass) { 4174 l_password = talloc_strdup(ctx,pass); 4507 char pwd[256] = {0}; 4508 int rc; 4509 4510 rc = samba_getpass("Password: ", pwd, sizeof(pwd), false, false); 4511 if (rc == 0) { 4512 l_password = talloc_strdup(ctx, pwd); 4175 4513 } 4176 4514 } … … 4188 4526 } 4189 4527 4190 d_printf("Current VUID is %d\n", cli->vuid); 4528 d_printf("Current VUID is %d\n", cli_state_get_uid(cli)); 4529 return 0; 4530 } 4531 4532 /** 4533 * close the session 4534 */ 4535 4536 static int cmd_logoff(void) 4537 { 4538 NTSTATUS status; 4539 4540 status = cli_ulogoff(cli); 4541 if (!NT_STATUS_IS_OK(status)) { 4542 d_printf("logoff failed: %s\n", nt_errstr(status)); 4543 return -1; 4544 } 4545 4546 d_printf("logoff successful\n"); 4547 return 0; 4548 } 4549 4550 4551 /** 4552 * tree connect (connect to a share) 4553 */ 4554 4555 static int cmd_tcon(void) 4556 { 4557 TALLOC_CTX *ctx = talloc_tos(); 4558 char *sharename; 4559 NTSTATUS status; 4560 4561 if (!next_token_talloc(ctx, &cmd_ptr, &sharename, NULL)) { 4562 d_printf("tcon <sharename>\n"); 4563 return 0; 4564 } 4565 4566 if (!sharename) { 4567 return 1; 4568 } 4569 4570 status = cli_tree_connect(cli, sharename, "?????", "", 0); 4571 if (!NT_STATUS_IS_OK(status)) { 4572 d_printf("tcon failed: %s\n", nt_errstr(status)); 4573 return -1; 4574 } 4575 4576 talloc_free(sharename); 4577 4578 d_printf("tcon to %s successful, tid: %u\n", sharename, 4579 cli_state_get_tid(cli)); 4580 return 0; 4581 } 4582 4583 /** 4584 * tree disconnect (disconnect from a share) 4585 */ 4586 4587 static int cmd_tdis(void) 4588 { 4589 NTSTATUS status; 4590 4591 status = cli_tdis(cli); 4592 if (!NT_STATUS_IS_OK(status)) { 4593 d_printf("tdis failed: %s\n", nt_errstr(status)); 4594 return -1; 4595 } 4596 4597 d_printf("tdis successful\n"); 4598 return 0; 4599 } 4600 4601 4602 /** 4603 * get or set tid 4604 */ 4605 4606 static int cmd_tid(void) 4607 { 4608 TALLOC_CTX *ctx = talloc_tos(); 4609 char *tid_str; 4610 4611 if (!next_token_talloc(ctx, &cmd_ptr, &tid_str, NULL)) { 4612 if (cli_state_has_tcon(cli)) { 4613 d_printf("current tid is %d\n", cli_state_get_tid(cli)); 4614 } else { 4615 d_printf("no tcon currently\n"); 4616 } 4617 } else { 4618 uint16_t tid = atoi(tid_str); 4619 cli_state_set_tid(cli, tid); 4620 } 4621 4191 4622 return 0; 4192 4623 } … … 4212 4643 struct cli_state *targetcli; 4213 4644 char *targetpath; 4214 4215 if (!cli_resolve_path(ctx, "", auth_info, cli, client_get_cur_dir(), 4216 &targetcli, &targetpath ) ) { 4217 d_printf("showconnect %s: %s\n", cur_dir, cli_errstr(cli)); 4218 return 1; 4219 } 4220 4221 d_printf("//%s/%s\n", targetcli->desthost, targetcli->share); 4222 return 0; 4645 NTSTATUS status; 4646 4647 status = cli_resolve_path(ctx, "", auth_info, cli, 4648 client_get_cur_dir(), &targetcli, 4649 &targetpath); 4650 if (!NT_STATUS_IS_OK(status)) { 4651 d_printf("showconnect %s: %s\n", cur_dir, nt_errstr(status)); 4652 return 1; 4653 } 4654 4655 d_printf("//%s/%s\n", smbXcli_conn_remote_name(targetcli->conn), targetcli->share); 4656 return 0; 4657 } 4658 4659 /** 4660 * set_remote_attr - set DOS attributes of a remote file 4661 * @filename: path to the file name 4662 * @new_attr: attribute bit mask to use 4663 * @mode: one of ATTR_SET or ATTR_UNSET 4664 * 4665 * Update the file attributes with the one provided. 4666 */ 4667 int set_remote_attr(const char *filename, uint16_t new_attr, int mode) 4668 { 4669 extern struct cli_state *cli; 4670 uint16_t old_attr; 4671 NTSTATUS status; 4672 4673 status = cli_getatr(cli, filename, &old_attr, NULL, NULL); 4674 if (!NT_STATUS_IS_OK(status)) { 4675 d_printf("cli_getatr failed: %s\n", nt_errstr(status)); 4676 return 1; 4677 } 4678 4679 if (mode == ATTR_SET) { 4680 new_attr |= old_attr; 4681 } else { 4682 new_attr = old_attr & ~new_attr; 4683 } 4684 4685 status = cli_setatr(cli, filename, new_attr, 0); 4686 if (!NT_STATUS_IS_OK(status)) { 4687 d_printf("cli_setatr failed: %s\n", nt_errstr(status)); 4688 return 1; 4689 } 4690 4691 return 0; 4692 } 4693 4694 /** 4695 * cmd_setmode - interactive command to set DOS attributes 4696 * 4697 * Read a filename and mode from the client command line and update 4698 * the file DOS attributes. 4699 */ 4700 int cmd_setmode(void) 4701 { 4702 const extern char *cmd_ptr; 4703 char *buf; 4704 char *fname = NULL; 4705 uint16_t attr[2] = {0}; 4706 int mode = ATTR_SET; 4707 int err = 0; 4708 bool ok; 4709 TALLOC_CTX *ctx = talloc_new(NULL); 4710 if (ctx == NULL) { 4711 return 1; 4712 } 4713 4714 ok = next_token_talloc(ctx, &cmd_ptr, &buf, NULL); 4715 if (!ok) { 4716 d_printf("setmode <filename> <[+|-]rsha>\n"); 4717 err = 1; 4718 goto out; 4719 } 4720 4721 fname = talloc_asprintf(ctx, 4722 "%s%s", 4723 client_get_cur_dir(), 4724 buf); 4725 if (fname == NULL) { 4726 err = 1; 4727 goto out; 4728 } 4729 4730 while (next_token_talloc(ctx, &cmd_ptr, &buf, NULL)) { 4731 const char *s = buf; 4732 4733 while (*s) { 4734 switch (*s++) { 4735 case '+': 4736 mode = ATTR_SET; 4737 break; 4738 case '-': 4739 mode = ATTR_UNSET; 4740 break; 4741 case 'r': 4742 attr[mode] |= FILE_ATTRIBUTE_READONLY; 4743 break; 4744 case 'h': 4745 attr[mode] |= FILE_ATTRIBUTE_HIDDEN; 4746 break; 4747 case 's': 4748 attr[mode] |= FILE_ATTRIBUTE_SYSTEM; 4749 break; 4750 case 'a': 4751 attr[mode] |= FILE_ATTRIBUTE_ARCHIVE; 4752 break; 4753 default: 4754 d_printf("setmode <filename> <perm=[+|-]rsha>\n"); 4755 err = 1; 4756 goto out; 4757 } 4758 } 4759 } 4760 4761 if (attr[ATTR_SET] == 0 && attr[ATTR_UNSET] == 0) { 4762 d_printf("setmode <filename> <[+|-]rsha>\n"); 4763 err = 1; 4764 goto out; 4765 } 4766 4767 DEBUG(2, ("perm set %d %d\n", attr[ATTR_SET], attr[ATTR_UNSET])); 4768 4769 /* ignore return value: server might not store DOS attributes */ 4770 set_remote_attr(fname, attr[ATTR_SET], ATTR_SET); 4771 set_remote_attr(fname, attr[ATTR_UNSET], ATTR_UNSET); 4772 out: 4773 talloc_free(ctx); 4774 return err; 4223 4775 } 4224 4776 … … 4234 4786 4235 4787 if (!next_token_talloc(ctx, &cmd_ptr,&buf,NULL)) { 4236 if (!smb_encrypt) { 4237 d_printf("iosize <n> or iosize 0x<n>. " 4238 "Minimum is 16384 (0x4000), " 4239 "max is 16776960 (0xFFFF00)\n"); 4788 if (smbXcli_conn_protocol(cli->conn) < PROTOCOL_SMB2_02) { 4789 if (!smb_encrypt) { 4790 d_printf("iosize <n> or iosize 0x<n>. " 4791 "Minimum is 0 (default), " 4792 "max is 16776960 (0xFFFF00)\n"); 4793 } else { 4794 d_printf("iosize <n> or iosize 0x<n>. " 4795 "(Encrypted connection) ," 4796 "Minimum is 0 (default), " 4797 "max is 130048 (0x1FC00)\n"); 4798 } 4240 4799 } else { 4241 d_printf("iosize <n> or iosize 0x<n>. " 4242 "(Encrypted connection) ," 4243 "Minimum is 16384 (0x4000), " 4244 "max is 130048 (0x1FC00)\n"); 4800 d_printf("iosize <n> or iosize 0x<n>.\n"); 4245 4801 } 4246 4802 return 1; … … 4248 4804 4249 4805 iosize = strtol(buf,NULL,0); 4250 if (smb_encrypt && (iosize < 0x4000 || iosize > 0xFC00)) { 4251 d_printf("iosize out of range for encrypted " 4252 "connection (min = 16384 (0x4000), " 4253 "max = 130048 (0x1FC00)"); 4254 return 1; 4255 } else if (!smb_encrypt && (iosize < 0x4000 || iosize > 0xFFFF00)) { 4256 d_printf("iosize out of range (min = 16384 (0x4000), " 4257 "max = 16776960 (0xFFFF00)"); 4258 return 1; 4806 if (smbXcli_conn_protocol(cli->conn) < PROTOCOL_SMB2_02) { 4807 if (smb_encrypt && (iosize < 0 || iosize > 0xFC00)) { 4808 d_printf("iosize out of range for encrypted " 4809 "connection (min = 0 (default), " 4810 "max = 130048 (0x1FC00)\n"); 4811 return 1; 4812 } else if (!smb_encrypt && (iosize < 0 || iosize > 0xFFFF00)) { 4813 d_printf("iosize out of range (min = 0 (default), " 4814 "max = 16776960 (0xFFFF00)\n"); 4815 return 1; 4816 } 4259 4817 } 4260 4818 … … 4263 4821 return 0; 4264 4822 } 4823 4824 /**************************************************************************** 4825 timeout command 4826 ***************************************************************************/ 4827 4828 static int cmd_timeout(void) 4829 { 4830 TALLOC_CTX *ctx = talloc_tos(); 4831 char *buf; 4832 4833 if (!next_token_talloc(ctx, &cmd_ptr,&buf,NULL)) { 4834 unsigned int old_timeout = cli_set_timeout(cli, 0); 4835 cli_set_timeout(cli, old_timeout); 4836 d_printf("timeout <n> (per-operation timeout " 4837 "in seconds - currently %u).\n", 4838 old_timeout/1000); 4839 return 1; 4840 } 4841 4842 io_timeout = strtol(buf,NULL,0); 4843 cli_set_timeout(cli, io_timeout*1000); 4844 d_printf("io_timeout per operation is now %d\n", io_timeout); 4845 return 0; 4846 } 4847 4265 4848 4266 4849 /**************************************************************************** … … 4307 4890 {"altname",cmd_altname,"<file> show alt name",{COMPL_NONE,COMPL_NONE}}, 4308 4891 {"archive",cmd_archive,"<level>\n0=ignore archive bit\n1=only get archive files\n2=only get archive files and reset archive bit\n3=get all files and reset archive bit",{COMPL_NONE,COMPL_NONE}}, 4892 {"backup",cmd_backup,"toggle backup intent state",{COMPL_NONE,COMPL_NONE}}, 4309 4893 {"blocksize",cmd_block,"blocksize <number> (default 20)",{COMPL_NONE,COMPL_NONE}}, 4310 4894 {"cancel",cmd_cancel,"<jobid> cancel a print queue entry",{COMPL_NONE,COMPL_NONE}}, 4311 4895 {"case_sensitive",cmd_setcase,"toggle the case sensitive flag to server",{COMPL_NONE,COMPL_NONE}}, 4312 4896 {"cd",cmd_cd,"[directory] change/report the remote directory",{COMPL_REMOTE,COMPL_NONE}}, 4313 {"chmod",cmd_chmod,"<src> <mode> chmod a file using UNIX permission",{COMPL_REMOTE,COMPL_ REMOTE}},4314 {"chown",cmd_chown,"<src> <uid> <gid> chown a file using UNIX uids and gids",{COMPL_REMOTE,COMPL_ REMOTE}},4315 {"close",cmd_close,"<fid> close a file given a fid",{COMPL_REMOTE,COMPL_ REMOTE}},4897 {"chmod",cmd_chmod,"<src> <mode> chmod a file using UNIX permission",{COMPL_REMOTE,COMPL_NONE}}, 4898 {"chown",cmd_chown,"<src> <uid> <gid> chown a file using UNIX uids and gids",{COMPL_REMOTE,COMPL_NONE}}, 4899 {"close",cmd_close,"<fid> close a file given a fid",{COMPL_REMOTE,COMPL_NONE}}, 4316 4900 {"del",cmd_del,"<mask> delete all matching files",{COMPL_REMOTE,COMPL_NONE}}, 4317 4901 {"dir",cmd_dir,"<mask> list the contents of the current directory",{COMPL_REMOTE,COMPL_NONE}}, … … 4320 4904 {"exit",cmd_quit,"logoff the server",{COMPL_NONE,COMPL_NONE}}, 4321 4905 {"get",cmd_get,"<remote name> [local name] get a file",{COMPL_REMOTE,COMPL_LOCAL}}, 4322 {"getfacl",cmd_getfacl,"<file name> get the POSIX ACL on a file (UNIX extensions only)",{COMPL_REMOTE,COMPL_ LOCAL}},4906 {"getfacl",cmd_getfacl,"<file name> get the POSIX ACL on a file (UNIX extensions only)",{COMPL_REMOTE,COMPL_NONE}}, 4323 4907 {"geteas", cmd_geteas, "<file name> get the EA list of a file", 4324 {COMPL_REMOTE, COMPL_ LOCAL}},4908 {COMPL_REMOTE, COMPL_NONE}}, 4325 4909 {"hardlink",cmd_hardlink,"<src> <dest> create a Windows hard link",{COMPL_REMOTE,COMPL_REMOTE}}, 4326 4910 {"help",cmd_help,"[command] give help on a command",{COMPL_NONE,COMPL_NONE}}, … … 4330 4914 {"link",cmd_link,"<oldname> <newname> create a UNIX hard link",{COMPL_REMOTE,COMPL_REMOTE}}, 4331 4915 {"lock",cmd_lock,"lock <fnum> [r|w] <hex-start> <hex-len> : set a POSIX lock",{COMPL_REMOTE,COMPL_REMOTE}}, 4332 {"lowercase",cmd_lowercase,"toggle lowercasing of filenames for get",{COMPL_NONE,COMPL_NONE}}, 4916 {"lowercase",cmd_lowercase,"toggle lowercasing of filenames for get",{COMPL_NONE,COMPL_NONE}}, 4333 4917 {"ls",cmd_dir,"<mask> list the contents of the current directory",{COMPL_REMOTE,COMPL_NONE}}, 4334 4918 {"l",cmd_dir,"<mask> list the contents of the current directory",{COMPL_REMOTE,COMPL_NONE}}, … … 4337 4921 {"mget",cmd_mget,"<mask> get all the matching files",{COMPL_REMOTE,COMPL_NONE}}, 4338 4922 {"mkdir",cmd_mkdir,"<directory> make a directory",{COMPL_NONE,COMPL_NONE}}, 4339 {"more",cmd_more,"<remote name> view a remote file with your pager",{COMPL_REMOTE,COMPL_NONE}}, 4923 {"more",cmd_more,"<remote name> view a remote file with your pager",{COMPL_REMOTE,COMPL_NONE}}, 4340 4924 {"mput",cmd_mput,"<mask> put all matching files",{COMPL_REMOTE,COMPL_NONE}}, 4341 4925 {"newer",cmd_newer,"<file> only mget files newer than the specified local file",{COMPL_LOCAL,COMPL_NONE}}, 4926 {"notify",cmd_notify,"<file>Get notified of dir changes",{COMPL_REMOTE,COMPL_NONE}}, 4342 4927 {"open",cmd_open,"<mask> open a file",{COMPL_REMOTE,COMPL_NONE}}, 4343 4928 {"posix", cmd_posix, "turn on all POSIX capabilities", {COMPL_REMOTE,COMPL_NONE}}, … … 4348 4933 {"posix_unlink",cmd_posix_unlink,"<name> removes a file using POSIX interface",{COMPL_REMOTE,COMPL_NONE}}, 4349 4934 {"print",cmd_print,"<file name> print a file",{COMPL_NONE,COMPL_NONE}}, 4350 {"prompt",cmd_prompt,"toggle prompting for filenames for mget and mput",{COMPL_NONE,COMPL_NONE}}, 4935 {"prompt",cmd_prompt,"toggle prompting for filenames for mget and mput",{COMPL_NONE,COMPL_NONE}}, 4351 4936 {"put",cmd_put,"<local name> [remote name] put a file",{COMPL_LOCAL,COMPL_REMOTE}}, 4352 4937 {"pwd",cmd_pwd,"show current remote directory (same as 'cd' with no args)",{COMPL_NONE,COMPL_NONE}}, … … 4356 4941 {"readlink",cmd_readlink,"filename Do a UNIX extensions readlink call on a symlink",{COMPL_REMOTE,COMPL_REMOTE}}, 4357 4942 {"rd",cmd_rmdir,"<directory> remove a directory",{COMPL_NONE,COMPL_NONE}}, 4358 {"recurse",cmd_recurse,"toggle directory recursion for mget and mput",{COMPL_NONE,COMPL_NONE}}, 4943 {"recurse",cmd_recurse,"toggle directory recursion for mget and mput",{COMPL_NONE,COMPL_NONE}}, 4359 4944 {"reget",cmd_reget,"<remote name> [local name] get a file restarting at end of local file",{COMPL_REMOTE,COMPL_LOCAL}}, 4360 4945 {"rename",cmd_rename,"<src> <dest> rename some files",{COMPL_REMOTE,COMPL_REMOTE}}, 4361 4946 {"reput",cmd_reput,"<local name> [remote name] put a file restarting at end of remote file",{COMPL_LOCAL,COMPL_REMOTE}}, 4362 4947 {"rm",cmd_del,"<mask> delete all matching files",{COMPL_REMOTE,COMPL_NONE}}, 4363 {"rmdir",cmd_rmdir,"<directory> remove a directory",{COMPL_ NONE,COMPL_NONE}},4364 {"showacls",cmd_showacls,"toggle if ACLs are shown or not",{COMPL_NONE,COMPL_NONE}}, 4948 {"rmdir",cmd_rmdir,"<directory> remove a directory",{COMPL_REMOTE,COMPL_NONE}}, 4949 {"showacls",cmd_showacls,"toggle if ACLs are shown or not",{COMPL_NONE,COMPL_NONE}}, 4365 4950 {"setea", cmd_setea, "<file name> <eaname> <eaval> Set an EA of a file", 4366 4951 {COMPL_REMOTE, COMPL_LOCAL}}, 4367 {"setmode",cmd_setmode,"filename <setmode string> change modes of file",{COMPL_REMOTE,COMPL_NONE}}, 4368 {"stat",cmd_stat,"filename Do a UNIX extensions stat call on a file",{COMPL_REMOTE,COMPL_REMOTE}}, 4952 {"setmode",cmd_setmode,"<file name> <setmode string> change modes of file",{COMPL_REMOTE,COMPL_NONE}}, 4953 {"scopy",cmd_scopy,"<src> <dest> server-side copy file",{COMPL_REMOTE,COMPL_REMOTE}}, 4954 {"stat",cmd_stat,"<file name> Do a UNIX extensions stat call on a file",{COMPL_REMOTE,COMPL_NONE}}, 4369 4955 {"symlink",cmd_symlink,"<oldname> <newname> create a UNIX symlink",{COMPL_REMOTE,COMPL_REMOTE}}, 4370 4956 {"tar",cmd_tar,"tar <c|x>[IXFqbgNan] current directory to/from <file name>",{COMPL_NONE,COMPL_NONE}}, 4371 4957 {"tarmode",cmd_tarmode,"<full|inc|reset|noreset> tar's behaviour towards archive bits",{COMPL_NONE,COMPL_NONE}}, 4958 {"timeout",cmd_timeout,"timeout <number> - set the per-operation timeout in seconds (default 20)",{COMPL_NONE,COMPL_NONE}}, 4372 4959 {"translate",cmd_translate,"toggle text translation for printing",{COMPL_NONE,COMPL_NONE}}, 4373 4960 {"unlock",cmd_unlock,"unlock <fnum> <hex-start> <hex-len> : remove a POSIX lock",{COMPL_REMOTE,COMPL_REMOTE}}, … … 4378 4965 {"listconnect",cmd_list_connect,"list open connections",{COMPL_NONE,COMPL_NONE}}, 4379 4966 {"showconnect",cmd_show_connect,"display the current active connection",{COMPL_NONE,COMPL_NONE}}, 4967 {"tcon",cmd_tcon,"connect to a share" ,{COMPL_NONE,COMPL_NONE}}, 4968 {"tdis",cmd_tdis,"disconnect from a share",{COMPL_NONE,COMPL_NONE}}, 4969 {"tid",cmd_tid,"show or set the current tid (tree-id)",{COMPL_NONE,COMPL_NONE}}, 4970 {"logoff",cmd_logoff,"log off (close the session)",{COMPL_NONE,COMPL_NONE}}, 4380 4971 {"..",cmd_cd_oneup,"change the remote directory (up one level)",{COMPL_REMOTE,COMPL_NONE}}, 4381 4972 … … 4458 5049 4459 5050 if (!cli) { 4460 cli = cli_cm_open(talloc_tos(), NULL, 4461 have_ip ? dest_ss_str : desthost, 4462 service, auth_info, 4463 true, smb_encrypt, 4464 max_protocol, port, name_type); 4465 if (!cli) { 5051 NTSTATUS status; 5052 5053 status = cli_cm_open(talloc_tos(), NULL, 5054 have_ip ? dest_ss_str : desthost, 5055 service, auth_info, 5056 true, smb_encrypt, 5057 max_protocol, port, name_type, 5058 &cli); 5059 if (!NT_STATUS_IS_OK(status)) { 4466 5060 return 1; 4467 5061 } 5062 cli_set_timeout(cli, io_timeout*1000); 4468 5063 } 4469 5064 … … 4638 5233 } 4639 5234 4640 if (!cli_resolve_path(ctx, "", auth_info, cli, dirmask, &targetcli, &targetpath)) { 5235 status = cli_resolve_path(ctx, "", auth_info, cli, dirmask, &targetcli, 5236 &targetpath); 5237 if (!NT_STATUS_IS_OK(status)) { 4641 5238 goto cleanup; 4642 5239 } … … 4676 5273 info.matches[0] = SMB_STRNDUP(info.matches[1], info.samelen); 4677 5274 info.matches[info.count] = NULL; 5275 TALLOC_FREE(ctx); 4678 5276 return info.matches; 4679 5277 … … 4788 5386 struct timespec now; 4789 5387 time_t t; 4790 int ret, revents; 5388 NTSTATUS status; 5389 unsigned char garbage[16]; 4791 5390 4792 5391 clock_gettime_mono(&now); … … 4798 5397 last_t = t; 4799 5398 4800 again: 4801 4802 if (cli->fd == -1) 5399 /* Ping the server to keep the connection alive using SMBecho. */ 5400 memset(garbage, 0xf0, sizeof(garbage)); 5401 status = cli_echo(cli, 1, data_blob_const(garbage, sizeof(garbage))); 5402 if (NT_STATUS_IS_OK(status)) { 4803 5403 return; 4804 4805 /* We deliberately use receive_smb_raw instead of 4806 client_receive_smb as we want to receive 4807 session keepalives and then drop them here. 4808 */ 4809 4810 ret = poll_intr_one_fd(cli->fd, POLLIN|POLLHUP, 0, &revents); 4811 4812 if ((ret > 0) && (revents & (POLLIN|POLLHUP|POLLERR))) { 4813 NTSTATUS status; 4814 size_t len; 4815 4816 set_smb_read_error(&cli->smb_rw_error, SMB_READ_OK); 4817 4818 status = receive_smb_raw(cli->fd, cli->inbuf, cli->bufsize, 0, 0, &len); 4819 4820 if (!NT_STATUS_IS_OK(status)) { 4821 DEBUG(0, ("Read from server failed, maybe it closed " 4822 "the connection\n")); 4823 4824 finished = true; 4825 smb_readline_done(); 4826 if (NT_STATUS_EQUAL(status, NT_STATUS_END_OF_FILE)) { 4827 set_smb_read_error(&cli->smb_rw_error, 4828 SMB_READ_EOF); 4829 return; 4830 } 4831 4832 if (NT_STATUS_EQUAL(status, NT_STATUS_IO_TIMEOUT)) { 4833 set_smb_read_error(&cli->smb_rw_error, 4834 SMB_READ_TIMEOUT); 4835 return; 4836 } 4837 4838 set_smb_read_error(&cli->smb_rw_error, SMB_READ_ERROR); 4839 return; 4840 } 4841 if(CVAL(cli->inbuf,0) != SMBkeepalive) { 4842 DEBUG(0, ("Read from server " 4843 "returned unexpected packet!\n")); 4844 return; 4845 } 4846 4847 goto again; 4848 } 4849 4850 /* Ping the server to keep the connection alive using SMBecho. */ 4851 { 4852 NTSTATUS status; 4853 unsigned char garbage[16]; 4854 memset(garbage, 0xf0, sizeof(garbage)); 4855 status = cli_echo(cli, 1, data_blob_const(garbage, sizeof(garbage))); 4856 4857 if (NT_STATUS_IS_OK(status)) { 4858 return; 4859 } 4860 4861 if (!cli_state_is_connected(cli)) { 4862 DEBUG(0, ("SMBecho failed (%s). The connection is " 4863 "disconnected now\n", nt_errstr(status))); 4864 finished = true; 4865 smb_readline_done(); 4866 } 5404 } 5405 5406 if (!cli_state_is_connected(cli)) { 5407 DEBUG(0,("SMBecho failed (%s). The connection is " 5408 "disconnected now\n", nt_errstr(status))); 5409 finished = true; 5410 smb_readline_done(); 4867 5411 } 4868 5412 } … … 4934 5478 { 4935 5479 int rc = 0; 4936 4937 cli = cli_cm_open(talloc_tos(), NULL, 4938 have_ip ? dest_ss_str : desthost, 4939 service, auth_info, true, smb_encrypt, 4940 max_protocol, port, name_type); 4941 if (!cli) { 4942 return 1; 4943 } 5480 NTSTATUS status; 5481 5482 status = cli_cm_open(talloc_tos(), NULL, 5483 have_ip ? dest_ss_str : desthost, 5484 service, auth_info, true, smb_encrypt, 5485 max_protocol, port, name_type, &cli); 5486 if (!NT_STATUS_IS_OK(status)) { 5487 return 1; 5488 } 5489 5490 cli_set_timeout(cli, io_timeout*1000); 4944 5491 4945 5492 if (base_directory && *base_directory) { … … 4967 5514 static int do_host_query(const char *query_host) 4968 5515 { 4969 cli = cli_cm_open(talloc_tos(), NULL, 4970 have_ip ? dest_ss_str : query_host, "IPC$", auth_info, true, smb_encrypt, 4971 max_protocol, port, name_type); 4972 if (!cli) 4973 return 1; 4974 5516 NTSTATUS status; 5517 5518 status = cli_cm_open(talloc_tos(), NULL, 5519 have_ip ? dest_ss_str : query_host, 5520 "IPC$", auth_info, true, smb_encrypt, 5521 max_protocol, port, name_type, &cli); 5522 if (!NT_STATUS_IS_OK(status)) { 5523 return 1; 5524 } 5525 5526 cli_set_timeout(cli, io_timeout*1000); 4975 5527 browse_host(true); 4976 5528 … … 4987 5539 } 4988 5540 4989 if (port != 139) {5541 if (port != NBT_SMB_PORT) { 4990 5542 4991 5543 /* Workgroups simply don't make sense over anything … … 4993 5545 4994 5546 cli_shutdown(cli); 4995 cli = cli_cm_open(talloc_tos(), NULL, 4996 have_ip ? dest_ss_str : query_host, "IPC$", 4997 auth_info, true, smb_encrypt, 4998 max_protocol, 139, name_type); 5547 status = cli_cm_open(talloc_tos(), NULL, 5548 have_ip ? dest_ss_str : query_host, 5549 "IPC$", auth_info, true, smb_encrypt, 5550 max_protocol, NBT_SMB_PORT, name_type, 5551 &cli); 5552 if (!NT_STATUS_IS_OK(status)) { 5553 cli = NULL; 5554 } 4999 5555 } 5000 5556 5001 5557 if (cli == NULL) { 5002 5558 d_printf("NetBIOS over TCP disabled -- no workgroup available\n"); 5003 return 1; 5004 } 5005 5559 return 0; 5560 } 5561 5562 cli_set_timeout(cli, io_timeout*1000); 5006 5563 list_servers(lp_workgroup()); 5007 5564 … … 5017 5574 static int do_tar_op(const char *base_directory) 5018 5575 { 5019 int ret; 5576 struct tar *tar_ctx = tar_get_ctx(); 5577 int ret = 0; 5020 5578 5021 5579 /* do we already have a connection? */ 5022 5580 if (!cli) { 5023 cli = cli_cm_open(talloc_tos(), NULL, 5024 have_ip ? dest_ss_str : desthost, 5025 service, auth_info, true, smb_encrypt, 5026 max_protocol, port, name_type); 5027 if (!cli) 5028 return 1; 5029 } 5030 5031 recurse=true; 5581 NTSTATUS status; 5582 5583 status = cli_cm_open(talloc_tos(), NULL, 5584 have_ip ? dest_ss_str : desthost, 5585 service, auth_info, true, smb_encrypt, 5586 max_protocol, port, name_type, &cli); 5587 if (!NT_STATUS_IS_OK(status)) { 5588 ret = 1; 5589 goto out; 5590 } 5591 cli_set_timeout(cli, io_timeout*1000); 5592 } 5593 5594 recurse = true; 5032 5595 5033 5596 if (base_directory && *base_directory) { 5034 5597 ret = do_cd(base_directory); 5035 5598 if (ret) { 5036 cli_shutdown(cli);5037 return ret;5038 5039 } 5040 5041 ret=process_tar(); 5042 5599 goto out_cli; 5600 } 5601 } 5602 5603 ret = tar_process(tar_ctx); 5604 5605 out_cli: 5043 5606 cli_shutdown(cli); 5044 5045 return (ret);5607 out: 5608 return ret; 5046 5609 } 5047 5610 … … 5052 5615 static int do_message_op(struct user_auth_info *a_info) 5053 5616 { 5054 struct sockaddr_storage ss;5055 struct nmb_name called, calling;5056 fstring server_name;5057 char name_type_hex[10];5058 int msg_port;5059 5617 NTSTATUS status; 5060 5618 5061 make_nmb_name(&calling, calling_name, 0x0); 5062 make_nmb_name(&called , desthost, name_type); 5063 5064 fstrcpy(server_name, desthost); 5065 snprintf(name_type_hex, sizeof(name_type_hex), "#%X", name_type); 5066 fstrcat(server_name, name_type_hex); 5067 5068 zero_sockaddr(&ss); 5069 if (have_ip) 5070 ss = dest_ss; 5071 5072 /* we can only do messages over port 139 (to windows clients at least) */ 5073 5074 msg_port = port ? port : 139; 5075 5076 if (!(cli=cli_initialise())) { 5077 d_printf("Connection to %s failed\n", desthost); 5078 return 1; 5079 } 5080 cli_set_port(cli, msg_port); 5081 5082 status = cli_connect(cli, server_name, &ss); 5619 status = cli_connect_nb(desthost, have_ip ? &dest_ss : NULL, 5620 port ? port : NBT_SMB_PORT, name_type, 5621 lp_netbios_name(), SMB_SIGNING_DEFAULT, 0, &cli); 5083 5622 if (!NT_STATUS_IS_OK(status)) { 5084 5623 d_printf("Connection to %s failed. Error %s\n", desthost, nt_errstr(status)); … … 5086 5625 } 5087 5626 5088 if (!cli_session_request(cli, &calling, &called)) { 5089 d_printf("session request failed\n"); 5090 cli_shutdown(cli); 5091 return 1; 5092 } 5093 5627 cli_set_timeout(cli, io_timeout*1000); 5094 5628 send_message(get_cmdline_auth_info_username(a_info)); 5095 5629 cli_shutdown(cli); … … 5102 5636 ****************************************************************************/ 5103 5637 5104 int main(int argc,char *argv[]) 5105 { 5638 int main(int argc,char *argv[]) 5639 { 5640 const char **const_argv = discard_const_p(const char *, argv); 5106 5641 char *base_directory = NULL; 5107 5642 int opt; … … 5112 5647 char *p; 5113 5648 int rc = 0; 5114 fstring new_workgroup;5115 5649 bool tar_opt = false; 5116 5650 bool service_opt = false; 5651 struct tar *tar_ctx = tar_get_ctx(); 5652 5117 5653 struct poptOption long_options[] = { 5118 5654 POPT_AUTOHELP … … 5126 5662 { "tar", 'T', POPT_ARG_STRING, NULL, 'T', "Command line tar", "<c|x>IXFqgbNan" }, 5127 5663 { "directory", 'D', POPT_ARG_STRING, NULL, 'D', "Start from directory", "DIR" }, 5128 { "command", 'c', POPT_ARG_STRING, &cmdstr, 'c', "Execute semicolon separated commands" }, 5664 { "command", 'c', POPT_ARG_STRING, &cmdstr, 'c', "Execute semicolon separated commands" }, 5129 5665 { "send-buffer", 'b', POPT_ARG_INT, &io_bufsize, 'b', "Changes the transmit/send buffer", "BYTES" }, 5666 { "timeout", 't', POPT_ARG_INT, &io_timeout, 'b', "Changes the per-operation timeout", "SECONDS" }, 5130 5667 { "port", 'p', POPT_ARG_INT, &port, 'p', "Port to connect to", "PORT" }, 5131 5668 { "grepable", 'g', POPT_ARG_NONE, NULL, 'g', "Produce grepable output" }, … … 5142 5679 } 5143 5680 5144 /* initialize the workgroup name so we can determine whether or5145 not it was set by a command line option */5146 5147 set_global_myworkgroup( "" );5148 set_global_myname( "" );5149 5150 5681 /* set default debug level to 1 regardless of what smb.conf sets */ 5151 5682 setup_logging( "smbclient", DEBUG_DEFAULT_STDERR ); 5152 load_case_tables();5683 smb_init_locale(); 5153 5684 5154 5685 lp_set_cmdline("log level", "1"); … … 5161 5692 5162 5693 /* skip argv(0) */ 5163 pc = poptGetContext("smbclient", argc, (const char **)argv, long_options, 0);5694 pc = poptGetContext("smbclient", argc, const_argv, long_options, 0); 5164 5695 poptSetOtherOptionHelp(pc, "service <password>"); 5165 5166 lp_set_in_client(true); /* Make sure that we tell lp_load we are */5167 5696 5168 5697 while ((opt = poptGetNextOpt(pc)) != -1) { … … 5193 5722 poptGetArg(pc)); 5194 5723 } 5724 5195 5725 5196 5726 switch (opt) { … … 5206 5736 } 5207 5737 if( !port ) 5208 port = 139;5738 port = NBT_SMB_PORT; 5209 5739 message = true; 5210 5740 break; … … 5230 5760 break; 5231 5761 case 'm': 5232 max_protocol = interpret_protocol(poptGetOptArg(pc), max_protocol);5762 lp_set_cmdline("client max protocol", poptGetOptArg(pc)); 5233 5763 break; 5234 5764 case 'T': … … 5237 5767 { 5238 5768 int i; 5769 5239 5770 for (i = 1; i < argc; i++) { 5240 5771 if (strncmp("-T", argv[i],2)==0) … … 5242 5773 } 5243 5774 i++; 5244 if (!tar_parseargs(argc, argv, poptGetOptArg(pc), i)) { 5775 if (tar_parse_args(tar_ctx, poptGetOptArg(pc), 5776 const_argv + i, argc - i)) { 5245 5777 poptPrintUsage(pc, stderr, 0); 5246 5778 exit(1); … … 5293 5825 } 5294 5826 5295 /* save the workgroup...5296 5297 FIXME!! do we need to do this for other options as well5298 (or maybe a generic way to keep lp_load() from overwriting5299 everything)? */5300 5301 fstrcpy( new_workgroup, lp_workgroup() );5302 calling_name = talloc_strdup(frame, global_myname() );5303 if (!calling_name) {5304 exit(ENOMEM);5305 }5306 5307 5827 if ( override_logfile ) 5308 setup_logging( lp_logfile( ), DEBUG_FILE );5309 5310 if (!lp_load (get_dyn_CONFIGFILE(),true,false,false,true)) {5828 setup_logging( lp_logfile(talloc_tos()), DEBUG_FILE ); 5829 5830 if (!lp_load_client(get_dyn_CONFIGFILE())) { 5311 5831 fprintf(stderr, "%s: Can't load %s - run testparm to debug it\n", 5312 5832 argv[0], get_dyn_CONFIGFILE()); … … 5338 5858 } 5339 5859 5340 if ( strlen(new_workgroup) != 0 ) {5341 set_global_myworkgroup( new_workgroup );5342 }5343 5344 if ( strlen(calling_name) != 0 ) {5345 set_global_myname( calling_name );5346 } else {5347 TALLOC_FREE(calling_name);5348 calling_name = talloc_strdup(frame, global_myname() );5349 }5350 5351 5860 smb_encrypt = get_cmdline_auth_info_smb_encrypt(auth_info); 5352 5861 if (!init_names()) { … … 5356 5865 5357 5866 if(new_name_resolve_order) 5358 lp_set_ name_resolve_order(new_name_resolve_order);5359 5360 if (!tar_t ype&& !query_host && !service && !message) {5867 lp_set_cmdline("name resolve order", new_name_resolve_order); 5868 5869 if (!tar_to_process(tar_ctx) && !query_host && !service && !message) { 5361 5870 poptPrintUsage(pc, stderr, 0); 5362 5871 exit(1); … … 5364 5873 5365 5874 poptFreeContext(pc); 5875 popt_burn_cmdline_password(argc, argv); 5366 5876 5367 5877 DEBUG(3,("Client started (version %s).\n", samba_version_string())); … … 5370 5880 set_cmdline_auth_info_getpass(auth_info); 5371 5881 5372 if (tar_type) { 5882 max_protocol = lp_client_max_protocol(); 5883 5884 if (tar_to_process(tar_ctx)) { 5373 5885 if (cmdstr) 5374 5886 process_command_string(cmdstr); 5375 return do_tar_op(base_directory); 5376 } 5377 5378 if (query_host && *query_host) { 5887 rc = do_tar_op(base_directory); 5888 } else if (query_host && *query_host) { 5379 5889 char *qhost = query_host; 5380 5890 char *slash; … … 5394 5904 } 5395 5905 5396 return do_host_query(qhost); 5397 } 5398 5399 if (message) { 5400 return do_message_op(auth_info); 5401 } 5402 5403 if (process(base_directory)) { 5404 return 1; 5906 rc = do_host_query(qhost); 5907 } else if (message) { 5908 rc = do_message_op(auth_info); 5909 } else if (process(base_directory)) { 5910 rc = 1; 5405 5911 } 5406 5912
Note:
See TracChangeset
for help on using the changeset viewer.