Rev 2732 | Rev 2735 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 2732 | Rev 2733 | ||
|---|---|---|---|
| Line 185... | Line 185... | ||
| 185 | return (void *) node; |
185 | return (void *) node; |
| 186 | } |
186 | } |
| 187 | 187 | ||
| 188 | static int destroy_component(void *nodeptr) |
188 | static int destroy_component(void *nodeptr) |
| 189 | { |
189 | { |
| - | 190 | tmpfs_dentry_t *dentry = (tmpfs_dentry_t *)nodeptr; |
|
| - | 191 | ||
| - | 192 | if (dentry->child) |
|
| - | 193 | return ENOTEMPTY; |
|
| - | 194 | ||
| - | 195 | if (!dentry->parent) |
|
| - | 196 | return EBUSY; |
|
| - | 197 | ||
| - | 198 | if (dentry->parent->child == dentry) { |
|
| - | 199 | dentry->parent->child = dentry->sibling; |
|
| - | 200 | } else { |
|
| - | 201 | /* TODO: consider doubly linked list for organizing siblings. */ |
|
| - | 202 | tmpfs_dentry_t *tmp = dentry->parent->child; |
|
| - | 203 | while (tmp->sibling != dentry) |
|
| - | 204 | tmp = tmp->sibling; |
|
| - | 205 | tmp->sibling = dentry->sibling; |
|
| - | 206 | } |
|
| - | 207 | ||
| 190 | return EPERM; |
208 | return EOK; |
| 191 | } |
209 | } |
| 192 | 210 | ||
| 193 | void tmpfs_lookup(ipc_callid_t rid, ipc_call_t *request) |
211 | void tmpfs_lookup(ipc_callid_t rid, ipc_call_t *request) |
| 194 | { |
212 | { |
| 195 | unsigned next = IPC_GET_ARG1(*request); |
213 | unsigned next = IPC_GET_ARG1(*request); |
| Line 311... | Line 329... | ||
| 311 | } |
329 | } |
| 312 | 330 | ||
| 313 | /* handle hit */ |
331 | /* handle hit */ |
| 314 | if (lflag & L_DESTROY) { |
332 | if (lflag & L_DESTROY) { |
| 315 | int res = destroy_component(dcur); |
333 | int res = destroy_component(dcur); |
| - | 334 | unsigned lnkcnt = (res == EOK) ? 0 : TMPFS_GET_LNKCNT(dcur); |
|
| 316 | ipc_answer_0(rid, res); |
335 | ipc_answer_5(rid, (ipcarg_t)res, tmpfs_reg.fs_handle, |
| - | 336 | dev_handle, dcur->index, dcur->size, lnkcnt); |
|
| 317 | return; |
337 | return; |
| 318 | } |
338 | } |
| 319 | if ((lflag & (L_CREATE | L_EXCLUSIVE)) == (L_CREATE | L_EXCLUSIVE)) { |
339 | if ((lflag & (L_CREATE | L_EXCLUSIVE)) == (L_CREATE | L_EXCLUSIVE)) { |
| 320 | ipc_answer_0(rid, EEXIST); |
340 | ipc_answer_0(rid, EEXIST); |
| 321 | return; |
341 | return; |