s3/libsmb: Use smbXcli_conn_nt_smbs_supported instead of SMB1 specific test
[obnox/samba/samba-obnox.git] / source3 / libsmb / libsmb_file.c
index abfec172e4f11643f41859cedd93e96201435f94..14080fe1c79a2c06d1d331378066511701adec5e 100644 (file)
@@ -7,25 +7,26 @@
    Copyright (C) Tom Jansen (Ninja ISD) 2002 
    Copyright (C) Derrell Lipman 2003-2008
    Copyright (C) Jeremy Allison 2007, 2008
-   
+
    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 3 of the License, or
    (at your option) any later version.
-   
+
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    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, see <http://www.gnu.org/licenses/>.
 */
 
 #include "includes.h"
+#include "libsmb/libsmb.h"
 #include "libsmbclient.h"
 #include "libsmb_internal.h"
-
+#include "../libcli/smb/smbXcli_base.h"
 
 /*
  * Routine to open() a file ...
@@ -50,23 +51,19 @@ SMBC_open_ctx(SMBCCTX *context,
        uint16_t fd;
        NTSTATUS status = NT_STATUS_OBJECT_PATH_INVALID;
        TALLOC_CTX *frame = talloc_stackframe();
-        
+
        if (!context || !context->internal->initialized) {
-                
                errno = EINVAL;  /* Best I can think of ... */
                TALLOC_FREE(frame);
                return NULL;
-                
        }
-        
+
        if (!fname) {
-                
                errno = EINVAL;
                TALLOC_FREE(frame);
                return NULL;
-                
        }
