Date: Thu, 27 Aug 1998 16:09:51 +0200 From: Wolfram Schneider <wosch@panke.de.freebsd.org> To: joelh@gnu.org, thyerm@camtech.net.au Cc: wosch@panke.de.freebsd.org, current@FreeBSD.ORG Subject: Re: file segment sizes of a core dump Message-ID: <19980827160951.A3164@panke.de> In-Reply-To: <199808262253.RAA03247@detlev.UUCP>; from Joel Ray Holveck on Wed, Aug 26, 1998 at 05:53:23PM -0500 References: <199808231906.VAA04727@campa.panke.de> <35E18FF5.B7FADA7B@camtech.net.au> <19980824193728.B4111@panke.de> <199808251931.OAA00986@detlev.UUCP> <35E40C49.C673670C@camtech.net.au> <199808262253.RAA03247@detlev.UUCP>
next in thread | previous in thread | raw e-mail | index | archive | help
On 1998-08-26 17:53:23 -0500, Joel Ray Holveck wrote:
> I accept GIGO as a fact of life. I would vote against needing the
> switch. That's all I have to say on the topic.
I have now a version without the switch. size(1) checks now
a value of the user structure (number of groups). If
the values seems correct size(1) assume it is a core file.
Index: size.c
===================================================================
RCS file: /usr/cvs/src/usr.bin/size/size.c,v
retrieving revision 1.4
diff -u -r1.4 size.c
--- size.c 1998/07/06 21:01:32 1.4
+++ size.c 1998/08/27 12:43:08
@@ -47,6 +47,9 @@
#include <sys/param.h>
#include <sys/file.h>
+#include <sys/types.h>
+#include <sys/user.h>
+#include <sys/stat.h>
#include <err.h>
#include <a.out.h>
#include <unistd.h>
@@ -66,7 +69,6 @@
while ((ch = getopt(argc, argv, "")) != -1)
switch(ch) {
- case '?':
default:
usage();
}
@@ -90,29 +92,63 @@
{
static int first = 1;
struct exec head;
+ struct user user;
+ struct stat stat;
u_long total;
int fd;
+ int coredump = 0;
if ((fd = open(name, O_RDONLY, 0)) < 0) {
warn("%s", name);
return (1);
}
- if (read(fd, &head, sizeof(head)) != sizeof(head) || N_BADMAG(head)) {
- (void)close(fd);
+
+ if (read(fd, &head, sizeof(head)) != sizeof(head)) {
warnx("%s: not in a.out format", name);
+ (void)close(fd);
return (1);
}
+
+ /* if not a.out try coredump format */
+ if (N_BADMAG(head)) {
+ if (lseek(fd, (off_t)0, SEEK_SET) != -1 &&
+ read(fd, &user, sizeof(user)) == sizeof(user) &&
+ fstat(fd, &stat) != -1 &&
+ stat.st_size >=
+ ptoa(UPAGES + user.u_dsize + user.u_ssize) &&
+ user.u_kproc.kp_eproc.e_ucred.cr_ngroups <= NGROUPS_MAX &&
+ user.u_kproc.kp_eproc.e_ucred.cr_ngroups > 0) {
+ coredump = 1;
+ } else {
+ warnx("%s: not in a.out or core format", name);
+ (void)close(fd);
+ return (1);
+ }
+ }
(void)close(fd);
if (first) {
first = 0;
(void)printf("text\tdata\tbss\tdec\thex\n");
+ }
+
+ if (!coredump) {
+ total = head.a_text + head.a_data + head.a_bss;
+ (void)printf("%lu\t%lu\t%lu\t%lu\t%lx", (u_long)head.a_text,
+ (u_long)head.a_data, (u_long)head.a_bss, total, total);
+ } else {
+ total = ptoa(user.u_tsize) + ptoa(user.u_dsize) +
+ ptoa(user.u_ssize);
+ (void)printf("%lu\t%lu\t%lu\t%lu\t%lx",
+ (u_long)ptoa(user.u_tsize),
+ (u_long)ptoa(user.u_dsize),
+ (u_long)ptoa(user.u_ssize), total, total);
}
- total = head.a_text + head.a_data + head.a_bss;
- (void)printf("%lu\t%lu\t%lu\t%lu\t%lx", (u_long)head.a_text,
- (u_long)head.a_data, (u_long)head.a_bss, total, total);
- if (count > 1)
+
+ if (count > 1 || coredump)
(void)printf("\t%s", name);
+ if (coredump)
+ printf(" [coredump]");
(void)printf("\n");
return (0);
}
--
Wolfram Schneider <wosch@freebsd.org> http://www.freebsd.org/~w/
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-current" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?19980827160951.A3164>
