X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fbin%2Frun.c;h=069c09ae88e0e1cea7e80e630ccfc2cb8f8f4b87;hb=dbb9b33dd9ab302713744fa4acbf10c80a36f34a;hp=ebd9833c2f667503c88132837f84204ad2c2bc5f;hpb=a3df8575c37898c17a1aedf95a98090550386e4a;p=framework%2Fuifw%2Felementary.git diff --git a/src/bin/run.c b/src/bin/run.c index ebd9833..069c09a 100644 --- a/src/bin/run.c +++ b/src/bin/run.c @@ -7,6 +7,9 @@ #include #include #include +#ifdef HAVE_ENVIRON +# define _GNU_SOURCE 1 +#endif #include #include #include @@ -14,12 +17,16 @@ # include #endif +#ifdef HAVE_ENVIRON +extern char **environ; +#endif + #define LENGTH_OF_SOCKADDR_UN(s) (strlen((s)->sun_path) + (size_t)(((struct sockaddr_un *)NULL)->sun_path)) int main(int argc, char **argv) { - int sock, socket_unix_len, i; + int sock, socket_unix_len, i, n; struct sockaddr_un socket_unix; char buf[PATH_MAX]; struct stat st; @@ -28,7 +35,7 @@ main(int argc, char **argv) char *disp; char *cwd; - int sargc, slen; + int sargc, slen, envnum; unsigned char *sbuf = NULL, *pos; char **sargv = NULL; @@ -38,11 +45,7 @@ main(int argc, char **argv) exit(-1); } cwd = strdup(buf); - if (!(disp = getenv("DISPLAY"))) - { - fprintf(stderr, "elementary_quicklaunch: DISPLAY env var not set\n"); - exit(-1); - } + if (!(disp = getenv("DISPLAY"))) disp = "unknown"; snprintf(buf, sizeof(buf), "/tmp/elm-ql-%i/%s", getuid(), disp); if ((sock = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) { @@ -51,6 +54,7 @@ main(int argc, char **argv) } socket_unix.sun_family = AF_UNIX; strncpy(socket_unix.sun_path, buf, sizeof(socket_unix.sun_path)); + socket_unix.sun_path[(int)(sizeof(socket_unix.sun_path)/sizeof(socket_unix.sun_path[0])) - 1] = '\0'; socket_unix_len = LENGTH_OF_SOCKADDR_UN(&socket_unix); if (connect(sock, (struct sockaddr *)&socket_unix, socket_unix_len) < 0) { @@ -134,25 +138,72 @@ main(int argc, char **argv) sargc = argc - 1; sargv = &(argv[1]); } - slen = sizeof(unsigned long) + sizeof(unsigned long); + + slen = 0; + envnum = 0; + + // header: + // UL 'total bytes' + // UL 'argnum' + // UL 'envnum' + slen += sizeof(unsigned long) * 3; + for (i = 0; i < sargc; i++) { slen += sizeof(unsigned long); slen += strlen(sargv[i]) + 1; } + +#ifdef HAVE_ENVIRON + // count how much space is needed for environment + for (i = 0; environ[i]; i++) + { + slen += sizeof(unsigned long); + slen += strlen(environ[i]) + 1; + envnum++; + } +#endif + + // how much space is needed for cwd + slen += sizeof(unsigned long); slen += strlen(cwd) + 1; + + // allocate buffer on stack sbuf = alloca(slen); + + // fill in header ((unsigned long *)(sbuf))[0] = slen - sizeof(unsigned long); ((unsigned long *)(sbuf))[1] = sargc; - pos = (unsigned char *)(&((((unsigned long *)(sbuf))[2 + sargc]))); + ((unsigned long *)(sbuf))[2] = envnum; + // pos pointer after header + pos = (unsigned char *)(&((((unsigned long *)(sbuf))[3 + sargc + envnum + 1]))); + n = 3; + + // fill in args for (i = 0; i < sargc; i++) { - ((unsigned long *)(sbuf))[2 + i] = - (unsigned long)pos - ((unsigned long)sbuf + sizeof(unsigned long)); + ((unsigned long *)(sbuf))[n] = (unsigned long)pos - (unsigned long)sbuf; strcpy((char *)pos, sargv[i]); pos += strlen(sargv[i]) + 1; + n++; } + +#ifdef HAVE_ENVIRON + // fill in environ + for (i = 0; environ[i]; i++) + { + ((unsigned long *)(sbuf))[n] = (unsigned long)pos - (unsigned long)sbuf; + strcpy((char *)pos, environ[i]); + pos += strlen(environ[i]) + 1; + n++; + } +#endif + + // fill in cwd + ((unsigned long *)(sbuf))[n] = (unsigned long)pos - (unsigned long)sbuf; + n++; strcpy((char *)pos, cwd); + if (write(sock, sbuf, slen) < 0) printf("elementary_quicklaunch: cannot write to socket '%s'\n", buf); close(sock);