Ignore:
File:
1 edited

Legend:

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

    r77a0119 rad9e225  
    11/*
    2  * Copyright (c) 2025 Jiri Svoboda
     2 * Copyright (c) 2024 Jiri Svoboda
    33 * Copyright (c) 2005 Martin Decky
    44 * All rights reserved.
     
    3535 */
    3636
    37 #include <devman.h>
    3837#include <fibril.h>
    3938#include <futil.h>
     
    4948#include <str.h>
    5049#include <loc.h>
    51 #include <shutdown.h>
    5250#include <str_error.h>
    5351#include <config.h>
     
    8684
    8785static void system_srv_conn(ipc_call_t *, void *);
    88 static errno_t system_srv_poweroff(void *);
    89 static errno_t system_srv_restart(void *);
     86static errno_t system_srv_shutdown(void *);
    9087
    9188system_ops_t system_srv_ops = {
    92         .poweroff = system_srv_poweroff,
    93         .restart = system_srv_restart
     89        .shutdown = system_srv_shutdown
    9490};
    9591
     
    386382                printf("%s: System volume is configured.\n", NAME);
    387383
    388                 /* Verify that system volume is mounted */
     384                /* Wait until system volume is mounted */
    389385                sv_mounted = false;
    390386
    391                 rc = vol_get_parts(vol, &part_ids, &nparts);
    392                 if (rc != EOK) {
    393                         printf("Error getting list of volumes.\n");
    394                         goto error;
    395                 }
    396 
    397                 for (i = 0; i < nparts; i++) {
    398                         rc = vol_part_info(vol, part_ids[i], &pinfo);
     387                while (true) {
     388                        rc = vol_get_parts(vol, &part_ids, &nparts);
    399389                        if (rc != EOK) {
    400                                 printf("Error getting partition "
    401                                     "information.\n");
    402                                 rc = EIO;
     390                                printf("Error getting list of volumes.\n");
    403391                                goto error;
    404392                        }
    405393
    406                         if (str_cmp(pinfo.cur_mp, "/w") == 0) {
    407                                 sv_mounted = true;
     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                                }
     407                        }
     408
     409                        if (sv_mounted)
    408410                                break;
    409                         }
    410                 }
    411 
    412                 if (sv_mounted == false) {
    413                         printf("System volume not found.\n");
    414                         rc = EIO;
    415                         goto error;
    416                 }
    417 
    418                 free(part_ids);
    419                 part_ids = NULL;
    420 
     411
     412                        free(part_ids);
     413                        part_ids = NULL;
     414
     415                        fibril_sleep(1);
     416                        printf("Sleeping(1) for system volume.\n");
     417                }
    421418        }
    422419
     
    523520        /* Eject all volumes. */
    524521
    525         log_msg(LOG_DEFAULT, LVL_NOTE, "Ejecting volumes.");
    526 
    527522        rc = vol_create(&vol);
    528523        if (rc != EOK) {
     
    539534
    540535        for (i = 0; i < nparts; i++) {
    541                 rc = vol_part_eject(vol, part_ids[i], vef_none);
     536                rc = vol_part_eject(vol, part_ids[i]);
    542537                if (rc != EOK) {
    543538                        log_msg(LOG_DEFAULT, LVL_ERROR, "Error ejecting "
     
    549544        free(part_ids);
    550545        vol_destroy(vol);
    551 
    552546        return EOK;
    553547error:
     
    616610}
    617611
    618 /** System poweroff request.
     612/** System shutdown request.
    619613 *
    620614 * @param arg Argument (sys_srv_t *)
    621615 */
    622 static errno_t system_srv_poweroff(void *arg)
     616static errno_t system_srv_shutdown(void *arg)
    623617{
    624618        sys_srv_t *syssrv = (sys_srv_t *)arg;
    625619        errno_t rc;
    626620
    627         log_msg(LOG_DEFAULT, LVL_NOTE, "system_srv_poweroff");
     621        log_msg(LOG_DEFAULT, LVL_NOTE, "system_srv_shutdown");
    628622
    629623        rc = system_sys_shutdown();
    630624        if (rc != EOK) {
    631                 log_msg(LOG_DEFAULT, LVL_NOTE, "system_srv_poweroff failed");
     625                log_msg(LOG_DEFAULT, LVL_NOTE, "system_srv_shutdown failed");
    632626                system_srv_shutdown_failed(&syssrv->srv);
    633627        }
    634628
    635         log_msg(LOG_DEFAULT, LVL_NOTE, "system_srv_poweroff complete");
    636         system_srv_shutdown_complete(&syssrv->srv);
    637         return EOK;
    638 }
    639 
    640 /** System restart request.
    641  *
    642  * @param arg Argument (sys_srv_t *)
    643  */
    644 static errno_t system_srv_restart(void *arg)
    645 {
    646         sys_srv_t *syssrv = (sys_srv_t *)arg;
    647         errno_t rc;
    648 
    649         log_msg(LOG_DEFAULT, LVL_NOTE, "system_srv_restart");
    650 
    651         rc = system_sys_shutdown();
    652         if (rc != EOK) {
    653                 log_msg(LOG_DEFAULT, LVL_NOTE, "system_srv_restart failed");
    654                 system_srv_shutdown_failed(&syssrv->srv);
    655         }
    656 
    657         /* Quiesce the device tree. */
    658 
    659         log_msg(LOG_DEFAULT, LVL_NOTE, "Quiescing devices.");
    660 
    661         rc = devman_quiesce_devices("/hw");
    662         if (rc != EOK) {
    663                 log_msg(LOG_DEFAULT, LVL_ERROR,
    664                     "Failed to quiesce device tree.");
    665                 return rc;
    666         }
    667 
    668         sys_reboot();
    669 
    670         log_msg(LOG_DEFAULT, LVL_NOTE, "system_srv_restart complete");
     629        log_msg(LOG_DEFAULT, LVL_NOTE, "system_srv_shutdown complete");
    671630        system_srv_shutdown_complete(&syssrv->srv);
    672631        return EOK;
Note: See TracChangeset for help on using the changeset viewer.