ddb.c revision 176833
125184Sjkh/*- 225184Sjkh * Copyright (c) 2007 Robert N. M. Watson 341371Sjkoshy * All rights reserved. 425184Sjkh * 525184Sjkh * Redistribution and use in source and binary forms, with or without 625184Sjkh * modification, are permitted provided that the following conditions 725184Sjkh * are met: 825184Sjkh * 1. Redistributions of source code must retain the above copyright 925184Sjkh * notice, this list of conditions and the following disclaimer. 1025184Sjkh * 2. Redistributions in binary form must reproduce the above copyright 1125184Sjkh * notice, this list of conditions and the following disclaimer in the 1225184Sjkh * documentation and/or other materials provided with the distribution. 1325184Sjkh * 1425184Sjkh * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 1525184Sjkh * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 1625184Sjkh * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 1725184Sjkh * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 1825184Sjkh * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 1925184Sjkh * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2025184Sjkh * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2125184Sjkh * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2225184Sjkh * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 2325184Sjkh * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 2425184Sjkh * SUCH DAMAGE. 2525184Sjkh */ 2625184Sjkh 2725184Sjkh#include <sys/cdefs.h> 2840006Sphk__FBSDID("$FreeBSD: head/sbin/ddb/ddb.c 176833 2008-03-05 17:51:06Z brooks $"); 2940006Sphk 3040006Sphk#include <err.h> 3140006Sphk#include <stdio.h> 3240006Sphk#include <stdlib.h> 3340006Sphk#include <string.h> 3425184Sjkh#include <sysexits.h> 3525184Sjkh#include <unistd.h> 3625184Sjkh 3733682Sbrian#include "ddb.h" 3825184Sjkh 3925184Sjkhvoid ddb_readfile(char *file); 4025184Sjkhvoid ddb_main(int argc, char *argv[]); 4125184Sjkh 4225184Sjkhvoid 4325184Sjkhusage(void) 4425184Sjkh{ 4525184Sjkh 4625184Sjkh fprintf(stderr, "usage:\n"); 4725184Sjkh fprintf(stderr, "ddb script scriptname\n"); 4825184Sjkh fprintf(stderr, "ddb script scriptname=script\n"); 4925184Sjkh fprintf(stderr, "ddb scripts\n"); 5025184Sjkh fprintf(stderr, "ddb unscript scriptname\n"); 5125184Sjkh exit(EX_USAGE); 5225184Sjkh} 5325184Sjkh 5425184Sjkhvoid 5525184Sjkhddb_readfile(char *filename) 5625184Sjkh{ 5725184Sjkh char buf[BUFSIZ]; 5825184Sjkh FILE* f; 5925184Sjkh 6025184Sjkh if ((f = fopen(filename, "r")) == NULL) 6125184Sjkh err(EX_UNAVAILABLE, "fopen: %s", filename); 6225184Sjkh 6329300Sdanny#define WHITESP " \t" 6429300Sdanny#define MAXARG 2 6529300Sdanny while (fgets(buf, BUFSIZ, f)) { 6629300Sdanny int argc = 0; 6732382Salex char *argv[MAXARG]; 6832382Salex size_t spn; 6932382Salex 7029300Sdanny spn = strlen(buf); 7129300Sdanny if (buf[spn-1] == '\n') 7229300Sdanny buf[spn-1] = '\0'; 7329300Sdanny 7441077Speter spn = strspn(buf, WHITESP); 7529300Sdanny argv[0] = buf + spn; 7629300Sdanny if (*argv[0] == '#' || *argv[0] == '\0') 7729300Sdanny continue; 7829300Sdanny argc++; 7929300Sdanny 8029300Sdanny spn = strcspn(argv[0], WHITESP); 8129300Sdanny argv[1] = argv[0] + spn + strspn(argv[0] + spn, WHITESP);; 8229300Sdanny argv[0][spn] = '\0'; 8329300Sdanny if (*argv[1] != '\0') 8429300Sdanny argc++; 8529300Sdanny 8625364Sjkh#ifdef DEBUG 8729300Sdanny { 8829300Sdanny int i; 8933337Salex printf("argc = %d\n", argc); 9033337Salex for (i = 0; i < argc; i++) { 9133149Salex printf("arg[%d] = %s\n", i, argv[i]); 9233149Salex } 9333149Salex } 9433149Salex#endif 9529300Sdanny ddb_main(argc, argv); 9625184Sjkh } 9725184Sjkh} 9840006Sphk 9940006Sphkvoid 10040006Sphkddb_main(int argc, char *argv[]) 10140006Sphk{ 10240006Sphk 10329300Sdanny if (argc < 1) 10429300Sdanny usage(); 10525184Sjkh 10625184Sjkh if (strcmp(argv[0], "script") == 0) 10725184Sjkh ddb_script(argc, argv); 10825184Sjkh else if (strcmp(argv[0], "scripts") == 0) 10925184Sjkh ddb_scripts(argc, argv); 11025184Sjkh else if (strcmp(argv[0], "unscript") == 0) 11125184Sjkh ddb_unscript(argc, argv); 11225184Sjkh else 11325184Sjkh usage(); 11425184Sjkh} 11525184Sjkh 11625184Sjkhint 11725184Sjkhmain(int argc, char *argv[]) 11825184Sjkh{ 11927218Spst 12027218Spst /* 12127218Spst * If we've only got one argument and it's an absolute path to a file, 12227218Spst * interpret as a file to be read in. 12327218Spst */ 12439267Sjkoshy if (argc == 2 && argv[1][0] == '/' && access(argv[1], R_OK) == 0) 12539267Sjkoshy ddb_readfile(argv[1]); 12639267Sjkoshy else 12739267Sjkoshy ddb_main(argc-1, argv+1); 12839267Sjkoshy exit(EX_OK); 12925184Sjkh} 13025365Sjkh