Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/system/system.c

    rad9e225 rca48672  
    11/*
    2  * Copyright (c) 2024 Jiri Svoboda
     2 * Copyright (c) 2025 Jiri Svoboda
    33 * Copyright (c) 2005 Martin Decky
    44 * All rights reserved.
     
    3535 */
    3636
     37#include <devman.h>
    3738#include <fibril.h>
    3839#include <futil.h>
     
    4849#include <str.h>
    4950#include <loc.h>
     51#include <shutdown.h>
    5052#include <str_error.h>
    5153#include <config.h>
     
    8486
    8587static void system_srv_conn(ipc_call_t *, void *);
    86 static errno_t system_srv_shutdown(void *);
     88static errno_t system_srv_poweroff(void *);
     89static errno_t system_srv_restart(void *);
    8790
    8891system_ops_t system_srv_ops = {
    89         .shutdown = system_srv_shutdown
     92        .poweroff = system_srv_poweroff,
     93        .restart = system_srv_restart
    9094};
    9195
     
    324328        size_t nparts;
    325329        bool sv_mounted;
     330        futil_t *futil = NULL;
    326331        size_t i;
    327332        errno_t rc;
     
    376381
    377382                /* Copy initial configuration files */
    378                 rc = futil_rcopy_contents("/cfg", "/w/cfg");
     383                rc = futil_create(NULL, NULL, &futil);
    379384                if (rc != EOK)
    380385                        goto error;
     386
     387                rc = futil_rcopy_contents(futil, "/cfg", "/w/cfg");
     388                if (rc != EOK)
     389                        goto error;
     390
     391                futil_destroy(futil);
     392                futil = NULL;
    381393        } else {
    382394                printf("%s: System volume is configured.\n", NAME);
    383395
    384                 /* Wait until system volume is mounted */
     396                /* Verify that system volume is mounted */
    385397                sv_mounted = false;
    386398
    387                 while (true) {
    388                         rc = vol_get_parts(vol, &part_ids, &nparts);
     399                rc = vol_get_parts(vol, &part_ids, &nparts);
     400                if (rc != EOK) {
     401                        printf("Error getting list of volumes.\n");
     402                        goto error;
     403                }
     404
     405                for (i = 0; i < nparts; i++) {
     406                        rc = vol_part_info(vol, part_ids[i], &pinfo);
    389407                        if (rc != EOK) {
    390                                 printf("Error getting list of volumes.\n");
     408                                printf("Error getting partition "
     409                                    "information.\n");
     410                                rc = EIO;
    391411                                goto error;
    392412                        }
    393413
    394                         for (i = 0; i < nparts; i++) {
    395                                 rc = vol_part_info(vol, part_ids[i], &pinfo);
    396                                 if (rc != EOK) {
    397                                         printf("Error getting partition "
    398                                             "information.\n");
    399                                         rc = EIO;
    400                                         goto error;
    401                                 }
    402 
    403                                 if (str_cmp(pinfo.cur_mp, "/w") == 0) {
    404                                         sv_mounted = true;
    405                                         break;
    406                                 }
     414                        if (str_cmp(pinfo.cur_mp, "/w") == 0) {
     415                                sv_mounted = true;
     416                                break;
    407417                        }
    408 
    409                         if (sv_mounted)
    410                                 break;
    411 
    412                         free(part_ids);
    413                         part_ids = NULL;
    414 
    415                         fibril_sleep(1);
    416                         printf("Sleeping(1) for system volume.\n");
    417                 }
     418                }
     419
     420                if (sv_mounted == false) {
     421                        printf("System volume not found.\n");
     422                        rc = EIO;
     423                        goto error;
     424                }
     425
     426                free(part_ids);
     427                part_ids = NULL;
     428
    418429        }
    419430
     
    426437        if (part_ids != NULL)
    427438                free(part_ids);
     439        if (futil != NULL)
     440                futil_destroy(futil);
    428441
    429442        return rc;
     
    520533        /* Eject all volumes. */
    521534
     535        log_msg(LOG_DEFAULT, LVL_NOTE, "Ejecting volumes.");
     536
    522537        rc = vol_create(&vol);
    523538        if (rc != EOK) {
     
    534549
    535550        for (i = 0; i < nparts; i++) {
    536                 rc = vol_part_eject(vol, part_ids[i]);
     551                rc = vol_part_eject(vol, part_ids[i], vef_none);
    537552                if (rc != EOK) {
    538553                        log_msg(LOG_DEFAULT, LVL_ERROR, "Error ejecting "
     
    544559        free(part_ids);
    545560        vol_destroy(vol);
     561
    546562        return EOK;
    547563error:
     
    556572static errno_t system_srv_init(sys_srv_t *syssrv)
    557573{
    558         port_id_t port;
     574        port_id_t port = 0;
    559575        loc_srv_t *srv = NULL;
    560576        service_id_t sid = 0;
     
    578594        }
    579595
    580         rc = loc_service_register(srv, SYSTEM_DEFAULT, &sid);
     596        rc = loc_service_register(srv, SYSTEM_DEFAULT, port, &sid);
    581597        if (rc != EOK) {
    582598                log_msg(LOG_DEFAULT, LVL_ERROR,
     
    592608        if (srv != NULL)
    593609                loc_server_unregister(srv);
    594         // XXX destroy port
     610        if (port != 0)
     611                async_port_destroy(port);
    595612        return rc;
    596613}
     
    610627}
    611628
    612 /** System shutdown request.
     629/** System poweroff request.
    613630 *
    614631 * @param arg Argument (sys_srv_t *)
    615632 */
    616 static errno_t system_srv_shutdown(void *arg)
     633static errno_t system_srv_poweroff(void *arg)
    617634{
    618635        sys_srv_t *syssrv = (sys_srv_t *)arg;
    619636        errno_t rc;
    620637
    621         log_msg(LOG_DEFAULT, LVL_NOTE, "system_srv_shutdown");
     638        log_msg(LOG_DEFAULT, LVL_NOTE, "system_srv_poweroff");
    622639
    623640        rc = system_sys_shutdown();
    624641        if (rc != EOK) {
    625                 log_msg(LOG_DEFAULT, LVL_NOTE, "system_srv_shutdown failed");
     642                log_msg(LOG_DEFAULT, LVL_NOTE, "system_srv_poweroff failed");
    626643                system_srv_shutdown_failed(&syssrv->srv);
    627644        }
    628645
    629         log_msg(LOG_DEFAULT, LVL_NOTE, "system_srv_shutdown complete");
     646        log_msg(LOG_DEFAULT, LVL_NOTE, "system_srv_poweroff complete");
     647        system_srv_shutdown_complete(&syssrv->srv);
     648        return EOK;
     649}
     650
     651/** System restart request.
     652 *
     653 * @param arg Argument (sys_srv_t *)
     654 */
     655static errno_t system_srv_restart(void *arg)
     656{
     657        sys_srv_t *syssrv = (sys_srv_t *)arg;
     658        errno_t rc;
     659
     660        log_msg(LOG_DEFAULT, LVL_NOTE, "system_srv_restart");
     661
     662        rc = system_sys_shutdown();
     663        if (rc != EOK) {
     664                log_msg(LOG_DEFAULT, LVL_NOTE, "system_srv_restart failed");
     665                system_srv_shutdown_failed(&syssrv->srv);
     666        }
     667
     668        /* Quiesce the device tree. */
     669
     670        log_msg(LOG_DEFAULT, LVL_NOTE, "Quiescing devices.");
     671
     672        rc = devman_quiesce_devices("/hw");
     673        if (rc != EOK) {
     674                log_msg(LOG_DEFAULT, LVL_ERROR,
     675                    "Failed to quiesce device tree.");
     676                return rc;
     677        }
     678
     679        sys_reboot();
     680
     681        log_msg(LOG_DEFAULT, LVL_NOTE, "system_srv_restart complete");
    630682        system_srv_shutdown_complete(&syssrv->srv);
    631683        return EOK;
Note: See TracChangeset for help on using the changeset viewer.