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 ---