Changeset 969585f in mainline for uspace/srv
- Timestamp:
- 2011-04-01T20:49:28Z (14 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 0053fa38, 5542b83, c6ba274
- Parents:
- 8e7d724 (diff), ebcb05a (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/srv
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/devman/devman.c
r8e7d724 r969585f 34 34 #include <fcntl.h> 35 35 #include <sys/stat.h> 36 #include <io/log.h> 36 37 #include <ipc/driver.h> 37 38 #include <ipc/devman.h> … … 146 147 fibril_mutex_unlock(&drivers_list->drivers_mutex); 147 148 148 printf(NAME": the '%s' driver was added to the list of available " 149 "drivers.\n", drv->name); 150 151 printf(NAME ": match ids:"); 152 link_t *cur; 153 for (cur = drv->match_ids.ids.next; cur != &drv->match_ids.ids; cur = cur->next) { 154 match_id_t *match_id = list_get_instance(cur, match_id_t, link); 155 printf(" %d:%s", match_id->score, match_id->id); 156 } 157 printf("\n"); 149 log_msg(LVL_NOTE, "Driver `%s' was added to the list of available " 150 "drivers.", drv->name); 158 151 } 159 152 … … 245 238 bool read_match_ids(const char *conf_path, match_id_list_t *ids) 246 239 { 247 printf(NAME ": read_match_ids conf_path = %s.\n", conf_path);240 log_msg(LVL_DEBUG, "read_match_ids(conf_path=\"%s\")", conf_path); 248 241 249 242 bool suc = false; … … 255 248 fd = open(conf_path, O_RDONLY); 256 249 if (fd < 0) { 257 printf(NAME ": unable to open %s\n", conf_path); 250 log_msg(LVL_ERROR, "Unable to open `%s' for reading: %s.", 251 conf_path, str_error(fd)); 258 252 goto cleanup; 259 253 } … … 263 257 lseek(fd, 0, SEEK_SET); 264 258 if (len == 0) { 265 printf(NAME ": configuration file '%s' is empty.\n", conf_path); 259 log_msg(LVL_ERROR, "Configuration file '%s' is empty.", 260 conf_path); 266 261 goto cleanup; 267 262 } … … 269 264 buf = malloc(len + 1); 270 265 if (buf == NULL) { 271 printf(NAME ": memory allocation failed when parsing file "272 "'%s'. \n", conf_path);266 log_msg(LVL_ERROR, "Memory allocation failed when parsing file " 267 "'%s'.", conf_path); 273 268 goto cleanup; 274 269 } … … 276 271 ssize_t read_bytes = safe_read(fd, buf, len); 277 272 if (read_bytes <= 0) { 278 printf(NAME ": unable to read file '%s'.\n", conf_path);273 log_msg(LVL_ERROR, "Unable to read file '%s'.", conf_path); 279 274 goto cleanup; 280 275 } … … 314 309 bool get_driver_info(const char *base_path, const char *name, driver_t *drv) 315 310 { 316 printf(NAME ": get_driver_info base_path = %s, name = %s.\n",311 log_msg(LVL_DEBUG, "get_driver_info(base_path=\"%s\", name=\"%s\")", 317 312 base_path, name); 318 313 … … 346 341 struct stat s; 347 342 if (stat(drv->binary_path, &s) == ENOENT) { /* FIXME!! */ 348 printf(NAME ": driver not found at path %s.", drv->binary_path); 343 log_msg(LVL_ERROR, "Driver not found at path `%s'.", 344 drv->binary_path); 349 345 goto cleanup; 350 346 } … … 373 369 int lookup_available_drivers(driver_list_t *drivers_list, const char *dir_path) 374 370 { 375 printf(NAME ": lookup_available_drivers, dir = %s \n", dir_path);371 log_msg(LVL_DEBUG, "lookup_available_drivers(dir=\"%s\")", dir_path); 376 372 377 373 int drv_cnt = 0; … … 407 403 dev_node_t *dev; 408 404 409 printf(NAME ": create_root_nodes\n");405 log_msg(LVL_DEBUG, "create_root_nodes()"); 410 406 411 407 fibril_rwlock_write_lock(&tree->rwlock); … … 492 488 void attach_driver(dev_node_t *dev, driver_t *drv) 493 489 { 494 printf(NAME ": attach_driver %s to device %s\n",495 d rv->name, dev->pfun->pathname);490 log_msg(LVL_DEBUG, "attach_driver(dev=\"%s\",drv=\"%s\")", 491 dev->pfun->pathname, drv->name); 496 492 497 493 fibril_mutex_lock(&drv->driver_mutex); … … 515 511 assert(fibril_mutex_is_locked(&drv->driver_mutex)); 516 512 517 printf(NAME ": start_driver '%s'\n", drv->name);513 log_msg(LVL_DEBUG, "start_driver(drv=\"%s\")", drv->name); 518 514 519 515 rc = task_spawnl(NULL, drv->binary_path, drv->binary_path, NULL); 520 516 if (rc != EOK) { 521 printf(NAME ": error spawning %s (%s)\n",522 drv->name, str_error(rc));517 log_msg(LVL_ERROR, "Spawning driver `%s' (%s) failed: %s.", 518 drv->name, drv->binary_path, str_error(rc)); 523 519 return false; 524 520 } … … 582 578 int phone; 583 579 584 printf(NAME ": pass_devices_to_driver(`%s')\n", driver->name); 580 log_msg(LVL_DEBUG, "pass_devices_to_driver(driver=\"%s\")", 581 driver->name); 585 582 586 583 fibril_mutex_lock(&driver->driver_mutex); … … 649 646 * immediately and possibly started here as well. 650 647 */ 651 printf(NAME ": driver %s goes into running state.\n", driver->name);648 log_msg(LVL_DEBUG, "Driver `%s' enters running state.", driver->name); 652 649 driver->state = DRIVER_RUNNING; 653 650 … … 666 663 void initialize_running_driver(driver_t *driver, dev_tree_t *tree) 667 664 { 668 printf(NAME ": initialize_running_driver (`%s')\n", driver->name); 665 log_msg(LVL_DEBUG, "initialize_running_driver(driver=\"%s\")", 666 driver->name); 669 667 670 668 /* … … 756 754 * access any structures that would affect driver_t. 757 755 */ 758 printf(NAME ": add_device (driver `%s', device `%s')\n", drv->name,759 d ev->pfun->name);756 log_msg(LVL_DEBUG, "add_device(drv=\"%s\", dev=\"%s\")", 757 drv->name, dev->pfun->name); 760 758 761 759 sysarg_t rc; … … 818 816 driver_t *drv = find_best_match_driver(drivers_list, dev); 819 817 if (drv == NULL) { 820 printf(NAME ": no driver found for device '%s'.\n",818 log_msg(LVL_ERROR, "No driver found for device `%s'.", 821 819 dev->pfun->pathname); 822 820 return false; … … 856 854 bool init_device_tree(dev_tree_t *tree, driver_list_t *drivers_list) 857 855 { 858 printf(NAME ": init_device_tree.\n");856 log_msg(LVL_DEBUG, "init_device_tree()"); 859 857 860 858 tree->current_handle = 0; … … 1035 1033 fun->pathname = (char *) malloc(pathsize); 1036 1034 if (fun->pathname == NULL) { 1037 printf(NAME ": failed to allocate device path.\n");1035 log_msg(LVL_ERROR, "Failed to allocate device path."); 1038 1036 return false; 1039 1037 } … … 1066 1064 assert(fibril_rwlock_is_write_locked(&tree->rwlock)); 1067 1065 1066 log_msg(LVL_DEBUG, "insert_dev_node(dev=%p, pfun=%p [\"%s\"])", 1067 dev, pfun, pfun->pathname); 1068 1068 1069 /* Add the node to the handle-to-node map. */ 1069 1070 dev->handle = ++tree->current_handle; … … 1072 1073 1073 1074 /* Add the node to the list of its parent's children. */ 1074 printf("insert_dev_node: dev=%p, dev->pfun := %p\n", dev, pfun);1075 1075 dev->pfun = pfun; 1076 1076 pfun->child = dev; … … 1173 1173 } 1174 1174 1175 /** Find function with a specified name belonging to given device. 1176 * 1177 * Device tree rwlock should be held at least for reading. 1178 * 1179 * @param dev Device the function belongs to. 1180 * @param name Function name (not path). 1181 * @return Function node. 1182 * @retval NULL No function with given name. 1183 */ 1184 fun_node_t *find_fun_node_in_device(dev_node_t *dev, const char *name) 1185 { 1186 assert(dev != NULL); 1187 assert(name != NULL); 1188 1189 fun_node_t *fun; 1190 link_t *link; 1191 1192 for (link = dev->functions.next; 1193 link != &dev->functions; 1194 link = link->next) { 1195 fun = list_get_instance(link, fun_node_t, dev_functions); 1196 1197 if (str_cmp(name, fun->name) == 0) 1198 return fun; 1199 } 1200 1201 return NULL; 1202 } 1203 1204 /** Find function node by its class name and index. */ 1205 fun_node_t *find_fun_node_by_class(class_list_t *class_list, 1206 const char *class_name, const char *dev_name) 1207 { 1208 assert(class_list != NULL); 1209 assert(class_name != NULL); 1210 assert(dev_name != NULL); 1211 1212 fibril_rwlock_read_lock(&class_list->rwlock); 1213 1214 dev_class_t *cl = find_dev_class_no_lock(class_list, class_name); 1215 if (cl == NULL) { 1216 fibril_rwlock_read_unlock(&class_list->rwlock); 1217 return NULL; 1218 } 1219 1220 dev_class_info_t *dev = find_dev_in_class(cl, dev_name); 1221 if (dev == NULL) { 1222 fibril_rwlock_read_unlock(&class_list->rwlock); 1223 return NULL; 1224 } 1225 1226 fun_node_t *fun = dev->fun; 1227 1228 fibril_rwlock_read_unlock(&class_list->rwlock); 1229 1230 return fun; 1231 } 1232 1233 1175 1234 /** Find child function node with a specified name. 1176 1235 * … … 1183 1242 fun_node_t *find_node_child(fun_node_t *pfun, const char *name) 1184 1243 { 1185 fun_node_t *fun; 1186 link_t *link; 1187 1188 link = pfun->child->functions.next; 1189 1190 while (link != &pfun->child->functions) { 1191 fun = list_get_instance(link, fun_node_t, dev_functions); 1192 1193 if (str_cmp(name, fun->name) == 0) 1194 return fun; 1195 1196 link = link->next; 1197 } 1198 1199 return NULL; 1244 return find_fun_node_in_device(pfun->child, name); 1200 1245 } 1201 1246 … … 1359 1404 } 1360 1405 1406 dev_class_info_t *find_dev_in_class(dev_class_t *dev_class, const char *dev_name) 1407 { 1408 assert(dev_class != NULL); 1409 assert(dev_name != NULL); 1410 1411 link_t *link; 1412 for (link = dev_class->devices.next; 1413 link != &dev_class->devices; 1414 link = link->next) { 1415 dev_class_info_t *dev = list_get_instance(link, 1416 dev_class_info_t, link); 1417 1418 if (str_cmp(dev->dev_name, dev_name) == 0) { 1419 return dev; 1420 } 1421 } 1422 1423 return NULL; 1424 } 1425 1361 1426 void init_class_list(class_list_t *class_list) 1362 1427 { -
uspace/srv/devman/devman.h
r8e7d724 r969585f 338 338 extern fun_node_t *find_fun_node(dev_tree_t *tree, devman_handle_t handle); 339 339 extern fun_node_t *find_fun_node_by_path(dev_tree_t *, char *); 340 extern fun_node_t *find_fun_node_in_device(dev_node_t *, const char *); 341 extern fun_node_t *find_fun_node_by_class(class_list_t *, const char *, const char *); 340 342 341 343 /* Device tree */ … … 359 361 extern dev_class_t *get_dev_class(class_list_t *, char *); 360 362 extern dev_class_t *find_dev_class_no_lock(class_list_t *, const char *); 363 extern dev_class_info_t *find_dev_in_class(dev_class_t *, const char *); 361 364 extern void add_dev_class_no_lock(class_list_t *, dev_class_t *); 362 365 -
uspace/srv/devman/main.c
r8e7d724 r969585f 43 43 #include <stdio.h> 44 44 #include <errno.h> 45 #include <str_error.h> 45 46 #include <bool.h> 46 47 #include <fibril_synch.h> … … 51 52 #include <sys/stat.h> 52 53 #include <ctype.h> 54 #include <io/log.h> 53 55 #include <ipc/devman.h> 54 56 #include <ipc/driver.h> … … 71 73 driver_t *driver = NULL; 72 74 73 printf(NAME ": devman_driver_register \n");75 log_msg(LVL_DEBUG, "devman_driver_register"); 74 76 75 77 iid = async_get_call(&icall); … … 88 90 } 89 91 90 printf(NAME ": the %s driver is trying to register by the service.\n",92 log_msg(LVL_DEBUG, "The `%s' driver is trying to register.", 91 93 drv_name); 92 94 … … 95 97 96 98 if (driver == NULL) { 97 printf(NAME ": no driver named %s was found.\n", drv_name);99 log_msg(LVL_ERROR, "No driver named `%s' was found.", drv_name); 98 100 free(drv_name); 99 101 drv_name = NULL; … … 106 108 107 109 /* Create connection to the driver. */ 108 printf(NAME ": creating connection to the %s driver.\n", driver->name); 110 log_msg(LVL_DEBUG, "Creating connection to the `%s' driver.", 111 driver->name); 109 112 ipc_call_t call; 110 113 ipc_callid_t callid = async_get_call(&call); … … 118 121 set_driver_phone(driver, IPC_GET_ARG5(call)); 119 122 120 printf(NAME ": the %s driver was successfully registered as running.\n", 123 log_msg(LVL_NOTE, 124 "The `%s' driver was successfully registered as running.", 121 125 driver->name); 122 126 … … 142 146 callid = async_get_call(&call); 143 147 if (DEVMAN_ADD_MATCH_ID != IPC_GET_IMETHOD(call)) { 144 printf(NAME ": ERROR: devman_receive_match_id - invalid "145 " protocol.\n");148 log_msg(LVL_ERROR, 149 "Invalid protocol when trying to receive match id."); 146 150 async_answer_0(callid, EINVAL); 147 151 delete_match_id(match_id); … … 150 154 151 155 if (match_id == NULL) { 152 printf(NAME ": ERROR: devman_receive_match_id - failed to " 153 "allocate match id.\n"); 156 log_msg(LVL_ERROR, "Failed to allocate match id."); 154 157 async_answer_0(callid, ENOMEM); 155 158 return ENOMEM; … … 165 168 if (rc != EOK) { 166 169 delete_match_id(match_id); 167 printf(NAME ": devman_receive_match_id - failed to receive "168 "match id string.\n");170 log_msg(LVL_ERROR, "Failed to receive match id string: %s.", 171 str_error(rc)); 169 172 return rc; 170 173 } … … 172 175 list_append(&match_id->link, &match_ids->ids); 173 176 174 printf(NAME ": received match id '%s', score = %d \n",177 log_msg(LVL_DEBUG, "Received match id `%s', score %d.", 175 178 match_id->id, match_id->score); 176 179 return rc; … … 228 231 if (ftype != fun_inner && ftype != fun_exposed) { 229 232 /* Unknown function type */ 230 printf(NAME ": Error, unknown function type provided by driver!\n"); 233 log_msg(LVL_ERROR, 234 "Unknown function type %d provided by driver.", 235 (int) ftype); 231 236 232 237 fibril_rwlock_write_unlock(&tree->rwlock); … … 243 248 } 244 249 250 /* Check that function with same name is not there already. */ 251 if (find_fun_node_in_device(pdev, fun_name) != NULL) { 252 fibril_rwlock_write_unlock(&tree->rwlock); 253 async_answer_0(callid, EEXISTS); 254 printf(NAME ": Warning, driver tried to register `%s' twice.\n", 255 fun_name); 256 free(fun_name); 257 return; 258 } 259 245 260 fun_node_t *fun = create_fun_node(); 246 261 if (!insert_fun_node(&device_tree, fun, fun_name, pdev)) { … … 265 280 fibril_rwlock_write_unlock(&tree->rwlock); 266 281 267 printf(NAME ": devman_add_function %s\n", fun->pathname);282 log_msg(LVL_DEBUG, "devman_add_function(fun=\"%s\")", fun->pathname); 268 283 269 284 devman_receive_match_ids(match_count, &fun->match_ids); … … 347 362 devmap_register_class_dev(class_info); 348 363 349 printf(NAME ": function'%s' added to class '%s', class name '%s' was "350 "asigned to it\n",fun->pathname, class_name, class_info->dev_name);364 log_msg(LVL_NOTE, "Function `%s' added to class `%s' as `%s'.", 365 fun->pathname, class_name, class_info->dev_name); 351 366 352 367 async_answer_0(callid, EOK); … … 363 378 364 379 initialize_running_driver(driver, &device_tree); 365 printf(NAME ": the %s driver was successfully initialized. \n",380 log_msg(LVL_DEBUG, "The `%s` driver was successfully initialized.", 366 381 driver->name); 367 382 return 0; … … 385 400 fid_t fid = fibril_create(init_running_drv, driver); 386 401 if (fid == 0) { 387 printf(NAME ": Error creating fibril for the initialization of "388 " the newly registered running driver.\n");402 log_msg(LVL_ERROR, "Failed to create initialization fibril " \ 403 "for driver `%s'.", driver->name); 389 404 return; 390 405 } … … 438 453 } 439 454 455 /** Find handle for the device instance identified by device class name. */ 456 static void devman_function_get_handle_by_class(ipc_callid_t iid, 457 ipc_call_t *icall) 458 { 459 char *classname; 460 char *devname; 461 462 int rc = async_data_write_accept((void **) &classname, true, 0, 0, 0, 0); 463 if (rc != EOK) { 464 async_answer_0(iid, rc); 465 return; 466 } 467 rc = async_data_write_accept((void **) &devname, true, 0, 0, 0, 0); 468 if (rc != EOK) { 469 free(classname); 470 async_answer_0(iid, rc); 471 return; 472 } 473 474 475 fun_node_t *fun = find_fun_node_by_class(&class_list, 476 classname, devname); 477 478 free(classname); 479 free(devname); 480 481 if (fun == NULL) { 482 async_answer_0(iid, ENOENT); 483 return; 484 } 485 486 async_answer_1(iid, EOK, fun->handle); 487 } 488 440 489 441 490 /** Function for handling connections from a client to the device manager. */ … … 457 506 devman_function_get_handle(callid, &call); 458 507 break; 508 case DEVMAN_DEVICE_GET_HANDLE_BY_CLASS: 509 devman_function_get_handle_by_class(callid, &call); 510 break; 459 511 default: 460 512 async_answer_0(callid, ENOENT); … … 484 536 */ 485 537 if (dev == NULL) { 486 printf(NAME ": devman_forward error - no device or function with"487 " handle %" PRIun " was found.\n", handle);538 log_msg(LVL_ERROR, "IPC forwarding failed - no device or " 539 "function with handle %" PRIun " was found.", handle); 488 540 async_answer_0(iid, ENOENT); 489 541 return; … … 491 543 492 544 if (fun == NULL && !drv_to_parent) { 493 printf(NAME ": devman_forward error - cannot connect to " 494 "handle %" PRIun ", refers to a device.\n", handle); 545 log_msg(LVL_ERROR, NAME ": devman_forward error - cannot " 546 "connect to handle %" PRIun ", refers to a device.", 547 handle); 495 548 async_answer_0(iid, ENOENT); 496 549 return; … … 513 566 514 567 if (driver == NULL) { 515 printf(NAME ": devman_forward error - the device %" PRIun\516 " (%s) is not in usable state.\n",568 log_msg(LVL_ERROR, "IPC forwarding refused - " \ 569 "the device %" PRIun "(%s) is not in usable state.", 517 570 handle, dev->pfun->pathname); 518 571 async_answer_0(iid, ENOENT); … … 527 580 528 581 if (driver->phone <= 0) { 529 printf(NAME ": devman_forward: cound not forward to driver %s ",530 driver->name);531 printf("the driver's phone is %" PRIun ").\n",driver->phone);582 log_msg(LVL_ERROR, 583 "Could not forward to driver `%s' (phone is %d).", 584 driver->name, (int) driver->phone); 532 585 async_answer_0(iid, EINVAL); 533 586 return; … … 535 588 536 589 if (fun != NULL) { 537 printf(NAME ": devman_forward: forward connection to function %s to " 538 "driver %s.\n", fun->pathname, driver->name); 590 log_msg(LVL_DEBUG, 591 "Forwarding request for `%s' function to driver `%s'.", 592 fun->pathname, driver->name); 539 593 } else { 540 printf(NAME ": devman_forward: forward connection to device %s to " 541 "driver %s.\n", dev->pfun->pathname, driver->name); 594 log_msg(LVL_DEBUG, 595 "Forwarding request for `%s' device to driver `%s'.", 596 dev->pfun->pathname, driver->name); 542 597 } 543 598 … … 571 626 async_forward_fast(iid, dev->drv->phone, DRIVER_CLIENT, fun->handle, 0, 572 627 IPC_FF_NONE); 573 printf(NAME ": devman_connection_devmapper: forwarded connection to " 574 "device %s to driver %s.\n", fun->pathname, dev->drv->name); 628 log_msg(LVL_DEBUG, 629 "Forwarding devmapper request for `%s' function to driver `%s'.", 630 fun->pathname, dev->drv->name); 575 631 } 576 632 … … 607 663 static bool devman_init(void) 608 664 { 609 printf(NAME ": devman_init - looking for available drivers.\n");665 log_msg(LVL_DEBUG, "devman_init - looking for available drivers."); 610 666 611 667 /* Initialize list of available drivers. */ … … 613 669 if (lookup_available_drivers(&drivers_list, 614 670 DRIVER_DEFAULT_STORE) == 0) { 615 printf(NAME " no drivers found.");671 log_msg(LVL_FATAL, "No drivers found."); 616 672 return false; 617 673 } 618 674 619 printf(NAME ": devman_init - list of drivers has been initialized.\n");675 log_msg(LVL_DEBUG, "devman_init - list of drivers has been initialized."); 620 676 621 677 /* Create root device node. */ 622 678 if (!init_device_tree(&device_tree, &drivers_list)) { 623 printf(NAME " failed to initialize device tree.");679 log_msg(LVL_FATAL, "Failed to initialize device tree."); 624 680 return false; 625 681 } … … 642 698 printf(NAME ": HelenOS Device Manager\n"); 643 699 700 if (log_init(NAME, LVL_ERROR) != EOK) { 701 printf(NAME ": Error initializing logging subsystem.\n"); 702 return -1; 703 } 704 644 705 if (!devman_init()) { 645 printf(NAME ": Error while initializing service\n");706 log_msg(LVL_ERROR, "Error while initializing service."); 646 707 return -1; 647 708 } … … 651 712 652 713 /* Register device manager at naming service. */ 653 if (service_register(SERVICE_DEVMAN) != EOK) 714 if (service_register(SERVICE_DEVMAN) != EOK) { 715 log_msg(LVL_ERROR, "Failed registering as a service."); 654 716 return -1; 655 656 printf(NAME ": Accepting connections\n"); 717 } 718 719 printf(NAME ": Accepting connections.\n"); 657 720 async_manager(); 658 721 -
uspace/srv/devmap/devmap.c
r8e7d724 r969585f 551 551 if (devmap_device_find_name(namespace->name, device->name) != NULL) { 552 552 printf("%s: Device '%s/%s' already registered\n", NAME, 553 device->namespace->name, device->name);553 namespace->name, device->name); 554 554 devmap_namespace_destroy(namespace); 555 555 fibril_mutex_unlock(&devices_list_mutex);
Note:
See TracChangeset
for help on using the changeset viewer.