Changeset 171 in MondoRescue for trunk/mondo/mondo/mondoarchive/mondo-cli.c
- Timestamp:
- Dec 8, 2005, 5:20:29 PM (18 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/mondo/mondo/mondoarchive/mondo-cli.c
r146 r171 1 1 /*************************************************************************** 2 mondo-cli.c 3 ------------------- 4 begin : Fri Apr 19 16:40:35 EDT 2002 5 copyright : (C) 2002 Mondo Hugo Rabson 6 email : Hugo Rabson <hugorabson@msn.com> 7 edited by : by Stan Benoit 4/2002 8 email : troff@nakedsoul.org 9 cvsid : $Id$ 10 ***************************************************************************/ 11 12 /*************************************************************************** 13 * * 14 * This program is free software; you can redistribute it and/or modify * 15 * it under the terms of the GNU General Public License as published by * 16 * the Free Software Foundation; either version 2 of the License, or * 17 * (at your option) any later version. * 18 * * 19 ***************************************************************************/ 20 21 /*************************************************************************** 22 UPDATE LOG 23 24 25 08/04 26 - if user specifies a dumb -T value, abort 27 28 07/22 29 - handle -Q sensibly (don't abort if only -Q supplied) 30 31 07/17 32 - better checking of NFS dir's validity 33 34 06/19 35 - added AUX_VER 36 37 04/17 38 - added '-b' support 39 04/03 40 - added star support 41 42 02/06 43 - fixed "Please give /dev entry" error msg 44 45 01/20/2004 46 - added 2.6.x-kernel "device = /dev/...." support to param reader 47 - better handling of SCSI and /dev entries 48 - touch /boot/boot.b if necessary 49 50 09/26/2003 51 - typo in command-line handling of 'r' 52 53 09/25 54 - added DVD write support 55 56 09/24 57 - if tape backup (-t) but user doesn't specify tape drive then 58 make an educated guess using find_tape_device_and_size() 59 60 09/18 61 - insist on partimagehack being present if -x found 62 63 09/16 64 - added support for multiple -I's and -E's in call to mondoarchive 65 - the '-D' flag doesn't take a value now 66 67 07/14 68 - fatal error if -E too short 69 70 05/14 71 - if 'n' and user doesn't have rights to write to output dir 72 then error out 73 74 05/05 75 - added Joshua Oreman's FreeBSD patches 76 77 05/04 78 - added Herman Kuster's multi-level bkp patch 79 80 05/02 81 - write errors to screen, not just to log 82 83 04/25 84 - added lots of assert()'s and log_OS_error()'s 85 86 04/21 87 - line 570 --- resolve boot device if softlink 88 89 04/08 90 - changed a bunch of fprintf(stderr,...)'s to log_it()'s 91 - fixed final / removal in retrieve_switches_from_command_line() 92 93 04/04 94 - added -e 95 96 03/15 97 - reject relative paths if -d flag (Alessandro Polverini) 98 99 01/02/2003 100 - added -J flag (to let user specify incoming filelist) 101 102 12/13/2002 103 - various strcpy() calls replaced with strncpy() calls 104 105 12/10 106 - added g_loglevel 107 108 11/25 109 - line 614 --- if commmand-line param ends in '/' then drop that '/' 110 111 11/19 112 - rewrote finish() to kill processes more softly 113 - if user calls with '-l RAW' then 114 115 09/01 - 09/30 116 - added -N to let user exclude all NFS-related mounts and devices 117 - run_program_and_log_output() now takes boolean operator to specify 118 whether it will log its activities in the event of _success_ 119 120 08/01 - 08/31 121 - if no device specified when backing up to tape streamer then assume /dev/st0 122 - abort if tape user specifies tape size (just for testing porpoises) 123 - tape users no longer need to specify tape size 124 - added some comments 125 - added bkpinfo->backup_media_type 126 - renamed from mondo-archive.c to mondo-cli.c 127 128 07/01 - 07/31 129 - better check for mkfs.vfat 130 - more sanity-checking for -d flag 131 - if isodir does not exist then abort 132 - removed "the rest are..." comment from log 133 - do not permit '-H' and '-t' in the same command line 134 - if not '-o' then insist on vfat-friendly kernel 135 136 06/01 - 06/30 137 - added signal-trapping 138 - added '-W' (won't make bootable CD or floppies) flag 139 - added missing 'j++' to -s switch's code 140 - expanded -s switch 141 - added -u switch 142 - if dvdrecord exists and cdrecord doesn't then use 143 dvdrecord instead of cdrecord 144 145 04/01 - 04/30 146 - if CD-ROM is supermounted then unmount, run, and remount 147 - replace MONDO_VERSION #define with VERSION from ../config.h 148 - if CD-ROM is mounted at start then abort 149 - improved homedir-locating code 150 - improved "backup will occupy N CD's" calculation a bit 151 - added -m (manual CD tray) flag 152 153 154 *******************************************************************/ 155 156 /** 157 * @file 2 * $Id$ 3 * 158 4 * Functions for handling command-line arguments passed to mondoarchive. 159 5 */ … … 180 26 extern bool g_skip_floppies; ///< Whether to skip the creation of boot disks 181 27 extern char g_startdir[MAX_STR_LEN]; ///< ????? @bug ????? 182 extern char g_erase_tmpdir_and_scratchdir[MAX_STR_LEN];183 28 extern char g_tmpfs_mountpt[MAX_STR_LEN]; 184 29 extern bool g_sigpipe; … … 245 90 /*@ buffers *************** */ 246 91 char *tmp; 247 char flag_val[128][MAX_STR_LEN];92 char *flag_val[128]; 248 93 bool flag_set[128]; 249 94 250 malloc_string(tmp);251 95 sensibly_set_tmpdir_and_scratchdir(bkpinfo); 96 252 97 for (i = 0; i < 128; i++) { 253 flag_val[i] [0] = '\0';98 flag_val[i] = NULL; 254 99 flag_set[i] = FALSE; 255 100 } 256 // strcpy (bkpinfo->tmpdir, "/root/images/mondo");257 // strcpy (bkpinfo->scratchdir, "/home");258 101 for (j = 1; j <= MAX_NOOF_MEDIA; j++) { 259 102 bkpinfo->media_size[j] = 650; … … 275 118 for (i = 0; i < 128; i++) { 276 119 if (flag_set[i]) { 277 sprintf(tmp, "-%c %s", i, flag_val[i]);120 asprintf(&tmp, "-%c %s", i, flag_val[i]); 278 121 log_msg(3, tmp); 122 paranoid_free(tmp); 279 123 } 280 124 } 281 125 // } 282 sprintf(tmp, "rm -Rf %s/tmp.mondo.*", bkpinfo->tmpdir);126 asprintf(&tmp, "rm -Rf %s/tmp.mondo.*", bkpinfo->tmpdir); 283 127 paranoid_system(tmp); 284 sprintf(tmp, "rm -Rf %s/mondo.scratch.*", bkpinfo->scratchdir); 128 paranoid_free(tmp); 129 130 asprintf(&tmp, "rm -Rf %s/mondo.scratch.*", bkpinfo->scratchdir); 285 131 paranoid_system(tmp); 132 paranoid_free(tmp); 133 286 134 sprintf(bkpinfo->tmpdir + strlen(bkpinfo->tmpdir), "/tmp.mondo.%ld", 287 135 random() % 32767); 288 136 sprintf(bkpinfo->scratchdir + strlen(bkpinfo->scratchdir), 289 137 "/mondo.scratch.%ld", random() % 32767); 290 sprintf(tmp, "mkdir -p %s/tmpfs", bkpinfo->tmpdir); 138 139 asprintf(&tmp, "mkdir -p %s/tmpfs", bkpinfo->tmpdir); 291 140 paranoid_system(tmp); 292 sprintf(tmp, "mkdir -p %s", bkpinfo->scratchdir); 141 paranoid_free(tmp); 142 143 asprintf(&tmp, "mkdir -p %s", bkpinfo->scratchdir); 293 144 paranoid_system(tmp); 145 paranoid_free(tmp); 146 294 147 if (bkpinfo->nfs_mount[0] != '\0') { 295 148 store_nfs_config(bkpinfo); 296 149 } 297 paranoid_free(tmp);298 150 return (retval); 299 151 } 300 301 302 152 303 153 … … 312 162 { 313 163 int j; 314 char tmp[MAX_STR_LEN], *p, comment[MAX_STR_LEN]; 164 char *tmp; 165 char *p; 166 char *q; 167 char *comment; 315 168 316 169 assert(bkpinfo != NULL); … … 320 173 for (j = 1, p = value; j < MAX_NOOF_MEDIA && strchr(p, ','); 321 174 j++, p = strchr(p, ',') + 1) { 322 strncpy(tmp, p, MAX_STR_LEN); 323 *(strchr(tmp, ',')) = '\0'; 175 asprintf(&tmp, p); 176 q = strchr(tmp, ','); 177 if (q != NULL) { 178 *q = '\0'; 179 } 324 180 bkpinfo->media_size[j] = friendly_sizestr_to_sizelong(tmp); 325 sprintf(comment, "media_size[%d] = %ld", j, 181 paranoid_free(tmp); 182 183 asprintf(&comment, "media_size[%d] = %ld", j, 326 184 bkpinfo->media_size[j]); 327 185 log_msg(3, comment); 186 paranoid_free(comment); 328 187 } 329 188 for (; j <= MAX_NOOF_MEDIA; j++) { 330 189 bkpinfo->media_size[j] = friendly_sizestr_to_sizelong(p); 331 190 } 332 // bkpinfo->media_size[0] = bkpinfo->media_size[MAX_NOOF_MEDIA];333 191 for (j = 1; j <= MAX_NOOF_MEDIA; j++) { 334 192 if (bkpinfo->media_size[j] <= 0) { … … 339 197 return (0); 340 198 } 341 342 199 343 200 … … 354 211 int 355 212 process_switches(struct s_bkpinfo *bkpinfo, 356 char flag_val[128][MAX_STR_LEN], bool flag_set[128])213 char *flag_val[128], bool flag_set[128]) 357 214 { 358 215 … … 364 221 /*@ buffers ** */ 365 222 char *tmp; 223 char *tmp2; 366 224 char *psz; 367 225 … … 374 232 bkpinfo->internal_tape_block_size = DEFAULT_INTERNAL_TAPE_BLOCK_SIZE; 375 233 376 /* compulsory */234 /* compulsory */ 377 235 i = flag_set['c'] + flag_set['i'] + flag_set['n'] + 378 236 flag_set['t'] + flag_set['u'] + flag_set['r'] + … … 502 360 ("You must use -L with -C. Therefore I am setting it for you."); 503 361 flag_set['L'] = 1; 504 flag_val['L'] [0] = '\0';362 flag_val['L'] = NULL; 505 363 } 506 364 } else { 507 365 log_msg(3, "flag_val['c'] = %s", flag_val['c']); 508 366 log_msg(3, "flag_val['w'] = %s", flag_val['w']); 509 // log_msg(3, "flag_set['r'] = %i", flag_set['r'] );510 367 if (flag_set['c']) { 511 368 bkpinfo->cdrw_speed = atoi(flag_val['c']); … … 546 403 } 547 404 if (!flag_set['d']) { 548 if ( !find_dvd_device(flag_val['d'], FALSE)) {405 if ((flag_val['d'] = find_dvd_device()) != NULL) { 549 406 flag_set['d'] = TRUE; 550 407 log_to_screen("I guess DVD drive is at %s", flag_val['d']); … … 564 421 } 565 422 if (!flag_set['s']) { 566 sprintf(flag_val['s'], "%d", DEFAULT_DVD_DISK_SIZE); // 4.7 salesman's GB = 4.482 real GB = 4582 MB 567 strcat(flag_val['s'], "m"); 423 asprintf(&flag_val['s'], "%dm", DEFAULT_DVD_DISK_SIZE); // 4.7 salesman's GB = 4.482 real GB = 4582 MB 568 424 log_to_screen 569 425 ("You did not specify a size (-s) for DVD. I'm guessing %s.", … … 571 427 flag_set['s'] = 1; 572 428 } 573 /*574 if (flag_set['Z']) {575 bkpinfo->blank_dvd_first = TRUE;576 }577 */578 429 } 579 430 … … 612 463 } 613 464 if (flag_set['n']) { 614 strncpy(bkpinfo->nfs_mount, flag_val['n'], MAX_STR_LEN); 465 asprintf(&tmp, flag_val['n']); 466 bkpinfo->nfs_mount = tmp; 615 467 if (!flag_set['d']) { 616 strncpy(bkpinfo->nfs_remote_dir, "/", MAX_STR_LEN); 468 asprintf(&tmp, "/"); 469 bkpinfo->nfs_remote_dir = tmp; 617 470 } 618 471 asprintf(&tmp, "mount | grep -x \"%s .*\" | cut -d' ' -f3", 619 472 bkpinfo->nfs_mount); 620 strncpy(bkpinfo->isodir, 621 call_program_and_get_last_line_of_output(tmp), 622 MAX_STR_LEN / 4); 473 asprintf(&tmp2, call_program_and_get_last_line_of_output(tmp)); 474 bkpinfo->isodir = tmp2; 623 475 paranoid_free(tmp); 624 476 … … 714 566 } 715 567 if (flag_set['x']) { 716 strncpy(bkpinfo->image_devs, flag_val['x'], MAX_STR_LEN / 4); 568 asprintf(&tmp, flag_val['x']); 569 bkpinfo->image_devs = tmp; 717 570 if (run_program_and_log_output("which partimagehack", 2)) { 718 571 fatal_error("Please install partimagehack RPM/tarball."); … … 723 576 } 724 577 if (flag_set['k']) { 725 strncpy(bkpinfo->kernel_path, flag_val['k'], MAX_STR_LEN); 726 if (!strcmp(bkpinfo->kernel_path, "failsafe")) { 727 strcpy(bkpinfo->kernel_path, "FAILSAFE"); 728 } 729 if (strcmp(bkpinfo->kernel_path, "FAILSAFE") 730 && !does_file_exist(bkpinfo->kernel_path)) { 731 retval++; 732 asprintf(&tmp, 578 if (strcasecmp(flag_val['k'], "FAILSAFE")) { 579 asprintf(&tmp, "FAILSAFE"); 580 bkpinfo->kernel_path = tmp; 581 582 if (!does_file_exist(bkpinfo->kernel_path)) { 583 retval++; 584 asprintf(&tmp, 733 585 "You specified kernel '%s', which does not exist\n", 734 586 bkpinfo->kernel_path); 735 log_to_screen(tmp); 736 paranoid_free(tmp); 587 log_to_screen(tmp); 588 paranoid_free(tmp); 589 } 590 } else { 591 asprintf(&tmp, flag_val['k']); 592 bkpinfo->kernel_path = tmp; 737 593 } 738 594 } 739 595 if (flag_set['p']) { 740 strncpy(bkpinfo->prefix, flag_val['p'], MAX_STR_LEN / 4); 596 asprintf(&tmp, bkpinfo->prefix); 597 bkpinfo->prefix = tmp; 741 598 } 742 599 … … 744 601 if (flag_set['d']) { /* backup directory (if ISO/NFS) */ 745 602 if (flag_set['i']) { 746 strncpy(bkpinfo->isodir, flag_val['d'], MAX_STR_LEN / 4); 603 asprintf(&tmp, flag_val['d']); 604 bkpinfo->isodir = tmp; 747 605 asprintf(&tmp, "ls -l %s", bkpinfo->isodir); 748 606 if (run_program_and_log_output(tmp, FALSE)) { … … 752 610 paranoid_free(tmp); 753 611 } else if (flag_set['n']) { 754 strncpy(bkpinfo->nfs_remote_dir, flag_val['d'], MAX_STR_LEN); 612 asprintf(&tmp, flag_val['d']); 613 bkpinfo->nfs_remote_dir = tmp; 755 614 } else { /* backup device (if tape/CD-R/CD-RW) */ 756 615 757 strncpy(bkpinfo->media_device, flag_val['d'], MAX_STR_LEN / 4);616 paranoid_alloc(bkpinfo->media_device, flag_val['d']); 758 617 } 759 618 } … … 782 641 log_to_screen("User opted to cancel."); 783 642 } 784 } else if (find_cdrw_device(bkpinfo->media_device)) { 643 } else if ((tmp = find_cdrw_device()) == NULL) { 644 paranoid_free(bkpinfo->media_device); 645 bkpinfo->media_device = tmp; 785 646 retval++; 786 647 log_to_screen … … 788 649 } else { 789 650 flag_set['d'] = TRUE; 790 strncpy(flag_val['d'], bkpinfo->media_device, MAX_STR_LEN / 4);651 asprintf(&flag_val['d'], bkpinfo->media_device); 791 652 } 792 653 } … … 805 666 } 806 667 if (flag_set['S']) { 807 sprintf(bkpinfo->scratchdir, "%s/mondo.scratch.%ld", flag_val['S'],668 asprintf(&tmp, "%s/mondo.scratch.%ld", flag_val['S'], 808 669 random() % 32768); 670 bkpinfo->scratchdir = tmp; 809 671 } 810 672 if (flag_set['T']) { 811 sprintf(bkpinfo->tmpdir, "%s/tmp.mondo.%ld", flag_val['T'],673 asprintf(&tmp, "%s/tmp.mondo.%ld", flag_val['T'], 812 674 random() % 32768); 675 bkpinfo->tmpdir = tmp; 813 676 asprintf(&tmp, "touch %s/.foo.dat", flag_val['T']); 814 677 if (run_program_and_log_output(tmp, 1)) { … … 831 694 } 832 695 if (flag_set['A']) { 833 strncpy(bkpinfo->call_after_iso, flag_val['A'], MAX_STR_LEN); 696 asprintf(&tmp, flag_val['A']); 697 bkpinfo->call_after_iso = tmp; 834 698 } 835 699 if (flag_set['B']) { 836 strncpy(bkpinfo->call_before_iso, flag_val['B'], MAX_STR_LEN); 700 asprintf(&tmp, flag_val['B']); 701 bkpinfo->call_before_iso = tmp; 837 702 } 838 703 if (flag_set['F']) { … … 864 729 if (flag_set['f']) { 865 730 tmp = resolve_softlinks_to_get_to_actual_device_file(flag_val['f']); 866 strncpy(bkpinfo->boot_device, tmp, 867 MAX_STR_LEN / 4); 731 bkpinfo->boot_device = tmp; 868 732 } 869 733 if (flag_set['Q']) { … … 880 744 881 745 if (flag_set['P']) { 882 strncpy(bkpinfo->postnuke_tarball, flag_val['P'], MAX_STR_LEN); 746 asprintf(&tmp, flag_val['P']); 747 bkpinfo->postnuke_tarball = tmp; 883 748 } 884 749 if (flag_set['L']) { … … 894 759 && 895 760 !run_program_and_log_output 896 (" cat /etc/issue.net | grep -i suse| grep 64", TRUE)) {761 ("grep -i suse /etc/issue.net | grep 64", TRUE)) { 897 762 bkpinfo->make_cd_use_lilo = TRUE; 898 763 log_to_screen … … 963 828 int 964 829 retrieve_switches_from_command_line(int argc, char *argv[], 965 char flag_val[128][MAX_STR_LEN],830 char *flag_val[128], 966 831 bool flag_set[128]) 967 832 { 968 833 /*@ ints ** */ 969 834 int opt = 0; 970 char tmp[MAX_STR_LEN];835 char *tmp; 971 836 int i = 0; 972 837 int len; … … 979 844 980 845 for (i = 0; i < 128; i++) { 981 flag_val[i] [0] = '\0';846 flag_val[i] = NULL; 982 847 flag_set[i] = FALSE; 983 848 } … … 992 857 if (flag_set[optopt]) { 993 858 bad_switches = TRUE; 994 sprintf(tmp, "Switch -%c previously defined as %s\n", opt,859 asprintf(&tmp, "Switch -%c previously defined as %s\n", opt, 995 860 flag_val[i]); 996 861 log_to_screen(tmp); 862 paranoid_free(tmp); 997 863 } else { 998 864 flag_set[opt] = TRUE; … … 1008 874 if (strchr(flag_val[opt], '/') 1009 875 && flag_val[opt][0] != '/') { 1010 sprintf(tmp,876 asprintf(&tmp, 1011 877 "-%c flag --- must be absolute path --- '%s' isn't absolute", 1012 878 opt, flag_val[opt]); 1013 879 log_to_screen(tmp); 880 paranoid_free(tmp); 1014 881 bad_switches = TRUE; 1015 882 } 1016 883 } 1017 strcpy(flag_val[opt], optarg);884 asprintf(&flag_val[opt], optarg); 1018 885 } 1019 886 } … … 1022 889 for (i = optind; i < argc; i++) { 1023 890 bad_switches = TRUE; 1024 sprintf(tmp, "Invalid arg -- %s\n", argv[i]);891 asprintf(&tmp, "Invalid arg -- %s\n", argv[i]); 1025 892 log_to_screen(tmp); 893 paranoid_free(tmp); 1026 894 } 1027 895 return (bad_switches); … … 1047 915 void terminate_daemon(int sig) 1048 916 { 1049 char tmp[64]; 1050 char tmp2[MAX_STR_LEN]; 1051 // char command[512]; 1052 // pid_t pid; 917 char *tmp; 918 char *tmp2; 1053 919 1054 920 switch (sig) { 1055 921 case SIGINT: 1056 sprintf(tmp, "SIGINT");1057 strcpy(tmp2, "You interrupted me :-)");922 asprintf(&tmp, "SIGINT signal received from OS"); 923 asprintf(&tmp2, "You interrupted me :-)"); 1058 924 break; 1059 925 case SIGKILL: 1060 sprintf(tmp, "SIGKILL");1061 strcpy(tmp2,926 asprintf(&tmp, "SIGKILL signal received from OS"); 927 asprintf(&tmp2, 1062 928 "I seriously have no clue how this signal even got to me. Something's wrong with your system."); 1063 929 break; 1064 930 case SIGTERM: 1065 sprintf(tmp, "SIGTERM");1066 strcpy(tmp2, "Got terminate signal");931 asprintf(&tmp, "SIGTERM signal received from OS"); 932 asprintf(&tmp2, "Got terminate signal"); 1067 933 break; 1068 934 case SIGHUP: 1069 sprintf(tmp, "SIGHUP");1070 strcpy(tmp2, "Hangup on line");935 asprintf(&tmp, "SIGHUP signal received from OS"); 936 asprintf(&tmp2, "Hangup on line"); 1071 937 break; 1072 938 case SIGSEGV: 1073 sprintf(tmp, "SIGSEGV");1074 strcpy(tmp2,939 asprintf(&tmp, "SIGSEGV signal received from OS"); 940 asprintf(&tmp2, 1075 941 "Internal programming error. Please send a backtrace as well as your log."); 1076 942 break; 1077 943 case SIGPIPE: 1078 sprintf(tmp, "SIGPIPE");1079 strcpy(tmp2, "Pipe was broken");944 asprintf(&tmp, "SIGPIPE signal received from OS"); 945 asprintf(&tmp2, "Pipe was broken"); 1080 946 break; 1081 947 case SIGABRT: 1082 sprintf(tmp, "SIGABRT");1083 sprintf(tmp2,948 asprintf(&tmp, "SIGABRT signal received from OS"); 949 asprintf(&tmp2, 1084 950 "Abort - probably failed assertion. I'm sleeping for a few seconds so you can read the message."); 1085 951 break; 1086 952 default: 1087 sprintf(tmp, "(Unknown)");1088 }1089 1090 strcat(tmp, " signal received from OS"); 953 asprintf(&tmp, "(Unknown)"); 954 asprintf(&tmp2, "(Unknown)"); 955 } 956 1091 957 log_to_screen(tmp); 1092 958 log_to_screen(tmp2); 959 paranoid_free(tmp); 960 paranoid_free(tmp2); 1093 961 if (sig == SIGABRT) { 1094 962 sleep(10); … … 1099 967 finish(254); // just in case 1100 968 } 1101 1102 1103 969 1104 970 … … 1122 988 } 1123 989 } 1124 1125 1126 990 1127 991
Note:
See TracChangeset
for help on using the changeset viewer.