Convert all uint32/16/8 to _t in source3/libsmb.
[bbaumbach/samba-autobuild/.git] / source3 / libsmb / libsmb_dir.c
index 7661ecf2f8a6250eda414cb07d86c9d8c5a3f899..d131c30c772348b9b0267bc66dbf423da6c369d1 100644 (file)
 */
 
 #include "includes.h"
-#include "popt_common.h"
+#include "libsmb/libsmb.h"
+#include "auth_info.h"
 #include "libsmbclient.h"
 #include "libsmb_internal.h"
-#include "../librpc/gen_ndr/cli_srvsvc.h"
+#include "rpc_client/cli_pipe.h"
+#include "../librpc/gen_ndr/ndr_srvsvc_c.h"
+#include "libsmb/nmblib.h"
+#include "../libcli/smb/smbXcli_base.h"
 
 /*
  * Routine to open a directory
@@ -56,7 +60,7 @@ static int
 add_dirent(SMBCFILE *dir,
            const char *name,
            const char *comment,
-           uint32 type)
+           uint32_t type)
 {
        struct smbc_dirent *dirent;
        int size;
@@ -134,7 +138,7 @@ add_dirent(SMBCFILE *dir,
 
 static void
 list_unique_wg_fn(const char *name,
-                  uint32 type,
+                  uint32_t type,
                   const char *comment,
                   void *state)
 {
@@ -147,9 +151,10 @@ list_unique_wg_fn(const char *name,
        dirent_type = dir->dir_type;
 
        if (add_dirent(dir, name, comment, dirent_type) < 0) {
-
                /* An error occurred, what do we do? */
                /* FIXME: Add some code here */
+               /* Change cli_NetServerEnum to take a fn
+                  returning NTSTATUS... JRA. */
        }
 
         /* Point to the one just added */
