ref: 6d6686912d9c4c54dc5b10b06d32047054309166
parent: 14d0230cfdf96483c0b6066c03e8e15a1878c23e
author: spew <spew@cbza.org>
date: Sat Mar 22 16:41:12 EDT 2025
lsd: pass arguments to new
--- a/src/plan9/lsd.c
+++ b/src/plan9/lsd.c
@@ -186,13 +186,11 @@
}
static int
-newproc(int *outp)
+newproc(char **argv, int *outp)
{
int pid, fd, p[2];
- char buf[128], *argv[2];
+ char buf[128];
- argv[0] = aout;
- argv[1] = nil;
if(pipe(p) < 0)
lerrorf(sl_errio, "could not create a pipe");
pid = rfork(RFPROC|RFFDG|RFREND|RFNAMEG|RFNOTEG);
@@ -286,7 +284,7 @@
len = cv_len(ptr(args[0]));
if(len+1 > sizeof(aout))
lerrorf(sl_errio, "path too long");
- memmove(aout, cvalue_data(args[0]), len);
+ strecpy(aout, aout+sizeof(aout), cvalue_data(args[0]));
}
load();
@@ -330,13 +328,20 @@
BUILTIN("lsd-new", lsd_new)
{
sl_v v;
- int pid, p;
+ int pid, p, i;
+ static char *argv[512];
- USED(args);
- USED(nargs);
+ if(nargs+2 >= nelem(argv))
+ lerrorf(sl_errio, "too many arguments");
+ argv[0] = aout;
+ for(i = 0; i < nargs; i++){
+ if(sl_unlikely(!sl_isstr(args[i])))
+ type_error("str", args[i]);
+ argv[i+1] = cvalue_data(args[i]);
+ }
+ argv[i+1] = nil;
+ pid = newproc(argv, &p);
- pid = newproc(&p);
-
if(proc_stdin != nil){
free(proc_stdin->loc.filename);
free(proc_stdin);
@@ -423,9 +428,9 @@
BUILTIN("lsd-file2pc", lsd_file2pc)
{
- static char buf[1024];
uvlong addr;
- int len, line;
+ char *file;
+ int line;
argcount(nargs, 2);
if(sl_unlikely(!sl_isstr(args[0])))
@@ -433,14 +438,10 @@
if(sl_unlikely(!isfixnum(args[1])))
type_error("num", args[1]);
- len = cv_len(ptr(args[0]));
- if(len+1 > sizeof(buf))
- lerrorf(sl_errio, "path too long");
- memmove(buf, cvalue_data(args[0]), len);
- buf[len] = '\0';
+ file = cvalue_data(args[0]);
line = numval(args[1]);
- addr = file2pc(buf, line);
+ addr = file2pc(file, line);
if(addr == ~0)
- lerrorf(sl_errio, "could not find address of %s:%d", buf, line);
+ lerrorf(sl_errio, "could not find address of %s:%d", file, line);
return size_wrap(addr);
}
--- a/src/plan9/lsd.sl
+++ b/src/plan9/lsd.sl
@@ -171,29 +171,6 @@
(set! textf (procfile 'text :read))
(void))
-(def (new . args)
- (let ((v (apply lsd-new args)))
- (when proc-stdin (io-close proc-stdin))
- (set! bptbl (table))
- (set! pid (aref v 0))
- (set! proc-stdin (aref v 1))
- (attach)
- (bpset (car (follow (symbol-addr (get (global-text globals) 'main)))))
- (startstop)
- (set! pids (cons pid pids))
- pid))
-
-(def (lsd a)
- (let* ((v (lsd-load a))
- (f (λ (symbol tbl) (put! tbl (sym (symbol-name symbol)) symbol)))
- (text (foldl f (table) (aref v 3)))
- (data (foldl f (table) (aref v 4))))
- (set! pid (aref v 0))
- (set! registers (aref v 1))
- (set! bpinst (aref v 2))
- (set! globals (make-global :text text :data data)))
- (and (>= pid 0) (attach)))
-
(def (status)
(let* ((sf (procfile 'status))
(stats (read-all sf)))
@@ -370,6 +347,38 @@
(lsd-cleanup)
(for-each (λ (p) (princ "echo kill > /proc/" p "/ctl\n"))
pids)))
+
+(def (new . args)
+ "Start a new process for debugging.
+
+ Args will be passed unparsed as the argument vector to
+ the executable.
+
+ EXAMPLES
+
+ `(new)`; new process with no arguments
+ `(new \"-v\" \"/sys/src/cmd/sl/slmain.c\")`; two arguments."
+ (let ((v (apply lsd-new args)))
+ (when proc-stdin (io-close proc-stdin))
+ (set! bptbl (table))
+ (set! pid (aref v 0))
+ (set! proc-stdin (aref v 1))
+ (attach)
+ (bpset (car (follow (symbol-addr (get (global-text globals) 'main)))))
+ (startstop)
+ (set! pids (cons pid pids))
+ pid))
+
+(def (lsd a)
+ (let* ((v (lsd-load a))
+ (f (λ (symbol tbl) (put! tbl (sym (symbol-name symbol)) symbol)))
+ (text (foldl f (table) (aref v 3)))
+ (data (foldl f (table) (aref v 4))))
+ (set! pid (aref v 0))
+ (set! registers (aref v 1))
+ (set! bpinst (aref v 2))
+ (set! globals (make-global :text text :data data)))
+ (and (>= pid 0) (attach)))
(let* ((proc (cadr *argv*))
(pid (str->num proc)))