redo the previous patch to instead initialize max_offset correctly before we invoke...
[deb_libnfs.git] / lib / libnfs.c
index c637a7518f172d696ed63b4d54f9df62333280b6..8d27a816b0fa079b6a28a090aa764a99767b08f1 100644 (file)
@@ -646,6 +646,9 @@ static void nfs_stat_1_cb(struct rpc_context *rpc _U_, int status, void *command
         st.st_dev     = -1;
         st.st_ino     = res->GETATTR3res_u.resok.obj_attributes.fileid;
         st.st_mode    = res->GETATTR3res_u.resok.obj_attributes.mode;
+       if (res->GETATTR3res_u.resok.obj_attributes.type == NF3DIR) {
+               st.st_mode |= S_IFDIR ;
+       }
         st.st_nlink   = res->GETATTR3res_u.resok.obj_attributes.nlink;
         st.st_uid     = res->GETATTR3res_u.resok.obj_attributes.uid;
         st.st_gid     = res->GETATTR3res_u.resok.obj_attributes.gid;
@@ -856,10 +859,12 @@ static void nfs_pread_mcb(struct rpc_context *rpc _U_, int status, void *command
                if (res->status != NFS3_OK) {
                        rpc_set_error(nfs->rpc, "NFS: Read failed with %s(%d)", nfsstat3_to_str(res->status), nfsstat3_to_errno(res->status));
                        data->error = 1;
-               } else {
-                       memcpy(&data->buffer[mdata->offset - data->start_offset], res->READ3res_u.resok.data.data_val, res->READ3res_u.resok.count);
-                       if ((unsigned)data->max_offset < mdata->offset + res->READ3res_u.resok.count) {
-                               data->max_offset = mdata->offset + res->READ3res_u.resok.count;
+               } else  {
+                       if (res->READ3res_u.resok.count > 0) {
+                               memcpy(&data->buffer[mdata->offset - data->start_offset], res->READ3res_u.resok.data.data_val, res->READ3res_u.resok.count);
+                               if ((unsigned)data->max_offset < mdata->offset + res->READ3res_u.resok.count) {
+                                       data->max_offset = mdata->offset + res->READ3res_u.resok.count;
+                               }
                        }
                }
        }
@@ -885,6 +890,7 @@ static void nfs_pread_mcb(struct rpc_context *rpc _U_, int status, void *command
 
        data->nfsfh->offset = data->max_offset;
        data->cb(data->max_offset - data->start_offset, nfs, data->buffer, data->private_data);
+
        free_nfs_cb_data(data);
        free(mdata);
 }
@@ -920,6 +926,7 @@ int nfs_pread_async(struct nfs_context *nfs, struct nfsfh *nfsfh, off_t offset,
         * reads and collect into a reassembly buffer.
         * we send all reads in parallell so that performance is still good.
         */
+       data->max_offset = offset;
        data->start_offset = offset;
 
        data->buffer =  malloc(count);
@@ -2860,13 +2867,13 @@ size_t nfs_get_writemax(struct nfs_context *nfs)
 void nfs_set_error(struct nfs_context *nfs, char *error_string, ...)
 {
         va_list ap;
-       char *str;
+       char *str = NULL;
 
+        va_start(ap, error_string);
+       vasprintf(&str, error_string, ap);
        if (nfs->rpc->error_string != NULL) {
                free(nfs->rpc->error_string);
        }
-        va_start(ap, error_string);
-       vasprintf(&str, error_string, ap);
        nfs->rpc->error_string = str;
         va_end(ap);
 }