Subversion Repositories HelenOS

Rev

Rev 2666 | Rev 2673 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 2666 Rev 2667
Line 343... Line 343...
343
        ipc_answer_0(rid, EINVAL);
343
        ipc_answer_0(rid, EINVAL);
344
        return;
344
        return;
345
    }
345
    }
346
 
346
 
347
    /*
347
    /*
-
 
348
     * Check whether the file needs to grow.
-
 
349
     */
-
 
350
    if (pos + size <= dentry->size) {
-
 
351
        /* The file size is not changing. */
-
 
352
        (void) ipc_data_write_deliver(callid, dentry->data + pos, size);
-
 
353
        ipc_answer_1(rid, EOK, size);
-
 
354
        return;
-
 
355
    }
-
 
356
    size_t delta = (pos + size) - dentry->size;
-
 
357
    /*
348
     * At this point, we are deliberately extremely straightforward and
358
     * At this point, we are deliberately extremely straightforward and
349
     * simply realloc the contents of the file on every write. In the end,
359
     * simply realloc the contents of the file on every write that grows the
350
     * the situation might not be as bad as it may look: our heap allocator
360
     * file. In the end, the situation might not be as bad as it may look:
351
     * can save us and just grow the block whenever possible.
361
     * our heap allocator can save us and just grow the block whenever
-
 
362
     * possible.
352
     */
363
     */
353
    void *newdata = realloc(dentry->data, size);
364
    void *newdata = realloc(dentry->data, dentry->size + delta);
354
    if (!newdata) {
365
    if (!newdata) {
355
        ipc_answer_0(callid, ENOMEM);
366
        ipc_answer_0(callid, ENOMEM);
356
        ipc_answer_1(rid, EOK, 0);
367
        ipc_answer_1(rid, EOK, 0);
357
        return;
368
        return;
358
    }
369
    }
359
    dentry->size = size;
370
    dentry->size += delta;
360
    dentry->data = newdata;
371
    dentry->data = newdata;
361
    (void) ipc_data_write_deliver(callid, dentry->data + pos, size);
372
    (void) ipc_data_write_deliver(callid, dentry->data + pos, size);
362
 
-
 
363
    /*
-
 
364
     * Answer the VFS_WRITE call.
-
 
365
     */
-
 
366
    ipc_answer_1(rid, EOK, size);
373
    ipc_answer_1(rid, EOK, size);
367
}
374
}
368
 
375
 
369
/**
376
/**
370
 * @}
377
 * @}