X-Git-Url: https://git.saurik.com/apple/system_cmds.git/blobdiff_plain/6d658acdb5f61932718109ed8f339604b778ab80..c03df0e9b5e00ac087fc7c53f812f6d1dd92f2a8:/dmesg.tproj/dmesg.c diff --git a/dmesg.tproj/dmesg.c b/dmesg.tproj/dmesg.c index 321c40a..373653d 100644 --- a/dmesg.tproj/dmesg.c +++ b/dmesg.tproj/dmesg.c @@ -3,22 +3,21 @@ * * @APPLE_LICENSE_HEADER_START@ * - * Copyright (c) 1999-2003 Apple Computer, Inc. All Rights Reserved. - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this - * file. + * "Portions Copyright (c) 1999 Apple Computer, Inc. All Rights + * Reserved. This file contains Original Code and/or Modifications of + * Original Code as defined in and that are subject to the Apple Public + * Source License Version 1.0 (the 'License'). You may not use this file + * except in compliance with the License. Please obtain a copy of the + * License at http://www.apple.com/publicsource and read it before using + * this file. * * The Original Code and all software distributed under the License are * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License." * * @APPLE_LICENSE_HEADER_END@ */ @@ -55,117 +54,34 @@ * SUCH DAMAGE. */ -#include -#include - -#include -#include -#include -#include #include #include -#include -#include #include +#include -struct nlist nl[] = { -#define X_MSGBUF 0 - { "_msgbufp" }, - { NULL }, -}; - -void usage __P((void)); - -#define KREAD(addr, var) \ - kvm_read(kd, addr, &var, sizeof(var)) != sizeof(var) +void +usage() { + (void)fprintf(stderr, "usage: sudo dmesg\n"); + exit(1); +} int -main(argc, argv) - int argc; - char *argv[]; -{ - register int ch, newl, skip; - register char *p, *ep; - struct msgbuf *bufp, cur; - char *memf, *nlistf; - kvm_t *kd; - char buf[5]; +main(int argc, char **argv) { + char msgbuf[16*1024], *visbuf; + long data_size; - memf = nlistf = NULL; - while ((ch = getopt(argc, argv, "M:N:")) != EOF) - switch(ch) { - case 'M': - memf = optarg; - break; - case 'N': - nlistf = optarg; - break; - case '?': - default: - usage(); - } - argc -= optind; - argv += optind; - - /* - * Discard setgid privileges if not the running kernel so that bad - * guys can't print interesting stuff from kernel memory. - */ - if (memf != NULL || nlistf != NULL) - setgid(getgid()); - - /* Read in kernel message buffer, do sanity checks. */ - if ((kd = kvm_open(nlistf, memf, NULL, O_RDONLY, "dmesg")) == NULL) - exit (1); - if (kvm_nlist(kd, nl) == -1) - errx(1, "kvm_nlist: %s", kvm_geterr(kd)); - if (nl[X_MSGBUF].n_type == 0) - errx(1, "%s: msgbufp not found", nlistf ? nlistf : "namelist"); - if (KREAD(nl[X_MSGBUF].n_value, bufp) || KREAD((long)bufp, cur)) - errx(1, "kvm_read: %s", kvm_geterr(kd)); - kvm_close(kd); - if (cur.msg_magic != MSG_MAGIC) - errx(1, "magic number incorrect"); - if (cur.msg_bufx >= MSG_BSIZE) - cur.msg_bufx = 0; - - /* - * The message buffer is circular; start at the read pointer, and - * go to the write pointer - 1. - */ - p = cur.msg_bufc + cur.msg_bufx; - ep = cur.msg_bufc + cur.msg_bufx - 1; - for (newl = skip = 0; p != ep; ++p) { - if (p == cur.msg_bufc + MSG_BSIZE) - p = cur.msg_bufc; - ch = *p; - /* Skip "\n<.*>" syslog sequences. */ - if (skip) { - if (ch == '>') - newl = skip = 0; - continue; - } - if (newl && ch == '<') { - skip = 1; - continue; - } - if (ch == '\0') - continue; - newl = ch == '\n'; - (void)vis(buf, ch, 0, 0); - if (buf[1] == 0) - (void)putchar(buf[0]); - else - (void)printf("%s", buf); + if (argc > 1) + usage(); + + if ((data_size = proc_kmsgbuf(msgbuf, sizeof(msgbuf))) == 0){ + perror("Unable to obtain kernel buffer"); + usage(); } - if (!newl) - (void)putchar('\n'); + + visbuf = malloc(data_size*4); + strvis(visbuf, msgbuf, 0); + printf("%s", visbuf); + free(visbuf); exit(0); } -void -usage() -{ - (void)fprintf(stderr, "usage: dmesg [-M core] [-N system]\n"); - exit(1); -}