Changes in uspace/app/sysinst/sysinst.c [61f28c4:2c21595] in mainline
- File:
-
- 1 edited
-
uspace/app/sysinst/sysinst.c (modified) (36 diffs)
Legend:
- Unmodified
- Added
- Removed
-
uspace/app/sysinst/sysinst.c
r61f28c4 r2c21595 1 1 /* 2 * Copyright (c) 202 5Jiri Svoboda2 * Copyright (c) 2026 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 41 41 #include <errno.h> 42 42 #include <fdisk.h> 43 #include <f util.h>43 #include <fmgt.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 1 79 /* File system type cannot be changed without modifying core.img */ 80 #define INST_FSTYPE fs_ext4 77 81 /** Volume label for the new file system */ 78 82 #define INST_VOL_LABEL "HelenOS" … … 87 91 #define CD_MOUNT_POINT "/vol/" CD_VOL_LABEL 88 92 89 #define BOOT_FILES_SRC CD_MOUNT_POINT 93 #define BOOT_FILES_SRC CD_MOUNT_POINT "/boot" 90 94 #define BOOT_BLOCK_IDX 0 /* MBR */ 91 95 92 96 #define CFG_FILES_SRC "/cfg" 93 #define CFG_FILES_DEST MOUNT_POINT "/cfg"97 #define CFG_FILES_DEST MOUNT_POINT 94 98 95 99 static const char *default_devs[] = { … … 139 143 }; 140 144 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_close 151 }; 152 141 153 static errno_t sysinst_restart_dlg_create(sysinst_t *); 142 154 static void sysinst_restart_dlg_button(ui_msg_dialog_t *, void *, unsigned); … … 151 163 static errno_t sysinst_restart(sysinst_t *); 152 164 static void sysinst_progress_destroy(sysinst_progress_t *); 165 static void sysinst_progress(sysinst_t *, const char *); 153 166 static void sysinst_action(sysinst_t *, const char *); 154 167 static void sysinst_error(sysinst_t *, const char *); 155 168 static void sysinst_debug(sysinst_t *, const char *); 156 169 157 static void sysinst_futil_copy_file(void *, const char *, const char *); 158 static void sysinst_futil_create_dir(void *, const char *); 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 *); 159 174 static errno_t sysinst_eject_dev(sysinst_t *, service_id_t); 160 175 static errno_t sysinst_eject_phys_by_mp(sysinst_t *, const char *); 161 162 static futil_cb_t sysinst_futil_cb = { 163 .copy_file = sysinst_futil_copy_file, 164 .create_dir = sysinst_futil_create_dir 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 165 182 }; 166 183 … … 247 264 */ 248 265 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 dialog 276 * @param arg Argument (sysinst_t *) 277 * @param btn Button number 278 * @param earg Entry argument 279 */ 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 dialog 310 * @param arg Argument (sysinst_t *) 311 */ 312 static void sysinst_upgrade_confirm_close(ui_msg_dialog_t *dialog, void *arg) 249 313 { 250 314 sysinst_t *sysinst = (sysinst_t *) arg; … … 350 414 } 351 415 352 /** Called when futil is starting to copy a file. 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. 353 471 * 354 472 * @param arg Argument (sysinst_t *) … … 356 474 * @param dest Destination path 357 475 */ 358 static void sysinst_futil_copy_file(void *arg, const char *src, 359 const char *dest) 476 static void sysinst_fmgt_progress(void *arg, fmgt_progress_t *progress) 360 477 { 361 478 sysinst_t *sysinst = (sysinst_t *)arg; 362 479 char buf[128]; 363 480 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); 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); 381 485 } 382 486 … … 430 534 } 431 535 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 { 595 fdisk_part_t *part; 596 fdisk_part_spec_t pspec; 597 fdisk_part_info_t pinfo; 598 capa_spec_t capa; 599 errno_t rc; 600 601 sysinst_debug(sysinst, "sysinst_inst_part_create(): get maximum available block"); 602 603 rc = fdisk_part_get_max_avail(fdev, spc_pri, &capa); 604 if (rc != EOK) { 605 sysinst_error(sysinst, 606 "Error getting available capacity."); 607 goto error; 608 } 609 610 fdisk_pspec_init(&pspec); 611 pspec.capacity = capa; 612 pspec.pkind = lpk_primary; 613 pspec.fstype = INST_FSTYPE; /* Cannot be changed without modifying core.img */ 614 pspec.mountp = MOUNT_POINT; 615 pspec.index = INST_PART_IDX; /* Cannot be changed without modifying core.img */ 616 pspec.label = INST_VOL_LABEL; 617 618 rc = fdisk_part_create(fdev, &pspec, &part); 619 if (rc != EOK) { 620 sysinst_error(sysinst, "Error creating partition."); 621 goto error; 622 } 623 624 rc = fdisk_part_get_info(part, &pinfo); 625 if (rc != EOK) { 626 sysinst_error(sysinst, "Error getting partition information."); 627 goto error; 628 } 629 630 sysinst_debug(sysinst, "sysinst_inst_part_create(): OK"); 631 sysinst->psvc_id = pinfo.svc_id; 632 return EOK; 633 error: 634 return rc; 635 } 636 432 637 /** Label and mount the destination device. 433 638 * 434 639 * @param sysinst System installer 435 640 * @param dev Disk device to label 436 * @param psvc_id Place to store service ID of the created partition437 641 * 438 642 * @return EOK on success or an error code … … 443 647 fdisk_dev_t *fdev = NULL; 444 648 fdisk_part_t *part; 445 fdisk_ part_spec_t pspec;446 fdisk_part_info_t pinfo;649 fdisk_label_info_t linfo; 650 bool create_label = false; 447 651 bool dir_created = false; 448 652 bool label_created = false; 449 capa_spec_t capa;450 653 service_id_t sid; 451 654 errno_t rc; … … 483 686 sysinst_debug(sysinst, "sysinst_label_dev(): create label"); 484 687 485 rc = fdisk_label_create(fdev, lt_mbr); 486 if (rc != EOK) { 487 sysinst_error(sysinst, "Error creating label."); 488 goto error; 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 } 489 715 } 490 716 … … 493 719 sysinst_debug(sysinst, "sysinst_label_dev(): create partition"); 494 720 495 rc = fdisk_part_get_max_avail(fdev, spc_pri, &capa); 496 if (rc != EOK) { 497 sysinst_error(sysinst, 498 "Error getting available capacity."); 499 goto error; 500 } 501 502 fdisk_pspec_init(&pspec); 503 pspec.capacity = capa; 504 pspec.pkind = lpk_primary; 505 pspec.fstype = fs_ext4; /* Cannot be changed without modifying core.img */ 506 pspec.mountp = MOUNT_POINT; 507 pspec.label = INST_VOL_LABEL; 508 509 rc = fdisk_part_create(fdev, &pspec, &part); 510 if (rc != EOK) { 511 sysinst_error(sysinst, "Error creating partition."); 512 goto error; 513 } 514 515 rc = fdisk_part_get_info(part, &pinfo); 516 if (rc != EOK) { 517 sysinst_error(sysinst, "Error getting partition information."); 518 goto error; 519 } 520 521 sysinst_debug(sysinst, "sysinst_label_dev(): OK"); 522 fdisk_dev_close(fdev); 523 fdisk_destroy(fdisk); 524 sysinst->psvc_id = pinfo.svc_id; 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 525 770 return EOK; 526 771 error: … … 568 813 char *path = NULL; 569 814 const char **cp; 815 fmgt_flist_t *flist = NULL; 570 816 int rv; 571 817 … … 579 825 580 826 rc = vfs_link_path(path, KIND_DIRECTORY, NULL); 581 if (rc != EOK ) {827 if (rc != EOK && rc != EEXIST) { 582 828 sysinst_error(sysinst, "Error creating directory."); 583 829 goto error; … … 593 839 594 840 /* Copy initial configuration files */ 595 rc = futil_rcopy_contents(sysinst->futil, CFG_FILES_SRC, 596 CFG_FILES_DEST); 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); 597 856 if (rc != EOK) { 598 857 sysinst_error(sysinst, "Error copying initial configuration " 599 858 "files."); 600 return rc; 601 } 602 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"); 603 865 return EOK; 604 866 error: 867 if (flist != NULL) 868 fmgt_flist_destroy(flist); 605 869 if (path != NULL) 606 870 free(path); … … 614 878 static errno_t sysinst_copy_boot_files(sysinst_t *sysinst) 615 879 { 880 fmgt_flist_t *flist = NULL; 616 881 errno_t rc; 617 882 618 883 log_msg(LOG_DEFAULT, LVL_NOTE, 619 884 "sysinst_copy_boot_files(): copy bootloader files"); 620 rc = futil_rcopy_contents(sysinst->futil, BOOT_FILES_SRC, MOUNT_POINT); 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); 621 896 if (rc != EOK) { 622 897 sysinst_error(sysinst, "Error copying bootloader " 623 898 "files."); 624 return rc; 625 } 626 899 goto error; 900 } 901 902 fmgt_flist_destroy(flist); 627 903 sysinst_debug(sysinst, "sysinst_copy_boot_files(): OK"); 628 904 return EOK; 905 error: 906 if (flist != NULL) 907 fmgt_flist_destroy(flist); 908 return rc; 629 909 } 630 910 … … 740 1020 } 741 1021 1022 /** Return file contents as a heap-allocated block of bytes. 1023 * 1024 * @param srcp File path 1025 * @param rdata Place to store pointer to data 1026 * @param rsize Place to store size of data 1027 * 1028 * @return EOK on success, ENOENT if failed to open file, EIO on other 1029 * I/O error, ENOMEM if out of memory 1030 */ 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 742 1071 /** Copy boot blocks. 743 1072 * … … 765 1094 "sysinst_copy_boot_blocks: Read boot block image."); 766 1095 767 rc = futil_get_file(sysinst->futil, 768 BOOT_FILES_SRC "/boot/grub/i386-pc/boot.img", 1096 rc = sysinst_get_file(BOOT_FILES_SRC "/grub/i386-pc/boot.img", 769 1097 &boot_img, &boot_img_size); 770 if (rc != EOK || boot_img_size != 512) 1098 if (rc != EOK || boot_img_size != 512) { 1099 sysinst_error(sysinst, "Error reading boot block image."); 771 1100 return EIO; 1101 } 772 1102 773 1103 log_msg(LOG_DEFAULT, LVL_NOTE, 774 1104 "sysinst_copy_boot_blocks: Read GRUB core image."); 775 1105 776 rc = futil_get_file(sysinst->futil, 777 BOOT_FILES_SRC "/boot/grub/i386-pc/core.img", 1106 rc = sysinst_get_file(BOOT_FILES_SRC "/grub/i386-pc/core.img", 778 1107 &core_img, &core_img_size); 779 if (rc != EOK) 1108 if (rc != EOK) { 1109 sysinst_error(sysinst, "Error reading GRUB core image."); 780 1110 return EIO; 1111 } 781 1112 782 1113 log_msg(LOG_DEFAULT, LVL_NOTE, … … 791 1122 792 1123 rc = block_init(sid); 793 if (rc != EOK) 1124 if (rc != EOK) { 1125 sysinst_error(sysinst, "Error opening block device."); 794 1126 return rc; 1127 } 795 1128 796 1129 log_msg(LOG_DEFAULT, LVL_NOTE, … … 798 1131 799 1132 rc = block_get_bsize(sid, &bsize); 800 if (rc != EOK) 1133 if (rc != EOK) { 1134 sysinst_error(sysinst, "Error getting block size."); 801 1135 return rc; 1136 } 802 1137 803 1138 if (bsize != 512) { … … 810 1145 811 1146 rc = block_read_direct(sid, BOOT_BLOCK_IDX, 1, bbuf); 812 if (rc != EOK) 1147 if (rc != EOK) { 1148 sysinst_error(sysinst, "Error reading boot block."); 813 1149 return EIO; 1150 } 814 1151 815 1152 core_start = 16; … … 842 1179 843 1180 rc = block_write_direct(sid, BOOT_BLOCK_IDX, 1, bbuf); 844 if (rc != EOK) 1181 if (rc != EOK) { 1182 sysinst_error(sysinst, "Error writing boot block."); 845 1183 return EIO; 1184 } 846 1185 847 1186 log_msg(LOG_DEFAULT, LVL_NOTE, … … 850 1189 /* XXX Must pad last block with zeros */ 851 1190 rc = block_write_direct(sid, core_start, core_blocks, core_img); 852 if (rc != EOK) 1191 if (rc != EOK) { 1192 sysinst_error(sysinst, "Error writing GRUB core blocks."); 853 1193 return EIO; 1194 } 854 1195 855 1196 log_msg(LOG_DEFAULT, LVL_NOTE, … … 1004 1345 if (rc != EOK) 1005 1346 goto error; 1347 if (sysinst->quit) 1348 return EOK; 1006 1349 1007 1350 clean_dev = true; … … 1074 1417 sysinst_progress_destroy(sysinst->progress); 1075 1418 sysinst->progress = NULL; 1419 1420 /* User decided not to upgrade system? */ 1421 if (sysinst->quit) { 1422 ui_quit(sysinst->ui); 1423 return EOK; 1424 } 1076 1425 1077 1426 rc = sysinst_restart_dlg_create(sysinst); … … 1115 1464 params.rect.p0.y = 0; 1116 1465 params.rect.p1.x = 64; 1117 params.rect.p1.y = 5;1466 params.rect.p1.y = 7; 1118 1467 } else { 1119 1468 params.rect.p0.x = 0; 1120 1469 params.rect.p0.y = 0; 1121 1470 params.rect.p1.x = 500; 1122 params.rect.p1.y = 60;1471 params.rect.p1.y = 90; 1123 1472 } 1124 1473 … … 1146 1495 } 1147 1496 1497 /* Installing/upgrading system line */ 1148 1498 rc = ui_label_create(ui_res, "Installing system. Please wait...", 1149 1499 &progress->label); … … 1178 1528 } 1179 1529 1530 /* Action line */ 1180 1531 rc = ui_label_create(ui_res, "", 1181 1532 &progress->action); … … 1189 1540 rect.p0.y = 3; 1190 1541 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; 1191 1573 rect.p1.y = arect.p1.y; 1192 1574 } else { 1193 1575 rect.p0.x = arect.p0.x; 1194 rect.p0.y = 30;1576 rect.p0.y = 70; 1195 1577 rect.p1.x = arect.p1.x; 1196 1578 rect.p1.y = arect.p1.y; 1197 1579 } 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));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)); 1203 1585 if (rc != EOK) { 1204 1586 sysinst_error(sysinst, "Error adding control to layout."); … … 1246 1628 } 1247 1629 1630 /** Set current progress message. 1631 * 1632 * @param sysinst System installer 1633 * @param progress Progress text 1634 */ 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 1248 1646 /** Set current action message. 1249 1647 * … … 1332 1730 } 1333 1731 1334 /** Create restartdialog.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)1732 /** Create upgrade confirmation dialog. 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) 1340 1738 { 1341 1739 ui_msg_dialog_params_t params; … … 1344 1742 1345 1743 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 installer 1761 * @return EOK on success or an error code 1762 */ 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); 1346 1770 params.caption = "Restart System"; 1347 params.text = "Installation complete. Restart the 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 1348 1777 params.choice = umdc_ok_cancel; 1349 1778 params.flags |= umdf_topmost | umdf_center; … … 1373 1802 return ENOMEM; 1374 1803 1375 rc = futil_create(&sysinst_futil_cb, (void *)sysinst, &sysinst->futil); 1804 fibril_condvar_initialize(&sysinst->responded_cv); 1805 fibril_mutex_initialize(&sysinst->responded_lock); 1806 1807 rc = fmgt_create(&sysinst->fmgt); 1376 1808 if (rc != EOK) { 1377 1809 printf("Out of memory.\n"); 1378 1810 goto error; 1379 1811 } 1812 1813 fmgt_set_cb(sysinst->fmgt, &sysinst_fmgt_cb, (void *)sysinst); 1814 fmgt_set_init_update(sysinst->fmgt, true); 1380 1815 1381 1816 rc = ui_create(display_spec, &ui); … … 1421 1856 } 1422 1857 1423 (void)sysinst_confirm_create(sysinst); 1858 rc = sysinst_confirm_create(sysinst); 1859 if (rc != EOK) { 1860 printf("Error creating window.\n"); 1861 goto error; 1862 } 1424 1863 1425 1864 ui_run(ui); … … 1434 1873 return EOK; 1435 1874 error: 1436 if (sysinst->f util!= NULL)1437 f util_destroy(sysinst->futil);1875 if (sysinst->fmgt != NULL) 1876 fmgt_destroy(sysinst->fmgt); 1438 1877 if (sysinst->system != NULL) 1439 1878 system_close(sysinst->system);
Note:
See TracChangeset
for help on using the changeset viewer.
