Changeset b3eeae5 in mainline for uspace/app/disp/disp.c


Ignore:
Timestamp:
2023-01-15T09:24:50Z (15 months ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
master, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
46a47c0
Parents:
46b02cb
Message:

Assigning devices to seats

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/app/disp/disp.c

    r46b02cb rb3eeae5  
    5454        printf("  %s create-seat <name>\n", NAME);
    5555        printf("  %s delete-seat <name>\n", NAME);
     56        printf("  %s assign-dev <device> <seat>\n", NAME);
     57        printf("  %s unassign-dev <device>\n", NAME);
    5658}
    5759
     
    273275}
    274276
     277/** Assign device subcommand.
     278 *
     279 * @param dcfg_svc Display configuration service name
     280 * @param argc Number of arguments
     281 * @param argv Arguments
     282 * @return EOK on success or an erro code
     283 */
     284static errno_t dev_assign(const char *dcfg_svc, int argc, char *argv[])
     285{
     286        dispcfg_t *dispcfg;
     287        char *dev_name;
     288        service_id_t svc_id;
     289        char *seat_name;
     290        sysarg_t seat_id;
     291        errno_t rc;
     292
     293        if (argc < 2) {
     294                printf(NAME ": Missing arguments.\n");
     295                print_syntax();
     296                return EINVAL;
     297        }
     298
     299        if (argc > 2) {
     300                printf(NAME ": Too many arguments.\n");
     301                print_syntax();
     302                return EINVAL;
     303        }
     304
     305        dev_name = argv[0];
     306        seat_name = argv[1];
     307
     308        rc = loc_service_get_id(dev_name, &svc_id, 0);
     309        if (rc != EOK) {
     310                printf(NAME ": Device service '%s' not found.\n",
     311                    dev_name);
     312                return ENOENT;
     313        }
     314
     315        rc = dispcfg_open(dcfg_svc, NULL, NULL, &dispcfg);
     316        if (rc != EOK) {
     317                printf(NAME ": Failed connecting to display configuration "
     318                    "service: %s.\n", str_error(rc));
     319                return rc;
     320        }
     321
     322        rc = seat_find_by_name(dispcfg, seat_name, &seat_id);
     323        if (rc != EOK) {
     324                printf(NAME ": Seat '%s' not found.\n", seat_name);
     325                dispcfg_close(dispcfg);
     326                return ENOENT;
     327        }
     328
     329        rc = dispcfg_dev_assign(dispcfg, svc_id, seat_id);
     330        if (rc != EOK) {
     331                printf(NAME ": Failed assigning device '%s' to seat '%s': "
     332                    "%s\n", dev_name, seat_name, str_error(rc));
     333                dispcfg_close(dispcfg);
     334                return EIO;
     335        }
     336
     337        dispcfg_close(dispcfg);
     338        return EOK;
     339}
     340
     341/** Unassign device subcommand.
     342 *
     343 * @param dcfg_svc Display configuration service name
     344 * @param argc Number of arguments
     345 * @param argv Arguments
     346 * @return EOK on success or an erro code
     347 */
     348static errno_t dev_unassign(const char *dcfg_svc, int argc, char *argv[])
     349{
     350        dispcfg_t *dispcfg;
     351        char *dev_name;
     352        service_id_t svc_id;
     353        errno_t rc;
     354
     355        if (argc < 1) {
     356                printf(NAME ": Missing arguments.\n");
     357                print_syntax();
     358                return EINVAL;
     359        }
     360
     361        if (argc > 1) {
     362                printf(NAME ": Too many arguments.\n");
     363                print_syntax();
     364                return EINVAL;
     365        }
     366
     367        dev_name = argv[0];
     368
     369        rc = loc_service_get_id(dev_name, &svc_id, 0);
     370        if (rc != EOK) {
     371                printf(NAME ": Device service '%s' not found.\n",
     372                    dev_name);
     373                return ENOENT;
     374        }
     375
     376        rc = dispcfg_open(dcfg_svc, NULL, NULL, &dispcfg);
     377        if (rc != EOK) {
     378                printf(NAME ": Failed connecting to display configuration "
     379                    "service: %s.\n", str_error(rc));
     380                return rc;
     381        }
     382
     383        rc = dispcfg_dev_unassign(dispcfg, svc_id);
     384        if (rc != EOK) {
     385                printf(NAME ": Failed unassigning device '%s': %s\n",
     386                    dev_name, str_error(rc));
     387                dispcfg_close(dispcfg);
     388                return EIO;
     389        }
     390
     391        dispcfg_close(dispcfg);
     392        return EOK;
     393}
     394
    275395int main(int argc, char *argv[])
    276396{
     
    295415                if (rc != EOK)
    296416                        return 1;
     417        } else if (str_cmp(argv[1], "assign-dev") == 0) {
     418                rc = dev_assign(dispcfg_svc, argc - 2, argv + 2);
     419                if (rc != EOK)
     420                        return 1;
     421        } else if (str_cmp(argv[1], "unassign-dev") == 0) {
     422                rc = dev_unassign(dispcfg_svc, argc - 2, argv + 2);
     423                if (rc != EOK)
     424                        return 1;
    297425        } else {
    298426                printf(NAME ": Unknown command '%s'.\n", argv[1]);
Note: See TracChangeset for help on using the changeset viewer.