diff options
Diffstat (limited to 'dpi/hello.c')
-rw-r--r-- | dpi/hello.c | 81 |
1 files changed, 55 insertions, 26 deletions
diff --git a/dpi/hello.c b/dpi/hello.c index 250a4a44..4643efc5 100644 --- a/dpi/hello.c +++ b/dpi/hello.c @@ -36,7 +36,7 @@ int main(void) { FILE *in_stream; - SockHandler *sh; + Dsh *sh; char *dpip_tag, *cmd = NULL, *url = NULL, *child_cmd = NULL; char *esc_tag, *d_cmd; size_t n; @@ -45,21 +45,46 @@ int main(void) char *choice[] = {"Window was closed", "Yes", "No", "Could be", "It's OK", "Cancel"}; /* "Could>be", ">It's OK", "Can'>cel"}; --for testing */ - int choice_num; + int choice_num = -1; MSG("starting...\n"); + /* sleep(20) */ + + /* Initialize the SockHandler. + * This means we'll use stdin for input and stdout for output. + * In case of a server dpi, we'd use a socket and pass its file descriptor + * twice (e.g. a_Dpip_dsh_new(sock_fd, sock_fd, 1024). + * (Note: by now the last parameter is not used) */ + sh = a_Dpip_dsh_new(STDIN_FILENO, STDOUT_FILENO, 2*1024); + + /* Authenticate our client... + * As we're using Internet domain sockets, DPIP checks whether the client + * runs with the user's ID, by means of a shared secret. The DPIP API does + * the work for us. */ + if (!(dpip_tag = a_Dpip_dsh_read_token(sh, 1)) || + a_Dpip_check_auth(dpip_tag) < 0) { + MSG("can't authenticate request: %s\n", dStrerror(errno)); + a_Dpip_dsh_close(sh); + return 1; + } + dFree(dpip_tag); - /* Initialize the SockHandler */ - sh = sock_handler_new(STDIN_FILENO, STDOUT_FILENO, 2*1024); - - /* Read the dpi command from STDIN */ - dpip_tag = sock_handler_read(sh); + /* Read the dpi command from STDIN + * Now we're past the authentication phase, let's see what's dillo + * asking from us. a_Dpip_dsh_read_token() will block and return + * a full dpip token or null on error (it's commented in dpip.c) */ + dpip_tag = a_Dpip_dsh_read_token(sh, 1); MSG("tag = [%s]\n", dpip_tag); - cmd = a_Dpip_get_attr(dpip_tag, strlen(dpip_tag), "cmd"); - url = a_Dpip_get_attr(dpip_tag, strlen(dpip_tag), "url"); + /* Now that we have the dpip_tag, let's isolate the command and url */ + cmd = a_Dpip_get_attr(dpip_tag, "cmd"); + url = a_Dpip_get_attr(dpip_tag, "url"); /*-- Dialog part */ +/* This is the dialog window. This is an example of interaction with + * the user. If you're starting to understand dpis, comment this out + * by switching to "#if 0" and the dialog will be disabled. */ +#if 1 { char *dpip_tag2, *dialog_msg; @@ -69,15 +94,15 @@ int main(void) "cmd=%s msg=%s alt1=%s alt2=%s alt3=%s alt4=%s alt5=%s", "dialog", "Do you want to see the hello page?", choice[1], choice[2], choice[3], choice[4], choice[5]); - sock_handler_write_str(sh, 1, d_cmd); + a_Dpip_dsh_write_str(sh, 1, d_cmd); dFree(d_cmd); /* Get the answer */ - dpip_tag2 = sock_handler_read(sh); + dpip_tag2 = a_Dpip_dsh_read_token(sh, 1); MSG("tag = [%s]\n", dpip_tag2); /* Get "msg" value */ - dialog_msg = a_Dpip_get_attr(dpip_tag2, strlen(dpip_tag2), "msg"); + dialog_msg = a_Dpip_get_attr(dpip_tag2, "msg"); choice_num = 0; if (dialog_msg) choice_num = *dialog_msg - '0'; @@ -85,14 +110,16 @@ int main(void) dFree(dialog_msg); dFree(dpip_tag2); } +#endif /*-- EOD part */ - /* Start sending our answer */ + /* Start sending our answer. + * (You can read the comments for DPIP API functions in dpip/dpip.c) */ d_cmd = a_Dpip_build_cmd("cmd=%s url=%s", "start_send_page", url); - sock_handler_write_str(sh, 0, d_cmd); + a_Dpip_dsh_write_str(sh, 0, d_cmd); dFree(d_cmd); - sock_handler_printf(sh, 0, + a_Dpip_dsh_printf(sh, 0, "Content-type: text/html\n\n" "<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01 Transitional//EN'>\n" "<html>\n" @@ -100,17 +127,17 @@ int main(void) "<body><hr><h1>Hello world!</h1><hr>\n<br><br>\n"); /* Show the choice received with the dialog */ - sock_handler_printf(sh, 0, + a_Dpip_dsh_printf(sh, 0, "<hr>\n" "<table width='100%%' border='1' bgcolor='burlywood'><tr><td>\n" "<big><em>Dialog question:</em> Do you want to see the hello page?<br>\n" "<em>Answer received:</em> <b>%s</b></big> </table>\n" "<hr>\n", - choice[choice_num]); + choice_num < 0 ? "There was NO dialog!" : choice[choice_num]); /* Show the dpip tag we received */ esc_tag = Escape_html_str(dpip_tag); - sock_handler_printf(sh, 0, + a_Dpip_dsh_printf(sh, 0, "<h3>dpip tag received:</h3>\n" "<pre>\n%s</pre>\n" "<br><small>(<b>dpip:</b> dpi protocol)</small><br><br><br>\n", @@ -119,7 +146,9 @@ int main(void) /* Now something more interesting, - * fork a command and show its feedback */ + * fork a command and show its feedback. + * (An example of generating dynamic content with an external + * program). */ if (cmd && url) { child_cmd = dStrdup("date -R"); MSG("[%s]\n", child_cmd); @@ -130,15 +159,15 @@ int main(void) return EXIT_FAILURE; } - sock_handler_printf(sh, 0, "<h3>date:</h3>\n"); - sock_handler_printf(sh, 0, "<pre>\n"); + a_Dpip_dsh_write_str(sh, 0, "<h3>date:</h3>\n"); + a_Dpip_dsh_write_str(sh, 0, "<pre>\n"); /* Read/Write */ while ((n = fread (buf, 1, 4096, in_stream)) > 0) { - sock_handler_write(sh, 0, buf, n); + a_Dpip_dsh_write(sh, 0, buf, n); } - sock_handler_printf(sh, 0, "</pre>\n"); + a_Dpip_dsh_write_str(sh, 0, "</pre>\n"); if ((ret = pclose(in_stream)) != 0) MSG("popen: [%d]\n", ret); @@ -146,15 +175,15 @@ int main(void) dFree(child_cmd); } - sock_handler_printf(sh, 1, "</body></html>\n"); + a_Dpip_dsh_write_str(sh, 1, "</body></html>\n"); dFree(cmd); dFree(url); dFree(dpip_tag); /* Finish the SockHandler */ - sock_handler_close(sh); - sock_handler_free(sh); + a_Dpip_dsh_close(sh); + a_Dpip_dsh_free(sh); return 0; } |