s3: make cli_resolve_path return NTSTATUS
[kai/samba.git] / source3 / libsmb / libsmb_file.c
index 8250da2b30dd714c7a4b4c2487a7f84d413d1ad4..4517a36f575a5f3df76dd12acdbfb26a3da5daf4 100644 (file)
@@ -23,6 +23,7 @@
 */
 
 #include "includes.h"
+#include "libsmb/libsmb.h"
 #include "libsmbclient.h"
 #include "libsmb_internal.h"
 
@@ -110,9 +111,10 @@ SMBC_open_ctx(SMBCCTX *context,
                ZERO_STRUCTP(file);
 
                /*d_printf(">>>open: 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;
                        SAFE_FREE(file);
@@ -229,6 +231,7 @@ SMBC_read_ctx(SMBCCTX *context,
        char *targetpath = NULL;
        struct cli_state *targetcli = NULL;
        TALLOC_CTX *frame = talloc_stackframe();
+       NTSTATUS status;
 
         /*
          * offset:
@@ -282,9 +285,10 @@ SMBC_read_ctx(SMBCCTX *context,
         }
 
        /*d_printf(">>>read: resolving %s\n", path);*/
-       if (!cli_resolve_path(frame, "", context->internal->auth_info,
-                       file->srv->cli, path,
-                       &targetcli, &targetpath)) {
+       status = cli_resolve_path(frame, "", context->internal->auth_info,
+                                 file->srv->cli, path,
+                                 &targetcli, &targetpath);
+       if (!NT_STATUS_IS_OK(status)) {
                d_printf("Could not resolve %s\n", path);
                 errno = ENOENT;
                TALLOC_FREE(frame);
@@ -318,13 +322,13 @@ SMBC_write_ctx(SMBCCTX *context,
                const void *buf,
                size_t count)
 {
-       int ret;
         off_t offset;
        char *server = NULL, *share = NULL, *user = NULL, *password = NULL;
        char *path = NULL;
        char *targetpath = NULL;
        struct cli_state *targetcli = NULL;
        TALLOC_CTX *frame = talloc_stackframe();
+       NTSTATUS status;
 
        /* First check all pointers before dereferencing them */
 
@@ -367,9 +371,10 @@ SMBC_write_ctx(SMBCCTX *context,
         }
 
        /*d_printf(">>>write: resolving %s\n", path);*/
-       if (!cli_resolve_path(frame, "", context->internal->auth_info,
-                       file->srv->cli, path,
-                       &targetcli, &targetpath)) {
+       status = cli_resolve_path(frame, "", context->internal->auth_info,
+                                 file->srv->cli, path,
+                                 &targetcli, &targetpath);
+       if (!NT_STATUS_IS_OK(status)) {
                d_printf("Could not resolve %s\n", path);
                 errno = ENOENT;
                TALLOC_FREE(frame);
@@ -377,18 +382,18 @@ SMBC_write_ctx(SMBCCTX *context,
        }
        /*d_printf(">>>write: resolved path as %s\n", targetpath);*/
 
-       ret = cli_write(targetcli, file->cli_fd,
-                        0, (char *)buf, offset, count);
-       if (ret <= 0) {
-               errno = SMBC_errno(context, targetcli);
+       status = cli_writeall(targetcli, file->cli_fd,
+                             0, (const uint8_t *)buf, offset, count, NULL);
+       if (!NT_STATUS_IS_OK(status)) {
+               errno = map_errno_from_nt_status(status);
                TALLOC_FREE(frame);
                return -1;
        }
 
-       file->offset += ret;
+       file->offset += count;
 
        TALLOC_FREE(frame);
-       return ret;  /* Success, 0 bytes of data ... */
+       return count;  /* Success, 0 bytes of data ... */
 }
 
 /*
@@ -405,6 +410,7 @@ SMBC_close_ctx(SMBCCTX *context,
        char *targetpath = NULL;
        struct cli_state *targetcli = NULL;
        TALLOC_CTX *frame = talloc_stackframe();
+       NTSTATUS status;
 
        if (!context || !context->internal->initialized) {
                errno = EINVAL;
@@ -441,9 +447,10 @@ SMBC_close_ctx(SMBCCTX *context,
         }
 
        /*d_printf(">>>close: resolving %s\n", path);*/
-       if (!cli_resolve_path(frame, "", context->internal->auth_info,
-                       file->srv->cli, path,
-                       &targetcli, &targetpath)) {
+       status = cli_resolve_path(frame, "", context->internal->auth_info,
+                                 file->srv->cli, path,
+                                 &targetcli, &targetpath);
+       if (!NT_STATUS_IS_OK(status)) {
                d_printf("Could not resolve %s\n", path);
                 errno = ENOENT;
                TALLOC_FREE(frame);
@@ -480,7 +487,7 @@ SMBC_close_ctx(SMBCCTX *context,
 bool
 SMBC_getatr(SMBCCTX * context,
             SMBCSRV *srv,
-            char *path,
+            const char *path,
             uint16 *mode,
             SMB_OFF_T *size,
             struct timespec *create_time_ts,
@@ -494,6 +501,7 @@ SMBC_getatr(SMBCCTX * context,
        struct cli_state *targetcli = NULL;
        time_t write_time;
        TALLOC_CTX *frame = talloc_stackframe();
+       NTSTATUS status;
 
        if (!context || !context->internal->initialized) {
                errno = EINVAL;
@@ -521,9 +529,10 @@ SMBC_getatr(SMBCCTX * context,
        }
        DEBUG(4,("SMBC_getatr: sending qpathinfo\n"));
 
-       if (!cli_resolve_path(frame, "", context->internal->auth_info,
-                       srv->cli, fixedpath,
-                       &targetcli, &targetpath)) {
+       status = cli_resolve_path(frame, "", context->internal->auth_info,
+                                 srv->cli, fixedpath,
+                                 &targetcli, &targetpath);
+       if (!NT_STATUS_IS_OK(status)) {
                d_printf("Couldn't resolve %s\n", path);
                 errno = ENOENT;
                TALLOC_FREE(frame);
@@ -603,12 +612,12 @@ SMBC_setatr(SMBCCTX * context, SMBCSRV *srv, char *path,
          * attributes manipulated.
          */
         if (srv->no_pathinfo ||
-            ! cli_setpathinfo(srv->cli, path,
-                              create_time,
-                              access_time,
-                              write_time,
-                              change_time,
-                              mode)) {
+            !NT_STATUS_IS_OK(cli_setpathinfo_basic(srv->cli, path,
+                                                  create_time,
+                                                  access_time,
+                                                  write_time,
+                                                  change_time,
+                                                  mode))) {
 
                 /*
                  * setpathinfo is not supported; go to plan B. 
@@ -676,6 +685,7 @@ SMBC_lseek_ctx(SMBCCTX *context,
        char *targetpath = NULL;
        struct cli_state *targetcli = NULL;
        TALLOC_CTX *frame = talloc_stackframe();
+       NTSTATUS status;
 
        if (!context || !context->internal->initialized) {
                errno = EINVAL;
@@ -720,9 +730,10 @@ SMBC_lseek_ctx(SMBCCTX *context,
                }
 
                /*d_printf(">>>lseek: resolving %s\n", path);*/
-               if (!cli_resolve_path(frame, "", context->internal->auth_info,
-                               file->srv->cli, path,
-                               &targetcli, &targetpath)) {
+               status = cli_resolve_path(
+                       frame, "", context->internal->auth_info,
+                       file->srv->cli, path, &targetcli, &targetpath);
+               if (!NT_STATUS_IS_OK(status)) {
                        d_printf("Could not resolve %s\n", path);
                         errno = ENOENT;
                        TALLOC_FREE(frame);
@@ -730,9 +741,10 @@ SMBC_lseek_ctx(SMBCCTX *context,
                }
 
                /*d_printf(">>>lseek: resolved path as %s\n", targetpath);*/
-               if (!cli_qfileinfo(targetcli, file->cli_fd, NULL,
-                                   &size, NULL, NULL, NULL, NULL, NULL))
-               {
+               if (!NT_STATUS_IS_OK(cli_qfileinfo_basic(
+                                            targetcli, file->cli_fd, NULL,
+                                            &size, NULL, NULL, NULL, NULL,
+                                            NULL))) {
                         SMB_OFF_T b_size = size;
                        if (!NT_STATUS_IS_OK(cli_getattrE(targetcli, file->cli_fd,
                                           NULL, &b_size, NULL, NULL, NULL))) {
@@ -772,6 +784,7 @@ SMBC_ftruncate_ctx(SMBCCTX *context,
         char *targetpath = NULL;
        struct cli_state *targetcli = NULL;
        TALLOC_CTX *frame = talloc_stackframe();
+       NTSTATUS status;
 
        if (!context || !context->internal->initialized) {
                errno = EINVAL;
@@ -808,9 +821,10 @@ SMBC_ftruncate_ctx(SMBCCTX *context,
         }
 
        /*d_printf(">>>fstat: resolving %s\n", path);*/
-       if (!cli_resolve_path(frame, "", context->internal->auth_info,
-                       file->srv->cli, path,
-                       &targetcli, &targetpath)) {
+       status = cli_resolve_path(frame, "", context->internal->auth_info,
+                                 file->srv->cli, path,
+                                 &targetcli, &targetpath);
+       if (!NT_STATUS_IS_OK(status)) {
                d_printf("Could not resolve %s\n", path);
                 errno = ENOENT;
                TALLOC_FREE(frame);