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