-/*
- run a function from a function table. If not found then
- call the specified usage function
-*/
-int net_run_function(int argc, const char **argv, struct functable *table,
- int (*usage_fn)(int argc, const char **argv))
-{
- int i;
-
- if (argc < 1) {
- d_printf("\nUsage: \n");
- return usage_fn(argc, argv);
- }
- for (i=0; table[i].funcname; i++) {
- if (StrCaseCmp(argv[0], table[i].funcname) == 0)
- return table[i].fn(argc-1, argv+1);
- }
- d_printf("No command: %s\n", argv[0]);
- return usage_fn(argc, argv);
-}
-
-/****************************************************************************
-connect to \\server\service
-****************************************************************************/
-NTSTATUS connect_to_service(struct cli_state **c, struct in_addr *server_ip,
- const char *server_name,
- const char *service_name,
- const char *service_type)
-{
- NTSTATUS nt_status;
-
- if (!opt_password && !opt_machine_pass) {
- char *pass = getpass("Password:");
- if (pass) {
- opt_password = SMB_STRDUP(pass);
- }
- }
-
- nt_status = cli_full_connection(c, NULL, server_name,
- server_ip, opt_port,
- service_name, service_type,
- opt_user_name, opt_workgroup,
- opt_password, 0, Undefined, NULL);
-
- if (NT_STATUS_IS_OK(nt_status)) {
- return nt_status;
- } else {
- d_printf("Could not connect to server %s\n", server_name);
-
- /* Display a nicer message depending on the result */
-
- if (NT_STATUS_V(nt_status) ==
- NT_STATUS_V(NT_STATUS_LOGON_FAILURE))
- d_printf("The username or password was not correct.\n");
-
- if (NT_STATUS_V(nt_status) ==
- NT_STATUS_V(NT_STATUS_ACCOUNT_LOCKED_OUT))
- d_printf("The account was locked out.\n");
-
- if (NT_STATUS_V(nt_status) ==
- NT_STATUS_V(NT_STATUS_ACCOUNT_DISABLED))
- d_printf("The account was disabled.\n");
-
- return nt_status;
- }
-}
-
-
-/****************************************************************************
-connect to \\server\ipc$
-****************************************************************************/
-NTSTATUS connect_to_ipc(struct cli_state **c, struct in_addr *server_ip,
- const char *server_name)
-{
- return connect_to_service(c, server_ip, server_name, "IPC$", "IPC");
-}
-
-/****************************************************************************
-connect to \\server\ipc$ anonymously
-****************************************************************************/
-NTSTATUS connect_to_ipc_anonymous(struct cli_state **c,
- struct in_addr *server_ip, const char *server_name)
-{
- NTSTATUS nt_status;
-
- nt_status = cli_full_connection(c, opt_requester_name, server_name,
- server_ip, opt_port,
- "IPC$", "IPC",
- "", "",
- "", 0, Undefined, NULL);
-
- if (NT_STATUS_IS_OK(nt_status)) {
- return nt_status;
- } else {
- DEBUG(1,("Cannot connect to server (anonymously). Error was %s\n", nt_errstr(nt_status)));
- return nt_status;
- }
-}
-
-/**
- * Connect a server and open a given pipe
- *
- * @param cli_dst A cli_state
- * @param pipe The pipe to open
- * @param got_pipe boolean that stores if we got a pipe
- *
- * @return Normal NTSTATUS return.
- **/
-NTSTATUS connect_pipe(struct cli_state **cli_dst, int pipe_num, BOOL *got_pipe)
-{
- NTSTATUS nt_status;
- char *server_name = SMB_STRDUP("127.0.0.1");
- struct cli_state *cli_tmp = NULL;
-
- if (opt_destination)
- server_name = SMB_STRDUP(opt_destination);
-
- /* make a connection to a named pipe */
- nt_status = connect_to_ipc(&cli_tmp, NULL, server_name);
- if (!NT_STATUS_IS_OK(nt_status))
- return nt_status;
-
- if (!cli_nt_session_open(cli_tmp, pipe_num)) {
- DEBUG(0, ("couldn't not initialize pipe\n"));
- cli_shutdown(cli_tmp);
- return NT_STATUS_UNSUCCESSFUL;
- }
-
- *cli_dst = cli_tmp;
- *got_pipe = True;
-
- return nt_status;
-}
-
-
-/****************************************************************************
- Use the local machine's password for this session
-****************************************************************************/
-int net_use_machine_password(void)
-{
- char *user_name = NULL;
-
- if (!secrets_init()) {
- d_printf("ERROR: Unable to open secrets database\n");
- exit(1);
- }
-
- user_name = NULL;
- opt_password = secrets_fetch_machine_password(opt_target_workgroup, NULL, NULL);
- if (asprintf(&user_name, "%s$@%s", global_myname(), lp_realm()) == -1) {
- return -1;
- }
- opt_user_name = user_name;
- return 0;
-}
-
-BOOL net_find_server(unsigned flags, struct in_addr *server_ip, char **server_name)
-{
-
- if (opt_host) {
- *server_name = SMB_STRDUP(opt_host);
- }
-
- if (opt_have_ip) {
- *server_ip = opt_dest_ip;
- if (!*server_name) {
- *server_name = SMB_STRDUP(inet_ntoa(opt_dest_ip));
- }
- } else if (*server_name) {
- /* resolve the IP address */
- if (!resolve_name(*server_name, server_ip, 0x20)) {
- DEBUG(1,("Unable to resolve server name\n"));
- return False;
- }
- } else if (flags & NET_FLAGS_PDC) {
- struct in_addr pdc_ip;
-
- if (get_pdc_ip(opt_target_workgroup, &pdc_ip)) {
- fstring dc_name;
-
- if (is_zero_ip(pdc_ip))
- return False;
-
- if ( !name_status_find(opt_target_workgroup, 0x1b, 0x20, pdc_ip, dc_name) )
- return False;
-
- *server_name = SMB_STRDUP(dc_name);
- *server_ip = pdc_ip;
- }
-
- } else if (flags & NET_FLAGS_DMB) {
- struct in_addr msbrow_ip;
- /* if (!resolve_name(MSBROWSE, &msbrow_ip, 1)) */
- if (!resolve_name(opt_target_workgroup, &msbrow_ip, 0x1B)) {
- DEBUG(1,("Unable to resolve domain browser via name lookup\n"));
- return False;
- } else {
- *server_ip = msbrow_ip;
- }
- *server_name = SMB_STRDUP(inet_ntoa(opt_dest_ip));
- } else if (flags & NET_FLAGS_MASTER) {
- struct in_addr brow_ips;
- if (!resolve_name(opt_target_workgroup, &brow_ips, 0x1D)) {
- /* go looking for workgroups */
- DEBUG(1,("Unable to resolve master browser via name lookup\n"));
- return False;
- } else {
- *server_ip = brow_ips;
- }
- *server_name = SMB_STRDUP(inet_ntoa(opt_dest_ip));
- } else if (!(flags & NET_FLAGS_LOCALHOST_DEFAULT_INSANE)) {
- *server_ip = loopback_ip;
- *server_name = SMB_STRDUP("127.0.0.1");
- }
-
- if (!server_name || !*server_name) {
- DEBUG(1,("no server to connect to\n"));
- return False;
- }
-
- return True;
-}
-
-
-BOOL net_find_pdc(struct in_addr *server_ip, fstring server_name, const char *domain_name)
-{
- if (get_pdc_ip(domain_name, server_ip)) {
- if (is_zero_ip(*server_ip))
- return False;
-
- if (!name_status_find(domain_name, 0x1b, 0x20, *server_ip, server_name))
- return False;
-
- return True;
- }
- else
- return False;
-}
-
-
-struct cli_state *net_make_ipc_connection(unsigned flags)
-{
- char *server_name = NULL;
- struct in_addr server_ip;
- struct cli_state *cli = NULL;
- NTSTATUS nt_status;
-
- if (!net_find_server(flags, &server_ip, &server_name)) {
- d_printf("\nUnable to find a suitable server\n");
- return NULL;
- }
-
- if (flags & NET_FLAGS_ANONYMOUS) {
- nt_status = connect_to_ipc_anonymous(&cli, &server_ip, server_name);
- } else {
- nt_status = connect_to_ipc(&cli, &server_ip, server_name);
- }
-
- SAFE_FREE(server_name);
- if (NT_STATUS_IS_OK(nt_status)) {
- return cli;
- } else {
- return NULL;
- }
-}
-
-static int net_user(int argc, const char **argv)