Add net rap file user
[ira/wip.git] / source3 / utils / net_rap.c
index 6e8f0d088dafc4d24f20cf1deb00912688629674..b4de37488511e30f8fffd8df10364ae7aab5eb26 100644 (file)
@@ -11,7 +11,7 @@
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
    
    This program is distributed in the hope that it will be useful,
@@ -20,8 +20,7 @@
    GNU General Public License for more details.
    
    You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
 #include "includes.h"
 #include "utils/net.h"
@@ -84,7 +83,7 @@ static int rap_file_close(int argc, const char **argv)
                return net_rap_file_usage(argc, argv);
        }
 
-       if (!(cli = net_make_ipc_connection(0))) 
+       if (!NT_STATUS_IS_OK(net_make_ipc_connection(0, &cli)))
                 return -1;
 
        ret = cli_NetFileClose(cli, atoi(argv[0]));
@@ -99,7 +98,7 @@ static int rap_file_info(int argc, const char **argv)
        if (argc == 0)
                return net_rap_file_usage(argc, argv);
        
-       if (!(cli = net_make_ipc_connection(0))) 
+       if (!NT_STATUS_IS_OK(net_make_ipc_connection(0, &cli)))
                 return -1;
 
        ret = cli_NetFileGetInfo(cli, atoi(argv[0]), one_file_fn);
@@ -109,11 +108,23 @@ static int rap_file_info(int argc, const char **argv)
 
 static int rap_file_user(int argc, const char **argv)
 {
+       struct cli_state *cli;
+       int ret;
+
        if (argc == 0)
                return net_rap_file_usage(argc, argv);
 
-       d_printf("net rap file user not implemented yet\n");
-       return -1;
+       if (!NT_STATUS_IS_OK(net_make_ipc_connection(0, &cli)))
+               return -1;
+
+       /* list open files */
+
+       d_printf("\nEnumerating open files on remote server:\n\n"
+                "\nFileId  Opened by            Perms  Locks  Path \n"
+                "------  ---------            -----  -----  ---- \n");
+       ret = cli_NetFileEnum(cli, argv[0], NULL, file_fn);
+       cli_shutdown(cli);
+       return ret;
 }
 
 int net_rap_file(int argc, const char **argv)
@@ -129,14 +140,14 @@ int net_rap_file(int argc, const char **argv)
                struct cli_state *cli;
                int ret;
                
-               if (!(cli = net_make_ipc_connection(0))) 
+               if (!NT_STATUS_IS_OK(net_make_ipc_connection(0, &cli)))
                         return -1;
 
                /* list open files */
-               d_printf(
-                "\nEnumerating open files on remote server:\n\n"\
-                "\nFileId  Opened by            Perms  Locks  Path \n"\
-                "------  ---------            -----  -----  ---- \n");
+
+               d_printf("\nEnumerating open files on remote server:\n\n"
+                        "\nFileId  Opened by            Perms  Locks  Path \n"
+                        "------  ---------            -----  -----  ---- \n");
                ret = cli_NetFileEnum(cli, NULL, NULL, file_fn);
                cli_shutdown(cli);
                return ret;
@@ -173,7 +184,7 @@ static int rap_share_delete(int argc, const char **argv)
                return net_rap_share_usage(argc, argv);
        }
 
-       if (!(cli = net_make_ipc_connection(0))) 
+       if (!NT_STATUS_IS_OK(net_make_ipc_connection(0, &cli)))
                 return -1;
 
        ret = cli_NetShareDelete(cli, argv[0]);
@@ -195,11 +206,15 @@ static int rap_share_add(int argc, const char **argv)
                return net_rap_share_usage(argc, argv);
        }
                        
-       if (!(cli = net_make_ipc_connection(0))) 
+       if (!NT_STATUS_IS_OK(net_make_ipc_connection(0, &cli)))
                 return -1;
 
        sharename = SMB_STRDUP(argv[0]);
        p = strchr(sharename, '=');
