JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
Applying the patch of Roberto Caballero to set WINDOWID and all the pwuid()
[st.git] / st.c
diff --git a/st.c b/st.c
index 43f5bc2..f54e4d5 100644 (file)
--- a/st.c
+++ b/st.c
@@ -5,6 +5,7 @@
 #include <fcntl.h>
 #include <limits.h>
 #include <locale.h>
+#include <pwd.h>
 #include <stdarg.h>
 #include <stdbool.h>
 #include <stdio.h>
@@ -340,6 +341,7 @@ static int utf8encode(long *, char *);
 static int utf8size(char *);
 static int isfullutf8(char *, int);
 
+static ssize_t xwrite(int, char *, size_t);
 static void *xmalloc(size_t);
 static void *xrealloc(void *, size_t);
 static void *xcalloc(size_t nmemb, size_t size);
@@ -379,6 +381,21 @@ static char *opt_embed = NULL;
 static char *opt_class = NULL;
 static char *opt_font = NULL;
 
+
+ssize_t
+xwrite(int fd, char *s, size_t len) {
+       size_t aux = len;
+
+       while(len > 0) {
+               ssize_t r = write(fd, s, len);
+               if(r < 0)
+                       return r;
+               len -= r;
+               s += r;
+       }
+       return aux;
+}
+
 void *
 xmalloc(size_t len) {
        void *p = malloc(len);
@@ -662,7 +679,7 @@ bpress(XEvent *e) {
 
 void
 selcopy(void) {
-       char *str, *ptr, *p;
+       char *str, *ptr;
        int x, y, bufsize, is_selected = 0, size;
        Glyph *gp;
 
@@ -677,11 +694,12 @@ selcopy(void) {
                        for(x = 0; x < term.col; x++) {
                                gp = &term.line[y][x];
 
-                               if(!(is_selected = selected(x, y)))
+                               if(!(is_selected = selected(x, y))
+                                               || !(gp->state & GLYPH_SET)) {
                                        continue;
-                               p = (gp->state & GLYPH_SET) ? gp->c : " ";
-                               size = utf8size(p);
-                               memcpy(ptr, p, size);
+                               }
+                               size = utf8size(gp->c);
+                               memcpy(ptr, gp->c, size);
                                ptr += size;
                        }
                        /* \n at the end of every selected line except for the last one */
@@ -864,14 +882,23 @@ void
 execsh(void) {
        char **args;
        char *envshell = getenv("SHELL");
-
-       if (envshell == NULL)
-               envshell ="/bin/sh";
+       const struct passwd *pass = getpwuid(getuid());
+       char buf[sizeof(long) * 8 + 1];
 
        unsetenv("COLUMNS");
        unsetenv("LINES");
        unsetenv("TERMCAP");
 
+       if(pass) {
+               setenv("LOGNAME", pass->pw_name, 1);
+               setenv("USER", pass->pw_name, 1);
+               setenv("SHELL", pass->pw_shell, 0);
+               setenv("HOME", pass->pw_dir, 0);
+       }
+
+       snprintf(buf, sizeof(buf), "%lu", xw.win);
+       setenv("WINDOWID", buf, 1);
+
        signal(SIGCHLD, SIG_DFL);
        signal(SIGHUP, SIG_DFL);
        signal(SIGINT, SIG_DFL);
@@ -881,7 +908,7 @@ execsh(void) {
 
        DEFAULT(envshell, SHELL);
        putenv("TERM="TNAME);
-       args = opt_cmd ? opt_cmd : (char*[]){envshell, "-i", NULL};
+       args = opt_cmd ? opt_cmd : (char *[]){envshell, "-i", NULL};
        execvp(args[0], args);
        exit(EXIT_FAILURE);
 }
@@ -929,13 +956,12 @@ ttynew(void) {
                cmdfd = m;
                signal(SIGCHLD, sigchld);
                if(opt_io) {
-                       if(!strcmp(opt_io, "-")) {
-                               iofd = STDOUT_FILENO;
-                       } else {
-                               if((iofd = open(opt_io, O_WRONLY | O_CREAT, 0666)) < 0) {
-                                       fprintf(stderr, "Error opening %s:%s\n",
-                                               opt_io, strerror(errno));
-                               }
+                       iofd = (!strcmp(opt_io, "-")) ?
+                                 STDOUT_FILENO :
+                                 open(opt_io, O_WRONLY | O_CREAT, 0666);
+                       if(iofd < 0) {
+                               fprintf(stderr, "Error opening %s:%s\n",
+                                       opt_io, strerror(errno));
                        }
                }
        }
@@ -1796,8 +1822,14 @@ tputc(char *c, int len) {
        uchar ascii = *c;
        bool control = ascii < '\x20' || ascii == 0177;
 
-       if(iofd != -1)
-               write(iofd, c, len);
+       if(iofd != -1) {
+               if (xwrite(iofd, c, len) < 0) {
+                       fprintf(stderr, "Error writting in %s:%s\n",
+                               opt_io, strerror(errno));
+                       close(iofd);
+                       iofd = -1;
+               }
+       }
        /*
         * STR sequences must be checked before of anything
         * because it can use some control codes as part of the sequence
@@ -2776,8 +2808,8 @@ main(int argc, char *argv[]) {
 run:
        setlocale(LC_CTYPE, "");
        tnew(80, 24);
-       ttynew();
        xinit();
+       ttynew();
        selinit();
        run();
        return 0;