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 | */ |