+       if (p == NULL) {
+               d_printf("Server path not specified\n");
+               return net_rap_share_usage(argc, argv);
+       }
        *p = 0;
        strlcpy(sinfo.share_name, sharename, sizeof(sinfo.share_name));
        sinfo.reserved1 = '\0';
@@ -231,7 +246,7 @@ int net_rap_share(int argc, const char **argv)
                struct cli_state *cli;
                int ret;
                
-               if (!(cli = net_make_ipc_connection(0))) 
+               if (!NT_STATUS_IS_OK(net_make_ipc_connection(0, &cli)))
                        return -1;
                
                if (opt_long_list_entries) {
@@ -317,7 +332,7 @@ static int rap_session_info(int argc, const char **argv)
        struct cli_state *cli;
        int ret;
        
-       if (!(cli = net_make_ipc_connection(0))) 
+       if (!NT_STATUS_IS_OK(net_make_ipc_connection(0, &cli)))
                 return -1;
 
        if (argc == 0) 
@@ -343,7 +358,7 @@ static int rap_session_delete(int argc, const char **argv)
        struct cli_state *cli;
        int ret;
        
-       if (!(cli = net_make_ipc_connection(0))) 
+       if (!NT_STATUS_IS_OK(net_make_ipc_connection(0, &cli)))
                 return -1;
 
        if (argc == 0) 
@@ -367,7 +382,7 @@ int net_rap_session(int argc, const char **argv)
                struct cli_state *cli;
                int ret;
                
-               if (!(cli = net_make_ipc_connection(0))) 
+               if (!NT_STATUS_IS_OK(net_make_ipc_connection(0, &cli)))
                        return -1;
 
                d_printf("Computer             User name            "\
@@ -403,13 +418,45 @@ int net_rap_server_usage(int argc, const char **argv)
        net_common_flags_usage(argc, argv);
        return -1;
 }
+
+static int net_rap_server_name(int argc, const char *argv[])
+{
+       struct cli_state *cli;
+       char *name;
+
+       if (!NT_STATUS_IS_OK(net_make_ipc_connection(0, &cli)))
+                return -1;
+
+       if (!cli_get_server_name(NULL, cli, &name)) {
+               d_fprintf(stderr, "cli_get_server_name failed\n");
+               cli_shutdown(cli);
+               return -1;
+       }
+
+       d_printf("Server name = %s\n", name);
+
+       TALLOC_FREE(name);
+       cli_shutdown(cli);
+       return 0;
+}
                    
 int net_rap_server(int argc, const char **argv)
 {
        struct cli_state *cli;
        int ret;
-       
-       if (!(cli = net_make_ipc_connection(0))) 
+
+       if (argc > 0) {
+               if (strequal(argv[0], "name")) {
+                       return net_rap_server_name(argc, argv);
+               }
+               /* smb4k uses 'net [rap|rpc] server domain' to query servers in a domain */
+               /* Fall through for 'domain', any other forms will cause to show usage message */
+               if (!strequal(argv[0], "domain")) {
+                       return net_rap_server_usage(argc-1, argv+1);
+               }
+       }
+
+       if (!NT_STATUS_IS_OK(net_make_ipc_connection(0, &cli)))
                 return -1;
 
        d_printf("\nEnumerating servers in this domain or workgroup: \n\n"\
@@ -437,7 +484,7 @@ int net_rap_domain(int argc, const char **argv)
        struct cli_state *cli;
        int ret;
        
-       if (!(cli = net_make_ipc_connection(0))) 
+       if (!NT_STATUS_IS_OK(net_make_ipc_connection(0, &cli)))
                 return -1;
 
        d_printf("\nEnumerating domains:\n\n"\
@@ -534,7 +581,7 @@ static int rap_printq_info(int argc, const char **argv)
        if (argc == 0) 
                 return net_rap_printq_usage(argc, argv);
 
-       if (!(cli = net_make_ipc_connection(0))) 
+       if (!NT_STATUS_IS_OK(net_make_ipc_connection(0, &cli)))
                 return -1;
 
        d_printf(PRINTQ_ENUM_DISPLAY, cli->desthost); /* list header */
@@ -551,7 +598,7 @@ static int rap_printq_delete(int argc, const char **argv)
        if (argc == 0) 
                 return net_rap_printq_usage(argc, argv);
 
-       if (!(cli = net_make_ipc_connection(0))) 
+       if (!NT_STATUS_IS_OK(net_make_ipc_connection(0, &cli)))
                 return -1;
 
        ret = cli_printjob_del(cli, atoi(argv[0]));
@@ -571,7 +618,7 @@ int net_rap_printq(int argc, const char **argv)
        };
 
        if (argc == 0) {
-               if (!(cli = net_make_ipc_connection(0))) 
+               if (!NT_STATUS_IS_OK(net_make_ipc_connection(0, &cli)))
                        return -1;
 
                d_printf(PRINTQ_ENUM_DISPLAY, cli->desthost); /* list header */
@@ -589,9 +636,7 @@ static int net_rap_user_usage(int argc, const char **argv)
        return net_help_user(argc, argv);
 } 
        
-static void user_fn(const char *user_name, const char *comment,
-                   const char * home_dir, const char * logon_script,
-                   void *state)
+static void user_fn(const char *user_name, void *state)
 {
        d_printf("%-21.21s\n", user_name);
 }
@@ -619,7 +664,7 @@ static int rap_user_delete(int argc, const char **argv)
                 return net_rap_user_usage(argc, argv);
        }
 
-       if (!(cli = net_make_ipc_connection(0))) 
+       if (!NT_STATUS_IS_OK(net_make_ipc_connection(0, &cli)))
                 return -1;
 
        ret = cli_NetUserDelete(cli, argv[0]);
@@ -638,7 +683,7 @@ static int rap_user_add(int argc, const char **argv)
                 return net_rap_user_usage(argc, argv);
        }
 
-       if (!(cli = net_make_ipc_connection(0)))
+       if (!NT_STATUS_IS_OK(net_make_ipc_connection(0, &cli)))
                 return -1;
                        
        safe_strcpy(userinfo.user_name, argv[0], sizeof(userinfo.user_name)-1);
@@ -667,7 +712,7 @@ static int rap_user_info(int argc, const char **argv)
                 return net_rap_user_usage(argc, argv);
        }
 
