Changes in uspace/srv/devman/main.c [33fc3ae:9d58539] in mainline
- File:
-
- 1 edited
-
uspace/srv/devman/main.c (modified) (15 diffs)
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/devman/main.c
r33fc3ae r9d58539 245 245 246 246 fibril_rwlock_write_lock(&device_tree.rwlock); 247 247 248 248 if (fun->state == FUN_ON_LINE) { 249 249 fibril_rwlock_write_unlock(&device_tree.rwlock); … … 259 259 return ENOMEM; 260 260 } 261 261 262 262 insert_dev_node(&device_tree, dev, fun); 263 263 dev_add_ref(dev); … … 272 272 /* Give one reference over to assign_driver_fibril(). */ 273 273 dev_add_ref(dev); 274 275 274 /* 276 275 * Try to find a suitable driver and assign it to the device. We do … … 289 288 } 290 289 fibril_add_ready(assign_fibril); 291 } else 290 } else { 292 291 loc_register_tree_function(fun, &device_tree); 292 } 293 293 294 294 fibril_rwlock_write_unlock(&device_tree.rwlock); … … 419 419 420 420 /* Check that function with same name is not there already. */ 421 fun_node_t *tfun = find_fun_node_in_device(tree, pdev, fun_name); 422 if (tfun) { 423 fun_del_ref(tfun); /* drop the new unwanted reference */ 421 if (find_fun_node_in_device(tree, pdev, fun_name) != NULL) { 424 422 fibril_rwlock_write_unlock(&tree->rwlock); 425 423 dev_del_ref(pdev); … … 857 855 } 858 856 859 /** Get function driver name. */860 static void devman_fun_get_driver_name(ipc_callid_t iid, ipc_call_t *icall)861 {862 devman_handle_t handle = IPC_GET_ARG1(*icall);863 864 fun_node_t *fun = find_fun_node(&device_tree, handle);865 if (fun == NULL) {866 async_answer_0(iid, ENOMEM);867 return;868 }869 870 ipc_callid_t data_callid;871 size_t data_len;872 if (!async_data_read_receive(&data_callid, &data_len)) {873 async_answer_0(iid, EINVAL);874 fun_del_ref(fun);875 return;876 }877 878 void *buffer = malloc(data_len);879 if (buffer == NULL) {880 async_answer_0(data_callid, ENOMEM);881 async_answer_0(iid, ENOMEM);882 fun_del_ref(fun);883 return;884 }885 886 fibril_rwlock_read_lock(&device_tree.rwlock);887 888 /* Check function state */889 if (fun->state == FUN_REMOVED) {890 fibril_rwlock_read_unlock(&device_tree.rwlock);891 free(buffer);892 893 async_answer_0(data_callid, ENOENT);894 async_answer_0(iid, ENOENT);895 fun_del_ref(fun);896 return;897 }898 899 /* Check whether function has a driver */900 if (fun->child == NULL || fun->child->drv == NULL) {901 fibril_rwlock_read_unlock(&device_tree.rwlock);902 free(buffer);903 904 async_answer_0(data_callid, EINVAL);905 async_answer_0(iid, EINVAL);906 fun_del_ref(fun);907 return;908 }909 910 size_t sent_length = str_size(fun->child->drv->name);911 if (sent_length > data_len) {912 sent_length = data_len;913 }914 915 async_data_read_finalize(data_callid, fun->child->drv->name,916 sent_length);917 async_answer_0(iid, EOK);918 919 fibril_rwlock_read_unlock(&device_tree.rwlock);920 fun_del_ref(fun);921 free(buffer);922 }923 857 924 858 /** Get device path. */ … … 1149 1083 devman_fun_get_name(callid, &call); 1150 1084 break; 1151 case DEVMAN_FUN_GET_DRIVER_NAME:1152 devman_fun_get_driver_name(callid, &call);1153 break;1154 1085 case DEVMAN_FUN_GET_PATH: 1155 1086 devman_fun_get_path(callid, &call); … … 1218 1149 if (dev->pfun->dev != NULL) 1219 1150 driver = dev->pfun->dev->drv; 1220 1221 1151 fwd_h = dev->pfun->handle; 1222 1152 } else if (dev->state == DEVICE_USABLE) { … … 1224 1154 driver = dev->drv; 1225 1155 assert(driver != NULL); 1226 1156 1227 1157 fwd_h = handle; 1228 1158 } … … 1251 1181 1252 1182 if (fun != NULL) { 1253 log_msg(LVL_DEBUG, 1183 log_msg(LVL_DEBUG, 1254 1184 "Forwarding request for `%s' function to driver `%s'.", 1255 1185 fun->pathname, driver->name); 1256 1186 } else { 1257 log_msg(LVL_DEBUG, 1187 log_msg(LVL_DEBUG, 1258 1188 "Forwarding request for `%s' device to driver `%s'.", 1259 1189 dev->pfun->pathname, driver->name); … … 1263 1193 async_forward_fast(iid, exch, method, fwd_h, 0, IPC_FF_NONE); 1264 1194 async_exchange_end(exch); 1265 1195 1266 1196 cleanup: 1267 1197 if (dev != NULL) 1268 1198 dev_del_ref(dev); 1269 1270 1199 if (fun != NULL) 1271 1200 fun_del_ref(fun); … … 1370 1299 return false; 1371 1300 } 1372 1301 1373 1302 log_msg(LVL_DEBUG, "devman_init - list of drivers has been initialized."); 1374 1303 1375 1304 /* Create root device node. */ 1376 1305 if (!init_device_tree(&device_tree, &drivers_list)) { … … 1378 1307 return false; 1379 1308 } 1380 1309 1381 1310 /* 1382 1311 * Caution: As the device manager is not a real loc … … 1393 1322 int main(int argc, char *argv[]) 1394 1323 { 1395 printf("%s: HelenOS Device Manager\n", NAME); 1396 1397 int rc = log_init(NAME, LVL_WARN); 1398 if (rc != EOK) { 1399 printf("%s: Error initializing logging subsystem.\n", NAME); 1400 return rc; 1324 printf(NAME ": HelenOS Device Manager\n"); 1325 1326 if (log_init(NAME, LVL_WARN) != EOK) { 1327 printf(NAME ": Error initializing logging subsystem.\n"); 1328 return -1; 1401 1329 } 1402 1330 … … 1405 1333 async_set_client_data_destructor(devman_client_data_destroy); 1406 1334 async_set_client_connection(devman_connection); 1407 1335 1408 1336 if (!devman_init()) { 1409 1337 log_msg(LVL_ERROR, "Error while initializing service."); 1410 1338 return -1; 1411 1339 } 1412 1340 1413 1341 /* Register device manager at naming service. */ 1414 rc = service_register(SERVICE_DEVMAN); 1415 if (rc != EOK) { 1342 if (service_register(SERVICE_DEVMAN) != EOK) { 1416 1343 log_msg(LVL_ERROR, "Failed registering as a service."); 1417 return rc;1418 } 1419 1420 printf( "%s: Accepting connections.\n", NAME);1344 return -1; 1345 } 1346 1347 printf(NAME ": Accepting connections.\n"); 1421 1348 task_retval(0); 1422 1349 async_manager(); 1423 1350 1424 1351 /* Never reached. */ 1425 1352 return 0;
Note:
See TracChangeset
for help on using the changeset viewer.
