Subversion Repositories HelenOS

Rev

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

Rev 3219 Rev 3403
Line 57... Line 57...
57
futex_t cwd_futex = FUTEX_INITIALIZER;
57
futex_t cwd_futex = FUTEX_INITIALIZER;
58
DIR *cwd_dir = NULL;
58
DIR *cwd_dir = NULL;
59
char *cwd_path = NULL;
59
char *cwd_path = NULL;
60
size_t cwd_len = 0;
60
size_t cwd_len = 0;
61
 
61
 
62
static char *absolutize(const char *path, size_t *retlen)
62
char *absolutize(const char *path, size_t *retlen)
63
{
63
{
64
    char *ncwd_path;
64
    char *ncwd_path;
-
 
65
    char *ncwd_path_nc;
65
 
66
 
66
    futex_down(&cwd_futex);
67
    futex_down(&cwd_futex);
67
    size_t len = strlen(path);
68
    size_t len = strlen(path);
68
    if (*path != '/') {
69
    if (*path != '/') {
69
        if (!cwd_path) {
70
        if (!cwd_path) {
70
            futex_up(&cwd_futex);
71
            futex_up(&cwd_futex);
71
            return NULL;
72
            return NULL;
72
        }
73
        }
73
        ncwd_path = malloc(len + cwd_len + 1);
74
        ncwd_path_nc = malloc(cwd_len + 1 + len + 1);
74
        if (!ncwd_path) {
75
        if (!ncwd_path_nc) {
75
            futex_up(&cwd_futex);
76
            futex_up(&cwd_futex);
76
            return NULL;
77
            return NULL;
77
        }
78
        }
78
        strcpy(ncwd_path, cwd_path);
79
        strcpy(ncwd_path_nc, cwd_path);
79
        ncwd_path[cwd_len] = '/';
80
        ncwd_path_nc[cwd_len] = '/';
80
        ncwd_path[cwd_len + 1] = '\0';
81
        ncwd_path_nc[cwd_len + 1] = '\0';
81
    } else {
82
    } else {
82
        ncwd_path = malloc(len + 1);
83
        ncwd_path_nc = malloc(len + 1);
83
        if (!ncwd_path) {
84
        if (!ncwd_path_nc) {
84
            futex_up(&cwd_futex);
85
            futex_up(&cwd_futex);
85
            return NULL;
86
            return NULL;
86
        }
87
        }
87
        ncwd_path[0] = '\0';
88
        ncwd_path_nc[0] = '\0';
88
    }
89
    }
89
    strcat(ncwd_path, path);
90
    strcat(ncwd_path_nc, path);
90
    if (!canonify(ncwd_path, retlen)) {
91
    ncwd_path = canonify(ncwd_path_nc, retlen);
-
 
92
    if (!ncwd_path) {
-
 
93
        futex_up(&cwd_futex);
-
 
94
        free(ncwd_path_nc);
-
 
95
        return NULL;
-
 
96
    }
-
 
97
    /*
-
 
98
     * We need to clone ncwd_path because canonify() works in-place and thus
-
 
99
     * the address in ncwd_path need not be the same as ncwd_path_nc, even
-
 
100
     * though they both point into the same dynamically allocated buffer.
-
 
101
     */
-
 
102
    ncwd_path = strdup(ncwd_path);
-
 
103
    free(ncwd_path_nc);
-
 
104
    if (!ncwd_path) {
91
        futex_up(&cwd_futex);
105
        futex_up(&cwd_futex);
92
        free(ncwd_path);
-
 
93
        return NULL;
106
        return NULL;
94
    }
107
    }
95
    futex_up(&cwd_futex);
108
    futex_up(&cwd_futex);
96
    return ncwd_path;
109
    return ncwd_path;
97
}
110
}
Line 103... Line 116...
103
    return vfs_phone;
116
    return vfs_phone;
104
}
117
}
105
 
118
 
106
static int device_get_handle(char *name, dev_handle_t *handle)
119
static int device_get_handle(char *name, dev_handle_t *handle)
107
{
120
{
108
    int phone = ipc_connect_me_to(PHONE_NS, SERVICE_DEVMAP, DEVMAP_CLIENT, 0);
121
    int phone = ipc_connect_me_to(PHONE_NS, SERVICE_DEVMAP, DEVMAP_CLIENT,
-
 
122
        0);
109
    if (phone < 0)
123
    if (phone < 0)
110
        return phone;
124
        return phone;
111
   
125
   
112
    ipc_call_t answer;
126
    ipc_call_t answer;
113
    aid_t req = async_send_2(phone, DEVMAP_DEVICE_GET_HANDLE, 0, 0,
127
    aid_t req = async_send_2(phone, DEVMAP_DEVICE_GET_HANDLE, 0, 0,
Line 169... Line 183...
169
        async_serialize_end();
183
        async_serialize_end();
170
        futex_up(&vfs_phone_futex);
184
        futex_up(&vfs_phone_futex);
171
        free(mpa);
185
        free(mpa);
172
        return (int) rc;
186
        return (int) rc;
173
    }
187
    }
-
 
188
    /* Ask VFS whether it likes fs_name. */
-
 
189
    rc = async_req_0_0(vfs_phone, IPC_M_PING);
-
 
190
    if (rc != EOK) {
-
 
191
        async_wait_for(req, NULL);
-
 
192
        async_serialize_end();
-
 
193
        futex_up(&vfs_phone_futex);
-
 
194
        free(mpa);
-
 
195
        return (int) rc;
-
 
196
    }
174
    rc = ipc_data_write_start(vfs_phone, (void *)mpa, mpa_len);
197
    rc = ipc_data_write_start(vfs_phone, (void *)mpa, mpa_len);
175
    if (rc != EOK) {
198
    if (rc != EOK) {
176
        async_wait_for(req, NULL);
199
        async_wait_for(req, NULL);
177
        async_serialize_end();
200
        async_serialize_end();
178
        futex_up(&vfs_phone_futex);
201
        futex_up(&vfs_phone_futex);
Line 221... Line 244...
221
    async_wait_for(req, &rc);
244
    async_wait_for(req, &rc);
222
    async_serialize_end();
245
    async_serialize_end();
223
    futex_up(&vfs_phone_futex);
246
    futex_up(&vfs_phone_futex);
224
    free(pa);
247
    free(pa);
225
 
248
 
-
 
249
    if (rc != EOK)
226
    if (rc != EOK) return (int) rc;
250
        return (int) rc;
227
    return (int) IPC_GET_ARG1(answer);
251
    return (int) IPC_GET_ARG1(answer);
228
}
252
}
229
 
253
 
230
int open(const char *path, int oflag, ...)
254
int open(const char *path, int oflag, ...)
231
{
255
{
Line 285... Line 309...
285
    async_serialize_end();
309
    async_serialize_end();
286
    futex_up(&vfs_phone_futex);
310
    futex_up(&vfs_phone_futex);
287
    if (rc == EOK)
311
    if (rc == EOK)
288
        return (ssize_t) IPC_GET_ARG1(answer);
312
        return (ssize_t) IPC_GET_ARG1(answer);
289
    else
313
    else
290
        return -1;
314
        return rc;
291
}
315
}
292
 
316
 
293
ssize_t write(int fildes, const void *buf, size_t nbyte)
317
ssize_t write(int fildes, const void *buf, size_t nbyte)
294
{
318
{
295
    int res;
319
    int res;