-       if (!(cli = net_make_ipc_connection(0)))
+       if (!NT_STATUS_IS_OK(net_make_ipc_connection(0, &cli)))
                 return -1;
 
        ret = cli_NetUserGetGroups(cli, argv[0], group_member_fn, NULL);
@@ -687,7 +732,7 @@ int net_rap_user(int argc, const char **argv)
 
        if (argc == 0) {
                struct cli_state *cli;
-               if (!(cli = net_make_ipc_connection(0)))
+               if (!NT_STATUS_IS_OK(net_make_ipc_connection(0, &cli)))
                         goto done;
                if (opt_long_list_entries) {
                        d_printf("\nUser name             Comment"\
@@ -696,7 +741,7 @@ int net_rap_user(int argc, const char **argv)
                        cli_shutdown(cli);
                        goto done;
                }
-               ret = cli_RNetUserEnum(cli, user_fn, NULL); 
+               ret = cli_RNetUserEnum0(cli, user_fn, NULL); 
                cli_shutdown(cli);
                goto done;
        }
@@ -721,7 +766,7 @@ static void long_group_fn(const char *group_name, const char *comment,
        d_printf("%-21.21s %s\n", group_name, comment);
 }
 
-static void group_fn(const char *group_name, const char *comment, void *state)
+static void group_fn(const char *group_name, void *state)
 {
        d_printf("%-21.21s\n", group_name);
 }
@@ -735,7 +780,7 @@ static int rap_group_delete(int argc, const char **argv)
                 return net_rap_group_usage(argc, argv);
        }
 
-       if (!(cli = net_make_ipc_connection(0)))
+       if (!NT_STATUS_IS_OK(net_make_ipc_connection(0, &cli)))
                 return -1;
 
        ret = cli_NetGroupDelete(cli, argv[0]);
