Changes in uspace/app/sysinst/sysinst.c [2c21595:629b480] in mainline
- File:
-
- 1 edited
-
uspace/app/sysinst/sysinst.c (modified) (41 diffs)
Legend:
- Unmodified
- Added
- Removed
-
uspace/app/sysinst/sysinst.c
r2c21595 r629b480 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 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 160 161 static futil_cb_t sysinst_futil_cb = { 162 .copy_file = sysinst_futil_copy_file, 163 .create_dir = sysinst_futil_create_dir 182 164 }; 183 165 … … 271 253 } 272 254 273 /** Upgrade confirm dialog OK button press.255 /** Restart system dialog OK button press. 274 256 * 275 257 * @param dialog Message dialog … … 278 260 * @param earg Entry argument 279 261 */ 280 static void sysinst_ upgrade_confirm_button(ui_msg_dialog_t *dialog, void *arg,262 static void sysinst_restart_dlg_button(ui_msg_dialog_t *dialog, void *arg, 281 263 unsigned btn) 282 264 { … … 284 266 285 267 ui_msg_dialog_destroy(dialog); 268 269 (void)sysinst; 286 270 287 271 switch (btn) { 288 272 case 0: 289 273 /* 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 {314 sysinst_t *sysinst = (sysinst_t *) arg;315 316 ui_msg_dialog_destroy(dialog);317 ui_quit(sysinst->ui);318 }319 320 /** Restart system dialog OK button press.321 *322 * @param dialog Message dialog323 * @param arg Argument (sysinst_t *)324 * @param btn Button number325 * @param earg Entry argument326 */327 static void sysinst_restart_dlg_button(ui_msg_dialog_t *dialog, void *arg,328 unsigned btn)329 {330 sysinst_t *sysinst = (sysinst_t *) arg;331 332 ui_msg_dialog_destroy(dialog);333 334 (void)sysinst;335 336 switch (btn) {337 case 0:338 /* OK */339 sysinst_action(sysinst, "Ejecting installation media.");340 (void)sysinst_eject_phys_by_mp(sysinst, CD_MOUNT_POINT);341 274 (void)sysinst_restart(sysinst); 342 275 break; … … 414 347 } 415 348 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. 349 /** Called when futil is starting to copy a file. 471 350 * 472 351 * @param arg Argument (sysinst_t *) … … 474 353 * @param dest Destination path 475 354 */ 476 static void sysinst_fmgt_progress(void *arg, fmgt_progress_t *progress) 355 static void sysinst_futil_copy_file(void *arg, const char *src, 356 const char *dest) 477 357 { 478 358 sysinst_t *sysinst = (sysinst_t *)arg; 479 359 char buf[128]; 480 360 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); 361 (void)src; 362 snprintf(buf, sizeof(buf), "Copying %s.", dest); 363 sysinst_action(sysinst, buf); 364 } 365 366 /** Called when futil is about to create a directory. 367 * 368 * @param arg Argument (sysinst_t *) 369 * @param dest Destination path 370 */ 371 static void sysinst_futil_create_dir(void *arg, const char *dest) 372 { 373 sysinst_t *sysinst = (sysinst_t *)arg; 374 char buf[128]; 375 376 snprintf(buf, sizeof(buf), "Creating %s.", dest); 377 sysinst_action(sysinst, buf); 485 378 } 486 379 … … 534 427 } 535 428 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 { 429 /** Label and mount the destination device. 430 * 431 * @param sysinst System installer 432 * @param dev Disk device to label 433 * @param psvc_id Place to store service ID of the created partition 434 * 435 * @return EOK on success or an error code 436 */ 437 static errno_t sysinst_label_dev(sysinst_t *sysinst, const char *dev) 438 { 439 fdisk_t *fdisk = NULL; 440 fdisk_dev_t *fdev = NULL; 595 441 fdisk_part_t *part; 596 442 fdisk_part_spec_t pspec; 597 443 fdisk_part_info_t pinfo; 444 bool dir_created = false; 445 bool label_created = false; 598 446 capa_spec_t capa; 599 errno_t rc; 600 601 sysinst_debug(sysinst, "sysinst_inst_part_create(): get maximum available block"); 447 service_id_t sid; 448 errno_t rc; 449 450 sysinst_debug(sysinst, "sysinst_label_dev(): get service ID"); 451 452 rc = loc_service_get_id(dev, &sid, 0); 453 if (rc != EOK) 454 goto error; 455 456 sysinst_debug(sysinst, "sysinst_label_dev(): open device"); 457 458 rc = fdisk_create(&fdisk); 459 if (rc != EOK) { 460 sysinst_error(sysinst, "Error initializing fdisk."); 461 goto error; 462 } 463 464 rc = fdisk_dev_open(fdisk, sid, &fdev); 465 if (rc != EOK) { 466 sysinst_error(sysinst, "Error opening device."); 467 goto error; 468 } 469 470 sysinst_debug(sysinst, "sysinst_label_dev(): create mount directory"); 471 472 rc = vfs_link_path(MOUNT_POINT, KIND_DIRECTORY, NULL); 473 if (rc != EOK) { 474 sysinst_error(sysinst, "Error creating mount directory."); 475 goto error; 476 } 477 478 dir_created = true; 479 480 sysinst_debug(sysinst, "sysinst_label_dev(): create label"); 481 482 rc = fdisk_label_create(fdev, lt_mbr); 483 if (rc != EOK) { 484 sysinst_error(sysinst, "Error creating label."); 485 goto error; 486 } 487 488 label_created = true; 489 490 sysinst_debug(sysinst, "sysinst_label_dev(): create partition"); 602 491 603 492 rc = fdisk_part_get_max_avail(fdev, spc_pri, &capa); … … 611 500 pspec.capacity = capa; 612 501 pspec.pkind = lpk_primary; 613 pspec.fstype = INST_FSTYPE; /* Cannot be changed without modifying core.img */502 pspec.fstype = fs_ext4; /* Cannot be changed without modifying core.img */ 614 503 pspec.mountp = MOUNT_POINT; 615 pspec.index = INST_PART_IDX; /* Cannot be changed without modifying core.img */616 504 pspec.label = INST_VOL_LABEL; 617 505 … … 628 516 } 629 517 630 sysinst_debug(sysinst, "sysinst_inst_part_create(): OK"); 518 sysinst_debug(sysinst, "sysinst_label_dev(): OK"); 519 fdisk_dev_close(fdev); 520 fdisk_destroy(fdisk); 631 521 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 522 return EOK; 771 523 error: … … 813 565 char *path = NULL; 814 566 const char **cp; 815 fmgt_flist_t *flist = NULL;816 567 int rv; 817 568 … … 825 576 826 577 rc = vfs_link_path(path, KIND_DIRECTORY, NULL); 827 if (rc != EOK && rc != EEXIST) {578 if (rc != EOK) { 828 579 sysinst_error(sysinst, "Error creating directory."); 829 580 goto error; … … 839 590 840 591 /* 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); 856 if (rc != EOK) { 857 sysinst_error(sysinst, "Error copying initial configuration " 858 "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"); 592 rc = futil_rcopy_contents(sysinst->futil, CFG_FILES_SRC, 593 CFG_FILES_DEST); 594 if (rc != EOK) 595 return rc; 596 865 597 return EOK; 866 598 error: 867 if (flist != NULL)868 fmgt_flist_destroy(flist);869 599 if (path != NULL) 870 600 free(path); … … 878 608 static errno_t sysinst_copy_boot_files(sysinst_t *sysinst) 879 609 { 880 fmgt_flist_t *flist = NULL;881 610 errno_t rc; 882 611 883 612 log_msg(LOG_DEFAULT, LVL_NOTE, 884 613 "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); 896 if (rc != EOK) { 897 sysinst_error(sysinst, "Error copying bootloader " 898 "files."); 899 goto error; 900 } 901 902 fmgt_flist_destroy(flist); 614 rc = futil_rcopy_contents(sysinst->futil, BOOT_FILES_SRC, MOUNT_POINT); 615 if (rc != EOK) 616 return rc; 617 903 618 sysinst_debug(sysinst, "sysinst_copy_boot_files(): OK"); 904 619 return EOK; 905 error:906 if (flist != NULL)907 fmgt_flist_destroy(flist);908 return rc;909 620 } 910 621 … … 1020 731 } 1021 732 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 733 /** Copy boot blocks. 1072 734 * … … 1094 756 "sysinst_copy_boot_blocks: Read boot block image."); 1095 757 1096 rc = sysinst_get_file(BOOT_FILES_SRC "/grub/i386-pc/boot.img", 758 rc = futil_get_file(sysinst->futil, 759 BOOT_FILES_SRC "/boot/grub/i386-pc/boot.img", 1097 760 &boot_img, &boot_img_size); 1098 if (rc != EOK || boot_img_size != 512) { 1099 sysinst_error(sysinst, "Error reading boot block image."); 761 if (rc != EOK || boot_img_size != 512) 1100 762 return EIO; 1101 }1102 763 1103 764 log_msg(LOG_DEFAULT, LVL_NOTE, 1104 765 "sysinst_copy_boot_blocks: Read GRUB core image."); 1105 766 1106 rc = sysinst_get_file(BOOT_FILES_SRC "/grub/i386-pc/core.img", 767 rc = futil_get_file(sysinst->futil, 768 BOOT_FILES_SRC "/boot/grub/i386-pc/core.img", 1107 769 &core_img, &core_img_size); 1108 if (rc != EOK) { 1109 sysinst_error(sysinst, "Error reading GRUB core image."); 770 if (rc != EOK) 1110 771 return EIO; 1111 }1112 772 1113 773 log_msg(LOG_DEFAULT, LVL_NOTE, … … 1122 782 1123 783 rc = block_init(sid); 1124 if (rc != EOK) { 1125 sysinst_error(sysinst, "Error opening block device."); 1126 return rc; 1127 } 784 if (rc != EOK) 785 return rc; 1128 786 1129 787 log_msg(LOG_DEFAULT, LVL_NOTE, … … 1131 789 1132 790 rc = block_get_bsize(sid, &bsize); 1133 if (rc != EOK) { 1134 sysinst_error(sysinst, "Error getting block size."); 1135 return rc; 1136 } 791 if (rc != EOK) 792 return rc; 1137 793 1138 794 if (bsize != 512) { … … 1145 801 1146 802 rc = block_read_direct(sid, BOOT_BLOCK_IDX, 1, bbuf); 1147 if (rc != EOK) { 1148 sysinst_error(sysinst, "Error reading boot block."); 803 if (rc != EOK) 1149 804 return EIO; 1150 }1151 805 1152 806 core_start = 16; … … 1179 833 1180 834 rc = block_write_direct(sid, BOOT_BLOCK_IDX, 1, bbuf); 1181 if (rc != EOK) { 1182 sysinst_error(sysinst, "Error writing boot block."); 835 if (rc != EOK) 1183 836 return EIO; 1184 }1185 837 1186 838 log_msg(LOG_DEFAULT, LVL_NOTE, … … 1189 841 /* XXX Must pad last block with zeros */ 1190 842 rc = block_write_direct(sid, core_start, core_blocks, core_img); 1191 if (rc != EOK) { 1192 sysinst_error(sysinst, "Error writing GRUB core blocks."); 843 if (rc != EOK) 1193 844 return EIO; 1194 }1195 845 1196 846 log_msg(LOG_DEFAULT, LVL_NOTE, … … 1241 891 errno_t rc; 1242 892 1243 log_msg(LOG_DEFAULT, LVL_NOTE,1244 "sysinst_eject_phys_by_mp(%s)", path);1245 1246 893 rc = vol_create(&vol); 1247 894 if (rc != EOK) { … … 1287 934 shutdown_failed = false; 1288 935 1289 sysinst_action(sysinst, "Restarting the system.");1290 1291 936 rc = system_open(SYSTEM_DEFAULT, &sysinst_system_cb, NULL, &system); 1292 937 if (rc != EOK) { … … 1338 983 { 1339 984 errno_t rc; 1340 bool clean_dev = false;1341 985 1342 986 sysinst_action(sysinst, "Creating device label and file system."); … … 1344 988 rc = sysinst_label_dev(sysinst, dev); 1345 989 if (rc != EOK) 1346 goto error; 1347 if (sysinst->quit) 1348 return EOK; 1349 1350 clean_dev = true; 990 return rc; 1351 991 1352 992 sysinst_action(sysinst, "Creating system directory structure."); 1353 993 rc = sysinst_setup_sysvol(sysinst); 1354 994 if (rc != EOK) 1355 goto error;995 return rc; 1356 996 1357 997 sysinst_action(sysinst, "Copying boot files."); 1358 998 rc = sysinst_copy_boot_files(sysinst); 1359 999 if (rc != EOK) 1360 goto error;1000 return rc; 1361 1001 1362 1002 sysinst_action(sysinst, "Configuring the system."); 1363 1003 rc = sysinst_customize_initrd(sysinst); 1364 1004 if (rc != EOK) 1365 goto error;1005 return rc; 1366 1006 1367 1007 sysinst_action(sysinst, "Finishing system volume."); 1368 1008 rc = sysinst_finish_dev(sysinst); 1369 1009 if (rc != EOK) 1370 goto error; 1371 1372 clean_dev = false; 1010 return rc; 1373 1011 1374 1012 sysinst_action(sysinst, "Installing boot blocks."); … … 1377 1015 return rc; 1378 1016 1379 return EOK; 1380 error: 1381 if (clean_dev) 1382 (void)sysinst_finish_dev(sysinst); 1383 return rc; 1017 sysinst_action(sysinst, "Ejecting installation media."); 1018 rc = sysinst_eject_phys_by_mp(sysinst, CD_MOUNT_POINT); 1019 if (rc != EOK) 1020 return rc; 1021 1022 return EOK; 1384 1023 } 1385 1024 … … 1416 1055 1417 1056 sysinst_progress_destroy(sysinst->progress); 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 }1425 1426 1057 rc = sysinst_restart_dlg_create(sysinst); 1427 1058 if (rc != EOK) … … 1464 1095 params.rect.p0.y = 0; 1465 1096 params.rect.p1.x = 64; 1466 params.rect.p1.y = 7;1097 params.rect.p1.y = 5; 1467 1098 } else { 1468 1099 params.rect.p0.x = 0; 1469 1100 params.rect.p0.y = 0; 1470 1101 params.rect.p1.x = 500; 1471 params.rect.p1.y = 90;1102 params.rect.p1.y = 60; 1472 1103 } 1473 1104 … … 1495 1126 } 1496 1127 1497 /* Installing/upgrading system line */1498 1128 rc = ui_label_create(ui_res, "Installing system. Please wait...", 1499 1129 &progress->label); … … 1528 1158 } 1529 1159 1530 /* Action line */1531 1160 rc = ui_label_create(ui_res, "", 1532 1161 &progress->action); … … 1540 1169 rect.p0.y = 3; 1541 1170 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 1171 rect.p1.y = arect.p1.y; 1574 1172 } else { 1575 1173 rect.p0.x = arect.p0.x; 1576 rect.p0.y = 70;1174 rect.p0.y = 30; 1577 1175 rect.p1.x = arect.p1.x; 1578 1176 rect.p1.y = arect.p1.y; 1579 1177 } 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));1178 ui_label_set_rect(progress->action, &rect); 1179 ui_label_set_halign(progress->action, gfx_halign_center); 1180 ui_label_set_valign(progress->action, gfx_valign_center); 1181 1182 rc = ui_fixed_add(fixed, ui_label_ctl(progress->action)); 1585 1183 if (rc != EOK) { 1586 1184 sysinst_error(sysinst, "Error adding control to layout."); … … 1628 1226 } 1629 1227 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 1228 /** Set current action message. 1229 * 1230 * @param sysinst System installer 1231 * @param action Action text 1232 */ 1233 static void sysinst_action(sysinst_t *sysinst, const char *action) 1234 { 1639 1235 if (sysinst->progress == NULL) 1640 1236 return; 1641 1237 1642 ui_label_set_text(sysinst->progress->progress, progress);1643 ui_label_paint(sysinst->progress->progress);1644 }1645 1646 /** Set current action message.1647 *1648 * @param sysinst System installer1649 * @param action Action text1650 */1651 static void sysinst_action(sysinst_t *sysinst, const char *action)1652 {1653 log_msg(LOG_DEFAULT, LVL_NOTE, "%s", action);1654 1655 if (sysinst->progress == NULL)1656 return;1657 1658 1238 ui_label_set_text(sysinst->progress->action, action); 1659 1239 ui_label_paint(sysinst->progress->action); 1240 log_msg(LOG_DEFAULT, LVL_NOTE, "%s", action); 1660 1241 } 1661 1242 … … 1730 1311 } 1731 1312 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)1313 /** Create restart dialog. 1314 * 1315 * @param sysinst System installer 1316 * @return EOK on success or an error code 1317 */ 1318 static errno_t sysinst_restart_dlg_create(sysinst_t *sysinst) 1738 1319 { 1739 1320 ui_msg_dialog_params_t params; … … 1742 1323 1743 1324 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 1325 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 1326 params.text = "Installation complete. Restart the system?"; 1777 1327 params.choice = umdc_ok_cancel; 1778 1328 params.flags |= umdf_topmost | umdf_center; … … 1802 1352 return ENOMEM; 1803 1353 1804 fibril_condvar_initialize(&sysinst->responded_cv); 1805 fibril_mutex_initialize(&sysinst->responded_lock); 1806 1807 rc = fmgt_create(&sysinst->fmgt); 1354 rc = futil_create(&sysinst_futil_cb, (void *)sysinst, &sysinst->futil); 1808 1355 if (rc != EOK) { 1809 1356 printf("Out of memory.\n"); 1810 1357 goto error; 1811 1358 } 1812 1813 fmgt_set_cb(sysinst->fmgt, &sysinst_fmgt_cb, (void *)sysinst);1814 fmgt_set_init_update(sysinst->fmgt, true);1815 1359 1816 1360 rc = ui_create(display_spec, &ui); … … 1856 1400 } 1857 1401 1858 rc = sysinst_confirm_create(sysinst); 1859 if (rc != EOK) { 1860 printf("Error creating window.\n"); 1861 goto error; 1862 } 1402 (void)sysinst_confirm_create(sysinst); 1863 1403 1864 1404 ui_run(ui); … … 1873 1413 return EOK; 1874 1414 error: 1875 if (sysinst->f mgt!= NULL)1876 f mgt_destroy(sysinst->fmgt);1415 if (sysinst->futil != NULL) 1416 futil_destroy(sysinst->futil); 1877 1417 if (sysinst->system != NULL) 1878 1418 system_close(sysinst->system);
Note:
See TracChangeset
for help on using the changeset viewer.
