savecore.c (9f5cdc1599e8163af3652e76c0b1ba1f34b6ef78) | savecore.c (b3bfc7199eb51b03496567ea71bff82b75a2209d) |
---|---|
1/*- 2 * Copyright (c) 1986, 1992, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 85 unchanged lines hidden (view full) --- 94 { "" }, 95}; 96 97/* Types match kernel declarations. */ 98long dumplo; /* where dump starts on dumpdev */ 99int dumpmag; /* magic number in dump */ 100int dumpsize; /* amount of memory dumped */ 101 | 1/*- 2 * Copyright (c) 1986, 1992, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 85 unchanged lines hidden (view full) --- 94 { "" }, 95}; 96 97/* Types match kernel declarations. */ 98long dumplo; /* where dump starts on dumpdev */ 99int dumpmag; /* magic number in dump */ 100int dumpsize; /* amount of memory dumped */ 101 |
102char *vmunix; | 102char *kernel; |
103char *dirname; /* directory to save dumps in */ 104char *ddname; /* name of dump device */ 105dev_t dumpdev; /* dump device */ 106int dumpfd; /* read/write descriptor on block dev */ 107time_t now; /* current date */ 108char panic_mesg[1024]; 109int panicstr; 110char vers[1024]; --- 34 unchanged lines hidden (view full) --- 145 case 'd': /* Not documented. */ 146 case 'v': 147 verbose = 1; 148 break; 149 case 'f': 150 force = 1; 151 break; 152 case 'N': | 103char *dirname; /* directory to save dumps in */ 104char *ddname; /* name of dump device */ 105dev_t dumpdev; /* dump device */ 106int dumpfd; /* read/write descriptor on block dev */ 107time_t now; /* current date */ 108char panic_mesg[1024]; 109int panicstr; 110char vers[1024]; --- 34 unchanged lines hidden (view full) --- 145 case 'd': /* Not documented. */ 146 case 'v': 147 verbose = 1; 148 break; 149 case 'f': 150 force = 1; 151 break; 152 case 'N': |
153 vmunix = optarg; | 153 kernel = optarg; |
154 break; 155 case 'z': 156 compress = 1; 157 break; 158 case '?': 159 default: 160 usage(); 161 } 162 argc -= optind; 163 argv += optind; 164 165 if (!clear) { 166 if (argc != 1 && argc != 2) 167 usage(); 168 dirname = argv[0]; 169 } 170 if (argc == 2) | 154 break; 155 case 'z': 156 compress = 1; 157 break; 158 case '?': 159 default: 160 usage(); 161 } 162 argc -= optind; 163 argv += optind; 164 165 if (!clear) { 166 if (argc != 1 && argc != 2) 167 usage(); 168 dirname = argv[0]; 169 } 170 if (argc == 2) |
171 vmunix = argv[1]; | 171 kernel = argv[1]; |
172 173 (void)time(&now); 174 kmem_setup(); 175 176 if (clear) { 177 clear_dump(); 178 exit(0); 179 } --- 36 unchanged lines hidden (view full) --- 216 syslog(LOG_ERR, "%s: nlist: %s", _PATH_UNIX, strerror(errno)); 217 for (i = 0; cursyms[i] != -1; i++) 218 if (current_nl[cursyms[i]].n_value == 0) { 219 syslog(LOG_ERR, "%s: %s not in namelist", 220 _PATH_UNIX, current_nl[cursyms[i]].n_name); 221 exit(1); 222 } 223 | 172 173 (void)time(&now); 174 kmem_setup(); 175 176 if (clear) { 177 clear_dump(); 178 exit(0); 179 } --- 36 unchanged lines hidden (view full) --- 216 syslog(LOG_ERR, "%s: nlist: %s", _PATH_UNIX, strerror(errno)); 217 for (i = 0; cursyms[i] != -1; i++) 218 if (current_nl[cursyms[i]].n_value == 0) { 219 syslog(LOG_ERR, "%s: %s not in namelist", 220 _PATH_UNIX, current_nl[cursyms[i]].n_name); 221 exit(1); 222 } 223 |
224 dump_sys = vmunix ? vmunix : _PATH_UNIX; | 224 dump_sys = kernel ? kernel : _PATH_UNIX; |
225 if ((nlist(dump_sys, dump_nl)) == -1) 226 syslog(LOG_ERR, "%s: nlist: %s", dump_sys, strerror(errno)); 227 for (i = 0; dumpsyms[i] != -1; i++) 228 if (dump_nl[dumpsyms[i]].n_value == 0) { 229 syslog(LOG_ERR, "%s: %s not in namelist", 230 dump_sys, dump_nl[dumpsyms[i]].n_name); 231 exit(1); 232 } --- 15 unchanged lines hidden (view full) --- 248 dumplo *= DEV_BSIZE; 249 ddname = find_dev(dumpdev, S_IFBLK); 250 dumpfd = Open(ddname, O_RDWR); 251 fp = fdopen(kmem, "r"); 252 if (fp == NULL) { 253 syslog(LOG_ERR, "%s: fdopen: %m", _PATH_KMEM); 254 exit(1); 255 } | 225 if ((nlist(dump_sys, dump_nl)) == -1) 226 syslog(LOG_ERR, "%s: nlist: %s", dump_sys, strerror(errno)); 227 for (i = 0; dumpsyms[i] != -1; i++) 228 if (dump_nl[dumpsyms[i]].n_value == 0) { 229 syslog(LOG_ERR, "%s: %s not in namelist", 230 dump_sys, dump_nl[dumpsyms[i]].n_name); 231 exit(1); 232 } --- 15 unchanged lines hidden (view full) --- 248 dumplo *= DEV_BSIZE; 249 ddname = find_dev(dumpdev, S_IFBLK); 250 dumpfd = Open(ddname, O_RDWR); 251 fp = fdopen(kmem, "r"); 252 if (fp == NULL) { 253 syslog(LOG_ERR, "%s: fdopen: %m", _PATH_KMEM); 254 exit(1); 255 } |
256 if (vmunix) | 256 if (kernel) |
257 return; 258 (void)fseek(fp, (off_t)current_nl[X_VERSION].n_value, L_SET); 259 (void)fgets(vers, sizeof(vers), fp); 260 261 /* Don't fclose(fp), we use dumpfd later. */ 262} 263 264void --- 5 unchanged lines hidden (view full) --- 270 271 fp = fdopen(dumpfd, "r"); 272 if (fp == NULL) { 273 syslog(LOG_ERR, "%s: fdopen: %m", ddname); 274 exit(1); 275 } 276 fseek(fp, (off_t)(dumplo + ok(dump_nl[X_VERSION].n_value)), L_SET); 277 fgets(core_vers, sizeof(core_vers), fp); | 257 return; 258 (void)fseek(fp, (off_t)current_nl[X_VERSION].n_value, L_SET); 259 (void)fgets(vers, sizeof(vers), fp); 260 261 /* Don't fclose(fp), we use dumpfd later. */ 262} 263 264void --- 5 unchanged lines hidden (view full) --- 270 271 fp = fdopen(dumpfd, "r"); 272 if (fp == NULL) { 273 syslog(LOG_ERR, "%s: fdopen: %m", ddname); 274 exit(1); 275 } 276 fseek(fp, (off_t)(dumplo + ok(dump_nl[X_VERSION].n_value)), L_SET); 277 fgets(core_vers, sizeof(core_vers), fp); |
278 if (strcmp(vers, core_vers) && vmunix == 0) | 278 if (strcmp(vers, core_vers) && kernel == 0) |
279 syslog(LOG_WARNING, 280 "warning: %s version mismatch:\n\t%s\nand\t%s\n", 281 _PATH_UNIX, vers, core_vers); 282 (void)fseek(fp, 283 (off_t)(dumplo + ok(dump_nl[X_PANICSTR].n_value)), L_SET); 284 (void)fread(&panicstr, sizeof(panicstr), 1, fp); 285 if (panicstr) { 286 (void)fseek(fp, dumplo + ok(panicstr), L_SET); --- 121 unchanged lines hidden (view full) --- 408 (void)printf("\n"); 409 (void)close(ifd); 410 if (compress) 411 (void)fclose(fp); 412 else 413 (void)close(ofd); 414 415 /* Copy the kernel. */ | 279 syslog(LOG_WARNING, 280 "warning: %s version mismatch:\n\t%s\nand\t%s\n", 281 _PATH_UNIX, vers, core_vers); 282 (void)fseek(fp, 283 (off_t)(dumplo + ok(dump_nl[X_PANICSTR].n_value)), L_SET); 284 (void)fread(&panicstr, sizeof(panicstr), 1, fp); 285 if (panicstr) { 286 (void)fseek(fp, dumplo + ok(panicstr), L_SET); --- 121 unchanged lines hidden (view full) --- 408 (void)printf("\n"); 409 (void)close(ifd); 410 if (compress) 411 (void)fclose(fp); 412 else 413 (void)close(ofd); 414 415 /* Copy the kernel. */ |
416 ifd = Open(vmunix ? vmunix : _PATH_UNIX, O_RDONLY); 417 (void)snprintf(path, sizeof(path), "%s/vmunix.%d%s", | 416 ifd = Open(kernel ? kernel : _PATH_UNIX, O_RDONLY); 417 (void)snprintf(path, sizeof(path), "%s/kernel.%d%s", |
418 dirname, bounds, compress ? ".Z" : ""); 419 if (compress) { 420 if ((fp = zopen(path, "w", 0)) == NULL) { 421 syslog(LOG_ERR, "%s: %s", path, strerror(errno)); 422 exit(1); 423 } 424 } else 425 ofd = Create(path, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); 426 syslog(LOG_NOTICE, "writing %skernel to %s", 427 compress ? "compressed " : "", path); 428 while ((nr = read(ifd, buf, sizeof(buf))) > 0) { 429 if (compress) 430 nw = fwrite(buf, 1, nr, fp); 431 else 432 nw = write(ofd, buf, nr); 433 if (nw != nr) { 434 syslog(LOG_ERR, "%s: %s", 435 path, strerror(nw == 0 ? EIO : errno)); 436 syslog(LOG_WARNING, | 418 dirname, bounds, compress ? ".Z" : ""); 419 if (compress) { 420 if ((fp = zopen(path, "w", 0)) == NULL) { 421 syslog(LOG_ERR, "%s: %s", path, strerror(errno)); 422 exit(1); 423 } 424 } else 425 ofd = Create(path, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); 426 syslog(LOG_NOTICE, "writing %skernel to %s", 427 compress ? "compressed " : "", path); 428 while ((nr = read(ifd, buf, sizeof(buf))) > 0) { 429 if (compress) 430 nw = fwrite(buf, 1, nr, fp); 431 else 432 nw = write(ofd, buf, nr); 433 if (nw != nr) { 434 syslog(LOG_ERR, "%s: %s", 435 path, strerror(nw == 0 ? EIO : errno)); 436 syslog(LOG_WARNING, |
437 "WARNING: vmunix may be incomplete"); | 437 "WARNING: kernel may be incomplete"); |
438 exit(1); 439 } 440 } 441 if (nr < 0) { 442 syslog(LOG_ERR, "%s: %s", | 438 exit(1); 439 } 440 } 441 if (nr < 0) { 442 syslog(LOG_ERR, "%s: %s", |
443 vmunix ? vmunix : _PATH_UNIX, strerror(errno)); | 443 kernel ? kernel : _PATH_UNIX, strerror(errno)); |
444 syslog(LOG_WARNING, | 444 syslog(LOG_WARNING, |
445 "WARNING: vmunix may be incomplete"); | 445 "WARNING: kernel may be incomplete"); |
446 exit(1); 447 } 448 if (compress) 449 (void)fclose(fp); 450 else 451 (void)close(ofd); 452} 453 --- 73 unchanged lines hidden (view full) --- 527 } 528 return (1); 529} 530 531int 532check_space() 533{ 534 register FILE *fp; | 446 exit(1); 447 } 448 if (compress) 449 (void)fclose(fp); 450 else 451 (void)close(ofd); 452} 453 --- 73 unchanged lines hidden (view full) --- 527 } 528 return (1); 529} 530 531int 532check_space() 533{ 534 register FILE *fp; |
535 char *tvmunix; 536 off_t minfree, spacefree, vmunixsize, needed; | 535 char *tkernel; 536 off_t minfree, spacefree, kernelsize, needed; |
537 struct stat st; 538 struct statfs fsbuf; 539 char buf[100], path[MAXPATHLEN]; 540 | 537 struct stat st; 538 struct statfs fsbuf; 539 char buf[100], path[MAXPATHLEN]; 540 |
541 tvmunix = vmunix ? vmunix : _PATH_UNIX; 542 if (stat(tvmunix, &st) < 0) { 543 syslog(LOG_ERR, "%s: %m", tvmunix); | 541 tkernel = kernel ? kernel : _PATH_UNIX; 542 if (stat(tkernel, &st) < 0) { 543 syslog(LOG_ERR, "%s: %m", tkernel); |
544 exit(1); 545 } | 544 exit(1); 545 } |
546 vmunixsize = st.st_blocks * S_BLKSIZE; | 546 kernelsize = st.st_blocks * S_BLKSIZE; |
547 if (statfs(dirname, &fsbuf) < 0) { 548 syslog(LOG_ERR, "%s: %m", dirname); 549 exit(1); 550 } 551 spacefree = (fsbuf.f_bavail * fsbuf.f_bsize) / 1024; 552 553 (void)snprintf(path, sizeof(path), "%s/minfree", dirname); 554 if ((fp = fopen(path, "r")) == NULL) 555 minfree = 0; 556 else { 557 if (fgets(buf, sizeof(buf), fp) == NULL) 558 minfree = 0; 559 else 560 minfree = atoi(buf); 561 (void)fclose(fp); 562 } 563 | 547 if (statfs(dirname, &fsbuf) < 0) { 548 syslog(LOG_ERR, "%s: %m", dirname); 549 exit(1); 550 } 551 spacefree = (fsbuf.f_bavail * fsbuf.f_bsize) / 1024; 552 553 (void)snprintf(path, sizeof(path), "%s/minfree", dirname); 554 if ((fp = fopen(path, "r")) == NULL) 555 minfree = 0; 556 else { 557 if (fgets(buf, sizeof(buf), fp) == NULL) 558 minfree = 0; 559 else 560 minfree = atoi(buf); 561 (void)fclose(fp); 562 } 563 |
564 needed = (dumpsize + vmunixsize) / 1024; | 564 needed = (dumpsize + kernelsize) / 1024; |
565 if (minfree > 0 && spacefree - needed < minfree) { 566 syslog(LOG_WARNING, 567 "no dump, not enough free space on device"); 568 return (0); 569 } 570 if (spacefree - needed < minfree) 571 syslog(LOG_WARNING, 572 "dump performed, but free space threshold crossed"); --- 80 unchanged lines hidden --- | 565 if (minfree > 0 && spacefree - needed < minfree) { 566 syslog(LOG_WARNING, 567 "no dump, not enough free space on device"); 568 return (0); 569 } 570 if (spacefree - needed < minfree) 571 syslog(LOG_WARNING, 572 "dump performed, but free space threshold crossed"); --- 80 unchanged lines hidden --- |