@@ -754,7 +799,7 @@ static int rap_group_add(int argc, const char **argv)
                 return net_rap_group_usage(argc, argv);
        }
 
-       if (!(cli = net_make_ipc_connection(0)))
+       if (!NT_STATUS_IS_OK(net_make_ipc_connection(0, &cli)))
                 return -1;
                        
        /* BB check for length 21 or smaller explicitly ? BB */
@@ -778,7 +823,7 @@ int net_rap_group(int argc, const char **argv)
        if (argc == 0) {
                struct cli_state *cli;
                int ret;
-               if (!(cli = net_make_ipc_connection(0)))
+               if (!NT_STATUS_IS_OK(net_make_ipc_connection(0, &cli)))
                         return -1;
                if (opt_long_list_entries) {
                        d_printf("Group name            Comment\n");
@@ -787,7 +832,7 @@ int net_rap_group(int argc, const char **argv)
                        cli_shutdown(cli);
                        return ret;
                }
-               ret = cli_RNetGroupEnum(cli, group_fn, NULL); 
+               ret = cli_RNetGroupEnum0(cli, group_fn, NULL); 
                cli_shutdown(cli);
                return ret;
        }
@@ -819,7 +864,7 @@ static int rap_groupmember_add(int argc, const char **argv)
                 return net_rap_groupmember_usage(argc, argv);
        }
 
-       if (!(cli = net_make_ipc_connection(0)))
+       if (!NT_STATUS_IS_OK(net_make_ipc_connection(0, &cli)))
                 return -1;
 
        ret = cli_NetGroupAddUser(cli, argv[0], argv[1]);
@@ -836,7 +881,7 @@ static int rap_groupmember_delete(int argc, const char **argv)
                 return net_rap_groupmember_usage(argc, argv);
        }
        
-       if (!(cli = net_make_ipc_connection(0)))
+       if (!NT_STATUS_IS_OK(net_make_ipc_connection(0, &cli)))
                 return -1;
 
        ret = cli_NetGroupDelUser(cli, argv[0], argv[1]);
@@ -853,7 +898,7 @@ static int rap_groupmember_list(int argc, const char **argv)
                 return net_rap_groupmember_usage(argc, argv);
        }
 
-       if (!(cli = net_make_ipc_connection(0)))
+       if (!NT_STATUS_IS_OK(net_make_ipc_connection(0, &cli)))
                 return -1;
 
        ret = cli_NetGroupGetUsers(cli, argv[0], group_member_fn, NULL ); 
@@ -912,6 +957,12 @@ static int rap_service_stop(int argc, const char **argv)
        return errmsg_not_implemented();
 }
 
+static void service_fn(const char *service_name, const char *dummy,
+                      void *state)
+{
+       d_printf("%-21.21s\n", service_name);
+}
+
 int net_rap_service(int argc, const char **argv)
 {
        struct functable func[] = {
@@ -923,7 +974,7 @@ int net_rap_service(int argc, const char **argv)
        if (argc == 0) {
                struct cli_state *cli;
                int ret;
-               if (!(cli = net_make_ipc_connection(0))) 
+               if (!NT_STATUS_IS_OK(net_make_ipc_connection(0, &cli)))
                        return -1;
 
                if (opt_long_list_entries) {
@@ -931,7 +982,7 @@ int net_rap_service(int argc, const char **argv)
                        d_printf("-----------------------------\n");
                        ret = cli_RNetServiceEnum(cli, long_group_fn, NULL);
                }
-               ret = cli_RNetServiceEnum(cli, group_fn, NULL); 
+               ret = cli_RNetServiceEnum(cli, service_fn, NULL); 
                cli_shutdown(cli);
                return ret;
        }
@@ -957,7 +1008,7 @@ int net_rap_password(int argc, const char **argv)
        if (argc < 3) 
                 return net_rap_password_usage(argc, argv);
 
-       if (!(cli = net_make_ipc_connection(0))) 
+       if (!NT_STATUS_IS_OK(net_make_ipc_connection(0, &cli)))
                 return -1;
 
        /* BB Add check for password lengths? */