1a1f25b0dSRobert Watson /*- 2a1f25b0dSRobert Watson * Copyright (c) 2007 Robert N. M. Watson 3a1f25b0dSRobert Watson * All rights reserved. 4a1f25b0dSRobert Watson * 5a1f25b0dSRobert Watson * Redistribution and use in source and binary forms, with or without 6a1f25b0dSRobert Watson * modification, are permitted provided that the following conditions 7a1f25b0dSRobert Watson * are met: 8a1f25b0dSRobert Watson * 1. Redistributions of source code must retain the above copyright 9a1f25b0dSRobert Watson * notice, this list of conditions and the following disclaimer. 10a1f25b0dSRobert Watson * 2. Redistributions in binary form must reproduce the above copyright 11a1f25b0dSRobert Watson * notice, this list of conditions and the following disclaimer in the 12a1f25b0dSRobert Watson * documentation and/or other materials provided with the distribution. 13a1f25b0dSRobert Watson * 14a1f25b0dSRobert Watson * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15a1f25b0dSRobert Watson * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16a1f25b0dSRobert Watson * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17a1f25b0dSRobert Watson * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18a1f25b0dSRobert Watson * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19a1f25b0dSRobert Watson * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20a1f25b0dSRobert Watson * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21a1f25b0dSRobert Watson * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22a1f25b0dSRobert Watson * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23a1f25b0dSRobert Watson * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24a1f25b0dSRobert Watson * SUCH DAMAGE. 25a1f25b0dSRobert Watson */ 26a1f25b0dSRobert Watson 27a1f25b0dSRobert Watson #include <sys/cdefs.h> 28a1f25b0dSRobert Watson __FBSDID("$FreeBSD$"); 29a1f25b0dSRobert Watson 3014084ab9SBrooks Davis #include <err.h> 31a1f25b0dSRobert Watson #include <stdio.h> 32a1f25b0dSRobert Watson #include <stdlib.h> 33a1f25b0dSRobert Watson #include <string.h> 34a1f25b0dSRobert Watson #include <sysexits.h> 3514084ab9SBrooks Davis #include <unistd.h> 36a1f25b0dSRobert Watson 37a1f25b0dSRobert Watson #include "ddb.h" 38a1f25b0dSRobert Watson 3914084ab9SBrooks Davis void ddb_readfile(char *file); 4014084ab9SBrooks Davis void ddb_main(int argc, char *argv[]); 4114084ab9SBrooks Davis 42a1f25b0dSRobert Watson void 43a1f25b0dSRobert Watson usage(void) 44a1f25b0dSRobert Watson { 45a1f25b0dSRobert Watson 4606934245SRobert Watson fprintf(stderr, "usage: ddb capture [-M core] [-N system] print\n"); 4706934245SRobert Watson fprintf(stderr, " ddb capture [-M core] [-N system] status\n"); 4806934245SRobert Watson fprintf(stderr, " ddb script scriptname\n"); 49a1f25b0dSRobert Watson fprintf(stderr, " ddb script scriptname=script\n"); 50a1f25b0dSRobert Watson fprintf(stderr, " ddb scripts\n"); 51a1f25b0dSRobert Watson fprintf(stderr, " ddb unscript scriptname\n"); 5285018ba5SRuslan Ermilov fprintf(stderr, " ddb pathname\n"); 53a1f25b0dSRobert Watson exit(EX_USAGE); 54a1f25b0dSRobert Watson } 55a1f25b0dSRobert Watson 5614084ab9SBrooks Davis void 5714084ab9SBrooks Davis ddb_readfile(char *filename) 5814084ab9SBrooks Davis { 5914084ab9SBrooks Davis char buf[BUFSIZ]; 6014084ab9SBrooks Davis FILE* f; 6114084ab9SBrooks Davis 6214084ab9SBrooks Davis if ((f = fopen(filename, "r")) == NULL) 6314084ab9SBrooks Davis err(EX_UNAVAILABLE, "fopen: %s", filename); 6414084ab9SBrooks Davis 6514084ab9SBrooks Davis #define WHITESP " \t" 6614084ab9SBrooks Davis #define MAXARG 2 6714084ab9SBrooks Davis while (fgets(buf, BUFSIZ, f)) { 6814084ab9SBrooks Davis int argc = 0; 6914084ab9SBrooks Davis char *argv[MAXARG]; 7014084ab9SBrooks Davis size_t spn; 7114084ab9SBrooks Davis 7214084ab9SBrooks Davis spn = strlen(buf); 7314084ab9SBrooks Davis if (buf[spn-1] == '\n') 7414084ab9SBrooks Davis buf[spn-1] = '\0'; 7514084ab9SBrooks Davis 7614084ab9SBrooks Davis spn = strspn(buf, WHITESP); 7714084ab9SBrooks Davis argv[0] = buf + spn; 7814084ab9SBrooks Davis if (*argv[0] == '#' || *argv[0] == '\0') 7914084ab9SBrooks Davis continue; 8014084ab9SBrooks Davis argc++; 8114084ab9SBrooks Davis 8214084ab9SBrooks Davis spn = strcspn(argv[0], WHITESP); 8314084ab9SBrooks Davis argv[1] = argv[0] + spn + strspn(argv[0] + spn, WHITESP);; 8414084ab9SBrooks Davis argv[0][spn] = '\0'; 8514084ab9SBrooks Davis if (*argv[1] != '\0') 8614084ab9SBrooks Davis argc++; 8714084ab9SBrooks Davis 8814084ab9SBrooks Davis #ifdef DEBUG 8914084ab9SBrooks Davis { 9014084ab9SBrooks Davis int i; 9114084ab9SBrooks Davis printf("argc = %d\n", argc); 9214084ab9SBrooks Davis for (i = 0; i < argc; i++) { 9314084ab9SBrooks Davis printf("arg[%d] = %s\n", i, argv[i]); 9414084ab9SBrooks Davis } 9514084ab9SBrooks Davis } 9614084ab9SBrooks Davis #endif 9714084ab9SBrooks Davis ddb_main(argc, argv); 9814084ab9SBrooks Davis } 9914084ab9SBrooks Davis } 10014084ab9SBrooks Davis 10114084ab9SBrooks Davis void 10214084ab9SBrooks Davis ddb_main(int argc, char *argv[]) 103a1f25b0dSRobert Watson { 104a1f25b0dSRobert Watson 10514084ab9SBrooks Davis if (argc < 1) 106a1f25b0dSRobert Watson usage(); 107a1f25b0dSRobert Watson 10806934245SRobert Watson if (strcmp(argv[0], "capture") == 0) 10906934245SRobert Watson ddb_capture(argc, argv); 11006934245SRobert Watson else if (strcmp(argv[0], "script") == 0) 111a1f25b0dSRobert Watson ddb_script(argc, argv); 112a1f25b0dSRobert Watson else if (strcmp(argv[0], "scripts") == 0) 113a1f25b0dSRobert Watson ddb_scripts(argc, argv); 114a1f25b0dSRobert Watson else if (strcmp(argv[0], "unscript") == 0) 115a1f25b0dSRobert Watson ddb_unscript(argc, argv); 116a1f25b0dSRobert Watson else 117a1f25b0dSRobert Watson usage(); 11814084ab9SBrooks Davis } 11914084ab9SBrooks Davis 12014084ab9SBrooks Davis int 12114084ab9SBrooks Davis main(int argc, char *argv[]) 12214084ab9SBrooks Davis { 12314084ab9SBrooks Davis 12414084ab9SBrooks Davis /* 12514084ab9SBrooks Davis * If we've only got one argument and it's an absolute path to a file, 12614084ab9SBrooks Davis * interpret as a file to be read in. 12714084ab9SBrooks Davis */ 12814084ab9SBrooks Davis if (argc == 2 && argv[1][0] == '/' && access(argv[1], R_OK) == 0) 12914084ab9SBrooks Davis ddb_readfile(argv[1]); 13014084ab9SBrooks Davis else 13114084ab9SBrooks Davis ddb_main(argc-1, argv+1); 132a1f25b0dSRobert Watson exit(EX_OK); 133a1f25b0dSRobert Watson } 134