@@ -178,7 +183,7 @@ list_unique_wg_fn(const char *name,
 
 static void
 list_fn(const char *name,
-        uint32 type,
+        uint32_t type,
         const char *comment,
         void *state)
 {
@@ -227,14 +232,14 @@ list_fn(const char *name,
         }
 
        if (add_dirent(dir, name, comment, dirent_type) < 0) {
-
                /* An error occurred, what do we do? */
                /* FIXME: Add some code here */
-
+               /* Change cli_NetServerEnum to take a fn
+                  returning NTSTATUS... JRA. */
        }
 }
 
-static void
+static NTSTATUS
 dir_list_fn(const char *mnt,
             struct file_info *finfo,
             const char *mask,
@@ -242,28 +247,25 @@ dir_list_fn(const char *mnt,
 {
 
        if (add_dirent((SMBCFILE *)state, finfo->name, "",
-                      (finfo->mode&aDIR?SMBC_DIR:SMBC_FILE)) < 0) {
-
-               /* Handle an error ... */
-
-               /* FIXME: Add some code ... */
-
+                      (finfo->mode&FILE_ATTRIBUTE_DIRECTORY?SMBC_DIR:SMBC_FILE)) < 0) {
+               SMBCFILE *dir = (SMBCFILE *)state;
+               return map_nt_error_from_unix(dir->dir_error);
        }
-
+       return NT_STATUS_OK;
 }
 
 static int
 net_share_enum_rpc(struct cli_state *cli,
                    void (*fn)(const char *name,
-                              uint32 type,
+                              uint32_t type,
                               const char *comment,
                               void *state),
                    void *state)
 {
         int i;
        WERROR result;
-       uint32 preferred_len = 0xffffffff;
-        uint32 type;
+       uint32_t preferred_len = 0xffffffff;
+        uint32_t type;
        struct srvsvc_NetShareInfoCtr info_ctr;
        struct srvsvc_NetShareCtr1 ctr1;
        fstring name = "";
@@ -272,9 +274,10 @@ net_share_enum_rpc(struct cli_state *cli,
         NTSTATUS nt_status;
        uint32_t resume_handle = 0;
        uint32_t total_entries = 0;
+       struct dcerpc_binding_handle *b;
 
         /* Open the server service pipe */
-        nt_status = cli_rpc_pipe_open_noauth(cli, &ndr_table_srvsvc.syntax_id,
+        nt_status = cli_rpc_pipe_open_noauth(cli, &ndr_table_srvsvc,
                                             &pipe_hnd);
         if (!NT_STATUS_IS_OK(nt_status)) {
                 DEBUG(1, ("net_share_enum_rpc pipe open fail!\n"));
@@ -287,8 +290,10 @@ net_share_enum_rpc(struct cli_state *cli,
        info_ctr.level = 1;
        info_ctr.ctr.ctr1 = &ctr1;
 
+       b = pipe_hnd->binding_handle;
+
         /* Issue the NetShareEnum RPC call and retrieve the response */
-       nt_status = rpccli_srvsvc_NetShareEnumAll(pipe_hnd, talloc_tos(),
+       nt_status = dcerpc_srvsvc_NetShareEnumAll(b, talloc_tos(),
                                                  pipe_hnd->desthost,
                                                  &info_ctr,
                                                  preferred_len,
@@ -297,12 +302,23 @@ net_share_enum_rpc(struct cli_state *cli,
                                                  &result);
 
         /* Was it successful? */
-       if (!NT_STATUS_IS_OK(nt_status) || !W_ERROR_IS_OK(result) ||
-           total_entries == 0) {
+       if (!NT_STATUS_IS_OK(nt_status)) {
+                /*  Nope.  Go clean up. */
+               result = ntstatus_to_werror(nt_status);
+               goto done;
+       }
+
+       if (!W_ERROR_IS_OK(result)) {
                 /*  Nope.  Go clean up. */
                goto done;
         }
 
+       if (total_entries == 0) {
+                /*  Nope.  Go clean up. */
+               result = WERR_GENERAL_FAILURE;
+               goto done;
+       }
+
         /* For each returned entry... */
         for (i = 0; i < info_ctr.ctr.ctr1->count; i++) {
 
@@ -361,7 +377,8 @@ SMBC_opendir_ctx(SMBCCTX *context,
         char *options = NULL;
        char *workgroup = NULL;
        char *path = NULL;
-        uint16 mode;
+        uint16_t mode;
+       uint16_t port = 0;
         char *p = NULL;
        SMBCSRV *srv  = NULL;
        SMBCFILE *dir = NULL;
@@ -370,16 +387,16 @@ SMBC_opendir_ctx(SMBCCTX *context,
 
        if (!context || !context->internal->initialized) {
                DEBUG(4, ("no valid context\n"));
-               errno = EINVAL + 8192;
                TALLOC_FREE(frame);
+               errno = EINVAL + 8192;
                return NULL;
 
        }
 
        if (!fname) {
                DEBUG(4, ("no valid fname\n"));
-               errno = EINVAL + 8193;
                TALLOC_FREE(frame);
+               errno = EINVAL + 8193;
                return NULL;
        }
 
@@ -388,14 +405,15 @@ SMBC_opendir_ctx(SMBCCTX *context,
                             fname,
                             &workgroup,
                             &server,
+                            &port,
                             &share,
                             &path,
                             &user,
                             &password,
                             &options)) {
                DEBUG(4, ("no valid path\n"));
-               errno = EINVAL + 8194;
                TALLOC_FREE(frame);
+               errno = EINVAL + 8194;
                return NULL;
        }
 
@@ -406,16 +424,16 @@ SMBC_opendir_ctx(SMBCCTX *context,
         /* Ensure the options are valid */
         if (SMBC_check_options(server, share, path, options)) {
                 DEBUG(4, ("unacceptable options (%s)\n", options));
-                errno = EINVAL + 8195;
                TALLOC_FREE(frame);
+                errno = EINVAL + 8195;
                 return NULL;
         }
 
        if (!user || user[0] == (char)0) {
                user = talloc_strdup(frame, smbc_getUser(context));
                if (!user) {
-                       errno = ENOMEM;
                        TALLOC_FREE(frame);
+                       errno = ENOMEM;
                        return NULL;
                }
        }
@@ -423,8 +441,8 @@ SMBC_opendir_ctx(SMBCCTX *context,
        dir = SMB_MALLOC_P(SMBCFILE);
 
        if (!dir) {
-               errno = ENOMEM;
                TALLOC_FREE(frame);
+               errno = ENOMEM;
                return NULL;
        }
 
@@ -442,18 +460,19 @@ SMBC_opendir_ctx(SMBCCTX *context,
                 int i;
                 int count;
                 int max_lmb_count;
-                struct ip_service *ip_list;
-                struct ip_service server_addr;
+                struct sockaddr_storage *ip_list;
+                struct sockaddr_storage server_addr;
                 struct user_auth_info u_info;
+               NTSTATUS status;
 
                if (share[0] != (char)0 || path[0] != (char)0) {
 
-                       errno = EINVAL + 8196;
                        if (dir) {
                                SAFE_FREE(dir->fname);
                                SAFE_FREE(dir);
                        }
                        TALLOC_FREE(frame);
+                       errno = EINVAL + 8196;
                        return NULL;
                }
 
@@ -484,28 +503,34 @@ SMBC_opendir_ctx(SMBCCTX *context,
                  */
 
                 ip_list = NULL;
-                if (!NT_STATUS_IS_OK(name_resolve_bcast(MSBROWSE, 1, &ip_list,
-                                                        &count)))
+               status = name_resolve_bcast(MSBROWSE, 1, talloc_tos(),
+                                           &ip_list, &count);
+                if (!NT_STATUS_IS_OK(status))
                {
 
-                        SAFE_FREE(ip_list);
+                        TALLOC_FREE(ip_list);
 
-                        if (!find_master_ip(workgroup, &server_addr.ss)) {
+                        if (!find_master_ip(workgroup, &server_addr)) {
 
                                if (dir) {
                                        SAFE_FREE(dir->fname);
                                        SAFE_FREE(dir);
                                }
-                                errno = ENOENT;
                                TALLOC_FREE(frame);
+                                errno = ENOENT;
                                 return NULL;
                         }
 
-                       ip_list = (struct ip_service *)memdup(
-                               &server_addr, sizeof(server_addr));
+                       ip_list = (struct sockaddr_storage *)talloc_memdup(
+                               talloc_tos(), &server_addr,
+                               sizeof(server_addr));
                        if (ip_list == NULL) {
-                               errno = ENOMEM;
+                               if (dir) {
+                                       SAFE_FREE(dir->fname);
+                                       SAFE_FREE(dir);
+                               }
                                TALLOC_FREE(frame);
+                               errno = ENOMEM;
                                return NULL;
                        }
                         count = 1;
@@ -516,7 +541,7 @@ SMBC_opendir_ctx(SMBCCTX *context,
                        char *wg_ptr = NULL;
                        struct cli_state *cli = NULL;
 
-                       print_sockaddr(addr, sizeof(addr), &ip_list[i].ss);
+                       print_sockaddr(addr, sizeof(addr), &ip_list[i]);
                         DEBUG(99, ("Found master browser %d of %d: %s\n",
                                    i+1, MAX(count, max_lmb_count),
                                    addr));
@@ -532,13 +557,17 @@ SMBC_opendir_ctx(SMBCCTX *context,
                        }
 
                        workgroup = talloc_strdup(frame, wg_ptr);
-                       server = talloc_strdup(frame, cli->desthost);
+                       server = talloc_strdup(frame, smbXcli_conn_remote_name(cli->conn));
 
                         cli_shutdown(cli);
 
                        if (!workgroup || !server) {
-                               errno = ENOMEM;
+                               if (dir) {
+                                       SAFE_FREE(dir->fname);
+                                       SAFE_FREE(dir);
+                               }
                                TALLOC_FREE(frame);
+                               errno = ENOMEM;
                                return NULL;
                        }
 
@@ -552,7 +581,7 @@ SMBC_opendir_ctx(SMBCCTX *context,
                          * workgroups/domains that it knows about.
                          */
 
-                        srv = SMBC_server(frame, context, True, server, "IPC$",
+                        srv = SMBC_server(frame, context, True, server, port, "IPC$",
                                           &workgroup, &user, &password);
                         if (!srv) {
                                 continue;
@@ -572,7 +601,7 @@ SMBC_opendir_ctx(SMBCCTX *context,
                         }
                 }
 
-                SAFE_FREE(ip_list);
+                TALLOC_FREE(ip_list);
         } else {
                 /*
                  * Server not an empty string ... Check the rest and see what
@@ -582,12 +611,12 @@ SMBC_opendir_ctx(SMBCCTX *context,
                        if (*path != '\0') {
 
                                 /* Should not have empty share with path */
-                               errno = EINVAL + 8197;
                                if (dir) {
                                        SAFE_FREE(dir->fname);
                                        SAFE_FREE(dir);
                                }
                                TALLOC_FREE(frame);
+                               errno = EINVAL + 8197;
                                return NULL;
 
                        }
@@ -607,7 +636,7 @@ SMBC_opendir_ctx(SMBCCTX *context,
                          * exist.
                          */
                         srv = SMBC_server(frame, context, False,
-                                          server, "IPC$",
+                                          server, port, "IPC$",
                                           &workgroup, &user, &password);
 
                         /*
@@ -645,8 +674,8 @@ SMBC_opendir_ctx(SMBCCTX *context,
                                                SAFE_FREE(dir->fname);
                                                SAFE_FREE(dir);
                                        }
-                                       errno = EPERM;
                                        TALLOC_FREE(frame);
+                                       errno = EPERM;
                                        return NULL;
 
                                }
@@ -656,7 +685,7 @@ SMBC_opendir_ctx(SMBCCTX *context,
                                  * we do not already have one
                                  */
                                srv = SMBC_server(frame, context, True,
-                                                  buserver, "IPC$",
+                                                  buserver, port, "IPC$",
                                                   &workgroup,
                                                   &user, &password);
                                if (!srv) {
@@ -692,7 +721,7 @@ SMBC_opendir_ctx(SMBCCTX *context,
                                  */
                                 if (!srv) {
                                         srv = SMBC_server(frame, context, True,
-                                                          server, "IPC$",
+                                                          server, port, "IPC$",
                                                           &workgroup,
                                                           &user, &password);
                                 }
@@ -754,7 +783,7 @@ SMBC_opendir_ctx(SMBCCTX *context,
                        /* We connect to the server and list the directory */
                        dir->dir_type = SMBC_FILE_SHARE;
 
-                       srv = SMBC_server(frame, context, True, server, share,
+                       srv = SMBC_server(frame, context, True, server, port, share,
                                           &workgroup, &user, &password);
 
                        if (!srv) {
@@ -781,9 +810,10 @@ SMBC_opendir_ctx(SMBCCTX *context,
                                return NULL;
                        }
 
-                       if (!cli_resolve_path(frame, "", context->internal->auth_info,
-                                               srv->cli, path,
-                                               &targetcli, &targetpath)) {
+                       status = cli_resolve_path(
+                               frame, "", context->internal->auth_info,
+                               srv->cli, path, &targetcli, &targetpath);
+                       if (!NT_STATUS_IS_OK(status)) {
                                d_printf("Could not resolve %s\n", path);
                                if (dir) {
                                        SAFE_FREE(dir->fname);
@@ -794,7 +824,7 @@ SMBC_opendir_ctx(SMBCCTX *context,
                        }
 
                        status = cli_list(targetcli, targetpath,
-                                         aDIR | aSYSTEM | aHIDDEN,
+                                         FILE_ATTRIBUTE_DIRECTORY | FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_HIDDEN,
                                          dir_list_fn, (void *)dir);
                        if (!NT_STATUS_IS_OK(status)) {
                                if (dir) {
@@ -846,8 +876,8 @@ SMBC_opendir_ctx(SMBCCTX *context,
                                         }
                                 }
 
-                                errno = saved_errno;
                                TALLOC_FREE(frame);
+                                errno = saved_errno;
                                return NULL;
                        }
                }
@@ -1050,6 +1080,7 @@ SMBC_getdents_ctx(SMBCCTX *context,
 
        while ((dirlist = dir->dir_next)) {
                struct smbc_dirent *dirent;
+               struct smbc_dirent *currentEntry = (struct smbc_dirent *)ndir;
 
                if (!dirlist->dirent) {
 
@@ -1086,17 +1117,23 @@ SMBC_getdents_ctx(SMBCCTX *context,
 
                }
 
-               memcpy(ndir, dirent, reqd); /* Copy the data in ... */
+               memcpy(currentEntry, dirent, reqd); /* Copy the data in ... */
 
-               ((struct smbc_dirent *)ndir)->comment =
-                       (char *)(&((struct smbc_dirent *)ndir)->name +
-                                 dirent->namelen +
-                                 1);
+               currentEntry->comment = &currentEntry->name[0] +
+                                               dirent->namelen + 1;
 
                ndir += reqd;
-
                rem -= reqd;
 
+               /* Try and align the struct for the next entry
+                  on a valid pointer boundary by appending zeros */
+               while((rem > 0) && ((unsigned long long)ndir & (sizeof(void*) - 1))) {
+                       *ndir = '\0';
+                       rem--;
+                       ndir++;
+                       currentEntry->dirlen++;
+               }
+
                dir->dir_next = dirlist = dirlist -> next;
        }
 
@@ -1126,8 +1163,10 @@ SMBC_mkdir_ctx(SMBCCTX *context,
         char *workgroup = NULL;
        char *path = NULL;
        char *targetpath = NULL;
+       uint16_t port = 0;
        struct cli_state *targetcli = NULL;
        TALLOC_CTX *frame = talloc_stackframe();
+       NTSTATUS status;
 
        if (!context || !context->internal->initialized) {
                errno = EINVAL;
@@ -1148,6 +1187,7 @@ SMBC_mkdir_ctx(SMBCCTX *context,
                             fname,
                             &workgroup,
                             &server,
+                            &port,
                             &share,
                             &path,
                             &user,
@@ -1168,7 +1208,7 @@ SMBC_mkdir_ctx(SMBCCTX *context,
        }
 
        srv = SMBC_server(frame, context, True,
-                          server, share, &workgroup, &user, &password);
+                          server, port, share, &workgroup, &user, &password);
 
        if (!srv) {
 
@@ -1178,9 +1218,9 @@ SMBC_mkdir_ctx(SMBCCTX *context,
        }
 
        /*d_printf(">>>mkdir: resolving %s\n", path);*/
-       if (!cli_resolve_path(frame, "", context->internal->auth_info,
-                               srv->cli, path,
-                               &targetcli, &targetpath)) {
+       status = cli_resolve_path(frame, "", context->internal->auth_info,
+                                 srv->cli, path, &targetcli, &targetpath);
+       if (!NT_STATUS_IS_OK(status)) {
                d_printf("Could not resolve %s\n", path);
                 errno = ENOENT;
                 TALLOC_FREE(frame);
@@ -1204,7 +1244,7 @@ SMBC_mkdir_ctx(SMBCCTX *context,
  * Our list function simply checks to see if a directory is not empty
  */
 
-static void
+static NTSTATUS
 rmdir_list_fn(const char *mnt,
               struct file_info *finfo,
               const char *mask,
@@ -1215,6 +1255,7 @@ rmdir_list_fn(const char *mnt,
                bool *smbc_rmdir_dirempty = (bool *)state;
                *smbc_rmdir_dirempty = false;
         }
+       return NT_STATUS_OK;
 }
 
 /*
@@ -1233,8 +1274,10 @@ SMBC_rmdir_ctx(SMBCCTX *context,
         char *workgroup = NULL;
        char *path = NULL;
         char *targetpath = NULL;
+       uint16_t port = 0;
        struct cli_state *targetcli = NULL;
        TALLOC_CTX *frame = talloc_stackframe();
+       NTSTATUS status;
 
        if (!context || !context->internal->initialized) {
                errno = EINVAL;
@@ -1255,6 +1298,7 @@ SMBC_rmdir_ctx(SMBCCTX *context,
                             fname,
                             &workgroup,
                             &server,
+                            &port,
                             &share,
                             &path,
                             &user,
@@ -1275,7 +1319,7 @@ SMBC_rmdir_ctx(SMBCCTX *context,
        }
 
        srv = SMBC_server(frame, context, True,
-                          server, share, &workgroup, &user, &password);
+                          server, port, share, &workgroup, &user, &password);
 
        if (!srv) {
 
@@ -1285,9 +1329,9 @@ SMBC_rmdir_ctx(SMBCCTX *context,
        }
 
        /*d_printf(">>>rmdir: resolving %s\n", path);*/
-       if (!cli_resolve_path(frame, "", context->internal->auth_info,
-                               srv->cli, path,
-                               &targetcli, &targetpath)) {
+       status = cli_resolve_path(frame, "", context->internal->auth_info,
+                                 srv->cli, path, &targetcli, &targetpath);
+       if (!NT_STATUS_IS_OK(status)) {
                d_printf("Could not resolve %s\n", path);
                 errno = ENOENT;
                TALLOC_FREE(frame);
@@ -1304,7 +1348,6 @@ SMBC_rmdir_ctx(SMBCCTX *context,
                         /* Local storage to avoid buffer overflows */
                        char *lpath;
                        bool smbc_rmdir_dirempty = true;
-                       NTSTATUS status;
 
                        lpath = talloc_asprintf(frame, "%s\\*",
                                                targetpath);
@@ -1315,7 +1358,7 @@ SMBC_rmdir_ctx(SMBCCTX *context,
                        }
 
                        status = cli_list(targetcli, lpath,
-                                         aDIR | aSYSTEM | aHIDDEN,
+                                         FILE_ATTRIBUTE_DIRECTORY | FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_HIDDEN,
                                          rmdir_list_fn,
                                          &smbc_rmdir_dirempty);
 
@@ -1519,8 +1562,10 @@ SMBC_chmod_ctx(SMBCCTX *context,
        char *targetpath = NULL;
        struct cli_state *targetcli = NULL;
        char *path = NULL;
-       uint16 mode;
+       uint16_t mode;
+       uint16_t port = 0;
        TALLOC_CTX *frame = talloc_stackframe();
+        NTSTATUS status;
 
        if (!context || !context->internal->initialized) {
 
@@ -1542,6 +1587,7 @@ SMBC_chmod_ctx(SMBCCTX *context,
                             fname,
                             &workgroup,
                             &server,
+                            &port,
                             &share,
                             &path,
                             &user,
@@ -1562,7 +1608,7 @@ SMBC_chmod_ctx(SMBCCTX *context,
        }
 
        srv = SMBC_server(frame, context, True,
-                          server, share, &workgroup, &user, &password);
+                          server, port, share, &workgroup, &user, &password);
 
        if (!srv) {
                TALLOC_FREE(frame);
@@ -1570,9 +1616,9 @@ SMBC_chmod_ctx(SMBCCTX *context,
        }
        
        /*d_printf(">>>unlink: resolving %s\n", path);*/
-       if (!cli_resolve_path(frame, "", context->internal->auth_info,
-                               srv->cli, path,
-                               &targetcli, &targetpath)) {
+       status = cli_resolve_path(frame, "", context->internal->auth_info,
+                                 srv->cli, path, &targetcli, &targetpath);
+       if (!NT_STATUS_IS_OK(status)) {
                d_printf("Could not resolve %s\n", path);
                 errno = ENOENT;
                TALLOC_FREE(frame);
@@ -1581,10 +1627,10 @@ SMBC_chmod_ctx(SMBCCTX *context,
 
        mode = 0;
 
-       if (!(newmode & (S_IWUSR | S_IWGRP | S_IWOTH))) mode |= aRONLY;
-       if ((newmode & S_IXUSR) && lp_map_archive(-1)) mode |= aARCH;
-       if ((newmode & S_IXGRP) && lp_map_system(-1)) mode |= aSYSTEM;
-       if ((newmode & S_IXOTH) && lp_map_hidden(-1)) mode |= aHIDDEN;
+       if (!(newmode & (S_IWUSR | S_IWGRP | S_IWOTH))) mode |= FILE_ATTRIBUTE_READONLY;
+       if ((newmode & S_IXUSR) && lp_map_archive(-1)) mode |= FILE_ATTRIBUTE_ARCHIVE;
+       if ((newmode & S_IXGRP) && lp_map_system(-1)) mode |= FILE_ATTRIBUTE_SYSTEM;
+       if ((newmode & S_IXOTH) && lp_map_hidden(-1)) mode |= FILE_ATTRIBUTE_HIDDEN;
 
        if (!NT_STATUS_IS_OK(cli_setatr(targetcli, targetpath, mode, 0))) {
                errno = SMBC_errno(context, targetcli);
@@ -1610,6 +1656,7 @@ SMBC_utimes_ctx(SMBCCTX *context,
        char *path = NULL;
         time_t access_time;
         time_t write_time;
+       uint16_t port = 0;
        TALLOC_CTX *frame = talloc_stackframe();
 
        if (!context || !context->internal->initialized) {
@@ -1658,6 +1705,7 @@ SMBC_utimes_ctx(SMBCCTX *context,
                             fname,
                             &workgroup,
                             &server,
+                            &port,
                             &share,
                             &path,
                             &user,
@@ -1678,7 +1726,7 @@ SMBC_utimes_ctx(SMBCCTX *context,
        }
 
        srv = SMBC_server(frame, context, True,
-                          server, share, &workgroup, &user, &password);
+                          server, port, share, &workgroup, &user, &password);
 
        if (!srv) {
                TALLOC_FREE(frame);
@@ -1710,9 +1758,11 @@ SMBC_unlink_ctx(SMBCCTX *context,
         char *workgroup = NULL;
        char *path = NULL;
        char *targetpath = NULL;
+       uint16_t port = 0;
        struct cli_state *targetcli = NULL;
        SMBCSRV *srv = NULL;
        TALLOC_CTX *frame = talloc_stackframe();
+        NTSTATUS status;
 
        if (!context || !context->internal->initialized) {
 
@@ -1734,6 +1784,7 @@ SMBC_unlink_ctx(SMBCCTX *context,
                             fname,
                             &workgroup,
                             &server,
+                            &port,
                             &share,
                             &path,
                             &user,
@@ -1754,7 +1805,7 @@ SMBC_unlink_ctx(SMBCCTX *context,
        }
 
        srv = SMBC_server(frame, context, True,
-                          server, share, &workgroup, &user, &password);
+                          server, port, share, &workgroup, &user, &password);
 
        if (!srv) {
                TALLOC_FREE(frame);
@@ -1763,9 +1814,9 @@ SMBC_unlink_ctx(SMBCCTX *context,
        }
 
        /*d_printf(">>>unlink: resolving %s\n", path);*/
-       if (!cli_resolve_path(frame, "", context->internal->auth_info,
-                               srv->cli, path,
-                               &targetcli, &targetpath)) {
+       status = cli_resolve_path(frame, "", context->internal->auth_info,
+                                 srv->cli, path, &targetcli, &targetpath);
+       if (!NT_STATUS_IS_OK(status)) {
                d_printf("Could not resolve %s\n", path);
                 errno = ENOENT;
                TALLOC_FREE(frame);
@@ -1773,15 +1824,15 @@ SMBC_unlink_ctx(SMBCCTX *context,
        }
        /*d_printf(">>>unlink: resolved path as %s\n", targetpath);*/
 
-       if (!NT_STATUS_IS_OK(cli_unlink(targetcli, targetpath, aSYSTEM | aHIDDEN))) {
+       if (!NT_STATUS_IS_OK(cli_unlink(targetcli, targetpath, FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_HIDDEN))) {
 
                errno = SMBC_errno(context, targetcli);
 
                if (errno == EACCES) { /* Check if the file is a directory */
 
                        int saverr = errno;
-                       SMB_OFF_T size = 0;
-                       uint16 mode = 0;
+                       off_t size = 0;
+                       uint16_t mode = 0;
                        struct timespec write_time_ts;
                         struct timespec access_time_ts;
                         struct timespec change_time_ts;
@@ -1847,7 +1898,10 @@ SMBC_rename_ctx(SMBCCTX *ocontext,
        struct cli_state *targetcli1 = NULL;
         struct cli_state *targetcli2 = NULL;
        SMBCSRV *srv = NULL;
+       uint16_t port1 = 0;
+       uint16_t port2 = 0;
        TALLOC_CTX *frame = talloc_stackframe();
+        NTSTATUS status;
 
        if (!ocontext || !ncontext ||
            !ocontext->internal->initialized ||
@@ -1871,6 +1925,7 @@ SMBC_rename_ctx(SMBCCTX *ocontext,
                             oname,
                             &workgroup,
                             &server1,
+                            &port1,
                             &share1,
                             &path1,
                             &user1,
@@ -1895,6 +1950,7 @@ SMBC_rename_ctx(SMBCCTX *ocontext,
                             nname,
                             NULL,
                             &server2,
+                            &port2,
                             &share2,
                             &path2,
                             &user2,
@@ -1923,7 +1979,7 @@ SMBC_rename_ctx(SMBCCTX *ocontext,
        }
 
        srv = SMBC_server(frame, ocontext, True,
-                          server1, share1, &workgroup, &user1, &password1);
+                          server1, port1, share1, &workgroup, &user1, &password1);
        if (!srv) {
                TALLOC_FREE(frame);
                return -1;
@@ -1937,10 +1993,9 @@ SMBC_rename_ctx(SMBCCTX *ocontext,
                                           password1);
 
        /*d_printf(">>>rename: resolving %s\n", path1);*/
-       if (!cli_resolve_path(frame, "", ocontext->internal->auth_info,
-                               srv->cli,
-                               path1,
-                               &targetcli1, &targetpath1)) {
+       status = cli_resolve_path(frame, "", ocontext->internal->auth_info,
+                                 srv->cli, path1, &targetcli1, &targetpath1);
+       if (!NT_STATUS_IS_OK(status)) {
                d_printf("Could not resolve %s\n", path1);
                 errno = ENOENT;
                TALLOC_FREE(frame);
@@ -1955,10 +2010,9 @@ SMBC_rename_ctx(SMBCCTX *ocontext,
        
        /*d_printf(">>>rename: resolved path as %s\n", targetpath1);*/
        /*d_printf(">>>rename: resolving %s\n", path2);*/
-       if (!cli_resolve_path(frame, "", ncontext->internal->auth_info,
-                               srv->cli, 
-                               path2,
-                               &targetcli2, &targetpath2)) {
+       status = cli_resolve_path(frame, "", ncontext->internal->auth_info,
+                                 srv->cli, path2, &targetcli2, &targetpath2);
+       if (!NT_STATUS_IS_OK(status)) {
                d_printf("Could not resolve %s\n", path2);
                 errno = ENOENT;
                TALLOC_FREE(frame);
@@ -1966,7 +2020,7 @@ SMBC_rename_ctx(SMBCCTX *ocontext,
        }
        /*d_printf(">>>rename: resolved path as %s\n", targetpath2);*/
 
-       if (strcmp(targetcli1->desthost, targetcli2->desthost) ||
+       if (strcmp(smbXcli_conn_remote_name(targetcli1->conn), smbXcli_conn_remote_name(targetcli2->conn)) ||
             strcmp(targetcli1->share, targetcli2->share))
        {
                /* can't rename across file systems */
@@ -1979,7 +2033,7 @@ SMBC_rename_ctx(SMBCCTX *ocontext,
                int eno = SMBC_errno(ocontext, targetcli1);
 
                if (eno != EEXIST ||
-                   !NT_STATUS_IS_OK(cli_unlink(targetcli1, targetpath2, aSYSTEM | aHIDDEN)) ||
+                   !NT_STATUS_IS_OK(cli_unlink(targetcli1, targetpath2, FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_HIDDEN)) ||
                    !NT_STATUS_IS_OK(cli_rename(targetcli1, targetpath1, targetpath2))) {
 
                        errno = eno;