Changeset f8e8738 in mainline for uspace/srv/devman/devman.c
- Timestamp:
- 2011-04-07T20:22:40Z (13 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- fee6381
- Parents:
- 61257f4 (diff), a82889e (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. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/devman/devman.c
r61257f4 rf8e8738 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 } 275 270 276 if (read(fd, buf, len) <= 0) { 277 printf(NAME ": unable to read file '%s'.\n", conf_path); 271 ssize_t read_bytes = safe_read(fd, buf, len); 272 if (read_bytes <= 0) { 273 log_msg(LVL_ERROR, "Unable to read file '%s'.", conf_path); 278 274 goto cleanup; 279 275 } 280 buf[ len] = 0;276 buf[read_bytes] = 0; 281 277 282 278 suc = parse_match_ids(buf, ids); … … 313 309 bool get_driver_info(const char *base_path, const char *name, driver_t *drv) 314 310 { 315 printf(NAME ": get_driver_info base_path = %s, name = %s.\n",311 log_msg(LVL_DEBUG, "get_driver_info(base_path=\"%s\", name=\"%s\")", 316 312 base_path, name); 317 313 … … 345 341 struct stat s; 346 342 if (stat(drv->binary_path, &s) == ENOENT) { /* FIXME!! */ 347 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); 348 345 goto cleanup; 349 346 } … … 372 369 int lookup_available_drivers(driver_list_t *drivers_list, const char *dir_path) 373 370 { 374 printf(NAME ": lookup_available_drivers, dir = %s \n", dir_path);371 log_msg(LVL_DEBUG, "lookup_available_drivers(dir=\"%s\")", dir_path); 375 372 376 373 int drv_cnt = 0; … … 406 403 dev_node_t *dev; 407 404 408 printf(NAME ": create_root_nodes\n");405 log_msg(LVL_DEBUG, "create_root_nodes()"); 409 406 410 407 fibril_rwlock_write_lock(&tree->rwlock); … … 491 488 void attach_driver(dev_node_t *dev, driver_t *drv) 492 489 { 493 printf(NAME ": attach_driver %s to device %s\n",494 d rv->name, dev->pfun->pathname);490 log_msg(LVL_DEBUG, "attach_driver(dev=\"%s\",drv=\"%s\")", 491 dev->pfun->pathname, drv->name); 495 492 496 493 fibril_mutex_lock(&drv->driver_mutex); … … 514 511 assert(fibril_mutex_is_locked(&drv->driver_mutex)); 515 512 516 printf(NAME ": start_driver '%s'\n", drv->name);513 log_msg(LVL_DEBUG, "start_driver(drv=\"%s\")", drv->name); 517 514 518 515 rc = task_spawnl(NULL, drv->binary_path, drv->binary_path, NULL); 519 516 if (rc != EOK) { 520 printf(NAME ": error spawning %s (%s)\n",521 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)); 522 519 return false; 523 520 } … … 581 578 int phone; 582 579 583 printf(NAME ": pass_devices_to_driver(`%s')\n", driver->name); 580 log_msg(LVL_DEBUG, "pass_devices_to_driver(driver=\"%s\")", 581 driver->name); 584 582 585 583 fibril_mutex_lock(&driver->driver_mutex); … … 648 646 * immediately and possibly started here as well. 649 647 */ 650 printf(NAME ": driver %s goes into running state.\n", driver->name);648 log_msg(LVL_DEBUG, "Driver `%s' enters running state.", driver->name); 651 649 driver->state = DRIVER_RUNNING; 652 650 … … 665 663 void initialize_running_driver(driver_t *driver, dev_tree_t *tree) 666 664 { 667 printf(NAME ": initialize_running_driver (`%s')\n", driver->name); 665 log_msg(LVL_DEBUG, "initialize_running_driver(driver=\"%s\")", 666 driver->name); 668 667 669 668 /* … … 755 754 * access any structures that would affect driver_t. 756 755 */ 757 printf(NAME ": add_device (driver `%s', device `%s')\n", drv->name,758 d ev->pfun->name);756 log_msg(LVL_DEBUG, "add_device(drv=\"%s\", dev=\"%s\")", 757 drv->name, dev->pfun->name); 759 758 760 759 sysarg_t rc; … … 817 816 driver_t *drv = find_best_match_driver(drivers_list, dev); 818 817 if (drv == NULL) { 819 printf(NAME ": no driver found for device '%s'.\n",818 log_msg(LVL_ERROR, "No driver found for device `%s'.", 820 819 dev->pfun->pathname); 821 820 return false; … … 855 854 bool init_device_tree(dev_tree_t *tree, driver_list_t *drivers_list) 856 855 { 857 printf(NAME ": init_device_tree.\n");856 log_msg(LVL_DEBUG, "init_device_tree()"); 858 857 859 858 tree->current_handle = 0; … … 1034 1033 fun->pathname = (char *) malloc(pathsize); 1035 1034 if (fun->pathname == NULL) { 1036 printf(NAME ": failed to allocate device path.\n");1035 log_msg(LVL_ERROR, "Failed to allocate device path."); 1037 1036 return false; 1038 1037 } … … 1065 1064 assert(fibril_rwlock_is_write_locked(&tree->rwlock)); 1066 1065 1066 log_msg(LVL_DEBUG, "insert_dev_node(dev=%p, pfun=%p [\"%s\"])", 1067 dev, pfun, pfun->pathname); 1068 1067 1069 /* Add the node to the handle-to-node map. */ 1068 1070 dev->handle = ++tree->current_handle; … … 1071 1073 1072 1074 /* Add the node to the list of its parent's children. */ 1073 printf("insert_dev_node: dev=%p, dev->pfun := %p\n", dev, pfun);1074 1075 dev->pfun = pfun; 1075 1076 pfun->child = dev; … … 1131 1132 fun_node_t *find_fun_node_by_path(dev_tree_t *tree, char *path) 1132 1133 { 1134 assert(path != NULL); 1135 1136 bool is_absolute = path[0] == '/'; 1137 if (!is_absolute) { 1138 return NULL; 1139 } 1140 1133 1141 fibril_rwlock_read_lock(&tree->rwlock); 1134 1142 … … 1140 1148 char *rel_path = path; 1141 1149 char *next_path_elem = NULL; 1142 bool cont = (rel_path[0] == '/');1150 bool cont = true; 1143 1151 1144 1152 while (cont && fun != NULL) { … … 1165 1173 } 1166 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 1167 1234 /** Find child function node with a specified name. 1168 1235 * … … 1175 1242 fun_node_t *find_node_child(fun_node_t *pfun, const char *name) 1176 1243 { 1177 fun_node_t *fun; 1178 link_t *link; 1179 1180 link = pfun->child->functions.next; 1181 1182 while (link != &pfun->child->functions) { 1183 fun = list_get_instance(link, fun_node_t, dev_functions); 1184 1185 if (str_cmp(name, fun->name) == 0) 1186 return fun; 1187 1188 link = link->next; 1189 } 1190 1191 return NULL; 1244 return find_fun_node_in_device(pfun->child, name); 1192 1245 } 1193 1246 … … 1351 1404 } 1352 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 1353 1426 void init_class_list(class_list_t *class_list) 1354 1427 {
Note:
See TracChangeset
for help on using the changeset viewer.