Changeset 7cfe5c0 in mainline for uspace/lib/c/generic
- Timestamp:
- 2012-08-20T19:16:24Z (13 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 6b99156
- Parents:
- b9cb911 (diff), 01e397ac (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:
-
- 7 added
- 5 edited
- 1 moved
-
async.c (modified) (5 diffs)
-
bd.c (added)
-
bd_srv.c (added)
-
device/graph_dev.c (added)
-
io/chargrid.c (moved) (moved from uspace/lib/fb/screenbuffer.c ) (25 diffs)
-
io/input.c (added)
-
io/output.c (added)
-
io/visualizer.c (added)
-
io/window.c (added)
-
ipc.c (modified) (4 diffs)
-
iplink_srv.c (modified) (1 diff)
-
str.c (modified) (2 diffs)
-
task.c (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/c/generic/async.c
rb9cb911 r7cfe5c0 114 114 #include <stdlib.h> 115 115 #include <macros.h> 116 #include "private/libc.h" 116 117 117 118 … … 2144 2145 int async_share_in_finalize(ipc_callid_t callid, void *src, unsigned int flags) 2145 2146 { 2146 return ipc_share_in_finalize(callid, src, flags); 2147 return ipc_answer_3(callid, EOK, (sysarg_t) src, (sysarg_t) flags, 2148 (sysarg_t) __entry); 2147 2149 } 2148 2150 … … 2211 2213 int async_share_out_finalize(ipc_callid_t callid, void **dst) 2212 2214 { 2213 return ipc_ share_out_finalize(callid,dst);2215 return ipc_answer_2(callid, EOK, (sysarg_t) __entry, (sysarg_t) dst); 2214 2216 } 2215 2217 … … 2295 2297 int async_data_read_finalize(ipc_callid_t callid, const void *src, size_t size) 2296 2298 { 2297 return ipc_ data_read_finalize(callid, src,size);2299 return ipc_answer_2(callid, EOK, (sysarg_t) src, (sysarg_t) size); 2298 2300 } 2299 2301 … … 2398 2400 int async_data_write_finalize(ipc_callid_t callid, void *dst, size_t size) 2399 2401 { 2400 return ipc_ data_write_finalize(callid, dst,size);2402 return ipc_answer_2(callid, EOK, (sysarg_t) dst, (sysarg_t) size); 2401 2403 } 2402 2404 -
uspace/lib/c/generic/io/chargrid.c
rb9cb911 r7cfe5c0 27 27 */ 28 28 29 /** @addtogroup console29 /** @addtogroup libc 30 30 * @{ 31 31 */ … … 39 39 #include <bool.h> 40 40 #include <as.h> 41 #include "screenbuffer.h" 42 43 /** Structure for buffering state of one virtual console. 44 * 45 */ 46 struct screenbuffer { 47 size_t size; /**< Structure size */ 48 screenbuffer_flag_t flags; /**< Screenbuffer flags */ 49 50 sysarg_t cols; /**< Number of columns */ 51 sysarg_t rows; /**< Number of rows */ 52 53 sysarg_t col; /**< Current column */ 54 sysarg_t row; /**< Current row */ 55 bool cursor_visible; /**< Cursor visibility */ 56 57 char_attrs_t attrs; /**< Current attributes */ 58 59 sysarg_t top_row; /**< The first row in the cyclic buffer */ 60 charfield_t data[]; /**< Screen contents (cyclic buffer) */ 61 }; 62 63 /** Create a screenbuffer. 41 #include <io/chargrid.h> 42 43 /** Create a chargrid. 64 44 * 65 45 * @param[in] cols Number of columns. 66 46 * @param[in] rows Number of rows. 67 * @param[in] flags Screenbufferflags.68 * 69 * @return New screenbuffer.47 * @param[in] flags Chargrid flags. 48 * 49 * @return New chargrid. 70 50 * @return NULL on failure. 71 51 * 72 52 */ 73 screenbuffer_t *screenbuffer_create(sysarg_t cols, sysarg_t rows,74 screenbuffer_flag_t flags)53 chargrid_t *chargrid_create(sysarg_t cols, sysarg_t rows, 54 chargrid_flag_t flags) 75 55 { 76 56 size_t size = 77 sizeof( screenbuffer_t) + cols * rows * sizeof(charfield_t);78 screenbuffer_t *scrbuf;79 80 if ((flags & SCREENBUFFER_FLAG_SHARED) == SCREENBUFFER_FLAG_SHARED) {81 scrbuf = ( screenbuffer_t *) as_area_create(AS_AREA_ANY, size,57 sizeof(chargrid_t) + cols * rows * sizeof(charfield_t); 58 chargrid_t *scrbuf; 59 60 if ((flags & CHARGRID_FLAG_SHARED) == CHARGRID_FLAG_SHARED) { 61 scrbuf = (chargrid_t *) as_area_create(AS_AREA_ANY, size, 82 62 AS_AREA_READ | AS_AREA_WRITE | AS_AREA_CACHEABLE); 83 63 if (scrbuf == AS_MAP_FAILED) 84 64 return NULL; 85 65 } else { 86 scrbuf = ( screenbuffer_t *) malloc(size);66 scrbuf = (chargrid_t *) malloc(size); 87 67 if (scrbuf == NULL) 88 68 return NULL; … … 99 79 100 80 scrbuf->top_row = 0; 101 screenbuffer_clear(scrbuf);81 chargrid_clear(scrbuf); 102 82 103 83 return scrbuf; 104 84 } 105 85 106 /** Return keyfield by coordinates 107 * 108 * The back buffer is organized as a cyclic buffer. 109 * Therefore we must take into account the topmost column. 110 * 111 * @param scrbuf Screenbuffer 112 * @param col Column position on screen 113 * @param row Row position on screen 114 * 115 * @return Keyfield structure on (row, col) 116 * 117 */ 118 charfield_t *screenbuffer_field_at(screenbuffer_t *scrbuf, sysarg_t col, 119 sysarg_t row) 120 { 121 return scrbuf->data + 122 ((row + scrbuf->top_row) % scrbuf->rows) * scrbuf->cols + 123 col; 124 } 125 126 bool screenbuffer_cursor_at(screenbuffer_t *scrbuf, sysarg_t col, sysarg_t row) 86 void chargrid_destroy(chargrid_t *srcbuf) 87 { 88 // TODO 89 } 90 91 bool chargrid_cursor_at(chargrid_t *scrbuf, sysarg_t col, sysarg_t row) 127 92 { 128 93 return ((scrbuf->cursor_visible) && (scrbuf->col == col) && … … 130 95 } 131 96 132 sysarg_t screenbuffer_get_top_row(screenbuffer_t *scrbuf)97 sysarg_t chargrid_get_top_row(chargrid_t *scrbuf) 133 98 { 134 99 return scrbuf->top_row; 135 100 } 136 101 137 static sysarg_t screenbuffer_update_rows(screenbuffer_t *scrbuf)102 static sysarg_t chargrid_update_rows(chargrid_t *scrbuf) 138 103 { 139 104 if (scrbuf->row == scrbuf->rows) { 140 105 scrbuf->row = scrbuf->rows - 1; 141 106 scrbuf->top_row = (scrbuf->top_row + 1) % scrbuf->rows; 142 screenbuffer_clear_row(scrbuf, scrbuf->row);107 chargrid_clear_row(scrbuf, scrbuf->row); 143 108 144 109 return scrbuf->rows; … … 148 113 } 149 114 150 static sysarg_t screenbuffer_update_cols(screenbuffer_t *scrbuf)115 static sysarg_t chargrid_update_cols(chargrid_t *scrbuf) 151 116 { 152 117 /* Column overflow */ … … 154 119 scrbuf->col = 0; 155 120 scrbuf->row++; 156 return screenbuffer_update_rows(scrbuf);121 return chargrid_update_rows(scrbuf); 157 122 } 158 123 … … 160 125 } 161 126 162 /** Store one character to screenbuffer.127 /** Store one character to chargrid. 163 128 * 164 129 * Its position is determined by scrbuf->col 165 130 * and scrbuf->row. 166 131 * 167 * @param scrbuf Screenbuffer.132 * @param scrbuf Chargrid. 168 133 * @param ch Character to store. 169 134 * @param update Update coordinates. … … 174 139 * 175 140 */ 176 sysarg_t screenbuffer_putchar(screenbuffer_t *scrbuf, wchar_t ch, bool update)141 sysarg_t chargrid_putchar(chargrid_t *scrbuf, wchar_t ch, bool update) 177 142 { 178 143 assert(scrbuf->col < scrbuf->cols); … … 180 145 181 146 charfield_t *field = 182 screenbuffer_field_at(scrbuf, scrbuf->col, scrbuf->row);147 chargrid_charfield_at(scrbuf, scrbuf->col, scrbuf->row); 183 148 184 149 field->ch = ch; … … 188 153 if (update) { 189 154 scrbuf->col++; 190 return screenbuffer_update_cols(scrbuf);155 return chargrid_update_cols(scrbuf); 191 156 } 192 157 … … 194 159 } 195 160 196 /** Jump to a new row in screenbuffer.197 * 198 * @param scrbuf Screenbuffer.161 /** Jump to a new row in chargrid. 162 * 163 * @param scrbuf Chargrid. 199 164 * 200 165 * @return Number of rows which have been affected. In usual … … 203 168 * 204 169 */ 205 sysarg_t screenbuffer_newline(screenbuffer_t *scrbuf)170 sysarg_t chargrid_newline(chargrid_t *scrbuf) 206 171 { 207 172 assert(scrbuf->col < scrbuf->cols); … … 211 176 scrbuf->row++; 212 177 213 return screenbuffer_update_rows(scrbuf);214 } 215 216 /** Jump to a new row in screenbuffer.217 * 218 * @param scrbuf Screenbuffer.178 return chargrid_update_rows(scrbuf); 179 } 180 181 /** Jump to a new row in chargrid. 182 * 183 * @param scrbuf Chargrid. 219 184 * @param tab_size Tab size. 220 185 * … … 224 189 * 225 190 */ 226 sysarg_t screenbuffer_tabstop(screenbuffer_t *scrbuf, sysarg_t tab_size)191 sysarg_t chargrid_tabstop(chargrid_t *scrbuf, sysarg_t tab_size) 227 192 { 228 193 assert(scrbuf->col < scrbuf->cols); … … 233 198 234 199 for (sysarg_t i = 0; i < spaces; i++) 235 flush += screenbuffer_putchar(scrbuf, ' ', true) - 1;200 flush += chargrid_putchar(scrbuf, ' ', true) - 1; 236 201 237 202 return flush; 238 203 } 239 204 240 /** Jump to the previous character in screenbuffer.205 /** Jump to the previous character in chargrid. 241 206 * 242 207 * Currently no scrollback is supported. 243 208 * 244 * @param scrbuf Screenbuffer.209 * @param scrbuf Chargrid. 245 210 * 246 211 * @return Number of rows which have been affected. In usual … … 250 215 * 251 216 */ 252 sysarg_t screenbuffer_backspace(screenbuffer_t *scrbuf)217 sysarg_t chargrid_backspace(chargrid_t *scrbuf) 253 218 { 254 219 assert(scrbuf->col < scrbuf->cols); … … 262 227 scrbuf->row--; 263 228 264 screenbuffer_putchar(scrbuf, ' ', false);229 chargrid_putchar(scrbuf, ' ', false); 265 230 return 2; 266 231 } 267 232 268 233 scrbuf->col--; 269 screenbuffer_putchar(scrbuf, ' ', false);234 chargrid_putchar(scrbuf, ' ', false); 270 235 return 1; 271 236 } 272 237 273 /** Clear the screenbuffer.274 * 275 * @param scrbuf Screenbuffer.276 * 277 */ 278 void screenbuffer_clear(screenbuffer_t *scrbuf)238 /** Clear the chargrid. 239 * 240 * @param scrbuf Chargrid. 241 * 242 */ 243 void chargrid_clear(chargrid_t *scrbuf) 279 244 { 280 245 for (size_t pos = 0; pos < (scrbuf->cols * scrbuf->rows); pos++) { … … 288 253 } 289 254 290 /** Update current screenbuffercoordinates291 * 292 * @param scrbuf Screenbuffer.255 /** Update current chargrid coordinates 256 * 257 * @param scrbuf Chargrid. 293 258 * @param col New column. 294 259 * @param row New row. 295 260 * 296 261 */ 297 void screenbuffer_set_cursor(screenbuffer_t *scrbuf, sysarg_t col, sysarg_t row)262 void chargrid_set_cursor(chargrid_t *scrbuf, sysarg_t col, sysarg_t row) 298 263 { 299 264 scrbuf->col = col; … … 301 266 } 302 267 303 void screenbuffer_set_cursor_visibility(screenbuffer_t *scrbuf, bool visible)268 void chargrid_set_cursor_visibility(chargrid_t *scrbuf, bool visible) 304 269 { 305 270 scrbuf->cursor_visible = visible; 306 271 } 307 272 308 /** Get current screenbuffercoordinates309 * 310 * @param scrbuf Screenbuffer.273 /** Get current chargrid coordinates 274 * 275 * @param scrbuf Chargrid. 311 276 * @param col Column. 312 277 * @param row Row. 313 278 * 314 279 */ 315 void screenbuffer_get_cursor(screenbuffer_t *scrbuf, sysarg_t *col,280 void chargrid_get_cursor(chargrid_t *scrbuf, sysarg_t *col, 316 281 sysarg_t *row) 317 282 { … … 323 288 } 324 289 325 bool screenbuffer_get_cursor_visibility(screenbuffer_t *scrbuf)290 bool chargrid_get_cursor_visibility(chargrid_t *scrbuf) 326 291 { 327 292 return scrbuf->cursor_visible; … … 330 295 /** Clear one buffer row. 331 296 * 332 * @param scrbuf Screenbuffer.297 * @param scrbuf Chargrid. 333 298 * @param row Row to clear. 334 299 * 335 300 */ 336 void screenbuffer_clear_row(screenbuffer_t *scrbuf, sysarg_t row)301 void chargrid_clear_row(chargrid_t *scrbuf, sysarg_t row) 337 302 { 338 303 for (sysarg_t col = 0; col < scrbuf->cols; col++) { 339 304 charfield_t *field = 340 screenbuffer_field_at(scrbuf, col, row);305 chargrid_charfield_at(scrbuf, col, row); 341 306 342 307 field->ch = 0; … … 346 311 } 347 312 348 /** Set screenbufferstyle.349 * 350 * @param scrbuf Screenbuffer.313 /** Set chargrid style. 314 * 315 * @param scrbuf Chargrid. 351 316 * @param style Style. 352 317 * 353 318 */ 354 void screenbuffer_set_style(screenbuffer_t *scrbuf, console_style_t style)319 void chargrid_set_style(chargrid_t *scrbuf, console_style_t style) 355 320 { 356 321 scrbuf->attrs.type = CHAR_ATTR_STYLE; … … 358 323 } 359 324 360 /** Set screenbuffercolor.361 * 362 * @param scrbuf Screenbuffer.325 /** Set chargrid color. 326 * 327 * @param scrbuf Chargrid. 363 328 * @param bgcolor Background color. 364 329 * @param fgcolor Foreground color. … … 366 331 * 367 332 */ 368 void screenbuffer_set_color(screenbuffer_t *scrbuf, console_color_t bgcolor,333 void chargrid_set_color(chargrid_t *scrbuf, console_color_t bgcolor, 369 334 console_color_t fgcolor, console_color_attr_t attr) 370 335 { … … 375 340 } 376 341 377 /** Set screenbufferRGB color.378 * 379 * @param scrbuf Screenbuffer.342 /** Set chargrid RGB color. 343 * 344 * @param scrbuf Chargrid. 380 345 * @param bgcolor Background color. 381 346 * @param fgcolor Foreground color. 382 347 * 383 348 */ 384 void screenbuffer_set_rgb_color(screenbuffer_t *scrbuf, pixel_t bgcolor,349 void chargrid_set_rgb_color(chargrid_t *scrbuf, pixel_t bgcolor, 385 350 pixel_t fgcolor) 386 351 { -
uspace/lib/c/generic/ipc.c
rb9cb911 r7cfe5c0 48 48 #include <fibril.h> 49 49 #include <macros.h> 50 #include "private/libc.h"51 50 52 51 /** … … 83 82 84 83 static atomic_t ipc_futex = FUTEX_INITIALIZER; 85 86 /** Fast synchronous call.87 *88 * Only three payload arguments can be passed using this function. However,89 * this function is faster than the generic ipc_call_sync_slow() because90 * the payload is passed directly in registers.91 *92 * @param phoneid Phone handle for the call.93 * @param method Requested method.94 * @param arg1 Service-defined payload argument.95 * @param arg2 Service-defined payload argument.96 * @param arg3 Service-defined payload argument.97 * @param result1 If non-NULL, the return ARG1 will be stored there.98 * @param result2 If non-NULL, the return ARG2 will be stored there.99 * @param result3 If non-NULL, the return ARG3 will be stored there.100 * @param result4 If non-NULL, the return ARG4 will be stored there.101 * @param result5 If non-NULL, the return ARG5 will be stored there.102 *103 * @return Negative values representing IPC errors.104 * @return Otherwise the RETVAL of the answer.105 *106 */107 int ipc_call_sync_fast(int phoneid, sysarg_t method, sysarg_t arg1,108 sysarg_t arg2, sysarg_t arg3, sysarg_t *result1, sysarg_t *result2,109 sysarg_t *result3, sysarg_t *result4, sysarg_t *result5)110 {111 ipc_call_t resdata;112 int callres = __SYSCALL6(SYS_IPC_CALL_SYNC_FAST, phoneid, method, arg1,113 arg2, arg3, (sysarg_t) &resdata);114 if (callres)115 return callres;116 117 if (result1)118 *result1 = IPC_GET_ARG1(resdata);119 if (result2)120 *result2 = IPC_GET_ARG2(resdata);121 if (result3)122 *result3 = IPC_GET_ARG3(resdata);123 if (result4)124 *result4 = IPC_GET_ARG4(resdata);125 if (result5)126 *result5 = IPC_GET_ARG5(resdata);127 128 return IPC_GET_RETVAL(resdata);129 }130 131 /** Synchronous call transmitting 5 arguments of payload.132 *133 * @param phoneid Phone handle for the call.134 * @param imethod Requested interface and method.135 * @param arg1 Service-defined payload argument.136 * @param arg2 Service-defined payload argument.137 * @param arg3 Service-defined payload argument.138 * @param arg4 Service-defined payload argument.139 * @param arg5 Service-defined payload argument.140 * @param result1 If non-NULL, storage for the first return argument.141 * @param result2 If non-NULL, storage for the second return argument.142 * @param result3 If non-NULL, storage for the third return argument.143 * @param result4 If non-NULL, storage for the fourth return argument.144 * @param result5 If non-NULL, storage for the fifth return argument.145 *146 * @return Negative values representing IPC errors.147 * @return Otherwise the RETVAL of the answer.148 *149 */150 int ipc_call_sync_slow(int phoneid, sysarg_t imethod, sysarg_t arg1,151 sysarg_t arg2, sysarg_t arg3, sysarg_t arg4, sysarg_t arg5,152 sysarg_t *result1, sysarg_t *result2, sysarg_t *result3, sysarg_t *result4,153 sysarg_t *result5)154 {155 ipc_call_t data;156 157 IPC_SET_IMETHOD(data, imethod);158 IPC_SET_ARG1(data, arg1);159 IPC_SET_ARG2(data, arg2);160 IPC_SET_ARG3(data, arg3);161 IPC_SET_ARG4(data, arg4);162 IPC_SET_ARG5(data, arg5);163 164 int callres = __SYSCALL3(SYS_IPC_CALL_SYNC_SLOW, phoneid,165 (sysarg_t) &data, (sysarg_t) &data);166 if (callres)167 return callres;168 169 if (result1)170 *result1 = IPC_GET_ARG1(data);171 if (result2)172 *result2 = IPC_GET_ARG2(data);173 if (result3)174 *result3 = IPC_GET_ARG3(data);175 if (result4)176 *result4 = IPC_GET_ARG4(data);177 if (result5)178 *result5 = IPC_GET_ARG5(data);179 180 return IPC_GET_RETVAL(data);181 }182 84 183 85 /** Send asynchronous message via syscall. … … 611 513 } 612 514 613 /** Request callback connection.614 *615 * The @a task_id and @a phonehash identifiers returned616 * by the kernel can be used for connection tracking.617 *618 * @param phoneid Phone handle used for contacting the other side.619 * @param arg1 User defined argument.620 * @param arg2 User defined argument.621 * @param arg3 User defined argument.622 * @param task_id Identifier of the client task.623 * @param phonehash Opaque identifier of the phone that will624 * be used for incoming calls.625 *626 * @return Zero on success or a negative error code.627 *628 */629 int ipc_connect_to_me(int phoneid, sysarg_t arg1, sysarg_t arg2, sysarg_t arg3,630 task_id_t *task_id, sysarg_t *phonehash)631 {632 ipc_call_t data;633 int rc = __SYSCALL6(SYS_IPC_CALL_SYNC_FAST, phoneid,634 IPC_M_CONNECT_TO_ME, arg1, arg2, arg3, (sysarg_t) &data);635 if (rc == EOK) {636 *task_id = data.in_task_id;637 *phonehash = IPC_GET_ARG5(data);638 }639 return rc;640 }641 642 /** Request cloned connection.643 *644 * @param phoneid Phone handle used for contacting the other side.645 *646 * @return Cloned phone handle on success or a negative error code.647 *648 */649 int ipc_clone_establish(int phoneid)650 {651 sysarg_t newphid;652 int res = ipc_call_sync_0_5(phoneid, IPC_M_CLONE_ESTABLISH, NULL,653 NULL, NULL, NULL, &newphid);654 if (res)655 return res;656 657 return newphid;658 }659 660 /** Request new connection.661 *662 * @param phoneid Phone handle used for contacting the other side.663 * @param arg1 User defined argument.664 * @param arg2 User defined argument.665 * @param arg3 User defined argument.666 *667 * @return New phone handle on success or a negative error code.668 *669 */670 int ipc_connect_me_to(int phoneid, sysarg_t arg1, sysarg_t arg2, sysarg_t arg3)671 {672 sysarg_t newphid;673 int res = ipc_call_sync_3_5(phoneid, IPC_M_CONNECT_ME_TO, arg1, arg2, arg3,674 NULL, NULL, NULL, NULL, &newphid);675 if (res)676 return res;677 678 return newphid;679 }680 681 /** Request new connection (blocking)682 *683 * If the connection is not available at the moment, the684 * call should block. This has to be, however, implemented685 * on the server side.686 *687 * @param phoneid Phone handle used for contacting the other side.688 * @param arg1 User defined argument.689 * @param arg2 User defined argument.690 * @param arg3 User defined argument.691 *692 * @return New phone handle on success or a negative error code.693 *694 */695 int ipc_connect_me_to_blocking(int phoneid, sysarg_t arg1, sysarg_t arg2,696 sysarg_t arg3)697 {698 sysarg_t newphid;699 int res = ipc_call_sync_4_5(phoneid, IPC_M_CONNECT_ME_TO, arg1, arg2, arg3,700 IPC_FLAG_BLOCKING, NULL, NULL, NULL, NULL, &newphid);701 if (res)702 return res;703 704 return newphid;705 }706 707 515 /** Hang up a phone. 708 516 * … … 758 566 } 759 567 760 /** Wrapper for IPC_M_SHARE_IN calls.761 *762 * @param phoneid Phone that will be used to contact the receiving side.763 * @param size Size of the destination address space area.764 * @param arg User defined argument.765 * @param flags Storage for received flags. Can be NULL.766 * @param dst Destination address space area base. Cannot be NULL.767 *768 * @return Zero on success or a negative error code from errno.h.769 *770 */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);778 779 if (flags)780 *flags = (unsigned int) _flags;781 782 *dst = (void *) _dst;783 return res;784 }785 786 /** Wrapper for answering the IPC_M_SHARE_IN calls.787 *788 * This wrapper only makes it more comfortable to answer IPC_M_SHARE_IN789 * calls so that the user doesn't have to remember the meaning of each790 * IPC argument.791 *792 * @param callid Hash of the IPC_M_DATA_READ call to answer.793 * @param src Source address space base.794 * @param flags Flags to be used for sharing. Bits can be only cleared.795 *796 * @return Zero on success or a value from @ref errno.h on failure.797 *798 */799 int ipc_share_in_finalize(ipc_callid_t callid, void *src, unsigned int flags)800 {801 return ipc_answer_3(callid, EOK, (sysarg_t) src, (sysarg_t) flags,802 (sysarg_t) __entry);803 }804 805 /** Wrapper for IPC_M_SHARE_OUT calls.806 *807 * @param phoneid Phone that will be used to contact the receiving side.808 * @param src Source address space area base address.809 * @param flags Flags to be used for sharing. Bits can be only cleared.810 *811 * @return Zero on success or a negative error code from errno.h.812 *813 */814 int ipc_share_out_start(int phoneid, void *src, unsigned int flags)815 {816 return ipc_call_sync_3_0(phoneid, IPC_M_SHARE_OUT, (sysarg_t) src, 0,817 (sysarg_t) flags);818 }819 820 /** Wrapper for answering the IPC_M_SHARE_OUT calls.821 *822 * This wrapper only makes it more comfortable to answer IPC_M_SHARE_OUT823 * calls so that the user doesn't have to remember the meaning of each824 * IPC argument.825 *826 * @param callid Hash of the IPC_M_DATA_WRITE call to answer.827 * @param dst Destination address space area base address.828 *829 * @return Zero on success or a value from @ref errno.h on failure.830 *831 */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);835 }836 837 /** Wrapper for IPC_M_DATA_READ calls.838 *839 * @param phoneid Phone that will be used to contact the receiving side.840 * @param dst Address of the beginning of the destination buffer.841 * @param size Size of the destination buffer.842 *843 * @return Zero on success or a negative error code from errno.h.844 *845 */846 int ipc_data_read_start(int phoneid, void *dst, size_t size)847 {848 return ipc_call_sync_2_0(phoneid, IPC_M_DATA_READ, (sysarg_t) dst,849 (sysarg_t) size);850 }851 852 /** Wrapper for answering the IPC_M_DATA_READ calls.853 *854 * This wrapper only makes it more comfortable to answer IPC_M_DATA_READ855 * calls so that the user doesn't have to remember the meaning of each856 * IPC argument.857 *858 * @param callid Hash of the IPC_M_DATA_READ call to answer.859 * @param src Source address for the IPC_M_DATA_READ call.860 * @param size Size for the IPC_M_DATA_READ call. Can be smaller than861 * the maximum size announced by the sender.862 *863 * @return Zero on success or a value from @ref errno.h on failure.864 *865 */866 int ipc_data_read_finalize(ipc_callid_t callid, const void *src, size_t size)867 {868 return ipc_answer_2(callid, EOK, (sysarg_t) src, (sysarg_t) size);869 }870 871 /** Wrapper for IPC_M_DATA_WRITE calls.872 *873 * @param phoneid Phone that will be used to contact the receiving side.874 * @param src Address of the beginning of the source buffer.875 * @param size Size of the source buffer.876 *877 * @return Zero on success or a negative error code from errno.h.878 *879 */880 int ipc_data_write_start(int phoneid, const void *src, size_t size)881 {882 return ipc_call_sync_2_0(phoneid, IPC_M_DATA_WRITE, (sysarg_t) src,883 (sysarg_t) size);884 }885 886 /** Wrapper for answering the IPC_M_DATA_WRITE calls.887 *888 * This wrapper only makes it more comfortable to answer IPC_M_DATA_WRITE889 * calls so that the user doesn't have to remember the meaning of each890 * IPC argument.891 *892 * @param callid Hash of the IPC_M_DATA_WRITE call to answer.893 * @param dst Final destination address for the IPC_M_DATA_WRITE call.894 * @param size Final size for the IPC_M_DATA_WRITE call.895 *896 * @return Zero on success or a value from @ref errno.h on failure.897 *898 */899 int ipc_data_write_finalize(ipc_callid_t callid, void *dst, size_t size)900 {901 return ipc_answer_2(callid, EOK, (sysarg_t) dst, (sysarg_t) size);902 }903 904 568 /** Connect to a task specified by id. 905 569 * -
uspace/lib/c/generic/iplink_srv.c
rb9cb911 r7cfe5c0 139 139 if (!method) { 140 140 /* The other side has hung up */ 141 fibril_mutex_lock(&srv->lock); 142 srv->connected = false; 143 fibril_mutex_unlock(&srv->lock); 141 144 async_answer_0(callid, EOK); 142 145 break; -
uspace/lib/c/generic/str.c
rb9cb911 r7cfe5c0 136 136 } 137 137 138 /** Decode a single character from a string to the left. 139 * 140 * Decode a single character from a string of size @a size. Decoding starts 141 * at @a offset and this offset is moved to the beginning of the previous 142 * character. In case of decoding error, offset generally decreases at least 143 * by one. However, offset is never moved before 0. 144 * 145 * @param str String (not necessarily NULL-terminated). 146 * @param offset Byte offset in string where to start decoding. 147 * @param size Size of the string (in bytes). 148 * 149 * @return Value of decoded character, U_SPECIAL on decoding error or 150 * NULL if attempt to decode beyond @a start of str. 151 * 152 */ 153 wchar_t str_decode_reverse(const char *str, size_t *offset, size_t size) 154 { 155 if (*offset == 0) 156 return 0; 157 158 size_t processed = 0; 159 /* Continue while continuation bytes found */ 160 while (*offset > 0 && processed < 4) { 161 uint8_t b = (uint8_t) str[--(*offset)]; 162 163 if (processed == 0 && (b & 0x80) == 0) { 164 /* 0xxxxxxx (Plain ASCII) */ 165 return b & 0x7f; 166 } 167 else if ((b & 0xe0) == 0xc0 || (b & 0xf0) == 0xe0 || 168 (b & 0xf8) == 0xf0) { 169 /* Start byte */ 170 size_t start_offset = *offset; 171 return str_decode(str, &start_offset, size); 172 } 173 else if ((b & 0xc0) != 0x80) { 174 /* Not a continuation byte */ 175 return U_SPECIAL; 176 } 177 processed++; 178 } 179 /* Too many continuation bytes */ 180 return U_SPECIAL; 181 } 182 138 183 /** Encode a single character to string representation. 139 184 * … … 397 442 398 443 return len; 444 } 445 446 /** Get character display width on a character cell display. 447 * 448 * @param ch Character 449 * @return Width of character in cells. 450 */ 451 size_t chr_width(wchar_t ch) 452 { 453 return 1; 454 } 455 456 /** Get string display width on a character cell display. 457 * 458 * @param str String 459 * @return Width of string in cells. 460 */ 461 size_t str_width(const char *str) 462 { 463 size_t width = 0; 464 size_t offset = 0; 465 wchar_t ch; 466 467 while ((ch = str_decode(str, &offset, STR_NO_LIMIT)) != 0) 468 width += chr_width(ch); 469 470 return width; 399 471 } 400 472 -
uspace/lib/c/generic/task.c
rb9cb911 r7cfe5c0 201 201 * 202 202 * This is really just a convenience wrapper over the more complicated 203 * loader API. Arguments are passed in a va_list. 204 * 205 * @param id If not NULL, the ID of the task is stored here on success. 206 * @param path Pathname of the binary to execute. 207 * @param cnt Number of arguments. 208 * @param ap Command-line arguments. 209 * 210 * @return Zero on success or negative error code. 211 * 212 */ 213 int task_spawn(task_id_t *task_id, const char *path, int cnt, va_list ap) 214 { 215 /* Allocate argument list. */ 216 const char **arglist = malloc(cnt * sizeof(const char *)); 217 if (arglist == NULL) 218 return ENOMEM; 219 220 /* Fill in arguments. */ 221 const char *arg; 222 cnt = 0; 223 do { 224 arg = va_arg(ap, const char *); 225 arglist[cnt++] = arg; 226 } while (arg != NULL); 227 228 /* Spawn task. */ 229 int rc = task_spawnv(task_id, path, arglist); 230 231 /* Free argument list. */ 232 free(arglist); 233 return rc; 234 } 235 236 /** Create a new task by running an executable from the filesystem. 237 * 238 * This is really just a convenience wrapper over the more complicated 203 239 * loader API. Arguments are passed as a null-terminated list of arguments. 204 240 * … … 216 252 va_list ap; 217 253 const char *arg; 218 const char **arglist;219 254 int cnt = 0; 220 255 … … 226 261 va_end(ap); 227 262 228 /* Allocate argument list. */229 arglist = malloc(cnt * sizeof(const char *));230 if (arglist == NULL)231 return ENOMEM;232 233 /* Fill in arguments. */234 cnt = 0;235 263 va_start(ap, path); 236 do { 237 arg = va_arg(ap, const char *); 238 arglist[cnt++] = arg; 239 } while (arg != NULL); 264 int rc = task_spawn(task_id, path, cnt, ap); 240 265 va_end(ap); 241 266 242 /* Spawn task. */243 int rc = task_spawnv(task_id, path, arglist);244 245 /* Free argument list. */246 free(arglist);247 267 return rc; 248 268 }
Note:
See TracChangeset
for help on using the changeset viewer.