-        
+
        if (SMBC_parse_path(frame,
                             context,
                             fname,
@@ -81,7 +78,7 @@ SMBC_open_ctx(SMBCCTX *context,
                TALLOC_FREE(frame);
                return NULL;
         }
-        
+
        if (!user || user[0] == (char)0) {
                user = talloc_strdup(frame, smbc_getUser(context));
                if (!user) {
@@ -90,35 +87,34 @@ SMBC_open_ctx(SMBCCTX *context,
                        return NULL;
                }
        }
-        
+
        srv = SMBC_server(frame, context, True,
                           server, share, &workgroup, &user, &password);
-        
        if (!srv) {
                if (errno == EPERM) errno = EACCES;
                TALLOC_FREE(frame);
                return NULL;  /* SMBC_server sets errno */
        }
-        
+
        /* Hmmm, the test for a directory is suspect here ... FIXME */
-        
+
        if (strlen(path) > 0 && path[strlen(path) - 1] == '\\') {
                status = NT_STATUS_OBJECT_PATH_INVALID;
        } else {
                file = SMB_MALLOC_P(SMBCFILE);
-                
                if (!file) {
                        errno = ENOMEM;
                        TALLOC_FREE(frame);
                        return NULL;
                }
-                
+
                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);
@@ -126,30 +122,29 @@ SMBC_open_ctx(SMBCCTX *context,
                        return NULL;
                }
                /*d_printf(">>>open: resolved %s as %s\n", path, targetpath);*/
-                
+
                status = cli_open(targetcli, targetpath, flags,
                                    context->internal->share_mode, &fd);
                if (!NT_STATUS_IS_OK(status)) {
-                        
+
                        /* Handle the error ... */
-                        
+
                        SAFE_FREE(file);
                        errno = SMBC_errno(context, targetcli);
                        TALLOC_FREE(frame);
                        return NULL;
-                        
                }
-                
+
                /* Fill in file struct */
-                
+
                file->cli_fd  = fd;
                file->fname   = SMB_STRDUP(fname);
                file->srv     = srv;
                file->offset  = 0;
                file->file    = True;
-                
+
                DLIST_ADD(context->internal->files, file);
-                
+
                 /*
                  * If the file was opened in O_APPEND mode, all write
                  * operations should be appended to the file.  To do that,
@@ -180,29 +175,26 @@ SMBC_open_ctx(SMBCCTX *context,
                                 return NULL;
                         }
                 }
-                
+
                TALLOC_FREE(frame);
                return file;
-                
        }
-        
+
        /* Check if opendir needed ... */
-        
+
        if (!NT_STATUS_IS_OK(status)) {
                int eno = 0;
-                
+
                eno = SMBC_errno(context, srv->cli);
                file = smbc_getFunctionOpendir(context)(context, fname);
                if (!file) errno = eno;
                TALLOC_FREE(frame);
                return file;
-                
        }
-        
+
        errno = EINVAL; /* FIXME, correct errno ? */
        TALLOC_FREE(frame);
        return NULL;
-        
 }
 
 /*
@@ -214,14 +206,11 @@ SMBC_creat_ctx(SMBCCTX *context,
                const char *path,
                mode_t mode)
 {
-        
        if (!context || !context->internal->initialized) {
-                
                errno = EINVAL;
                return NULL;
-                
        }
-        
+
        return SMBC_open_ctx(context, path,
                              O_WRONLY | O_CREAT | O_TRUNC, mode);
 }
@@ -236,13 +225,14 @@ SMBC_read_ctx(SMBCCTX *context,
               void *buf,
               size_t count)
 {
-       int ret;
+       size_t ret;
        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;
+
         /*
          * offset:
          *
@@ -253,35 +243,31 @@ SMBC_read_ctx(SMBCCTX *context,
          * retrieving data at an offset greater than 4GB.
          */
         off_t offset;
-        
+
        if (!context || !context->internal->initialized) {
-                
                errno = EINVAL;
                TALLOC_FREE(frame);
                return -1;
-                
        }
-        
+
        DEBUG(4, ("smbc_read(%p, %d)\n", file, (int)count));
-        
+
        if (!file || !SMBC_dlist_contains(context->internal->files, file)) {
                errno = EBADF;
                TALLOC_FREE(frame);
                return -1;
-                
        }
-        
+
        offset = file->offset;
-        
+
        /* Check that the buffer exists ... */
-        
+
        if (buf == NULL) {
                errno = EINVAL;
                TALLOC_FREE(frame);
                return -1;
-                
        }
-        
+
        /*d_printf(">>>read: parsing %s\n", file->fname);*/
        if (SMBC_parse_path(frame,
                             context,
@@ -297,35 +283,33 @@ SMBC_read_ctx(SMBCCTX *context,
                TALLOC_FREE(frame);
                 return -1;
         }
-        
+
        /*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);
                return -1;
        }
        /*d_printf(">>>fstat: resolved path as %s\n", targetpath);*/
-        
-       ret = cli_read(targetcli, file->cli_fd, (char *)buf, offset, count);
-        
-       if (ret < 0) {
-                
+
+       status = cli_read(targetcli, file->cli_fd, (char *)buf, offset,
+                         count, &ret);
+       if (!NT_STATUS_IS_OK(status)) {
                errno = SMBC_errno(context, targetcli);
                TALLOC_FREE(frame);
                return -1;
-                
        }
-        
+
        file->offset += ret;
-        
-       DEBUG(4, ("  --> %d\n", ret));
-        
+
+       DEBUG(4, ("  --> %ld\n", (unsigned long)ret));
+
        TALLOC_FREE(frame);
        return ret;  /* Success, ret bytes of data ... */
-        
 }
 
 /*
@@ -338,41 +322,38 @@ 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 */
-        
+
        if (!context || !context->internal->initialized) {
-                
                errno = EINVAL;
                TALLOC_FREE(frame);
                return -1;
-                
        }
-        
+
        if (!file || !SMBC_dlist_contains(context->internal->files, file)) {
                errno = EBADF;
                TALLOC_FREE(frame);
                return -1;
        }
-        
+
        /* Check that the buffer exists ... */
-        
+
        if (buf == NULL) {
                errno = EINVAL;
                TALLOC_FREE(frame);
                return -1;
-                
        }
-        
+
         offset = file->offset; /* See "offset" comment in SMBC_read_ctx() */
-        
+
        /*d_printf(">>>write: parsing %s\n", file->fname);*/
        if (SMBC_parse_path(frame,
                             context,
@@ -390,30 +371,29 @@ 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);
                return -1;
        }
        /*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 ... */
 }
 
 /*
@@ -430,26 +410,26 @@ 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;
                TALLOC_FREE(frame);
                return -1;
        }
-        
+
        if (!file || !SMBC_dlist_contains(context->internal->files, file)) {
                errno = EBADF;
                TALLOC_FREE(frame);
                return -1;
        }
-        
+
        /* IS a dir ... */
        if (!file->file) {
                TALLOC_FREE(frame);
                return smbc_getFunctionClosedir(context)(context, file);
        }
-        
+
        /*d_printf(">>>close: parsing %s\n", file->fname);*/
        if (SMBC_parse_path(frame,
                             context,
@@ -465,20 +445,20 @@ SMBC_close_ctx(SMBCCTX *context,
                TALLOC_FREE(frame);
                 return -1;
         }
-        
+
        /*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);
                return -1;
        }
        /*d_printf(">>>close: resolved path as %s\n", targetpath);*/
-        
+
        if (!NT_STATUS_IS_OK(cli_close(targetcli, file->cli_fd))) {
-                
                DEBUG(3, ("cli_close failed on %s. purging server.\n", 
                          file->fname));
                /* Deallocate slot and remove the server 
@@ -491,14 +471,12 @@ SMBC_close_ctx(SMBCCTX *context,
                smbc_getFunctionRemoveUnusedServer(context)(context, srv);
                TALLOC_FREE(frame);
                return -1;
-                
        }
-        
+
        DLIST_REMOVE(context->internal->files, file);
        SAFE_FREE(file->fname);
        SAFE_FREE(file);
        TALLOC_FREE(frame);
-        
        return 0;
 }
 
@@ -509,9 +487,9 @@ SMBC_close_ctx(SMBCCTX *context,
 bool
 SMBC_getatr(SMBCCTX * context,
             SMBCSRV *srv,
-            char *path,
+            const char *path,
             uint16 *mode,
-            SMB_OFF_T *size,
+            off_t *size,
             struct timespec *create_time_ts,
             struct timespec *access_time_ts,
             struct timespec *write_time_ts,
@@ -523,14 +501,14 @@ 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;
                TALLOC_FREE(frame);
                return False;
        }
-        
+
        /* path fixup for . and .. */
        if (strequal(path, ".") || strequal(path, "..")) {
                fixedpath = talloc_strdup(frame, "\\");
@@ -550,65 +528,59 @@ SMBC_getatr(SMBCCTX * context,
                trim_string(fixedpath, NULL, "\\.");
        }
        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);
                return False;
        }
-        
+
        if (!srv->no_pathinfo2 &&
-            cli_qpathinfo2(targetcli, targetpath,
+            NT_STATUS_IS_OK(cli_qpathinfo2(targetcli, targetpath,
                            create_time_ts,
                            access_time_ts,
                            write_time_ts,
                            change_time_ts,
-                           size, mode, ino)) {
+                          size, mode, ino))) {
                TALLOC_FREE(frame);
                return True;
         }
-        
+
        /* if this is NT then don't bother with the getatr */
-       if (targetcli->capabilities & CAP_NT_SMBS) {
+       if (smbXcli_conn_nt_smbs_supported(targetcli->conn)) {
                 errno = EPERM;
                TALLOC_FREE(frame);
                 return False;
         }
-        
+
        if (NT_STATUS_IS_OK(cli_getatr(targetcli, targetpath, mode, size, &write_time))) {
-                
                 struct timespec w_time_ts;
-                
+
                 w_time_ts = convert_time_t_to_timespec(write_time);
-                
                 if (write_time_ts != NULL) {
                        *write_time_ts = w_time_ts;
                 }
-                
                 if (create_time_ts != NULL) {
                         *create_time_ts = w_time_ts;
                 }
-                
                 if (access_time_ts != NULL) {
                         *access_time_ts = w_time_ts;
                 }
-                
                 if (change_time_ts != NULL) {
                         *change_time_ts = w_time_ts;
                 }
-                
                srv->no_pathinfo2 = True;
                TALLOC_FREE(frame);
                return True;
        }
-        
+
         errno = EPERM;
        TALLOC_FREE(frame);
        return False;
-        
 }
 
 /*
@@ -632,7 +604,7 @@ SMBC_setatr(SMBCCTX * context, SMBCSRV *srv, char *path,
         uint16_t fd;
         int ret;
        TALLOC_CTX *frame = talloc_stackframe();
-        
+
         /*
          * First, try setpathinfo (if qpathinfo succeeded), for it is the
          * modern function for "new code" to be using, and it works given a
@@ -640,13 +612,13 @@ 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. 
                  *
@@ -656,27 +628,26 @@ SMBC_setatr(SMBCCTX * context, SMBCSRV *srv, char *path,
                  * cli_setattrE() which should work on all OS versions, and
                  * supports both times.
                  */
-                
+
                 /* Don't try {q,set}pathinfo() again, with this server */
                 srv->no_pathinfo = True;
-                
+
                 /* Open the file */
                 if (!NT_STATUS_IS_OK(cli_open(srv->cli, path, O_RDWR, DENY_NONE, &fd))) {
-                        
                         errno = SMBC_errno(context, srv->cli);
                        TALLOC_FREE(frame);
                         return -1;
                 }
-                
+
                 /* Set the new attributes */
                 ret = NT_STATUS_IS_OK(cli_setattrE(srv->cli, fd,
                                    change_time,
                                    access_time,
                                    write_time));
-                
+
                 /* Close the file */
                 cli_close(srv->cli, fd);
-                
+
                 /*
                  * Unfortunately, setattrE() doesn't have a provision for
                  * setting the access mode (attributes).  We'll have to try
@@ -686,14 +657,14 @@ SMBC_setatr(SMBCCTX * context, SMBCSRV *srv, char *path,
                 if (ret && mode != (uint16) -1) {
                         ret = NT_STATUS_IS_OK(cli_setatr(srv->cli, path, mode, 0));
                 }
-                
+
                 if (! ret) {
                         errno = SMBC_errno(context, srv->cli);
                        TALLOC_FREE(frame);
                         return False;
                 }
         }
-        
+
        TALLOC_FREE(frame);
         return True;
 }
@@ -708,45 +679,39 @@ SMBC_lseek_ctx(SMBCCTX *context,
                off_t offset,
                int whence)
 {
-       SMB_OFF_T size;
+       off_t size;
        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;
+
        if (!context || !context->internal->initialized) {
-                
                errno = EINVAL;
                TALLOC_FREE(frame);
                return -1;
        }
-        
+
        if (!file || !SMBC_dlist_contains(context->internal->files, file)) {
-                
                errno = EBADF;
                TALLOC_FREE(frame);
                return -1;
-                
        }
-        
+
        if (!file->file) {
-                
                errno = EINVAL;
                TALLOC_FREE(frame);
                return -1;      /* Can't lseek a dir ... */
-                
        }
-        
+
        switch (whence) {
        case SEEK_SET:
                file->offset = offset;
                break;
-                
        case SEEK_CUR:
                file->offset += offset;
                break;
-                
        case SEEK_END:
                /*d_printf(">>>lseek: parsing %s\n", file->fname);*/
                if (SMBC_parse_path(frame,
@@ -763,22 +728,24 @@ SMBC_lseek_ctx(SMBCCTX *context,
                        TALLOC_FREE(frame);
                        return -1;
                }
-                
+
                /*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);
                        return -1;
                }
+
                /*d_printf(">>>lseek: resolved path as %s\n", targetpath);*/
-                
-               if (!cli_qfileinfo(targetcli, file->cli_fd, NULL,
-                                   &size, NULL, NULL, NULL, NULL, NULL))
-               {
-                        SMB_OFF_T b_size = size;
+               if (!NT_STATUS_IS_OK(cli_qfileinfo_basic(
+                                            targetcli, file->cli_fd, NULL,
+                                            &size, NULL, NULL, NULL, NULL,
+                                            NULL))) {
+                        off_t b_size = size;
                        if (!NT_STATUS_IS_OK(cli_getattrE(targetcli, file->cli_fd,
                                           NULL, &b_size, NULL, NULL, NULL))) {
                                 errno = EINVAL;
@@ -789,16 +756,13 @@ SMBC_lseek_ctx(SMBCCTX *context,
                }
                file->offset = size + offset;
                break;
-                
        default:
                errno = EINVAL;
                break;
-                
        }
-        
+
        TALLOC_FREE(frame);
        return file->offset;
-        
 }
 
 
@@ -811,7 +775,7 @@ SMBC_ftruncate_ctx(SMBCCTX *context,
                    SMBCFILE *file,
                    off_t length)
 {
-       SMB_OFF_T size = length;
+       off_t size = length;
        char *server = NULL;
        char *share = NULL;
        char *user = NULL;
@@ -820,26 +784,26 @@ 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;
                TALLOC_FREE(frame);
                return -1;
        }
-        
+
        if (!file || !SMBC_dlist_contains(context->internal->files, file)) {
                errno = EBADF;
                TALLOC_FREE(frame);
                return -1;
        }
-        
+
        if (!file->file) {
                errno = EINVAL;
                TALLOC_FREE(frame);
                return -1;
        }
-        
+
        /*d_printf(">>>fstat: parsing %s\n", file->fname);*/
        if (SMBC_parse_path(frame,
                             context,
@@ -855,25 +819,25 @@ SMBC_ftruncate_ctx(SMBCCTX *context,
                TALLOC_FREE(frame);
                 return -1;
         }
-        
+
        /*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);
                return -1;
        }
        /*d_printf(">>>fstat: resolved path as %s\n", targetpath);*/
-        
-        if (!cli_ftruncate(targetcli, file->cli_fd, size)) {
+
+        if (!NT_STATUS_IS_OK(cli_ftruncate(targetcli, file->cli_fd, (uint64_t)size))) {
                 errno = EINVAL;
                 TALLOC_FREE(frame);
                 return -1;
         }
-        
+
        TALLOC_FREE(frame);
        return 0;
-        
 }