shithub: sl

Download patch

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)))