shithub: sl

Download patch

ref: 812dc24c837fc55cd0912e2e125a6a997e8a3f19
parent: 0f0024116ec937f749ea6f146d1b9af648cf2ac0
author: Sigrid Solveig Haflínudóttir <sigrid@ftrv.se>
date: Thu Mar 20 03:25:34 EDT 2025

ios: always have a filename allocated

--- a/src/io.c
+++ b/src/io.c
@@ -365,6 +365,7 @@
 	}else{
 		((u8int*)cv->data)[n] = 0;
 	}
+	ios_free(&dest);
 	if(n == 0 && ios_eof(src))
 		return sl_eof;
 	return str;
--- a/src/ios.c
+++ b/src/ios.c
@@ -614,9 +614,7 @@
 ios_setbuf(sl_ios *s, u8int *buf, usize size, bool own)
 {
 	ios_flush(s);
-	usize nvalid;
-
-	nvalid = size < s->size ? size : s->size;
+	usize nvalid = size < s->size ? size : s->size;
 	if(nvalid > 0)
 		memcpy(buf, s->buf, nvalid);
 	if(s->bpos > nvalid){
@@ -763,7 +761,7 @@
 		flags |= O_CREAT;
 	fd = open(fname, flags, 0644);
 #endif
-	s = ios_fd(s, fd, 1, 1);
+	s = ios_fd(s, fd, fname, true, true);
 	if(fd < 0)
 		goto open_file_err;
 	if(!wr && rd)
@@ -770,7 +768,6 @@
 		s->readonly = true;
 	if(wr && !rd)
 		s->writeonly = true;
-	s->loc.filename = MEM_STRDUP(fname);
 	return s;
 open_file_err:
 	s->fd = -1;
@@ -798,7 +795,7 @@
 }
 
 sl_ios *
-ios_fd(sl_ios *s, int fd, bool isfile, bool own)
+ios_fd(sl_ios *s, int fd, const char *name, bool isfile, bool own)
 {
 	_ios_init(s);
 	s->fd = fd;
@@ -806,8 +803,7 @@
 		s->rereadable = true;
 	_buf_init(s, bm_block);
 	s->ownfd = own;
-	if(fd == STDERR_FILENO)
-		s->bm = bm_none;
+	s->loc.filename = MEM_STRDUP(name);
 	return s;
 }
 
@@ -815,18 +811,15 @@
 ios_init_std(void)
 {
 	ios_stdin = MEM_ALLOC(sizeof(sl_ios));
-	ios_fd(ios_stdin, STDIN_FILENO, 0, 0);
-	ios_stdin->loc.filename = MEM_STRDUP("*stdin*");
+	ios_fd(ios_stdin, STDIN_FILENO, "*stdin*", false, false);
 
 	ios_stdout = MEM_ALLOC(sizeof(sl_ios));
-	ios_fd(ios_stdout, STDOUT_FILENO, 0, 0);
+	ios_fd(ios_stdout, STDOUT_FILENO, "*stdout*", false, false);
 	ios_stdout->bm = bm_line;
-	ios_stdout->loc.filename = MEM_STRDUP("*stdout*");
 
 	ios_stderr = MEM_ALLOC(sizeof(sl_ios));
-	ios_fd(ios_stderr, STDERR_FILENO, 0, 0);
+	ios_fd(ios_stderr, STDERR_FILENO, "*stderr*", false, false);
 	ios_stderr->bm = bm_none;
-	ios_stderr->loc.filename = MEM_STRDUP("*stderr*");
 }
 
 /* higher level interface */
--- a/src/ios.h
+++ b/src/ios.h
@@ -84,7 +84,7 @@
 sl_ios *ios_file(sl_ios *s, char *fname, bool rd, bool wr, bool create, bool trunc);
 sl_ios *ios_mem(sl_ios *s, usize initsize);
 sl_ios *ios_static_buffer(sl_ios *s, const u8int *buf, usize sz);
-sl_ios *ios_fd(sl_ios *s, int fd, bool isfile, bool own);
+sl_ios *ios_fd(sl_ios *s, int fd, const char *name, bool isfile, bool own);
 // todo: ios_socket
 extern sl_ios *ios_stdin;
 extern sl_ios *ios_stdout;
--- a/src/plan9/lsd.c
+++ b/src/plan9/lsd.c
@@ -319,8 +319,7 @@
 		free(proc_stdin);
 	}
 	proc_stdin = MEM_ALLOC(sizeof(*proc_stdin));
-	ios_fd(proc_stdin, p, 0, 0);
-	proc_stdin->loc.filename = MEM_STRDUP("proc-stdin");
+	ios_fd(proc_stdin, p, "proc-stdin", false, false);
 
 	v = alloc_vec(2, 0);
 	sl_gc_handle(&v);