surf-2.0-externalpipe.diff - sites - public wiki contents of suckless.org
 (HTM) git clone git://git.suckless.org/sites
 (DIR) Log
 (DIR) Files
 (DIR) Refs
       ---
       surf-2.0-externalpipe.diff (2379B)
       ---
            1 diff --git a/surf.c b/surf.c
            2 index 93a1629..ba53b94 100644
            3 --- a/surf.c
            4 +++ b/surf.c
            5 @@ -217,6 +217,7 @@ static void togglefullscreen(Client *c, const Arg *a);
            6  static void togglecookiepolicy(Client *c, const Arg *a);
            7  static void toggleinspector(Client *c, const Arg *a);
            8  static void find(Client *c, const Arg *a);
            9 +static void externalpipe(Client *c, const Arg *a);
           10  
           11  /* Buttons */
           12  static void clicknavigate(Client *c, const Arg *a, WebKitHitTestResult *h);
           13 @@ -241,6 +242,80 @@ char *argv0;
           14  /* configuration, allows nested code to access above variables */
           15  #include "config.h"
           16  
           17 +static void
           18 +externalpipe_execute(char* buffer, Arg *arg) {
           19 +        int to[2];
           20 +        void (*oldsigpipe)(int);
           21 +
           22 +        if (pipe(to) == -1)
           23 +                return;
           24 +
           25 +        switch (fork()) {
           26 +        case -1:
           27 +                close(to[0]);
           28 +                close(to[1]);
           29 +                return;
           30 +        case 0:
           31 +                dup2(to[0], STDIN_FILENO); close(to[0]); close(to[1]);
           32 +                execvp(((char **)arg->v)[0], (char **)arg->v);
           33 +                fprintf(stderr, "st: execvp %s\n", ((char **)arg->v)[0]);
           34 +                perror("failed");
           35 +                exit(0);
           36 +        }
           37 +
           38 +        close(to[0]);
           39 +        oldsigpipe = signal(SIGPIPE, SIG_IGN);
           40 +        write(to[1], buffer, strlen(buffer));
           41 +        close(to[1]);
           42 +        signal(SIGPIPE, oldsigpipe);
           43 +}
           44 +
           45 +static void
           46 +externalpipe_resource_done(WebKitWebResource *r, GAsyncResult *s, Arg *arg)
           47 +{
           48 +        GError *gerr = NULL;
           49 +        guchar *buffer = webkit_web_resource_get_data_finish(r, s, NULL, &gerr);
           50 +        if (gerr == NULL) {
           51 +                externalpipe_execute((char *) buffer, arg);
           52 +        } else {
           53 +                g_error_free(gerr);
           54 +        }
           55 +        g_free(buffer);
           56 +}
           57 +
           58 +static void
           59 +externalpipe_js_done(WebKitWebView *wv, GAsyncResult *s, Arg *arg)
           60 +{
           61 +        WebKitJavascriptResult *j = webkit_web_view_run_javascript_finish(
           62 +                wv, s, NULL);
           63 +        if (!j) {
           64 +                return;
           65 +        }
           66 +        JSCValue *v = webkit_javascript_result_get_js_value(j);
           67 +        if (jsc_value_is_string(v)) {
           68 +                char *buffer = jsc_value_to_string(v);
           69 +                externalpipe_execute(buffer, arg);
           70 +                g_free(buffer);
           71 +        }
           72 +        webkit_javascript_result_unref(j);
           73 +}
           74 +
           75 +void
           76 +externalpipe(Client *c, const Arg *arg)
           77 +{
           78 +        if (curconfig[JavaScript].val.i) {
           79 +                webkit_web_view_run_javascript(
           80 +                        c->view, "window.document.documentElement.outerHTML",
           81 +                        NULL, externalpipe_js_done, arg);
           82 +        } else {
           83 +                WebKitWebResource *resource = webkit_web_view_get_main_resource(c->view);
           84 +                if (resource != NULL) {
           85 +                        webkit_web_resource_get_data(
           86 +                                resource, NULL, externalpipe_resource_done, arg);
           87 +                }
           88 +        }
           89 +}
           90 +
           91  void
           92  usage(void)
           93  {