Changeset a2f95ce in mainline for uspace/app/sysinst/sysinst.c


Ignore:
Timestamp:
2026-04-11T12:47:58Z (32 hours ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
master
Parents:
6d06bbc
Message:

Ask user to confirm upgrade if existing installation found.

File:
1 edited

Legend:

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

    r6d06bbc ra2f95ce  
    143143};
    144144
     145static void sysinst_upgrade_confirm_button(ui_msg_dialog_t *, void *, unsigned);
     146static void sysinst_upgrade_confirm_close(ui_msg_dialog_t *, void *);
     147
     148static ui_msg_dialog_cb_t sysinst_upgrade_confirm_cb = {
     149        .button = sysinst_upgrade_confirm_button,
     150        .close = sysinst_upgrade_confirm_close
     151};
     152
    145153static errno_t sysinst_restart_dlg_create(sysinst_t *);
    146154static void sysinst_restart_dlg_button(ui_msg_dialog_t *, void *, unsigned);
     
    163171static errno_t sysinst_eject_dev(sysinst_t *, service_id_t);
    164172static errno_t sysinst_eject_phys_by_mp(sysinst_t *, const char *);
     173static errno_t sysinst_upgrade_confirm_create(sysinst_t *);
    165174
    166175static futil_cb_t sysinst_futil_cb = {
     
    251260 */
    252261static void sysinst_confirm_close(ui_msg_dialog_t *dialog, void *arg)
     262{
     263        sysinst_t *sysinst = (sysinst_t *) arg;
     264
     265        ui_msg_dialog_destroy(dialog);
     266        ui_quit(sysinst->ui);
     267}
     268
     269/** Upgrade confirm dialog OK button press.
     270 *
     271 * @param dialog Message dialog
     272 * @param arg Argument (sysinst_t *)
     273 * @param btn Button number
     274 * @param earg Entry argument
     275 */
     276static void sysinst_upgrade_confirm_button(ui_msg_dialog_t *dialog, void *arg,
     277    unsigned btn)
     278{
     279        sysinst_t *sysinst = (sysinst_t *) arg;
     280
     281        ui_msg_dialog_destroy(dialog);
     282
     283        switch (btn) {
     284        case 0:
     285                /* OK */
     286                fibril_mutex_lock(&sysinst->responded_lock);
     287                sysinst->responded = true;
     288                sysinst->quit = false;
     289                fibril_mutex_unlock(&sysinst->responded_lock);
     290                fibril_condvar_signal(&sysinst->responded_cv);
     291                break;
     292        default:
     293                /* Cancel */
     294                fibril_mutex_lock(&sysinst->responded_lock);
     295                sysinst->responded = true;
     296                sysinst->quit = true;
     297                fibril_mutex_unlock(&sysinst->responded_lock);
     298                fibril_condvar_signal(&sysinst->responded_cv);
     299                break;
     300        }
     301}
     302
     303/** Upgrade confirm dialog close request.
     304 *
     305 * @param dialog Message dialog
     306 * @param arg Argument (sysinst_t *)
     307 */
     308static void sysinst_upgrade_confirm_close(ui_msg_dialog_t *dialog, void *arg)
    253309{
    254310        sysinst_t *sysinst = (sysinst_t *) arg;
     
    622678        rc = sysinst_existing_os_part_find(sysinst, fdev, &part);
    623679        if (rc == EOK) {
     680                /* Open dialog to confirm that user wants to upgrade. */
     681                rc = sysinst_upgrade_confirm_create(sysinst);
     682                if (rc != EOK) {
     683                        sysinst_error(sysinst, "Cannot create window.");
     684                        goto error;
     685                }
     686
     687                fibril_mutex_lock(&sysinst->responded_lock);
     688                while (!sysinst->responded)
     689                        fibril_condvar_wait(&sysinst->responded_cv,
     690                            &sysinst->responded_lock);
     691                fibril_mutex_unlock(&sysinst->responded_lock);
     692
     693                /* User decided not to upgrade existing installation? */
     694                if (sysinst->quit) {
     695                        (void)vfs_unlink_path(MOUNT_POINT);
     696                        return EOK;
     697                }
     698
    624699                /* Set mount point for installation partition. */
    625700                rc = fdisk_part_set_mountp(part, MOUNT_POINT);
     
    11301205        if (rc != EOK)
    11311206                goto error;
     1207        if (sysinst->quit)
     1208                return EOK;
    11321209
    11331210        clean_dev = true;
     
    12001277        sysinst_progress_destroy(sysinst->progress);
    12011278        sysinst->progress = NULL;
     1279
     1280        /* User decided not to upgrade system? */
     1281        if (sysinst->quit) {
     1282                ui_quit(sysinst->ui);
     1283                return EOK;
     1284        }
    12021285
    12031286        rc = sysinst_restart_dlg_create(sysinst);
     
    14581541}
    14591542
     1543/** Create upgrade confirmation dialog.
     1544 *
     1545 * @param sysinst System installer
     1546 * @return EOK on success or an error code
     1547 */
     1548static errno_t sysinst_upgrade_confirm_create(sysinst_t *sysinst)
     1549{
     1550        ui_msg_dialog_params_t params;
     1551        ui_msg_dialog_t *dialog;
     1552        errno_t rc;
     1553
     1554        ui_msg_dialog_params_init(&params);
     1555        params.caption = "System upgrade";
     1556        params.text = "Existing installation found. "
     1557            "Do you want to upgrade it?";
     1558        params.choice = umdc_ok_cancel;
     1559        params.flags |= umdf_topmost | umdf_center;
     1560
     1561        rc = ui_msg_dialog_create(sysinst->ui, &params, &dialog);
     1562        if (rc != EOK)
     1563                return rc;
     1564
     1565        ui_msg_dialog_set_cb(dialog, &sysinst_upgrade_confirm_cb, sysinst);
     1566        return EOK;
     1567}
     1568
    14601569/** Create restart dialog.
    14611570 *
     
    15031612        if (sysinst == NULL)
    15041613                return ENOMEM;
     1614
     1615        fibril_condvar_initialize(&sysinst->responded_cv);
     1616        fibril_mutex_initialize(&sysinst->responded_lock);
    15051617
    15061618        rc = futil_create(&sysinst_futil_cb, (void *)sysinst, &sysinst->futil);
     
    15521664        }
    15531665
    1554         (void)sysinst_confirm_create(sysinst);
     1666        rc = sysinst_confirm_create(sysinst);
     1667        if (rc != EOK) {
     1668                printf("Error creating window.\n");
     1669                goto error;
     1670        }
    15551671
    15561672        ui_run(ui);
Note: See TracChangeset for help on using the changeset viewer.