vfs_fruit: use VFS function in ad_convert_truncate()
[metze/samba/wip.git] / source3 / modules / vfs_fruit.c
index b07a525e3c9b97040e0b98da1fdecfc44d9aef9a..0502dd51b2f46e63b3d2cd61c30e5bfa8e80b107 100644 (file)
@@ -1063,10 +1063,7 @@ static bool ad_convert_xattr(vfs_handle_struct *handle,
                             bool *converted_xattr)
 {
        static struct char_mappings **string_replace_cmaps = NULL;
-       char *map = MAP_FAILED;
-       size_t maplen;
        uint16_t i;
-       ssize_t len;
        int saved_errno = 0;
        NTSTATUS status;
        int rc;
@@ -1090,17 +1087,6 @@ static bool ad_convert_xattr(vfs_handle_struct *handle,
                TALLOC_FREE(mappings);
        }
 
-       maplen = ad_getentryoff(ad, ADEID_RFORK) +
-               ad_getentrylen(ad, ADEID_RFORK);
-
-       /* FIXME: direct use of mmap(), vfs_aio_fork does it too */
-       map = mmap(NULL, maplen, PROT_READ|PROT_WRITE, MAP_SHARED,
-                  ad->ad_fsp->fh->fd, 0);
-       if (map == MAP_FAILED) {
-               DBG_ERR("mmap AppleDouble: %s\n", strerror(errno));
-               return false;
-       }
-
        for (i = 0; i < ad->adx_header.adx_num_attrs; i++) {
                struct ad_xattr_entry *e = &ad->adx_entries[i];
                char *mapped_name = NULL;
@@ -1172,7 +1158,7 @@ static bool ad_convert_xattr(vfs_handle_struct *handle,
                }
 
                nwritten = SMB_VFS_PWRITE(fsp,
-                                         map + e->adx_offset,
+                                         ad->ad_data + e->adx_offset,
                                          e->adx_length,
                                          0);
                if (nwritten == -1) {
@@ -1200,9 +1186,10 @@ static bool ad_convert_xattr(vfs_handle_struct *handle,
                goto fail;
        }
 
-       len = sys_pwrite(ad->ad_fsp->fh->fd, ad->ad_data, AD_DATASZ_DOT_UND, 0);
-       if (len != AD_DATASZ_DOT_UND) {
-               DBG_ERR("%s: bad size: %zd\n", smb_fname->base_name, len);
+       rc = ad_fset(handle, ad, ad->ad_fsp);
+       if (rc != 0) {
+               DBG_ERR("ad_fset on [%s] failed: %s\n",
+                       fsp_str_dbg(ad->ad_fsp), strerror(errno));
                ok = false;
                goto fail;
        }
@@ -1216,12 +1203,6 @@ static bool ad_convert_xattr(vfs_handle_struct *handle,
        ok = true;
 
 fail:
-       rc = munmap(map, maplen);
-       if (rc != 0) {
-               DBG_ERR("munmap failed: %s\n", strerror(errno));
-               return false;
-       }
-
        return ok;
 }
 
@@ -1328,17 +1309,16 @@ static bool ad_convert_finderinfo(vfs_handle_struct *handle,
        return true;
 }
 
-static bool ad_convert_truncate(struct adouble *ad,
+static bool ad_convert_truncate(vfs_handle_struct *handle,
+                               struct adouble *ad,
                                const struct smb_filename *smb_fname)
 {
        int rc;
+       off_t newlen;
 
-       /*
-        * FIXME: direct ftruncate(), but we don't have a fsp for the
-        * VFS call
-        */
-       rc = ftruncate(ad->ad_fsp->fh->fd, ADEDOFF_RFORK_DOT_UND +
-                      ad_getentrylen(ad, ADEID_RFORK));
+       newlen = ADEDOFF_RFORK_DOT_UND + ad_getentrylen(ad, ADEID_RFORK);
+
+       rc = SMB_VFS_FTRUNCATE(ad->ad_fsp, newlen);
        if (rc != 0) {
                return false;
        }
@@ -1485,7 +1465,7 @@ static int ad_convert(struct vfs_handle_struct *handle,
        }
 
        if (converted_xattr || blank) {
-               ok = ad_convert_truncate(ad, smb_fname);
+               ok = ad_convert_truncate(handle, ad, smb_fname);
                if (!ok) {
                        ret = -1;
                        goto done;