* Get fd from file vnode. */
| 421 | * Get fd from file vnode. |
| 422 | */ |
| 423 | static int _ipc_msg_fd_new(void *file) |
| 424 | { |
| 425 | int fd; |
| 426 | struct dfs_file *d; |
| 427 | struct dfs_file *df = RT_NULL; |
| 428 | |
| 429 | if (file == RT_NULL) |
| 430 | { |
| 431 | return -1; |
| 432 | } |
| 433 | |
| 434 | df = (struct dfs_file *)file; |
| 435 | |
| 436 | fd = fd_new(); |
| 437 | if (fd < 0) |
| 438 | { |
| 439 | return -1; |
| 440 | } |
| 441 | |
| 442 | d = fd_get(fd); |
| 443 | if (!d) |
| 444 | { |
| 445 | fd_release(fd); |
| 446 | return -1; |
| 447 | } |
| 448 | |
| 449 | d->vnode = df->vnode; |
| 450 | d->flags = df->flags; |
| 451 | d->data = df->data; |
| 452 | d->magic = df->magic; |
| 453 | |
| 454 | #ifdef RT_USING_DFS_V2 |
| 455 | d->fops = df->fops; |
| 456 | d->mode = df->mode; |
| 457 | d->dentry = df->dentry; |
| 458 | if (d->dentry) |
| 459 | rt_atomic_add(&(d->dentry->ref_count), 1); |
| 460 | |
| 461 | if (d->vnode) |
| 462 | rt_atomic_add(&(d->vnode->ref_count), 1); |
| 463 | #else |
| 464 | if (d->vnode) |
| 465 | d->vnode->ref_count++; |
| 466 | #endif |
| 467 | |
| 468 | return fd; |
| 469 | } |
| 470 | |
| 471 | static rt_err_t _do_send_recv_timeout(rt_channel_t ch, rt_channel_msg_t data, int need_reply, rt_channel_msg_t data_ret, rt_int32_t time, rt_ipc_msg_t msg); |
| 472 |
no test coverage detected