Changes in uspace/app/sysinst/sysinst.c [2c21595:61f28c4] in mainline
- File:
-
- 1 edited
-
uspace/app/sysinst/sysinst.c (modified) (35 diffs)
Legend:
- Unmodified
- Added
- Removed
-
uspace/app/sysinst/sysinst.c
r2c21595 r61f28c4 1 1 /* 2 * Copyright (c) 202 6Jiri Svoboda2 * Copyright (c) 2025 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 41 41 #include <errno.h> 42 42 #include <fdisk.h> 43 #include <f mgt.h>43 #include <futil.h> 44 44 #include <gfx/render.h> 45 45 #include <io/log.h> … … 75 75 #define DEFAULT_DEV_2 "devices/\\hw\\sys\\00:01.0\\ide1\\c0d0" 76 76 //#define DEFAULT_DEV "devices/\\hw\\pci0\\00:01.2\\uhci_rh\\usb01_a1\\mass-storage0\\l0" 77 /** Index of partition which we must install to (hardwired in load.cfg) */78 #define INST_PART_IDX 179 /* File system type cannot be changed without modifying core.img */80 #define INST_FSTYPE fs_ext481 77 /** Volume label for the new file system */ 82 78 #define INST_VOL_LABEL "HelenOS" … … 91 87 #define CD_MOUNT_POINT "/vol/" CD_VOL_LABEL 92 88 93 #define BOOT_FILES_SRC CD_MOUNT_POINT "/boot"89 #define BOOT_FILES_SRC CD_MOUNT_POINT 94 90 #define BOOT_BLOCK_IDX 0 /* MBR */ 95 91 96 92 #define CFG_FILES_SRC "/cfg" 97 #define CFG_FILES_DEST MOUNT_POINT 93 #define CFG_FILES_DEST MOUNT_POINT "/cfg" 98 94 99 95 static const char *default_devs[] = { … … 143 139 }; 144 140 145 static void sysinst_upgrade_confirm_button(ui_msg_dialog_t *, void *, unsigned);146 static void sysinst_upgrade_confirm_close(ui_msg_dialog_t *, void *);147 148 static ui_msg_dialog_cb_t sysinst_upgrade_confirm_cb = {149 .button = sysinst_upgrade_confirm_button,150 .close = sysinst_upgrade_confirm_close151 };152 153 141 static errno_t sysinst_restart_dlg_create(sysinst_t *); 154 142 static void sysinst_restart_dlg_button(ui_msg_dialog_t *, void *, unsigned); … … 163 151 static errno_t sysinst_restart(sysinst_t *); 164 152 static void sysinst_progress_destroy(sysinst_progress_t *); 165 static void sysinst_progress(sysinst_t *, const char *);166 153 static void sysinst_action(sysinst_t *, const char *); 167 154 static void sysinst_error(sysinst_t *, const char *); 168 155 static void sysinst_debug(sysinst_t *, const char *); 169 156 170 static fmgt_exists_action_t sysinst_fmgt_exists_query(void *, fmgt_exists_t *); 171 static void sysinst_fmgt_action(void *, fmgt_action_t, const char *, 172 const char *); 173 static void sysinst_fmgt_progress(void *, fmgt_progress_t *); 157 static void sysinst_futil_copy_file(void *, const char *, const char *); 158 static void sysinst_futil_create_dir(void *, const char *); 174 159 static errno_t sysinst_eject_dev(sysinst_t *, service_id_t); 175 160 static errno_t sysinst_eject_phys_by_mp(sysinst_t *, const char *); 176 static errno_t sysinst_upgrade_confirm_create(sysinst_t *); 177 178 static fmgt_cb_t sysinst_fmgt_cb = { 179 .exists_query = sysinst_fmgt_exists_query, 180 .action = sysinst_fmgt_action, 181 .progress = sysinst_fmgt_progress 161 162 static futil_cb_t sysinst_futil_cb = { 163 .copy_file = sysinst_futil_copy_file, 164 .create_dir = sysinst_futil_create_dir 182 165 }; 183 166 … … 264 247 */ 265 248 static void sysinst_confirm_close(ui_msg_dialog_t *dialog, void *arg) 266 {267 sysinst_t *sysinst = (sysinst_t *) arg;268 269 ui_msg_dialog_destroy(dialog);270 ui_quit(sysinst->ui);271 }272 273 /** Upgrade confirm dialog OK button press.274 *275 * @param dialog Message dialog276 * @param arg Argument (sysinst_t *)277 * @param btn Button number278 * @param earg Entry argument279 */280 static void sysinst_upgrade_confirm_button(ui_msg_dialog_t *dialog, void *arg,281 unsigned btn)282 {283 sysinst_t *sysinst = (sysinst_t *) arg;284 285 ui_msg_dialog_destroy(dialog);286 287 switch (btn) {288 case 0:289 /* OK */290 fibril_mutex_lock(&sysinst->responded_lock);291 sysinst->responded = true;292 sysinst->quit = false;293 fibril_mutex_unlock(&sysinst->responded_lock);294 fibril_condvar_signal(&sysinst->responded_cv);295 break;296 default:297 /* Cancel */298 fibril_mutex_lock(&sysinst->responded_lock);299 sysinst->responded = true;300 sysinst->quit = true;301 fibril_mutex_unlock(&sysinst->responded_lock);302 fibril_condvar_signal(&sysinst->responded_cv);303 break;304 }305 }306 307 /** Upgrade confirm dialog close request.308 *309 * @param dialog Message dialog310 * @param arg Argument (sysinst_t *)311 */312 static void sysinst_upgrade_confirm_close(ui_msg_dialog_t *dialog, void *arg)313 249 { 314 250 sysinst_t *sysinst = (sysinst_t *) arg; … … 414 350 } 415 351 416 /** Called when fmgt hits an existing file while copying. 417 * 418 * @param arg Argument (sysinst_t *) 419 * @param exists Information about existing file 420 * @return Existing file recovery action 421 */ 422 fmgt_exists_action_t sysinst_fmgt_exists_query(void *arg, fmgt_exists_t *exists) 423 { 424 sysinst_t *sysinst = (sysinst_t *)arg; 425 426 (void)sysinst; 427 (void)exists->fname; 428 429 sysinst_action(sysinst, exists->fname); 430 431 /* 432 * Before starting fmgt operation, the caller would specify 433 * whether to overwrite existing files. 434 */ 435 if (sysinst->overwrite) 436 return fmgt_exr_overwrite; 437 else 438 return fmgt_exr_skip; 439 } 440 441 /** Called when fmgt is starting to perform action on a file. 442 * 443 * @param arg Argument (sysinst_t *) 444 * @param action Action being performed 445 * @param src Source or only path 446 * @param dest Destination path or @c NULL 447 */ 448 static void sysinst_fmgt_action(void *arg, fmgt_action_t action, 449 const char *src, const char *dest) 450 { 451 sysinst_t *sysinst = (sysinst_t *)arg; 452 char buf[128]; 453 454 (void)src; 455 456 switch (action) { 457 case fmgt_ac_create: 458 snprintf(buf, sizeof(buf), "Creating %s.", src); 459 sysinst_action(sysinst, buf); 460 break; 461 case fmgt_ac_copy: 462 snprintf(buf, sizeof(buf), "Copying %s.", dest); 463 sysinst_action(sysinst, buf); 464 break; 465 default: 466 break; 467 } 468 } 469 470 /** Called by fmgt to update on progress. 352 /** Called when futil is starting to copy a file. 471 353 * 472 354 * @param arg Argument (sysinst_t *) … … 474 356 * @param dest Destination path 475 357 */ 476 static void sysinst_fmgt_progress(void *arg, fmgt_progress_t *progress) 358 static void sysinst_futil_copy_file(void *arg, const char *src, 359 const char *dest) 477 360 { 478 361 sysinst_t *sysinst = (sysinst_t *)arg; 479 362 char buf[128]; 480 363 481 snprintf(buf, sizeof(buf), "Copied %s files, %s; " 482 "current file: %s done.", progress->total_procf, 483 progress->total_procb, progress->curf_percent); 484 sysinst_progress(sysinst, buf); 364 (void)src; 365 snprintf(buf, sizeof(buf), "Copying %s.", dest); 366 sysinst_action(sysinst, buf); 367 } 368 369 /** Called when futil is about to create a directory. 370 * 371 * @param arg Argument (sysinst_t *) 372 * @param dest Destination path 373 */ 374 static void sysinst_futil_create_dir(void *arg, const char *dest) 375 { 376 sysinst_t *sysinst = (sysinst_t *)arg; 377 char buf[128]; 378 379 snprintf(buf, sizeof(buf), "Creating %s.", dest); 380 sysinst_action(sysinst, buf); 485 381 } 486 382 … … 534 430 } 535 431 536 /** Find existing OS partition. 537 * 538 * @param sysinst System installer 539 * @param fdev Destination device 540 * @param rpart Place to store pointer to partition 541 * 542 * @return EOK on success or an error code 543 */ 544 static errno_t sysinst_existing_os_part_find(sysinst_t *sysinst, 545 fdisk_dev_t *fdev, fdisk_part_t **rpart) 546 { 547 fdisk_part_t *part; 548 fdisk_part_info_t pinfo; 549 errno_t rc; 550 551 sysinst_debug(sysinst, "sysinst_existing_os_part_find(): walk partitions"); 552 553 part = fdisk_part_first(fdev); 554 while (part != NULL) { 555 rc = fdisk_part_get_info(part, &pinfo); 556 if (rc != EOK) { 557 sysinst_error(sysinst, 558 "Error getting partition information."); 559 goto error; 560 } 561 562 if (pinfo.index == INST_PART_IDX && pinfo.pkind == lpk_primary) 563 break; 564 565 part = fdisk_part_next(part); 566 } 567 568 /* Partition with index INST_PART_IDX not found? */ 569 if (part == NULL) 570 return ENOENT; 571 572 /* Correct file system type? */ 573 if (pinfo.fstype != INST_FSTYPE) { 574 /* Not a usable existing partition. */ 575 return ENOENT; 576 } 577 578 sysinst_debug(sysinst, "sysinst_existing_os_part_find(): OK"); 579 sysinst->psvc_id = pinfo.svc_id; 580 *rpart = part; 581 return EOK; 582 error: 583 return rc; 584 } 585 586 /** Create installation partition. 587 * 588 * @param sysinst System installer 589 * @param fdev Destination device 590 * 591 * @return EOK on success or an error code 592 */ 593 static errno_t sysinst_inst_part_create(sysinst_t *sysinst, fdisk_dev_t *fdev) 594 { 432 /** Label and mount the destination device. 433 * 434 * @param sysinst System installer 435 * @param dev Disk device to label 436 * @param psvc_id Place to store service ID of the created partition 437 * 438 * @return EOK on success or an error code 439 */ 440 static errno_t sysinst_label_dev(sysinst_t *sysinst, const char *dev) 441 { 442 fdisk_t *fdisk = NULL; 443 fdisk_dev_t *fdev = NULL; 595 444 fdisk_part_t *part; 596 445 fdisk_part_spec_t pspec; 597 446 fdisk_part_info_t pinfo; 447 bool dir_created = false; 448 bool label_created = false; 598 449 capa_spec_t capa; 599 errno_t rc; 600 601 sysinst_debug(sysinst, "sysinst_inst_part_create(): get maximum available block"); 450 service_id_t sid; 451 errno_t rc; 452 453 sysinst_debug(sysinst, "sysinst_label_dev(): get service ID"); 454 455 rc = loc_service_get_id(dev, &sid, 0); 456 if (rc != EOK) 457 goto error; 458 459 sysinst_debug(sysinst, "sysinst_label_dev(): open device"); 460 461 rc = fdisk_create(&fdisk); 462 if (rc != EOK) { 463 sysinst_error(sysinst, "Error initializing fdisk."); 464 goto error; 465 } 466 467 rc = fdisk_dev_open(fdisk, sid, &fdev); 468 if (rc != EOK) { 469 sysinst_error(sysinst, "Error opening device."); 470 goto error; 471 } 472 473 sysinst_debug(sysinst, "sysinst_label_dev(): create mount directory"); 474 475 rc = vfs_link_path(MOUNT_POINT, KIND_DIRECTORY, NULL); 476 if (rc != EOK) { 477 sysinst_error(sysinst, "Error creating mount directory."); 478 goto error; 479 } 480 481 dir_created = true; 482 483 sysinst_debug(sysinst, "sysinst_label_dev(): create label"); 484 485 rc = fdisk_label_create(fdev, lt_mbr); 486 if (rc != EOK) { 487 sysinst_error(sysinst, "Error creating label."); 488 goto error; 489 } 490 491 label_created = true; 492 493 sysinst_debug(sysinst, "sysinst_label_dev(): create partition"); 602 494 603 495 rc = fdisk_part_get_max_avail(fdev, spc_pri, &capa); … … 611 503 pspec.capacity = capa; 612 504 pspec.pkind = lpk_primary; 613 pspec.fstype = INST_FSTYPE; /* Cannot be changed without modifying core.img */505 pspec.fstype = fs_ext4; /* Cannot be changed without modifying core.img */ 614 506 pspec.mountp = MOUNT_POINT; 615 pspec.index = INST_PART_IDX; /* Cannot be changed without modifying core.img */616 507 pspec.label = INST_VOL_LABEL; 617 508 … … 628 519 } 629 520 630 sysinst_debug(sysinst, "sysinst_inst_part_create(): OK"); 521 sysinst_debug(sysinst, "sysinst_label_dev(): OK"); 522 fdisk_dev_close(fdev); 523 fdisk_destroy(fdisk); 631 524 sysinst->psvc_id = pinfo.svc_id; 632 return EOK;633 error:634 return rc;635 }636 637 /** Label and mount the destination device.638 *639 * @param sysinst System installer640 * @param dev Disk device to label641 *642 * @return EOK on success or an error code643 */644 static errno_t sysinst_label_dev(sysinst_t *sysinst, const char *dev)645 {646 fdisk_t *fdisk = NULL;647 fdisk_dev_t *fdev = NULL;648 fdisk_part_t *part;649 fdisk_label_info_t linfo;650 bool create_label = false;651 bool dir_created = false;652 bool label_created = false;653 service_id_t sid;654 errno_t rc;655 656 sysinst_debug(sysinst, "sysinst_label_dev(): get service ID");657 658 rc = loc_service_get_id(dev, &sid, 0);659 if (rc != EOK)660 goto error;661 662 sysinst_debug(sysinst, "sysinst_label_dev(): open device");663 664 rc = fdisk_create(&fdisk);665 if (rc != EOK) {666 sysinst_error(sysinst, "Error initializing fdisk.");667 goto error;668 }669 670 rc = fdisk_dev_open(fdisk, sid, &fdev);671 if (rc != EOK) {672 sysinst_error(sysinst, "Error opening device.");673 goto error;674 }675 676 sysinst_debug(sysinst, "sysinst_label_dev(): create mount directory");677 678 rc = vfs_link_path(MOUNT_POINT, KIND_DIRECTORY, NULL);679 if (rc != EOK) {680 sysinst_error(sysinst, "Error creating mount directory.");681 goto error;682 }683 684 dir_created = true;685 686 sysinst_debug(sysinst, "sysinst_label_dev(): create label");687 688 rc = fdisk_label_get_info(fdev, &linfo);689 if (rc != EOK) {690 sysinst_error(sysinst, "Error analyzing device.");691 goto error;692 }693 694 switch (linfo.ltype) {695 case lt_none:696 /* need to create label */697 create_label = true;698 break;699 case lt_mbr:700 /* MBR label already present */701 break;702 default:703 /* a different type of label already present */704 sysinst_error(sysinst, "Disk contains unusable label.");705 goto error;706 }707 708 /* Need to create label? */709 if (create_label) {710 rc = fdisk_label_create(fdev, lt_mbr);711 if (rc != EOK) {712 sysinst_error(sysinst, "Error creating label.");713 goto error;714 }715 }716 717 label_created = true;718 719 sysinst_debug(sysinst, "sysinst_label_dev(): create partition");720 721 /* Existing OS partition? */722 rc = sysinst_existing_os_part_find(sysinst, fdev, &part);723 if (rc == EOK) {724 /* Open dialog to confirm that user wants to upgrade. */725 rc = sysinst_upgrade_confirm_create(sysinst);726 if (rc != EOK) {727 sysinst_error(sysinst, "Cannot create window.");728 goto error;729 }730 731 fibril_mutex_lock(&sysinst->responded_lock);732 while (!sysinst->responded)733 fibril_condvar_wait(&sysinst->responded_cv,734 &sysinst->responded_lock);735 fibril_mutex_unlock(&sysinst->responded_lock);736 737 /* User decided not to upgrade existing installation? */738 if (sysinst->quit) {739 (void)vfs_unlink_path(MOUNT_POINT);740 return EOK;741 }742 743 /* Set mount point for installation partition. */744 rc = fdisk_part_set_mountp(part, MOUNT_POINT);745 if (rc != EOK) {746 sysinst_error(sysinst, "Cannot mount installation "747 "partition.");748 goto error;749 }750 751 /* performing OS upgrade */752 sysinst->oper = sio_upgrade;753 if (sysinst->progress != NULL) {754 (void)ui_label_set_text(sysinst->progress->label,755 "Upgrading system. Please wait...");756 (void)ui_label_paint(sysinst->progress->label);757 (void)ui_window_set_caption(sysinst->bgwindow,758 "System Upgrade");759 }760 } else {761 /* Create installation partition. */762 rc = sysinst_inst_part_create(sysinst, fdev);763 if (rc != EOK)764 goto error;765 766 /* performing initial OS installation */767 sysinst->oper = sio_install;768 }769 770 525 return EOK; 771 526 error: … … 813 568 char *path = NULL; 814 569 const char **cp; 815 fmgt_flist_t *flist = NULL;816 570 int rv; 817 571 … … 825 579 826 580 rc = vfs_link_path(path, KIND_DIRECTORY, NULL); 827 if (rc != EOK && rc != EEXIST) {581 if (rc != EOK) { 828 582 sysinst_error(sysinst, "Error creating directory."); 829 583 goto error; … … 839 593 840 594 /* Copy initial configuration files */ 841 842 log_msg(LOG_DEFAULT, LVL_NOTE, 843 "sysinst_copy_boot_files(): copy initial configuration files"); 844 845 rc = fmgt_flist_create(&flist); 846 if (rc != EOK) 847 goto error; 848 849 rc = fmgt_flist_append(flist, CFG_FILES_SRC); 850 if (rc != EOK) 851 goto error; 852 853 /* Do not overwrite configuration files. */ 854 sysinst->overwrite = false; 855 rc = fmgt_copy(sysinst->fmgt, flist, CFG_FILES_DEST); 595 rc = futil_rcopy_contents(sysinst->futil, CFG_FILES_SRC, 596 CFG_FILES_DEST); 856 597 if (rc != EOK) { 857 598 sysinst_error(sysinst, "Error copying initial configuration " 858 599 "files."); 859 goto error; 860 } 861 862 fmgt_flist_destroy(flist); 863 log_msg(LOG_DEFAULT, LVL_NOTE, 864 "sysinst_copy_boot_files(): copy initial configuration files OK"); 600 return rc; 601 } 602 865 603 return EOK; 866 604 error: 867 if (flist != NULL)868 fmgt_flist_destroy(flist);869 605 if (path != NULL) 870 606 free(path); … … 878 614 static errno_t sysinst_copy_boot_files(sysinst_t *sysinst) 879 615 { 880 fmgt_flist_t *flist = NULL;881 616 errno_t rc; 882 617 883 618 log_msg(LOG_DEFAULT, LVL_NOTE, 884 619 "sysinst_copy_boot_files(): copy bootloader files"); 885 rc = fmgt_flist_create(&flist); 886 if (rc != EOK) 887 goto error; 888 889 rc = fmgt_flist_append(flist, BOOT_FILES_SRC); 890 if (rc != EOK) 891 goto error; 892 893 /* Overwrite boot files with new ones during upgrade. */ 894 sysinst->overwrite = true; 895 rc = fmgt_copy(sysinst->fmgt, flist, MOUNT_POINT); 620 rc = futil_rcopy_contents(sysinst->futil, BOOT_FILES_SRC, MOUNT_POINT); 896 621 if (rc != EOK) { 897 622 sysinst_error(sysinst, "Error copying bootloader " 898 623 "files."); 899 goto error; 900 } 901 902 fmgt_flist_destroy(flist); 624 return rc; 625 } 626 903 627 sysinst_debug(sysinst, "sysinst_copy_boot_files(): OK"); 904 628 return EOK; 905 error:906 if (flist != NULL)907 fmgt_flist_destroy(flist);908 return rc;909 629 } 910 630 … … 1020 740 } 1021 741 1022 /** Return file contents as a heap-allocated block of bytes.1023 *1024 * @param srcp File path1025 * @param rdata Place to store pointer to data1026 * @param rsize Place to store size of data1027 *1028 * @return EOK on success, ENOENT if failed to open file, EIO on other1029 * I/O error, ENOMEM if out of memory1030 */1031 static errno_t sysinst_get_file(const char *srcp, void **rdata, size_t *rsize)1032 {1033 int sf;1034 size_t nr;1035 errno_t rc;1036 size_t fsize;1037 char *data;1038 vfs_stat_t st;1039 1040 rc = vfs_lookup_open(srcp, WALK_REGULAR, MODE_READ, &sf);1041 if (rc != EOK)1042 return ENOENT;1043 1044 if (vfs_stat(sf, &st) != EOK) {1045 vfs_put(sf);1046 return EIO;1047 }1048 1049 fsize = st.size;1050 1051 data = calloc(fsize, 1);1052 if (data == NULL) {1053 vfs_put(sf);1054 return ENOMEM;1055 }1056 1057 rc = vfs_read(sf, (aoff64_t []) { 0 }, data, fsize, &nr);1058 if (rc != EOK || nr != fsize) {1059 vfs_put(sf);1060 free(data);1061 return EIO;1062 }1063 1064 (void) vfs_put(sf);1065 *rdata = data;1066 *rsize = fsize;1067 1068 return EOK;1069 }1070 1071 742 /** Copy boot blocks. 1072 743 * … … 1094 765 "sysinst_copy_boot_blocks: Read boot block image."); 1095 766 1096 rc = sysinst_get_file(BOOT_FILES_SRC "/grub/i386-pc/boot.img", 767 rc = futil_get_file(sysinst->futil, 768 BOOT_FILES_SRC "/boot/grub/i386-pc/boot.img", 1097 769 &boot_img, &boot_img_size); 1098 if (rc != EOK || boot_img_size != 512) { 1099 sysinst_error(sysinst, "Error reading boot block image."); 770 if (rc != EOK || boot_img_size != 512) 1100 771 return EIO; 1101 }1102 772 1103 773 log_msg(LOG_DEFAULT, LVL_NOTE, 1104 774 "sysinst_copy_boot_blocks: Read GRUB core image."); 1105 775 1106 rc = sysinst_get_file(BOOT_FILES_SRC "/grub/i386-pc/core.img", 776 rc = futil_get_file(sysinst->futil, 777 BOOT_FILES_SRC "/boot/grub/i386-pc/core.img", 1107 778 &core_img, &core_img_size); 1108 if (rc != EOK) { 1109 sysinst_error(sysinst, "Error reading GRUB core image."); 779 if (rc != EOK) 1110 780 return EIO; 1111 }1112 781 1113 782 log_msg(LOG_DEFAULT, LVL_NOTE, … … 1122 791 1123 792 rc = block_init(sid); 1124 if (rc != EOK) { 1125 sysinst_error(sysinst, "Error opening block device."); 1126 return rc; 1127 } 793 if (rc != EOK) 794 return rc; 1128 795 1129 796 log_msg(LOG_DEFAULT, LVL_NOTE, … … 1131 798 1132 799 rc = block_get_bsize(sid, &bsize); 1133 if (rc != EOK) { 1134 sysinst_error(sysinst, "Error getting block size."); 1135 return rc; 1136 } 800 if (rc != EOK) 801 return rc; 1137 802 1138 803 if (bsize != 512) { … … 1145 810 1146 811 rc = block_read_direct(sid, BOOT_BLOCK_IDX, 1, bbuf); 1147 if (rc != EOK) { 1148 sysinst_error(sysinst, "Error reading boot block."); 812 if (rc != EOK) 1149 813 return EIO; 1150 }1151 814 1152 815 core_start = 16; … … 1179 842 1180 843 rc = block_write_direct(sid, BOOT_BLOCK_IDX, 1, bbuf); 1181 if (rc != EOK) { 1182 sysinst_error(sysinst, "Error writing boot block."); 844 if (rc != EOK) 1183 845 return EIO; 1184 }1185 846 1186 847 log_msg(LOG_DEFAULT, LVL_NOTE, … … 1189 850 /* XXX Must pad last block with zeros */ 1190 851 rc = block_write_direct(sid, core_start, core_blocks, core_img); 1191 if (rc != EOK) { 1192 sysinst_error(sysinst, "Error writing GRUB core blocks."); 852 if (rc != EOK) 1193 853 return EIO; 1194 }1195 854 1196 855 log_msg(LOG_DEFAULT, LVL_NOTE, … … 1345 1004 if (rc != EOK) 1346 1005 goto error; 1347 if (sysinst->quit)1348 return EOK;1349 1006 1350 1007 clean_dev = true; … … 1417 1074 sysinst_progress_destroy(sysinst->progress); 1418 1075 sysinst->progress = NULL; 1419 1420 /* User decided not to upgrade system? */1421 if (sysinst->quit) {1422 ui_quit(sysinst->ui);1423 return EOK;1424 }1425 1076 1426 1077 rc = sysinst_restart_dlg_create(sysinst); … … 1464 1115 params.rect.p0.y = 0; 1465 1116 params.rect.p1.x = 64; 1466 params.rect.p1.y = 7;1117 params.rect.p1.y = 5; 1467 1118 } else { 1468 1119 params.rect.p0.x = 0; 1469 1120 params.rect.p0.y = 0; 1470 1121 params.rect.p1.x = 500; 1471 params.rect.p1.y = 90;1122 params.rect.p1.y = 60; 1472 1123 } 1473 1124 … … 1495 1146 } 1496 1147 1497 /* Installing/upgrading system line */1498 1148 rc = ui_label_create(ui_res, "Installing system. Please wait...", 1499 1149 &progress->label); … … 1528 1178 } 1529 1179 1530 /* Action line */1531 1180 rc = ui_label_create(ui_res, "", 1532 1181 &progress->action); … … 1540 1189 rect.p0.y = 3; 1541 1190 rect.p1.x = arect.p1.x; 1542 rect.p1.y = 4;1543 } else {1544 rect.p0.x = arect.p0.x;1545 rect.p0.y = 40;1546 rect.p1.x = arect.p1.x;1547 rect.p1.y = 60;1548 }1549 ui_label_set_rect(progress->action, &rect);1550 ui_label_set_halign(progress->action, gfx_halign_center);1551 ui_label_set_valign(progress->action, gfx_valign_top);1552 1553 rc = ui_fixed_add(fixed, ui_label_ctl(progress->action));1554 if (rc != EOK) {1555 sysinst_error(sysinst, "Error adding control to layout.");1556 ui_label_destroy(progress->label);1557 progress->label = NULL;1558 goto error;1559 }1560 1561 /* Progress line */1562 rc = ui_label_create(ui_res, "",1563 &progress->progress);1564 if (rc != EOK) {1565 sysinst_error(sysinst, "Error creating label.");1566 goto error;1567 }1568 1569 if (ui_is_textmode(sysinst->ui)) {1570 rect.p0.x = arect.p0.x;1571 rect.p0.y = 5;1572 rect.p1.x = arect.p1.x;1573 1191 rect.p1.y = arect.p1.y; 1574 1192 } else { 1575 1193 rect.p0.x = arect.p0.x; 1576 rect.p0.y = 70;1194 rect.p0.y = 30; 1577 1195 rect.p1.x = arect.p1.x; 1578 1196 rect.p1.y = arect.p1.y; 1579 1197 } 1580 ui_label_set_rect(progress-> progress, &rect);1581 ui_label_set_halign(progress-> progress, gfx_halign_center);1582 ui_label_set_valign(progress-> progress, gfx_valign_top);1583 1584 rc = ui_fixed_add(fixed, ui_label_ctl(progress-> progress));1198 ui_label_set_rect(progress->action, &rect); 1199 ui_label_set_halign(progress->action, gfx_halign_center); 1200 ui_label_set_valign(progress->action, gfx_valign_center); 1201 1202 rc = ui_fixed_add(fixed, ui_label_ctl(progress->action)); 1585 1203 if (rc != EOK) { 1586 1204 sysinst_error(sysinst, "Error adding control to layout."); … … 1628 1246 } 1629 1247 1630 /** Set current progress message.1631 *1632 * @param sysinst System installer1633 * @param progress Progress text1634 */1635 static void sysinst_progress(sysinst_t *sysinst, const char *progress)1636 {1637 log_msg(LOG_DEFAULT, LVL_NOTE, "%s", progress);1638 1639 if (sysinst->progress == NULL)1640 return;1641 1642 ui_label_set_text(sysinst->progress->progress, progress);1643 ui_label_paint(sysinst->progress->progress);1644 }1645 1646 1248 /** Set current action message. 1647 1249 * … … 1730 1332 } 1731 1333 1732 /** Create upgrade confirmationdialog.1733 * 1734 * @param sysinst System installer 1735 * @return EOK on success or an error code 1736 */ 1737 static errno_t sysinst_ upgrade_confirm_create(sysinst_t *sysinst)1334 /** Create restart dialog. 1335 * 1336 * @param sysinst System installer 1337 * @return EOK on success or an error code 1338 */ 1339 static errno_t sysinst_restart_dlg_create(sysinst_t *sysinst) 1738 1340 { 1739 1341 ui_msg_dialog_params_t params; … … 1742 1344 1743 1345 ui_msg_dialog_params_init(¶ms); 1744 params.caption = "System upgrade";1745 params.text = "Existing installation found. "1746 "Do you want to upgrade it?";1747 params.choice = umdc_ok_cancel;1748 params.flags |= umdf_topmost | umdf_center;1749 1750 rc = ui_msg_dialog_create(sysinst->ui, ¶ms, &dialog);1751 if (rc != EOK)1752 return rc;1753 1754 ui_msg_dialog_set_cb(dialog, &sysinst_upgrade_confirm_cb, sysinst);1755 return EOK;1756 }1757 1758 /** Create restart dialog.1759 *1760 * @param sysinst System installer1761 * @return EOK on success or an error code1762 */1763 static errno_t sysinst_restart_dlg_create(sysinst_t *sysinst)1764 {1765 ui_msg_dialog_params_t params;1766 ui_msg_dialog_t *dialog;1767 errno_t rc;1768 1769 ui_msg_dialog_params_init(¶ms);1770 1346 params.caption = "Restart System"; 1771 1772 if (sysinst->oper == sio_install) 1773 params.text = "Installation complete. Restart the system?"; 1774 else 1775 params.text = "Upgrade complete. Restart the system?"; 1776 1347 params.text = "Installation complete. Restart the system?"; 1777 1348 params.choice = umdc_ok_cancel; 1778 1349 params.flags |= umdf_topmost | umdf_center; … … 1802 1373 return ENOMEM; 1803 1374 1804 fibril_condvar_initialize(&sysinst->responded_cv); 1805 fibril_mutex_initialize(&sysinst->responded_lock); 1806 1807 rc = fmgt_create(&sysinst->fmgt); 1375 rc = futil_create(&sysinst_futil_cb, (void *)sysinst, &sysinst->futil); 1808 1376 if (rc != EOK) { 1809 1377 printf("Out of memory.\n"); 1810 1378 goto error; 1811 1379 } 1812 1813 fmgt_set_cb(sysinst->fmgt, &sysinst_fmgt_cb, (void *)sysinst);1814 fmgt_set_init_update(sysinst->fmgt, true);1815 1380 1816 1381 rc = ui_create(display_spec, &ui); … … 1856 1421 } 1857 1422 1858 rc = sysinst_confirm_create(sysinst); 1859 if (rc != EOK) { 1860 printf("Error creating window.\n"); 1861 goto error; 1862 } 1423 (void)sysinst_confirm_create(sysinst); 1863 1424 1864 1425 ui_run(ui); … … 1873 1434 return EOK; 1874 1435 error: 1875 if (sysinst->f mgt!= NULL)1876 f mgt_destroy(sysinst->fmgt);1436 if (sysinst->futil != NULL) 1437 futil_destroy(sysinst->futil); 1877 1438 if (sysinst->system != NULL) 1878 1439 system_close(sysinst->system);
Note:
See TracChangeset
for help on using the changeset viewer.
