Changeset b14d9f9 in mainline for uspace/lib/c/generic/vfs/vfs.c
- Timestamp:
- 2017-05-05T17:37:36Z (7 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 951f6b9e
- Parents:
- 75b24cd
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/c/generic/vfs/vfs.c
r75b24cd rb14d9f9 346 346 347 347 return loc_service_connect(stat.service, iface, 0); 348 } 349 350 /** Return a list of currently available file system types 351 * 352 * @param fstypes Points to structure where list of filesystem types is 353 * stored. It is read as a null-terminated list of strings 354 * fstypes->fstypes[0..]. To free the list use vfs_fstypes_free(). 355 * 356 * @return EOK on success or a negative error code 357 */ 358 int vfs_fstypes(vfs_fstypes_t *fstypes) 359 { 360 sysarg_t size; 361 char *buf; 362 char dummybuf[1]; 363 size_t count, i; 364 365 async_exch_t *exch = vfs_exchange_begin(); 366 int rc = async_req_0_1(exch, VFS_IN_FSTYPES, &size); 367 368 if (rc != EOK) { 369 vfs_exchange_end(exch); 370 return rc; 371 } 372 373 buf = malloc(size); 374 if (buf == NULL) { 375 buf = dummybuf; 376 size = 1; 377 } 378 379 rc = async_data_read_start(exch, buf, size); 380 vfs_exchange_end(exch); 381 382 if (buf == dummybuf) 383 return ENOMEM; 384 385 /* 386 * Buffer should contain a number of null-terminated strings. 387 * Count them so that we can allocate an index 388 */ 389 count = 0; 390 i = 0; 391 while (i < size) { 392 if (buf[i] == '\0') 393 ++count; 394 ++i; 395 } 396 397 if (count == 0) { 398 free(buf); 399 return EIO; 400 } 401 402 fstypes->fstypes = calloc(sizeof(char *), count + 1); 403 if (fstypes->fstypes == NULL) { 404 free(buf); 405 return ENOMEM; 406 } 407 408 /* Now fill the index */ 409 if (buf[0] != '\0') 410 fstypes->fstypes[0] = &buf[0]; 411 count = 0; 412 i = 0; 413 while (i < size) { 414 if (buf[i] == '\0') 415 fstypes->fstypes[++count] = &buf[i + 1]; 416 ++i; 417 } 418 fstypes->fstypes[count] = NULL; 419 fstypes->buf = buf; 420 fstypes->size = size; 421 422 return rc; 423 } 424 425 /** Free list of file system types. 426 * 427 * @param fstypes List of file system types 428 */ 429 void vfs_fstypes_free(vfs_fstypes_t *fstypes) 430 { 431 free(fstypes->buf); 432 fstypes->buf = NULL; 433 free(fstypes->fstypes); 434 fstypes->fstypes = NULL; 435 fstypes->size = 0; 348 436 } 349 437
Note:
See TracChangeset
for help on using the changeset viewer.