Rev 2687 | Rev 2699 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 2687 | Rev 2693 | ||
---|---|---|---|
Line 366... | Line 366... | ||
366 | if (!newdata) { |
366 | if (!newdata) { |
367 | ipc_answer_0(callid, ENOMEM); |
367 | ipc_answer_0(callid, ENOMEM); |
368 | ipc_answer_1(rid, EOK, 0); |
368 | ipc_answer_1(rid, EOK, 0); |
369 | return; |
369 | return; |
370 | } |
370 | } |
371 | /* Clear any newly allocated memory in order to emulate gaps. */ |
371 | /* Clear any newly allocated memory in order to emulate gaps. */ |
372 | memset(newdata + dentry->size, 0, delta); |
372 | memset(newdata + dentry->size, 0, delta); |
373 | dentry->size += delta; |
373 | dentry->size += delta; |
374 | dentry->data = newdata; |
374 | dentry->data = newdata; |
375 | (void) ipc_data_write_finalize(callid, dentry->data + pos, len); |
375 | (void) ipc_data_write_finalize(callid, dentry->data + pos, len); |
376 | ipc_answer_2(rid, EOK, len, dentry->size); |
376 | ipc_answer_2(rid, EOK, len, dentry->size); |
377 | } |
377 | } |
378 | 378 | ||
- | 379 | void tmpfs_truncate(ipc_callid_t rid, ipc_call_t *request) |
|
- | 380 | { |
|
- | 381 | int dev_handle = IPC_GET_ARG1(*request); |
|
- | 382 | unsigned long index = IPC_GET_ARG2(*request); |
|
- | 383 | size_t size = IPC_GET_ARG3(*request); |
|
- | 384 | ||
- | 385 | /* |
|
- | 386 | * Lookup the respective dentry. |
|
- | 387 | */ |
|
- | 388 | link_t *hlp; |
|
- | 389 | hlp = hash_table_find(&dentries, &index); |
|
- | 390 | if (!hlp) { |
|
- | 391 | ipc_answer_0(rid, ENOENT); |
|
- | 392 | return; |
|
- | 393 | } |
|
- | 394 | tmpfs_dentry_t *dentry = hash_table_get_instance(hlp, tmpfs_dentry_t, |
|
- | 395 | dh_link); |
|
- | 396 | ||
- | 397 | if (size == dentry->size) { |
|
- | 398 | ipc_answer_0(rid, EOK); |
|
- | 399 | return; |
|
- | 400 | } |
|
- | 401 | ||
- | 402 | void *newdata = realloc(dentry->data, size); |
|
- | 403 | if (!newdata) { |
|
- | 404 | ipc_answer_0(rid, ENOMEM); |
|
- | 405 | return; |
|
- | 406 | } |
|
- | 407 | if (size > dentry->size) { |
|
- | 408 | size_t delta = size - dentry->size; |
|
- | 409 | memset(newdata + dentry->size, 0, delta); |
|
- | 410 | } |
|
- | 411 | dentry->size = size; |
|
- | 412 | dentry->data = newdata; |
|
- | 413 | ipc_answer_0(rid, EOK); |
|
- | 414 | } |
|
- | 415 | ||
379 | /** |
416 | /** |
380 | * @} |
417 | * @} |
381 | */ |
418 | */ |