Add net rap file user
[ira/wip.git] / source3 / utils / net_rap.c
index 8f3dd53fa6aaa614082460f473f03d742bcb3ee2..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,
    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"
+#include "utils/net.h"
 
 /* The following messages were for error checking that is not properly 
    reported at the moment.  Which should be reinstated? */
@@ -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;
@@ -153,14 +164,14 @@ int net_rap_share_usage(int argc, const char **argv)
 static void long_share_fn(const char *share_name, uint32 type, 
                          const char *comment, void *state)
 {
-       d_printf("%-12.12s %-8.8s %-50.50s\n",
+       d_printf("%-12s %-8.8s %-50s\n",
                 share_name, share_type[type], comment);
 }
 
 static void share_fn(const char *share_name, uint32 type, 
                     const char *comment, void *state)
 {
-       d_printf("%-12.12s\n", share_name);
+       d_printf("%s\n", share_name);
 }
 
 static int rap_share_delete(int argc, const char **argv)
@@ -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 = strdup(argv[0]);
+       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) {
@@ -240,8 +255,9 @@ int net_rap_share(int argc, const char **argv)
        "\nShare name   Type     Description\n"\
        "----------   ----     -----------\n");
                        ret = cli_RNetShareEnum(cli, long_share_fn, NULL);
+               } else {
+                       ret = cli_RNetShareEnum(cli, share_fn, NULL);
                }
-               ret = cli_RNetShareEnum(cli, share_fn, NULL);
                cli_shutdown(cli);
                return ret;
        }
@@ -260,6 +276,9 @@ int net_rap_session_usage(int argc, const char **argv)
         "\tor"\
         "\nnet rap session CLOSE <client_name> [misc. options] [targets]"\
         "\n\tDeletes (closes) a session from specified client to server\n");
+       d_printf(
+       "\nnet rap session INFO <client_name>"\
+       "\n\tEnumerates all open files in specified session\n");
 
        net_common_flags_usage(argc, argv);
        return -1;
@@ -313,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) 
@@ -339,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) 
@@ -363,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            "\
@@ -399,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"\
@@ -433,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"\
@@ -460,7 +511,6 @@ int net_rap_printq_usage(int argc, const char **argv)
         "\tprinter queue if no job number is specified\n");
 
        net_common_flags_usage(argc, argv);
-        d_printf("\t-j or --jobid=<job id>\t\tjob id\n");
 
        return -1;
 }      
@@ -531,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 */
@@ -548,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]));
@@ -568,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 */
@@ -586,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);
 }
@@ -597,7 +645,7 @@ static void long_user_fn(const char *user_name, const char *comment,
                         const char * home_dir, const char * logon_script, 
                         void *state)
 {
-       d_printf("%-21.21s %-50.50s\n",
+       d_printf("%-21.21s %s\n",
                 user_name, comment);
 }
 
@@ -616,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]);
@@ -635,10 +683,10 @@ 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));
+       safe_strcpy(userinfo.user_name, argv[0], sizeof(userinfo.user_name)-1);
        if (opt_flags == -1) 
                 opt_flags = 0x21; 
                        
@@ -664,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);
@@ -684,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"\
@@ -693,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;
        }
@@ -715,10 +763,10 @@ int net_rap_group_usage(int argc, const char **argv)
 static void long_group_fn(const char *group_name, const char *comment,
                          void *state)
 {
-       d_printf("%-21.21s %-50.50s\n", group_name, 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);
 }
@@ -732,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]);
@@ -751,11 +799,11 @@ 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 */
-       safe_strcpy(grinfo.group_name, argv[0], sizeof(grinfo.group_name));
+       safe_strcpy(grinfo.group_name, argv[0], sizeof(grinfo.group_name)-1);
        grinfo.reserved1 = '\0';
        grinfo.comment = smb_xstrdup(opt_comment);
        
@@ -775,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");
@@ -784,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;
        }
@@ -816,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]);
@@ -833,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]);
@@ -850,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 ); 
@@ -909,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[] = {
@@ -920,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) {
@@ -928,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;
        }
@@ -954,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? */