1 #include "elementary_config.h"
8 #include <sys/socket.h>
17 #define LENGTH_OF_SOCKADDR_UN(s) (strlen((s)->sun_path) + (size_t)(((struct sockaddr_un *)NULL)->sun_path))
20 main(int argc, char **argv)
22 int sock, socket_unix_len, i;
23 struct sockaddr_un socket_unix;
27 int we_are_elementary_run = 0;
32 unsigned char *sbuf = NULL, *pos;
35 if (!getcwd(buf, sizeof(buf) - 1))
37 fprintf(stderr, "elementary_quicklaunch: currect working dir too big.\n");
41 if (!(disp = getenv("DISPLAY")))
43 fprintf(stderr, "elementary_quicklaunch: DISPLAY env var not set\n");
46 snprintf(buf, sizeof(buf), "/tmp/elm-ql-%i/%s", getuid(), disp);
47 if ((sock = socket(AF_UNIX, SOCK_STREAM, 0)) < 0)
49 perror("elementary_quicklaunch: socket(AF_UNIX, SOCK_STREAM, 0)");
52 socket_unix.sun_family = AF_UNIX;
53 strncpy(socket_unix.sun_path, buf, sizeof(socket_unix.sun_path));
54 socket_unix_len = LENGTH_OF_SOCKADDR_UN(&socket_unix);
55 if (connect(sock, (struct sockaddr *)&socket_unix, socket_unix_len) < 0)
57 perror("elementary_quicklaunch: connect(sock, (struct sockaddr *)&socket_unix, socket_unix_len)");
58 printf("elementary_quicklaunch: cannot connect to socket '%s'\n", buf);
62 if (!(((exe[0] == '/')) ||
63 ((exe[0] == '.') && (exe[1] == '/')) ||
64 ((exe[0] == '.') && (exe[1] == '.') && (exe[2] == '/'))))
66 char *path = getenv("PATH");
67 int exelen = strlen(argv[0]);
77 if ((*p == ':') || (!*p))
82 if (len < (sizeof(buf) - exelen - 3))
84 strncpy(buf, pp, len);
85 strcpy(buf + len, "/");
86 strcpy(buf + len + 1, argv[0]);
87 if (!access(buf, R_OK | X_OK))
107 if (!lstat(exe, &st))
109 if (S_ISLNK(st.st_mode))
113 ssize_t len = readlink(exe, buf2, sizeof(buf2) - 1);
118 p = strrchr(buf2, '/');
121 if (!strncasecmp(p, "elementary_run", 14))
122 we_are_elementary_run = 1;
127 if (we_are_elementary_run)
137 slen = sizeof(unsigned long) + sizeof(unsigned long);
138 for (i = 0; i < sargc; i++)
140 slen += sizeof(unsigned long);
141 slen += strlen(sargv[i]) + 1;
143 slen += strlen(cwd) + 1;
145 ((unsigned long *)(sbuf))[0] = slen - sizeof(unsigned long);
146 ((unsigned long *)(sbuf))[1] = sargc;
147 pos = (unsigned char *)(&((((unsigned long *)(sbuf))[2 + sargc])));
148 for (i = 0; i < sargc; i++)
150 ((unsigned long *)(sbuf))[2 + i] =
151 (unsigned long)pos - ((unsigned long)sbuf + sizeof(unsigned long));
152 strcpy((char *)pos, sargv[i]);
153 pos += strlen(sargv[i]) + 1;
155 strcpy((char *)pos, cwd);
156 if (write(sock, sbuf, slen) < 0)
157 printf("elementary_quicklaunch: cannot write to socket '%s'\n", buf);