|
Lines 134-140
Link Here
|
| 134 |
void Lseek __P((int, off_t, int)); |
134 |
void Lseek __P((int, off_t, int)); |
| 135 |
int Open __P((const char *, int rw)); |
135 |
int Open __P((const char *, int rw)); |
| 136 |
int Read __P((int, void *, int)); |
136 |
int Read __P((int, void *, int)); |
| 137 |
char *rawname __P((char *s)); |
|
|
| 138 |
void save_core __P((void)); |
137 |
void save_core __P((void)); |
| 139 |
void usage __P((void)); |
138 |
void usage __P((void)); |
| 140 |
void Write __P((int, void *, int)); |
139 |
void Write __P((int, void *, int)); |
|
Lines 340-346
Link Here
|
| 340 |
{ |
339 |
{ |
| 341 |
register FILE *fp; |
340 |
register FILE *fp; |
| 342 |
register int bounds, ifd, nr, nw, ofd; |
341 |
register int bounds, ifd, nr, nw, ofd; |
| 343 |
char *rawp, path[MAXPATHLEN]; |
342 |
char path[MAXPATHLEN]; |
| 344 |
mode_t oumask; |
343 |
mode_t oumask; |
| 345 |
|
344 |
|
| 346 |
/* |
345 |
/* |
|
Lines 379-393
Link Here
|
| 379 |
ofd = Create(path, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); |
378 |
ofd = Create(path, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); |
| 380 |
(void)umask(oumask); |
379 |
(void)umask(oumask); |
| 381 |
|
380 |
|
| 382 |
/* Open the raw device. */ |
|
|
| 383 |
rawp = rawname(ddname); |
| 384 |
if ((ifd = open(rawp, O_RDONLY)) == -1) { |
| 385 |
syslog(LOG_WARNING, "%s: %m; using block device", rawp); |
| 386 |
ifd = dumpfd; |
| 387 |
} |
| 388 |
|
| 389 |
/* Seek to the start of the core. */ |
381 |
/* Seek to the start of the core. */ |
| 390 |
Lseek(ifd, (off_t)dumplo, L_SET); |
382 |
Lseek(dumpfd, (off_t)dumplo, L_SET); |
| 391 |
|
383 |
|
| 392 |
/* Copy the core file. */ |
384 |
/* Copy the core file. */ |
| 393 |
syslog(LOG_NOTICE, "writing %score to %s", |
385 |
syslog(LOG_NOTICE, "writing %score to %s", |
|
Lines 395-407
Link Here
|
| 395 |
for (; dumpsize > 0; dumpsize -= nr) { |
387 |
for (; dumpsize > 0; dumpsize -= nr) { |
| 396 |
(void)printf("%6dK\r", dumpsize / 1024); |
388 |
(void)printf("%6dK\r", dumpsize / 1024); |
| 397 |
(void)fflush(stdout); |
389 |
(void)fflush(stdout); |
| 398 |
nr = read(ifd, buf, MIN(dumpsize, sizeof(buf))); |
390 |
nr = read(dumpfd, buf, MIN(dumpsize, sizeof(buf))); |
| 399 |
if (nr <= 0) { |
391 |
if (nr <= 0) { |
| 400 |
if (nr == 0) |
392 |
if (nr == 0) |
| 401 |
syslog(LOG_WARNING, |
393 |
syslog(LOG_WARNING, |
| 402 |
"WARNING: EOF on dump device"); |
394 |
"WARNING: EOF on dump device"); |
| 403 |
else |
395 |
else |
| 404 |
syslog(LOG_ERR, "%s: %m", rawp); |
396 |
syslog(LOG_ERR, "%s: %m", ddname); |
| 405 |
goto err2; |
397 |
goto err2; |
| 406 |
} |
398 |
} |
| 407 |
if (compress) |
399 |
if (compress) |
|
Lines 417-423
Link Here
|
| 417 |
exit(1); |
409 |
exit(1); |
| 418 |
} |
410 |
} |
| 419 |
} |
411 |
} |
| 420 |
(void)close(ifd); |
|
|
| 421 |
if (compress) |
412 |
if (compress) |
| 422 |
(void)fclose(fp); |
413 |
(void)fclose(fp); |
| 423 |
else |
414 |
else |
|
Lines 497-521
Link Here
|
| 497 |
closedir(dfd); |
488 |
closedir(dfd); |
| 498 |
syslog(LOG_ERR, "can't find device %d/%d", major(dev), minor(dev)); |
489 |
syslog(LOG_ERR, "can't find device %d/%d", major(dev), minor(dev)); |
| 499 |
exit(1); |
490 |
exit(1); |
| 500 |
} |
|
|
| 501 |
|
| 502 |
char * |
| 503 |
rawname(s) |
| 504 |
char *s; |
| 505 |
{ |
| 506 |
char *sl, name[MAXPATHLEN]; |
| 507 |
|
| 508 |
if ((sl = rindex(s, '/')) == NULL || sl[1] == '0') { |
| 509 |
syslog(LOG_ERR, |
| 510 |
"can't make raw dump device name from %s", s); |
| 511 |
return (s); |
| 512 |
} |
| 513 |
snprintf(name, sizeof(name), "%.*s/r%s", (int)(sl - s), s, sl + 1); |
| 514 |
if ((sl = strdup(name)) == NULL) { |
| 515 |
syslog(LOG_ERR, "%s", strerror(errno)); |
| 516 |
exit(1); |
| 517 |
} |
| 518 |
return (sl); |
| 519 |
} |
491 |
} |
| 520 |
|
492 |
|
| 521 |
int |
493 |
int |