mirror of https://github.com/0intro/wmii
wmii(1) is no more. wmiistartrc is now executed under a login shell from wmiiwm, which starts the appropriate wmiirc.
This commit is contained in:
parent
d41f07eecf
commit
97f91bc48b
2
Makefile
2
Makefile
|
@ -9,7 +9,7 @@ SRC = area.c bar.c client.c column.c draw.c event.c frame.c fs.c \
|
|||
geom.c key.c main.c mouse.c rule.c printevent.c util.c view.c
|
||||
OBJ = ${SRC:.c=.o}
|
||||
MAN1 = wmii wmiir wmiiwm wmiiloop
|
||||
SCRIPTS = wmii wmiir wmiiloop wmii9rc
|
||||
SCRIPTS = wmiistartrc wmiir wmiiloop wmii9rc
|
||||
BIN = wmiiwm wmii9menu
|
||||
|
||||
all: options ${BIN}
|
||||
|
|
131
main.c
131
main.c
|
@ -204,13 +204,6 @@ cleanup_handler(int signal) {
|
|||
}
|
||||
}
|
||||
|
||||
static void
|
||||
sigchld_handler(int sig) {
|
||||
int ret;
|
||||
/* We only spawn one child */
|
||||
wait(&ret);
|
||||
}
|
||||
|
||||
static void
|
||||
init_traps() {
|
||||
char buf[1];
|
||||
|
@ -253,26 +246,21 @@ check_9pcon(IXPConn *c) {
|
|||
|
||||
int
|
||||
main(int argc, char *argv[]) {
|
||||
char *wmiirc, *errstr, *namespace, *tmp;
|
||||
char *wmiirc, *errstr, *tmp;
|
||||
char address[1024], ns_path[1024];
|
||||
WMScreen *s;
|
||||
struct passwd *passwd;
|
||||
int i;
|
||||
WMScreen *s;
|
||||
int sock, i;
|
||||
pid_t pid;
|
||||
XSetWindowAttributes wa;
|
||||
|
||||
passwd = getpwuid(getuid());
|
||||
user = estrdup(passwd->pw_name);
|
||||
wmiirc = nil;
|
||||
tmp = getenv("WMII_NS_PATH");
|
||||
if(tmp)
|
||||
strncpy(ns_path, tmp, sizeof(ns_path));
|
||||
else
|
||||
snprintf(ns_path, sizeof(ns_path), "/tmp/ns.%s.%s", user, getenv("DISPLAY"));
|
||||
tmp = getenv("WMII_ADDRESS");
|
||||
if(tmp)
|
||||
strncpy(address, tmp, sizeof(ns_path));
|
||||
else
|
||||
snprintf(address, sizeof(address), "unix!%s/wmii", ns_path);
|
||||
wmiirc = "wmiistartrc";
|
||||
|
||||
address[0] = '\0';
|
||||
if((tmp = getenv("WMII_ADDRESS")) && strlen(tmp) > 0)
|
||||
strncpy(address, tmp, sizeof(address));
|
||||
|
||||
/* command line args */
|
||||
for(i = 1; (i < argc) && (argv[i][0] == '-'); i++) {
|
||||
|
@ -302,10 +290,21 @@ main(int argc, char *argv[]) {
|
|||
}
|
||||
}
|
||||
|
||||
if(!address)
|
||||
usage();
|
||||
if(strncmp(address, "unix!", 5) == 0) {
|
||||
tmp = &address[5];
|
||||
i = strrchr(tmp, '/') - tmp;
|
||||
if(i < 0)
|
||||
fatal("wmiiwm: Bad address\n");
|
||||
strncpy(ns_path, tmp, min(sizeof(ns_path), i));
|
||||
}else if((tmp = getenv("WMII_NS_PATH")) && strlen(tmp) > 0)
|
||||
strncpy(ns_path, tmp, sizeof(ns_path));
|
||||
else
|
||||
snprintf(ns_path, sizeof(ns_path), "/tmp/ns.%s.%s", user, getenv("DISPLAY"));
|
||||
|
||||
setenv("WMII_NS_PATH", ns_path, True);
|
||||
if(strlen(address) == 0)
|
||||
snprintf(address, sizeof(address), "unix!%s/wmii", ns_path);
|
||||
|
||||
setenv("WMII_NS_DIR", ns_path, True);
|
||||
setenv("WMII_ADDRESS", address, True);
|
||||
|
||||
setlocale(LC_CTYPE, "");
|
||||
|
@ -325,56 +324,86 @@ main(int argc, char *argv[]) {
|
|||
|
||||
init_traps();
|
||||
|
||||
/* Make sure that the namespace directory exists */
|
||||
switch(pid = fork()) {
|
||||
case -1:
|
||||
fatal("wmiiwm: Can't fork: %s\n", strerror(errno));
|
||||
break; /* Not reached */
|
||||
case 0:
|
||||
execlp("mkdir", "mkdir", "-m", "0700", "-p", ns_path, nil);
|
||||
fatal("wmiiwm: Can't exec mkdir: %s\n", strerror(errno));
|
||||
break; /* Not reached */
|
||||
default:
|
||||
if(waitpid(pid, &i, WUNTRACED) == -1)
|
||||
fprintf(stderr, "wmiiwm: warning: wait for mkdir returned -1: %s\n",
|
||||
strerror(errno));
|
||||
else if(WEXITSTATUS(i) != 0)
|
||||
fatal("wmiiwm: Can't create namespace dir \"%s\" (mkdir returned %d)\n",
|
||||
ns_path, i);
|
||||
break;
|
||||
}
|
||||
|
||||
/* Check namespace permissions */
|
||||
if(!strncmp(address, "unix!", 5)) {
|
||||
struct stat st;
|
||||
|
||||
namespace = estrdup(&address[5]);
|
||||
for(i = strlen(namespace) - 1; i >= 0; i--)
|
||||
if(namespace[i] == '/') break;
|
||||
namespace[i+1] = '\0';
|
||||
|
||||
if(stat(namespace, &st))
|
||||
fatal("wmiiwm: can't stat namespace directory \"%s\": %s\n",
|
||||
namespace, strerror(errno));
|
||||
if(stat(ns_path, &st))
|
||||
fatal("wmiiwm: can't stat ns_path directory \"%s\": %s\n",
|
||||
ns_path, strerror(errno));
|
||||
if(getuid() != st.st_uid)
|
||||
fatal("wmiiwm: namespace directory \"%s\" exists, "
|
||||
fatal("wmiiwm: ns_path directory \"%s\" exists, "
|
||||
"but is not owned by you",
|
||||
namespace);
|
||||
ns_path);
|
||||
if(st.st_mode & 077)
|
||||
fatal("wmiiwm: namespace directory \"%s\" exists, "
|
||||
fatal("wmiiwm: ns_path directory \"%s\" exists, "
|
||||
"but has group or world permissions",
|
||||
namespace);
|
||||
free(namespace);
|
||||
ns_path);
|
||||
}
|
||||
|
||||
errstr = nil;
|
||||
i = ixp_create_sock(address, &errstr);
|
||||
if(i < 0)
|
||||
fatal("wmiiwm: fatal: %s\n", errstr);
|
||||
sock = ixp_create_sock(address, &errstr);
|
||||
if(sock < 0)
|
||||
fatal("wmiiwm: fatal: %s (%s)\n", errstr, address);
|
||||
|
||||
/* start wmiirc */
|
||||
if(wmiirc) {
|
||||
int name_len = strlen(wmiirc) + 6;
|
||||
char execstr[name_len];
|
||||
signal(SIGCHLD, sigchld_handler);
|
||||
/* Double fork hack */
|
||||
switch(pid = fork()) {
|
||||
case -1:
|
||||
perror("wmiiwm: cannot fork wmiirc");
|
||||
break; /* Not reached */
|
||||
case 0:
|
||||
switch(fork()) {
|
||||
case -1:
|
||||
perror("wmiiwm: cannot fork wmiirc");
|
||||
break; /* Not reached */
|
||||
case 0:
|
||||
if(setsid() == -1)
|
||||
fatal("wmiiwm: can't setsid: %s\n", strerror(errno));
|
||||
close(i);
|
||||
close(sock);
|
||||
close(ConnectionNumber(blz.dpy));
|
||||
snprintf(execstr, name_len, "exec %s", wmiirc);
|
||||
execl("/bin/sh", "sh", "-c", execstr, nil);
|
||||
|
||||
/* Run through the user's shell as a login shell */
|
||||
tmp = malloc(sizeof(char*) * (strlen(passwd->pw_shell) + 2));
|
||||
/* Can't overflow */
|
||||
sprintf(tmp, "-%s", passwd->pw_shell);
|
||||
execl(passwd->pw_shell, tmp, "-c", wmiirc, nil);
|
||||
|
||||
fatal("wmiiwm: can't exec \"%s\": %s\n", wmiirc, strerror(errno));
|
||||
case -1:
|
||||
perror("wmiiwm: cannot fork wmiirc");
|
||||
break; /* Not reached */
|
||||
default:
|
||||
exit(0);
|
||||
break; /* Not reached */
|
||||
}
|
||||
default:
|
||||
waitpid(pid, &i, 0);
|
||||
if(i != 0)
|
||||
exit(1); /* Error already printed */
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
ixp_server_open_conn(&srv, i, &p9srv, check_9pcon, nil);
|
||||
ixp_server_open_conn(&srv, sock, &p9srv, check_9pcon, nil);
|
||||
ixp_server_open_conn(&srv, ConnectionNumber(blz.dpy), nil, check_x_event, nil);
|
||||
|
||||
view = nil;
|
||||
|
@ -401,8 +430,8 @@ main(int argc, char *argv[]) {
|
|||
|
||||
num_screens = 1;
|
||||
screens = emallocz(num_screens * sizeof(*screens));
|
||||
for(i = 0; i < num_screens; i++) {
|
||||
s = &screens[i];
|
||||
for(sock = 0; sock < num_screens; sock++) {
|
||||
s = &screens[sock];
|
||||
s->lbar = nil;
|
||||
s->rbar = nil;
|
||||
s->sel = nil;
|
||||
|
|
|
@ -103,6 +103,8 @@ fn Action {
|
|||
fn Action-rehash { proglist $PATH >$progs_file }
|
||||
fn Action-quit { wmiir xwrite /ctl quit }
|
||||
fn Action-status {
|
||||
flag x -
|
||||
flag r -
|
||||
if(wmiir remove /rbar/status >[2]/dev/null)
|
||||
sleep 2
|
||||
echo $WMII_NORMCOLORS | wmiir create /rbar/status
|
||||
|
|
7
util.c
7
util.c
|
@ -73,6 +73,13 @@ max(int a, int b) {
|
|||
return b;
|
||||
}
|
||||
|
||||
int
|
||||
min(int a, int b) {
|
||||
if(a < b)
|
||||
return a;
|
||||
return b;
|
||||
}
|
||||
|
||||
char *
|
||||
str_nil(char *s) {
|
||||
if(s)
|
||||
|
|
Loading…
Reference in New Issue