Changeset db96017 in mainline for uspace/lib/c/generic
- Timestamp:
- 2012-04-07T17:41:44Z (14 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- b6913b7
- Parents:
- b69e4c0 (diff), 6bb169b5 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)links above to see all the changes relative to each parent. - Location:
- uspace/lib/c/generic
- Files:
-
- 4 added
- 17 edited
-
adt/hash_set.c (added)
-
adt/hash_table.c (modified) (2 diffs)
-
as.c (modified) (2 diffs)
-
async.c (modified) (9 diffs)
-
ddi.c (modified) (7 diffs)
-
device/hw_res_parsed.c (added)
-
device/nic.c (added)
-
device/pci.c (added)
-
devman.c (modified) (2 diffs)
-
elf/elf_load.c (modified) (1 diff)
-
fibril_synch.c (modified) (1 diff)
-
ipc.c (modified) (5 diffs)
-
loc.c (modified) (9 diffs)
-
malloc.c (modified) (1 diff)
-
mman.c (modified) (1 diff)
-
net/packet.c (modified) (8 diffs)
-
ns.c (modified) (2 diffs)
-
str.c (modified) (3 diffs)
-
sysinfo.c (modified) (4 diffs)
-
time.c (modified) (1 diff)
-
vfs/vfs.c (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/c/generic/adt/hash_table.c
rb69e4c0 rdb96017 76 76 77 77 return true; 78 } 79 80 /** Remove all elements from the hash table 81 * 82 * @param h Hash table to be cleared 83 */ 84 void hash_table_clear(hash_table_t *h) 85 { 86 for (hash_count_t chain = 0; chain < h->entries; ++chain) { 87 link_t *cur; 88 link_t *next; 89 90 for (cur = h->entry[chain].head.next; 91 cur != &h->entry[chain].head; 92 cur = next) { 93 next = cur->next; 94 list_remove(cur); 95 h->op->remove_callback(cur); 96 } 97 } 78 98 } 79 99 … … 198 218 */ 199 219 void hash_table_apply(hash_table_t *h, void (*f)(link_t *, void *), void *arg) 200 { 201 hash_index_t bucket; 202 203 for (bucket = 0; bucket < h->entries; bucket++) { 204 list_foreach(h->entry[bucket], cur) { 220 { 221 for (hash_index_t bucket = 0; bucket < h->entries; bucket++) { 222 link_t *cur; 223 link_t *next; 224 225 for (cur = h->entry[bucket].head.next; cur != &h->entry[bucket].head; 226 cur = next) { 227 /* 228 * The next pointer must be stored prior to the functor 229 * call to allow using destructor as the functor (the 230 * free function could overwrite the cur->next pointer). 231 */ 232 next = cur->next; 205 233 f(cur, arg); 206 234 } -
uspace/lib/c/generic/as.c
rb69e4c0 rdb96017 45 45 /** Create address space area. 46 46 * 47 * @param address Virtual address where to place new address space area. 48 * @param size Size of the area. 49 * @param flags Flags describing type of the area. 47 * @param base Starting virtual address of the area. 48 * If set to (void *) -1, the kernel finds 49 * a mappable area. 50 * @param size Size of the area. 51 * @param flags Flags describing type of the area. 50 52 * 51 * @return address on success, (void *) -1 otherwise. 53 * @return Starting virtual address of the created area on success. 54 * @return (void *) -1 otherwise. 52 55 * 53 56 */ 54 void *as_area_create(void * address, size_t size, unsigned int flags)57 void *as_area_create(void *base, size_t size, unsigned int flags) 55 58 { 56 return (void *) __SYSCALL 3(SYS_AS_AREA_CREATE, (sysarg_t) address,57 (sysarg_t) size, (sysarg_t) flags );59 return (void *) __SYSCALL4(SYS_AS_AREA_CREATE, (sysarg_t) base, 60 (sysarg_t) size, (sysarg_t) flags, (sysarg_t) __entry); 58 61 } 59 62 … … 102 105 } 103 106 104 /** Return pointer to unmapped address space area107 /** Find mapping to physical address. 105 108 * 106 * @param size Requested size of the allocation. 109 * @param virt Virtual address to find mapping for. 110 * @param[out] phys Physical adress. 107 111 * 108 * @return Pointer to the beginning of unmapped address space area. 112 * @return EOK on no error. 113 * @retval ENOENT if no mapping was found. 109 114 * 110 115 */ 111 void *as_get_mappable_page(size_t size)116 int as_get_physical_mapping(const void *virt, uintptr_t *phys) 112 117 { 113 return (void *) __SYSCALL2(SYS_AS_GET_UNMAPPED_AREA, 114 (sysarg_t) __entry, (sysarg_t) size); 115 } 116 117 /** Find mapping to physical address. 118 * 119 * @param address Virtual address in question (virtual). 120 * @param[out] frame Frame address (physical). 121 * @return Error code. 122 * @retval EOK No error, @p frame holds the translation. 123 * @retval ENOENT Mapping not found. 124 */ 125 int as_get_physical_mapping(const void *address, uintptr_t *frame) 126 { 127 uintptr_t tmp_frame; 128 uintptr_t virt = (uintptr_t) address; 129 130 int rc = (int) __SYSCALL2(SYS_PAGE_FIND_MAPPING, 131 (sysarg_t) virt, (sysarg_t) &tmp_frame); 132 if (rc != EOK) { 133 return rc; 134 } 135 136 if (frame != NULL) { 137 *frame = tmp_frame; 138 } 139 140 return EOK; 118 return (int) __SYSCALL2(SYS_PAGE_FIND_MAPPING, (sysarg_t) virt, 119 (sysarg_t) phys); 141 120 } 142 121 -
uspace/lib/c/generic/async.c
rb69e4c0 rdb96017 257 257 void async_set_client_data_constructor(async_client_data_ctor_t ctor) 258 258 { 259 assert(async_client_data_create == default_client_data_constructor); 259 260 async_client_data_create = ctor; 260 261 } … … 262 263 void async_set_client_data_destructor(async_client_data_dtor_t dtor) 263 264 { 265 assert(async_client_data_destroy == default_client_data_destructor); 264 266 async_client_data_destroy = dtor; 265 267 } … … 303 305 void async_set_client_connection(async_client_conn_t conn) 304 306 { 307 assert(client_connection == default_client_connection); 305 308 client_connection = conn; 306 309 } … … 1848 1851 1849 1852 int rc = async_hangup_internal(sess->phone); 1850 if (rc == EOK)1851 free(sess);1852 1853 1853 1854 while (!list_empty(&sess->exch_list)) { … … 1861 1862 free(exch); 1862 1863 } 1864 1865 free(sess); 1863 1866 1864 1867 fibril_mutex_unlock(&async_sess_mutex); … … 1998 2001 * 1999 2002 * @param exch Exchange for sending the message. 2000 * @param dst Destination address space area base.2001 2003 * @param size Size of the destination address space area. 2002 2004 * @param arg User defined argument. 2003 2005 * @param flags Storage for the received flags. Can be NULL. 2006 * @param dst Destination address space area base. Cannot be NULL. 2004 2007 * 2005 2008 * @return Zero on success or a negative error code from errno.h. 2006 2009 * 2007 2010 */ 2008 int async_share_in_start(async_exch_t *exch, void *dst, size_t size,2009 sysarg_t arg, unsigned int *flags)2011 int async_share_in_start(async_exch_t *exch, size_t size, sysarg_t arg, 2012 unsigned int *flags, void **dst) 2010 2013 { 2011 2014 if (exch == NULL) 2012 2015 return ENOENT; 2013 2016 2014 sysarg_t tmp_flags; 2015 int res = async_req_3_2(exch, IPC_M_SHARE_IN, (sysarg_t) dst, 2016 (sysarg_t) size, arg, NULL, &tmp_flags); 2017 sysarg_t _flags = 0; 2018 sysarg_t _dst = (sysarg_t) -1; 2019 int res = async_req_2_4(exch, IPC_M_SHARE_IN, (sysarg_t) size, 2020 arg, NULL, &_flags, NULL, &_dst); 2017 2021 2018 2022 if (flags) 2019 *flags = (unsigned int) tmp_flags; 2020 2023 *flags = (unsigned int) _flags; 2024 2025 *dst = (void *) _dst; 2021 2026 return res; 2022 2027 } … … 2047 2052 return false; 2048 2053 2049 *size = (size_t) IPC_GET_ARG 2(data);2054 *size = (size_t) IPC_GET_ARG1(data); 2050 2055 return true; 2051 2056 } … … 2053 2058 /** Wrapper for answering the IPC_M_SHARE_IN calls using the async framework. 2054 2059 * 2055 * This wrapper only makes it more comfortable to answer IPC_M_ DATA_READ2060 * This wrapper only makes it more comfortable to answer IPC_M_SHARE_IN 2056 2061 * calls so that the user doesn't have to remember the meaning of each IPC 2057 2062 * argument. … … 2131 2136 * 2132 2137 */ 2133 int async_share_out_finalize(ipc_callid_t callid, void * dst)2138 int async_share_out_finalize(ipc_callid_t callid, void **dst) 2134 2139 { 2135 2140 return ipc_share_out_finalize(callid, dst); -
uspace/lib/c/generic/ddi.c
rb69e4c0 rdb96017 33 33 */ 34 34 35 #include <assert.h> 36 #include <unistd.h> 37 #include <errno.h> 35 38 #include <sys/types.h> 36 39 #include <abi/ddi/arg.h> … … 42 45 #include <align.h> 43 46 #include <libarch/config.h> 47 #include "private/libc.h" 44 48 45 49 /** Return unique device number. … … 53 57 } 54 58 55 /** Map piece of physical memory to task.59 /** Map a piece of physical memory to task. 56 60 * 57 61 * Caller of this function must have the CAP_MEM_MANAGER capability. 58 62 * 59 * @param p fPhysical address of the starting frame.60 * @param vp Virtual address of the starting page.61 * @param pages Number of pages to map.62 * @param flags Flags for the new address space area.63 * @param phys Physical address of the starting frame. 64 * @param pages Number of pages to map. 65 * @param flags Flags for the new address space area. 66 * @param virt Virtual address of the starting page. 63 67 * 64 * @return 0 on success, EPERM if the caller lacks the 65 * CAP_MEM_MANAGER capability, ENOENT if there is no task 66 * with specified ID and ENOMEM if there was some problem 67 * in creating address space area. 68 * @return EOK on success 69 * @return EPERM if the caller lacks the CAP_MEM_MANAGER capability 70 * @return ENOENT if there is no task with specified ID 71 * @return ENOMEM if there was some problem in creating 72 * the address space area. 73 * 68 74 */ 69 int physmem_map(void *p f, void *vp, unsigned long pages, int flags)75 int physmem_map(void *phys, size_t pages, unsigned int flags, void **virt) 70 76 { 71 return __SYSCALL4(SYS_PHYSMEM_MAP, (sysarg_t) pf, (sysarg_t) vp, pages, 72 flags); 77 return __SYSCALL5(SYS_PHYSMEM_MAP, (sysarg_t) phys, 78 pages, flags, (sysarg_t) virt, (sysarg_t) __entry); 79 } 80 81 int dmamem_map(void *virt, size_t size, unsigned int map_flags, 82 unsigned int flags, void **phys) 83 { 84 return (int) __SYSCALL6(SYS_DMAMEM_MAP, (sysarg_t) size, 85 (sysarg_t) map_flags, (sysarg_t) flags & ~DMAMEM_FLAGS_ANONYMOUS, 86 (sysarg_t) phys, (sysarg_t) virt, 0); 87 } 88 89 int dmamem_map_anonymous(size_t size, unsigned int map_flags, 90 unsigned int flags, void **phys, void **virt) 91 { 92 return (int) __SYSCALL6(SYS_DMAMEM_MAP, (sysarg_t) size, 93 (sysarg_t) map_flags, (sysarg_t) flags | DMAMEM_FLAGS_ANONYMOUS, 94 (sysarg_t) phys, (sysarg_t) virt, (sysarg_t) __entry); 95 } 96 97 int dmamem_unmap(void *virt, size_t size) 98 { 99 return __SYSCALL3(SYS_DMAMEM_UNMAP, (sysarg_t) virt, (sysarg_t) size, 0); 100 } 101 102 int dmamem_unmap_anonymous(void *virt) 103 { 104 return __SYSCALL3(SYS_DMAMEM_UNMAP, (sysarg_t) virt, 0, 105 DMAMEM_FLAGS_ANONYMOUS); 73 106 } 74 107 … … 77 110 * Caller of this function must have the IO_MEM_MANAGER capability. 78 111 * 79 * @param id Task ID.80 * @param ioaddr Starting address of the I/O range.81 * @param size Size of the range.112 * @param id Task ID. 113 * @param ioaddr Starting address of the I/O range. 114 * @param size Size of the range. 82 115 * 83 * @return 0 on success, EPERM if the caller lacks the 84 * CAP_IO_MANAGER capability, ENOENT if there is no task 85 * with specified ID and ENOMEM if there was some problem 86 * in allocating memory. 116 * @return EOK on success 117 * @return EPERM if the caller lacks the CAP_IO_MANAGER capability 118 * @return ENOENT if there is no task with specified ID 119 * @return ENOMEM if there was some problem in allocating memory. 120 * 87 121 */ 88 122 int iospace_enable(task_id_t id, void *ioaddr, unsigned long size) 89 123 { 90 124 ddi_ioarg_t arg; 91 125 92 126 arg.task_id = id; 93 127 arg.ioaddr = ioaddr; 94 128 arg.size = size; 95 129 96 130 return __SYSCALL1(SYS_IOSPACE_ENABLE, (sysarg_t) &arg); 97 131 } … … 99 133 /** Enable PIO for specified I/O range. 100 134 * 101 * @param pio_addr I/O start address.102 * @param size Size of the I/O region.103 * @param use_addr Address where the final address for application's PIO104 * will be stored.135 * @param pio_addr I/O start address. 136 * @param size Size of the I/O region. 137 * @param virt Virtual address for application's 138 * PIO operations. 105 139 * 106 * @return Zero on success or negative error code. 140 * @return EOK on success. 141 * @return Negative error code on failure. 142 * 107 143 */ 108 int pio_enable(void *pio_addr, size_t size, void ** use_addr)144 int pio_enable(void *pio_addr, size_t size, void **virt) 109 145 { 110 void *phys;111 void *virt;112 size_t offset;113 unsigned int pages;114 115 146 #ifdef IO_SPACE_BOUNDARY 116 147 if (pio_addr < IO_SPACE_BOUNDARY) { 117 * use_addr= pio_addr;148 *virt = pio_addr; 118 149 return iospace_enable(task_get_id(), pio_addr, size); 119 150 } 120 151 #endif 121 122 phys = (void *) ALIGN_DOWN((uintptr_t) pio_addr, PAGE_SIZE); 123 offset = pio_addr - phys; 124 pages = ALIGN_UP(offset + size, PAGE_SIZE) >> PAGE_WIDTH; 125 virt = as_get_mappable_page(pages << PAGE_WIDTH); 126 *use_addr = virt + offset; 127 return physmem_map(phys, virt, pages, AS_AREA_READ | AS_AREA_WRITE); 152 153 void *phys_frame = 154 (void *) ALIGN_DOWN((uintptr_t) pio_addr, PAGE_SIZE); 155 size_t offset = pio_addr - phys_frame; 156 size_t pages = SIZE2PAGES(offset + size); 157 158 void *virt_page; 159 int rc = physmem_map(phys_frame, pages, 160 AS_AREA_READ | AS_AREA_WRITE, &virt_page); 161 if (rc != EOK) 162 return rc; 163 164 *virt = virt_page + offset; 165 return EOK; 128 166 } 129 167 … … 138 176 * 139 177 */ 140 int register_irq(int inr, int devno, int method, irq_code_t *ucode)178 int irq_register(int inr, int devno, int method, irq_code_t *ucode) 141 179 { 142 return __SYSCALL4(SYS_ REGISTER_IRQ, inr, devno, method,180 return __SYSCALL4(SYS_IRQ_REGISTER, inr, devno, method, 143 181 (sysarg_t) ucode); 144 182 } … … 152 190 * 153 191 */ 154 int unregister_irq(int inr, int devno)192 int irq_unregister(int inr, int devno) 155 193 { 156 return __SYSCALL2(SYS_ UNREGISTER_IRQ, inr, devno);194 return __SYSCALL2(SYS_IRQ_UNREGISTER, inr, devno); 157 195 } 158 196 -
uspace/lib/c/generic/devman.c
rb69e4c0 rdb96017 177 177 178 178 /** Register running driver with device manager. */ 179 int devman_driver_register(const char *name , async_client_conn_t conn)179 int devman_driver_register(const char *name) 180 180 { 181 181 async_exch_t *exch = devman_exchange_begin_blocking(DEVMAN_DRIVER); … … 192 192 } 193 193 194 async_set_client_connection(conn);195 196 194 exch = devman_exchange_begin(DEVMAN_DRIVER); 197 async_connect_to_me(exch, 0, 0, 0, conn, NULL);195 async_connect_to_me(exch, 0, 0, 0, NULL, NULL); 198 196 devman_exchange_end(exch); 199 197 -
uspace/lib/c/generic/elf/elf_load.c
rb69e4c0 rdb96017 364 364 * and writeable. 365 365 */ 366 a = as_area_create((uint8_t *) base + bias, mem_sz,366 a = as_area_create((uint8_t *) base + bias, mem_sz, 367 367 AS_AREA_READ | AS_AREA_WRITE | AS_AREA_CACHEABLE); 368 if (a == (void *) (-1)) {368 if (a == (void *) -1) { 369 369 DPRINTF("memory mapping failed (0x%x, %d)\n", 370 base+bias, mem_sz);370 base + bias, mem_sz); 371 371 return EE_MEMORY; 372 372 } -
uspace/lib/c/generic/fibril_synch.c
rb69e4c0 rdb96017 447 447 } 448 448 449 /** Timer fibril. 450 * 451 * @param arg Timer 452 */ 453 static int fibril_timer_func(void *arg) 454 { 455 fibril_timer_t *timer = (fibril_timer_t *) arg; 456 int rc; 457 458 fibril_mutex_lock(&timer->lock); 459 460 while (true) { 461 while (timer->state != fts_active && 462 timer->state != fts_cleanup) { 463 464 if (timer->state == fts_cleanup) 465 break; 466 467 fibril_condvar_wait(&timer->cv, &timer->lock); 468 } 469 470 if (timer->state == fts_cleanup) 471 break; 472 473 rc = fibril_condvar_wait_timeout(&timer->cv, &timer->lock, 474 timer->delay); 475 if (rc == ETIMEOUT) { 476 timer->state = fts_fired; 477 fibril_mutex_unlock(&timer->lock); 478 timer->fun(timer->arg); 479 fibril_mutex_lock(&timer->lock); 480 } 481 } 482 483 fibril_mutex_unlock(&timer->lock); 484 return 0; 485 } 486 487 /** Create new timer. 488 * 489 * @return New timer on success, @c NULL if out of memory. 490 */ 491 fibril_timer_t *fibril_timer_create(void) 492 { 493 fid_t fid; 494 fibril_timer_t *timer; 495 496 timer = calloc(1, sizeof(fibril_timer_t)); 497 if (timer == NULL) 498 return NULL; 499 500 fid = fibril_create(fibril_timer_func, (void *) timer); 501 if (fid == 0) { 502 free(timer); 503 return NULL; 504 } 505 506 fibril_mutex_initialize(&timer->lock); 507 fibril_condvar_initialize(&timer->cv); 508 509 timer->fibril = fid; 510 timer->state = fts_not_set; 511 512 fibril_add_ready(fid); 513 514 return timer; 515 } 516 517 /** Destroy timer. 518 * 519 * @param timer Timer, must not be active or accessed by other threads. 520 */ 521 void fibril_timer_destroy(fibril_timer_t *timer) 522 { 523 fibril_mutex_lock(&timer->lock); 524 assert(timer->state != fts_active); 525 timer->state = fts_cleanup; 526 fibril_condvar_broadcast(&timer->cv); 527 fibril_mutex_unlock(&timer->lock); 528 } 529 530 /** Set timer. 531 * 532 * Set timer to execute a callback function after the specified 533 * interval. 534 * 535 * @param timer Timer 536 * @param delay Delay in microseconds 537 * @param fun Callback function 538 * @param arg Argument for @a fun 539 */ 540 void fibril_timer_set(fibril_timer_t *timer, suseconds_t delay, 541 fibril_timer_fun_t fun, void *arg) 542 { 543 fibril_mutex_lock(&timer->lock); 544 timer->state = fts_active; 545 timer->delay = delay; 546 timer->fun = fun; 547 timer->arg = arg; 548 fibril_condvar_broadcast(&timer->cv); 549 fibril_mutex_unlock(&timer->lock); 550 } 551 552 /** Clear timer. 553 * 554 * Clears (cancels) timer and returns last state of the timer. 555 * This can be one of: 556 * - fts_not_set If the timer has not been set or has been cleared 557 * - fts_active Timer was set but did not fire 558 * - fts_fired Timer fired 559 * 560 * @param timer Timer 561 * @return Last timer state 562 */ 563 fibril_timer_state_t fibril_timer_clear(fibril_timer_t *timer) 564 { 565 fibril_timer_state_t old_state; 566 567 fibril_mutex_lock(&timer->lock); 568 old_state = timer->state; 569 timer->state = fts_not_set; 570 571 timer->delay = 0; 572 timer->fun = NULL; 573 timer->arg = NULL; 574 fibril_condvar_broadcast(&timer->cv); 575 fibril_mutex_unlock(&timer->lock); 576 577 return old_state; 578 } 579 449 580 /** @} 450 581 */ -
uspace/lib/c/generic/ipc.c
rb69e4c0 rdb96017 48 48 #include <fibril.h> 49 49 #include <macros.h> 50 #include "private/libc.h" 50 51 51 52 /** … … 760 761 * 761 762 * @param phoneid Phone that will be used to contact the receiving side. 762 * @param dst Destination address space area base.763 763 * @param size Size of the destination address space area. 764 764 * @param arg User defined argument. 765 765 * @param flags Storage for received flags. Can be NULL. 766 * @param dst Destination address space area base. Cannot be NULL. 766 767 * 767 768 * @return Zero on success or a negative error code from errno.h. 768 769 * 769 770 */ 770 int ipc_share_in_start(int phoneid, void *dst, size_t size, sysarg_t arg, 771 unsigned int *flags) 772 { 773 sysarg_t tmp_flags = 0; 774 int res = ipc_call_sync_3_2(phoneid, IPC_M_SHARE_IN, (sysarg_t) dst, 775 (sysarg_t) size, arg, NULL, &tmp_flags); 771 int ipc_share_in_start(int phoneid, size_t size, sysarg_t arg, 772 unsigned int *flags, void **dst) 773 { 774 sysarg_t _flags = 0; 775 sysarg_t _dst = (sysarg_t) -1; 776 int res = ipc_call_sync_2_4(phoneid, IPC_M_SHARE_IN, (sysarg_t) size, 777 arg, NULL, &_flags, NULL, &_dst); 776 778 777 779 if (flags) 778 *flags = (unsigned int) tmp_flags; 779 780 *flags = (unsigned int) _flags; 781 782 *dst = (void *) _dst; 780 783 return res; 781 784 } … … 783 786 /** Wrapper for answering the IPC_M_SHARE_IN calls. 784 787 * 785 * This wrapper only makes it more comfortable to answer IPC_M_ DATA_READ788 * This wrapper only makes it more comfortable to answer IPC_M_SHARE_IN 786 789 * calls so that the user doesn't have to remember the meaning of each 787 790 * IPC argument. … … 796 799 int ipc_share_in_finalize(ipc_callid_t callid, void *src, unsigned int flags) 797 800 { 798 return ipc_answer_2(callid, EOK, (sysarg_t) src, (sysarg_t) flags); 801 return ipc_answer_3(callid, EOK, (sysarg_t) src, (sysarg_t) flags, 802 (sysarg_t) __entry); 799 803 } 800 804 … … 826 830 * 827 831 */ 828 int ipc_share_out_finalize(ipc_callid_t callid, void * dst)829 { 830 return ipc_answer_ 1(callid, EOK, (sysarg_t) dst);832 int ipc_share_out_finalize(ipc_callid_t callid, void **dst) 833 { 834 return ipc_answer_2(callid, EOK, (sysarg_t) __entry, (sysarg_t) dst); 831 835 } 832 836 -
uspace/lib/c/generic/loc.c
rb69e4c0 rdb96017 47 47 static FIBRIL_MUTEX_INITIALIZE(loc_callback_mutex); 48 48 static bool loc_callback_created = false; 49 static loc_cat_change_cb_t cat_change_cb = NULL; 49 50 50 51 static async_sess_t *loc_supp_block_sess = NULL; … … 54 55 static async_sess_t *loc_consumer_sess = NULL; 55 56 56 static loc_cat_change_cb_t cat_change_cb = NULL;57 58 57 static void loc_cb_conn(ipc_callid_t iid, ipc_call_t *icall, void *arg) 59 58 { 60 loc_cat_change_cb_t cb_fun;61 62 59 while (true) { 63 60 ipc_call_t call; … … 69 66 } 70 67 71 int retval;72 73 68 switch (IPC_GET_IMETHOD(call)) { 74 69 case LOC_EVENT_CAT_CHANGE: 75 70 fibril_mutex_lock(&loc_callback_mutex); 76 cb_fun = cat_change_cb; 77 if (cb_fun != NULL) { 71 loc_cat_change_cb_t cb_fun = cat_change_cb; 72 fibril_mutex_unlock(&loc_callback_mutex); 73 74 async_answer_0(callid, EOK); 75 76 if (cb_fun != NULL) 78 77 (*cb_fun)(); 79 } 80 fibril_mutex_unlock(&loc_callback_mutex); 81 retval = 0; 78 82 79 break; 83 80 default: 84 retval = ENOTSUP;81 async_answer_0(callid, ENOTSUP); 85 82 } 86 87 async_answer_0(callid, retval);88 83 } 89 84 } … … 101 96 } 102 97 98 /** Create callback 99 * 100 * Must be called with loc_callback_mutex locked. 101 * 102 * @return EOK on success. 103 * 104 */ 103 105 static int loc_callback_create(void) 104 106 { 105 async_exch_t *exch;106 sysarg_t retval;107 int rc = EOK;108 109 fibril_mutex_lock(&loc_callback_mutex);110 111 107 if (!loc_callback_created) { 112 exch = loc_exchange_begin_blocking(LOC_PORT_CONSUMER); 108 async_exch_t *exch = 109 loc_exchange_begin_blocking(LOC_PORT_CONSUMER); 113 110 114 111 ipc_call_t answer; 115 112 aid_t req = async_send_0(exch, LOC_CALLBACK_CREATE, &answer); 116 async_connect_to_me(exch, 0, 0, 0, loc_cb_conn, NULL);113 int rc = async_connect_to_me(exch, 0, 0, 0, loc_cb_conn, NULL); 117 114 loc_exchange_end(exch); 118 115 116 if (rc != EOK) 117 return rc; 118 119 sysarg_t retval; 119 120 async_wait_for(req, &retval); 120 if (rc != EOK) 121 goto done; 122 123 if (retval != EOK) { 124 rc = retval; 125 goto done; 126 } 121 if (retval != EOK) 122 return retval; 127 123 128 124 loc_callback_created = true; 129 125 } 130 126 131 rc = EOK; 132 done: 133 fibril_mutex_unlock(&loc_callback_mutex); 134 return rc; 127 return EOK; 135 128 } 136 129 … … 242 235 243 236 /** Register new driver with loc. */ 244 int loc_server_register(const char *name , async_client_conn_t conn)237 int loc_server_register(const char *name) 245 238 { 246 239 async_exch_t *exch = loc_exchange_begin_blocking(LOC_PORT_SUPPLIER); … … 256 249 return retval; 257 250 } 258 259 async_set_client_connection(conn);260 251 261 252 exch = loc_exchange_begin(LOC_PORT_SUPPLIER); … … 797 788 sysarg_t **data, size_t *count) 798 789 { 799 service_id_t *ids;800 size_t act_size;801 size_t alloc_size;802 int rc;803 804 790 *data = NULL; 805 act_size = 0; /* silence warning */ 806 807 rc = loc_category_get_ids_once(method, arg1, NULL, 0, 791 *count = 0; 792 793 size_t act_size = 0; 794 int rc = loc_category_get_ids_once(method, arg1, NULL, 0, 808 795 &act_size); 809 796 if (rc != EOK) 810 797 return rc; 811 812 alloc_size = act_size;813 ids = malloc(alloc_size);798 799 size_t alloc_size = act_size; 800 service_id_t *ids = malloc(alloc_size); 814 801 if (ids == NULL) 815 802 return ENOMEM; 816 803 817 804 while (true) { 818 805 rc = loc_category_get_ids_once(method, arg1, ids, alloc_size, … … 820 807 if (rc != EOK) 821 808 return rc; 822 809 823 810 if (act_size <= alloc_size) 824 811 break; 825 826 alloc_size *= 2; 827 free(ids); 828 829 ids = malloc(alloc_size); 812 813 alloc_size = act_size; 814 ids = realloc(ids, alloc_size); 830 815 if (ids == NULL) 831 816 return ENOMEM; 832 817 } 833 818 834 819 *count = act_size / sizeof(category_id_t); 835 820 *data = ids; … … 869 854 int loc_register_cat_change_cb(loc_cat_change_cb_t cb_fun) 870 855 { 871 if (loc_callback_create() != EOK) 856 fibril_mutex_lock(&loc_callback_mutex); 857 if (loc_callback_create() != EOK) { 858 fibril_mutex_unlock(&loc_callback_mutex); 872 859 return EIO; 873 860 } 861 874 862 cat_change_cb = cb_fun; 863 fibril_mutex_unlock(&loc_callback_mutex); 864 875 865 return EOK; 876 866 } -
uspace/lib/c/generic/malloc.c
rb69e4c0 rdb96017 283 283 static bool area_create(size_t size) 284 284 { 285 void *start = as_get_mappable_page(size); 286 if (start == NULL) 287 return false; 288 289 /* Align the heap area on page boundary */ 290 void *astart = (void *) ALIGN_UP((uintptr_t) start, PAGE_SIZE); 285 /* Align the heap area size on page boundary */ 291 286 size_t asize = ALIGN_UP(size, PAGE_SIZE); 292 293 astart = as_area_create(astart, asize,AS_AREA_WRITE | AS_AREA_READ);287 void *astart = as_area_create((void *) -1, asize, 288 AS_AREA_WRITE | AS_AREA_READ); 294 289 if (astart == (void *) -1) 295 290 return false; -
uspace/lib/c/generic/mman.c
rb69e4c0 rdb96017 42 42 { 43 43 if (!start) 44 start = as_get_mappable_page(length);44 start = (void *) -1; 45 45 46 46 // if (!((flags & MAP_SHARED) ^ (flags & MAP_PRIVATE))) -
uspace/lib/c/generic/net/packet.c
rb69e4c0 rdb96017 36 36 */ 37 37 38 #include <assert.h> 38 39 #include <malloc.h> 39 40 #include <mem.h> … … 44 45 #include <sys/mman.h> 45 46 46 #include <adt/ generic_field.h>47 #include <adt/hash_table.h> 47 48 #include <net/packet.h> 48 49 #include <net/packet_header.h> 49 50 50 /** Packet map page size. */ 51 #define PACKET_MAP_SIZE 100 52 53 /** Returns the packet map page index. 54 * @param[in] packet_id The packet identifier. 55 */ 56 #define PACKET_MAP_PAGE(packet_id) (((packet_id) - 1) / PACKET_MAP_SIZE) 57 58 /** Returns the packet index in the corresponding packet map page. 59 * @param[in] packet_id The packet identifier. 60 */ 61 #define PACKET_MAP_INDEX(packet_id) (((packet_id) - 1) % PACKET_MAP_SIZE) 62 63 /** Type definition of the packet map page. */ 64 typedef packet_t *packet_map_t[PACKET_MAP_SIZE]; 65 66 /** Packet map. 67 * Maps packet identifiers to the packet references. 68 * @see generic_field.h 69 */ 70 GENERIC_FIELD_DECLARE(gpm, packet_map_t); 51 /** Packet hash table size. */ 52 #define PACKET_HASH_TABLE_SIZE 128 71 53 72 54 /** Packet map global data. */ … … 75 57 fibril_rwlock_t lock; 76 58 /** Packet map. */ 77 gpm_t packet_map; 59 hash_table_t packet_map; 60 /** Packet map operations */ 61 hash_table_operations_t operations; 78 62 } pm_globals; 79 63 80 GENERIC_FIELD_IMPLEMENT(gpm, packet_map_t); 64 typedef struct { 65 link_t link; 66 packet_t *packet; 67 } pm_entry_t; 68 69 /** 70 * Hash function for the packet mapping hash table 71 */ 72 static hash_index_t pm_hash(unsigned long key[]) 73 { 74 return (hash_index_t) key[0] % PACKET_HASH_TABLE_SIZE; 75 } 76 77 /** 78 * Key compare function for the packet mapping hash table 79 */ 80 static int pm_compare(unsigned long key[], hash_count_t keys, link_t *link) 81 { 82 pm_entry_t *entry = list_get_instance(link, pm_entry_t, link); 83 return entry->packet->packet_id == key[0]; 84 } 85 86 /** 87 * Remove callback for the packet mapping hash table 88 */ 89 static void pm_remove_callback(link_t *link) 90 { 91 pm_entry_t *entry = list_get_instance(link, pm_entry_t, link); 92 free(entry); 93 } 94 95 /** 96 * Wrapper used when destroying the whole table 97 */ 98 static void pm_free_wrapper(link_t *link, void *ignored) 99 { 100 pm_entry_t *entry = list_get_instance(link, pm_entry_t, link); 101 free(entry); 102 } 103 81 104 82 105 /** Initializes the packet map. … … 87 110 int pm_init(void) 88 111 { 89 int rc ;112 int rc = EOK; 90 113 91 114 fibril_rwlock_initialize(&pm_globals.lock); 92 115 93 116 fibril_rwlock_write_lock(&pm_globals.lock); 94 rc = gpm_initialize(&pm_globals.packet_map); 117 118 pm_globals.operations.hash = pm_hash; 119 pm_globals.operations.compare = pm_compare; 120 pm_globals.operations.remove_callback = pm_remove_callback; 121 122 if (!hash_table_create(&pm_globals.packet_map, PACKET_HASH_TABLE_SIZE, 1, 123 &pm_globals.operations)) 124 rc = ENOMEM; 125 95 126 fibril_rwlock_write_unlock(&pm_globals.lock); 96 127 … … 100 131 /** Finds the packet mapping. 101 132 * 102 * @param[in] packet_id The packet identifier to be found. 103 * @return The found packet reference. 104 * @return NULL if the mapping does not exist. 133 * @param[in] packet_id Packet identifier to be found. 134 * 135 * @return The found packet reference. 136 * @return NULL if the mapping does not exist. 137 * 105 138 */ 106 139 packet_t *pm_find(packet_id_t packet_id) 107 140 { 108 packet_map_t *map;109 packet_t *packet;110 111 141 if (!packet_id) 112 142 return NULL; 113 143 114 144 fibril_rwlock_read_lock(&pm_globals.lock); 115 if (packet_id > PACKET_MAP_SIZE * gpm_count(&pm_globals.packet_map)) { 116 fibril_rwlock_read_unlock(&pm_globals.lock); 117 return NULL; 118 } 119 map = gpm_get_index(&pm_globals.packet_map, PACKET_MAP_PAGE(packet_id)); 120 if (!map) { 121 fibril_rwlock_read_unlock(&pm_globals.lock); 122 return NULL; 123 } 124 packet = (*map) [PACKET_MAP_INDEX(packet_id)]; 145 146 unsigned long key = packet_id; 147 link_t *link = hash_table_find(&pm_globals.packet_map, &key); 148 149 packet_t *packet; 150 if (link != NULL) { 151 pm_entry_t *entry = 152 hash_table_get_instance(link, pm_entry_t, link); 153 packet = entry->packet; 154 } else 155 packet = NULL; 156 125 157 fibril_rwlock_read_unlock(&pm_globals.lock); 126 158 return packet; … … 129 161 /** Adds the packet mapping. 130 162 * 131 * @param[in] packet The packet to be remembered. 132 * @return EOK on success. 133 * @return EINVAL if the packet is not valid. 134 * @return EINVAL if the packet map is not initialized. 135 * @return ENOMEM if there is not enough memory left. 163 * @param[in] packet Packet to be remembered. 164 * 165 * @return EOK on success. 166 * @return EINVAL if the packet is not valid. 167 * @return ENOMEM if there is not enough memory left. 168 * 136 169 */ 137 170 int pm_add(packet_t *packet) 138 171 { 139 packet_map_t *map;140 int rc;141 142 172 if (!packet_is_valid(packet)) 143 173 return EINVAL; 144 174 145 175 fibril_rwlock_write_lock(&pm_globals.lock); 146 147 if (PACKET_MAP_PAGE(packet->packet_id) < 148 gpm_count(&pm_globals.packet_map)) { 149 map = gpm_get_index(&pm_globals.packet_map, 150 PACKET_MAP_PAGE(packet->packet_id)); 151 } else { 152 do { 153 map = (packet_map_t *) malloc(sizeof(packet_map_t)); 154 if (!map) { 155 fibril_rwlock_write_unlock(&pm_globals.lock); 156 return ENOMEM; 157 } 158 bzero(map, sizeof(packet_map_t)); 159 rc = gpm_add(&pm_globals.packet_map, map); 160 if (rc < 0) { 161 fibril_rwlock_write_unlock(&pm_globals.lock); 162 free(map); 163 return rc; 164 } 165 } while (PACKET_MAP_PAGE(packet->packet_id) >= 166 gpm_count(&pm_globals.packet_map)); 176 177 pm_entry_t *entry = malloc(sizeof(pm_entry_t)); 178 if (entry == NULL) { 179 fibril_rwlock_write_unlock(&pm_globals.lock); 180 return ENOMEM; 167 181 } 168 169 (*map) [PACKET_MAP_INDEX(packet->packet_id)] = packet; 182 183 entry->packet = packet; 184 185 unsigned long key = packet->packet_id; 186 hash_table_insert(&pm_globals.packet_map, &key, &entry->link); 187 170 188 fibril_rwlock_write_unlock(&pm_globals.lock); 189 171 190 return EOK; 172 191 } 173 192 174 /** Releases the packet map. */ 193 /** Remove the packet mapping 194 * 195 * @param[in] packet The packet to be removed 196 * 197 */ 198 void pm_remove(packet_t *packet) 199 { 200 assert(packet_is_valid(packet)); 201 202 fibril_rwlock_write_lock(&pm_globals.lock); 203 204 unsigned long key = packet->packet_id; 205 hash_table_remove(&pm_globals.packet_map, &key, 1); 206 207 fibril_rwlock_write_unlock(&pm_globals.lock); 208 } 209 210 /** Release the packet map. */ 175 211 void pm_destroy(void) 176 212 { 177 int count;178 int index;179 packet_map_t *map;180 packet_t *packet;181 182 213 fibril_rwlock_write_lock(&pm_globals.lock); 183 count = gpm_count(&pm_globals.packet_map); 184 while (count > 0) { 185 map = gpm_get_index(&pm_globals.packet_map, count - 1); 186 for (index = PACKET_MAP_SIZE - 1; index >= 0; --index) { 187 packet = (*map)[index]; 188 if (packet_is_valid(packet)) 189 munmap(packet, packet->length); 190 } 191 } 192 gpm_destroy(&pm_globals.packet_map, free); 193 /* leave locked */ 214 hash_table_apply(&pm_globals.packet_map, pm_free_wrapper, NULL); 215 hash_table_destroy(&pm_globals.packet_map); 216 /* Leave locked */ 194 217 } 195 218 … … 199 222 * The packet is inserted right before the packets of the same order value. 200 223 * 201 * @param[in,out] first The first packet of the queue. Sets the first packet of 202 * the queue. The original first packet may be shifted by 203 * the new packet. 204 * @param[in] packet The packet to be added. 205 * @param[in] order The packet order value. 206 * @param[in] metric The metric value of the packet. 207 * @return EOK on success. 208 * @return EINVAL if the first parameter is NULL. 209 * @return EINVAL if the packet is not valid. 224 * @param[in,out] first First packet of the queue. Sets the first 225 * packet of the queue. The original first packet 226 * may be shifted by the new packet. 227 * @param[in] packet Packet to be added. 228 * @param[in] order Packet order value. 229 * @param[in] metric Metric value of the packet. 230 * 231 * @return EOK on success. 232 * @return EINVAL if the first parameter is NULL. 233 * @return EINVAL if the packet is not valid. 234 * 210 235 */ 211 236 int pq_add(packet_t **first, packet_t *packet, size_t order, size_t metric) 212 237 { 213 packet_t *item; 214 215 if (!first || !packet_is_valid(packet)) 238 if ((!first) || (!packet_is_valid(packet))) 216 239 return EINVAL; 217 240 218 241 pq_set_order(packet, order, metric); 219 242 if (packet_is_valid(*first)) { 220 item = * first; 243 packet_t *cur = *first; 244 221 245 do { 222 if (item->order < order) { 223 if (item->next) { 224 item = pm_find(item->next); 225 } else { 226 item->next = packet->packet_id; 227 packet->previous = item->packet_id; 246 if (cur->order < order) { 247 if (cur->next) 248 cur = pm_find(cur->next); 249 else { 250 cur->next = packet->packet_id; 251 packet->previous = cur->packet_id; 252 228 253 return EOK; 229 254 } 230 255 } else { 231 packet->previous = item->previous; 232 packet->next = item->packet_id; 233 item->previous = packet->packet_id; 234 item = pm_find(packet->previous); 235 if (item) 236 item->next = packet->packet_id; 256 packet->previous = cur->previous; 257 packet->next = cur->packet_id; 258 259 cur->previous = packet->packet_id; 260 cur = pm_find(packet->previous); 261 262 if (cur) 263 cur->next = packet->packet_id; 237 264 else 238 265 *first = packet; 266 239 267 return EOK; 240 268 } 241 } while (packet_is_valid( item));269 } while (packet_is_valid(cur)); 242 270 } 271 243 272 *first = packet; 244 273 return EOK; … … 312 341 313 342 next = pm_find(packet->next); 314 if (next) {343 if (next) 315 344 next->previous = packet->previous; 316 previous = pm_find(next->previous); 317 if (previous) 318 previous->next = next->packet_id; 319 } 345 346 previous = pm_find(packet->previous); 347 if (previous) 348 previous->next = packet->next ; 349 320 350 packet->previous = 0; 321 351 packet->next = 0; -
uspace/lib/c/generic/ns.c
rb69e4c0 rdb96017 54 54 if (!exch) 55 55 return NULL; 56 56 57 async_sess_t *sess = 57 58 async_connect_me_to(mgmt, exch, service, arg2, arg3); 58 59 async_exchange_end(exch); 59 60 60 61 if (!sess) 61 62 return NULL; … … 75 76 { 76 77 async_exch_t *exch = async_exchange_begin(session_ns); 78 if (!exch) 79 return NULL; 77 80 async_sess_t *sess = 78 81 async_connect_me_to_blocking(mgmt, exch, service, arg2, arg3); 79 82 async_exchange_end(exch); 83 84 if (!sess) 85 return NULL; 80 86 81 87 /* -
uspace/lib/c/generic/str.c
rb69e4c0 rdb96017 261 261 } 262 262 263 /** Get size of string with size limit. 264 * 265 * Get the number of bytes which are used by the string @a str 266 * (excluding the NULL-terminator), but no more than @max_size bytes. 267 * 268 * @param str String to consider. 269 * @param max_size Maximum number of bytes to measure. 270 * 271 * @return Number of bytes used by the string 272 * 273 */ 274 size_t str_nsize(const char *str, size_t max_size) 275 { 276 size_t size = 0; 277 278 while ((*str++ != 0) && (size < max_size)) 279 size++; 280 281 return size; 282 } 283 284 /** Get size of wide string with size limit. 285 * 286 * Get the number of bytes which are used by the wide string @a str 287 * (excluding the NULL-terminator), but no more than @max_size bytes. 288 * 289 * @param str Wide string to consider. 290 * @param max_size Maximum number of bytes to measure. 291 * 292 * @return Number of bytes used by the wide string 293 * 294 */ 295 size_t wstr_nsize(const wchar_t *str, size_t max_size) 296 { 297 return (wstr_nlength(str, max_size) * sizeof(wchar_t)); 298 } 299 263 300 /** Get size of wide string with length limit. 264 301 * … … 839 876 840 877 return NULL; 878 } 879 880 /** Removes specified trailing characters from a string. 881 * 882 * @param str String to remove from. 883 * @param ch Character to remove. 884 */ 885 void str_rtrim(char *str, wchar_t ch) 886 { 887 size_t off = 0; 888 size_t pos = 0; 889 wchar_t c; 890 bool update_last_chunk = true; 891 char *last_chunk = NULL; 892 893 while ((c = str_decode(str, &off, STR_NO_LIMIT))) { 894 if (c != ch) { 895 update_last_chunk = true; 896 last_chunk = NULL; 897 } else if (update_last_chunk) { 898 update_last_chunk = false; 899 last_chunk = (str + pos); 900 } 901 pos = off; 902 } 903 904 if (last_chunk) 905 *last_chunk = '\0'; 906 } 907 908 /** Removes specified leading characters from a string. 909 * 910 * @param str String to remove from. 911 * @param ch Character to remove. 912 */ 913 void str_ltrim(char *str, wchar_t ch) 914 { 915 wchar_t acc; 916 size_t off = 0; 917 size_t pos = 0; 918 size_t str_sz = str_size(str); 919 920 while ((acc = str_decode(str, &off, STR_NO_LIMIT)) != 0) { 921 if (acc != ch) 922 break; 923 else 924 pos = off; 925 } 926 927 if (pos > 0) { 928 memmove(str, &str[pos], str_sz - pos); 929 pos = str_sz - pos; 930 str[str_sz - pos] = '\0'; 931 } 841 932 } 842 933 … … 1444 1535 * 1445 1536 */ 1446 int str_uint64 (const char *nptr, char **endptr, unsigned int base,1537 int str_uint64_t(const char *nptr, char **endptr, unsigned int base, 1447 1538 bool strict, uint64_t *result) 1448 1539 { -
uspace/lib/c/generic/sysinfo.c
rb69e4c0 rdb96017 40 40 #include <bool.h> 41 41 42 /** Get sysinfo keys size 43 * 44 * @param path Sysinfo path. 45 * @param value Pointer to store the keys size. 46 * 47 * @return EOK if the keys were successfully read. 48 * 49 */ 50 static int sysinfo_get_keys_size(const char *path, size_t *size) 51 { 52 return (int) __SYSCALL3(SYS_SYSINFO_GET_KEYS_SIZE, (sysarg_t) path, 53 (sysarg_t) str_size(path), (sysarg_t) size); 54 } 55 56 /** Get sysinfo keys 57 * 58 * @param path Sysinfo path. 59 * @param value Pointer to store the keys size. 60 * 61 * @return Keys read from sysinfo or NULL if the 62 * sysinfo item has no subkeys. 63 * The returned non-NULL pointer should be 64 * freed by free(). 65 * 66 */ 67 char *sysinfo_get_keys(const char *path, size_t *size) 68 { 69 /* 70 * The size of the keys might change during time. 71 * Unfortunatelly we cannot allocate the buffer 72 * and transfer the keys as a single atomic operation. 73 */ 74 75 /* Get the keys size */ 76 int ret = sysinfo_get_keys_size(path, size); 77 if ((ret != EOK) || (size == 0)) { 78 /* 79 * Item with no subkeys. 80 */ 81 *size = 0; 82 return NULL; 83 } 84 85 char *data = malloc(*size); 86 if (data == NULL) { 87 *size = 0; 88 return NULL; 89 } 90 91 /* Get the data */ 92 size_t sz; 93 ret = __SYSCALL5(SYS_SYSINFO_GET_KEYS, (sysarg_t) path, 94 (sysarg_t) str_size(path), (sysarg_t) data, (sysarg_t) *size, 95 (sysarg_t) &sz); 96 if (ret == EOK) { 97 *size = sz; 98 return data; 99 } 100 101 free(data); 102 *size = 0; 103 return NULL; 104 } 105 42 106 /** Get sysinfo item type 43 107 * … … 70 134 /** Get sysinfo binary data size 71 135 * 72 * @param path Sysinfo path.73 * @param value Pointer to store the binary data size.136 * @param path Sysinfo path. 137 * @param size Pointer to store the binary data size. 74 138 * 75 139 * @return EOK if the value was successfully read and … … 85 149 /** Get sysinfo binary data 86 150 * 87 * @param path Sysinfo path.88 * @param value Pointer to store the binary data size.151 * @param path Sysinfo path. 152 * @param size Pointer to store the binary data size. 89 153 * 90 154 * @return Binary data read from sysinfo or NULL if the … … 134 198 } 135 199 200 /** Get sysinfo property 201 * 202 * @param path Sysinfo path. 203 * @param name Property name. 204 * @param size Pointer to store the binary data size. 205 * 206 * @return Property value read from sysinfo or NULL if the 207 * sysinfo item value type is not binary data. 208 * The returned non-NULL pointer should be 209 * freed by free(). 210 * 211 */ 212 void *sysinfo_get_property(const char *path, const char *name, size_t *size) 213 { 214 size_t total_size; 215 void *data = sysinfo_get_data(path, &total_size); 216 if ((data == NULL) || (total_size == 0)) { 217 *size = 0; 218 return NULL; 219 } 220 221 size_t pos = 0; 222 while (pos < total_size) { 223 /* Process each property with sanity checks */ 224 size_t cur_size = str_nsize(data + pos, total_size - pos); 225 if (((char *) data)[pos + cur_size] != 0) 226 break; 227 228 bool found = (str_cmp(data + pos, name) == 0); 229 230 pos += cur_size + 1; 231 if (pos >= total_size) 232 break; 233 234 /* Process value size */ 235 size_t value_size; 236 memcpy(&value_size, data + pos, sizeof(value_size)); 237 238 pos += sizeof(value_size); 239 if ((pos >= total_size) || (pos + value_size > total_size)) 240 break; 241 242 if (found) { 243 void *value = malloc(value_size); 244 if (value == NULL) 245 break; 246 247 memcpy(value, data + pos, value_size); 248 free(data); 249 250 *size = value_size; 251 return value; 252 } 253 254 pos += value_size; 255 } 256 257 free(data); 258 259 *size = 0; 260 return NULL; 261 } 262 136 263 /** @} 137 264 */ -
uspace/lib/c/generic/time.c
rb69e4c0 rdb96017 147 147 } 148 148 149 void *addr = as_get_mappable_page(PAGE_SIZE); 150 if (addr == NULL) { 151 errno = ENOMEM; 152 return -1; 153 } 154 155 rc = physmem_map((void *) faddr, addr, 1, 156 AS_AREA_READ | AS_AREA_CACHEABLE); 149 void *addr; 150 rc = physmem_map((void *) faddr, 1, 151 AS_AREA_READ | AS_AREA_CACHEABLE, &addr); 157 152 if (rc != EOK) { 158 153 as_area_destroy(addr); -
uspace/lib/c/generic/vfs/vfs.c
rb69e4c0 rdb96017 831 831 } 832 832 833 int get_mtab_list(list_t *mtab_list) 834 { 835 sysarg_t rc; 836 aid_t req; 837 size_t i; 838 sysarg_t num_mounted_fs; 839 840 async_exch_t *exch = vfs_exchange_begin(); 841 842 req = async_send_0(exch, VFS_IN_MTAB_GET, NULL); 843 844 /* Ask VFS how many filesystems are mounted */ 845 rc = async_req_0_1(exch, VFS_IN_PING, &num_mounted_fs); 846 if (rc != EOK) 847 goto exit; 848 849 for (i = 0; i < num_mounted_fs; ++i) { 850 mtab_ent_t *mtab_ent; 851 852 mtab_ent = malloc(sizeof(mtab_ent_t)); 853 if (!mtab_ent) { 854 rc = ENOMEM; 855 goto exit; 856 } 857 858 memset(mtab_ent, 0, sizeof(mtab_ent_t)); 859 860 rc = async_data_read_start(exch, (void *) mtab_ent->mp, 861 MAX_PATH_LEN); 862 if (rc != EOK) 863 goto exit; 864 865 rc = async_data_read_start(exch, (void *) mtab_ent->opts, 866 MAX_MNTOPTS_LEN); 867 if (rc != EOK) 868 goto exit; 869 870 rc = async_data_read_start(exch, (void *) mtab_ent->fs_name, 871 FS_NAME_MAXLEN); 872 if (rc != EOK) 873 goto exit; 874 875 sysarg_t p[2]; 876 877 rc = async_req_0_2(exch, VFS_IN_PING, &p[0], &p[1]); 878 if (rc != EOK) 879 goto exit; 880 881 mtab_ent->instance = p[0]; 882 mtab_ent->service_id = p[1]; 883 884 link_initialize(&mtab_ent->link); 885 list_append(&mtab_ent->link, mtab_list); 886 } 887 888 exit: 889 async_wait_for(req, &rc); 890 vfs_exchange_end(exch); 891 return rc; 892 } 893 833 894 /** @} 834 895 */
Note:
See TracChangeset
for help on using the changeset viewer.
