1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
|
/*
* Dpi for "View source".
*
* This server is an example. Play with it and modify to your taste.
*
* Copyright 2010 Jorge Arellano Cid <jcid@dillo.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
*/
#include <unistd.h>
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include "../dpip/dpip.h"
#include "dpiutil.h"
/*
* Debugging macros
*/
#define _MSG(...)
#define MSG(...) printf("[vsource dpi]: " __VA_ARGS__)
/*---------------------------------------------------------------------------*/
/*
*
*/
int main(void)
{
Dsh *sh;
int data_size, bytes_read = 0;
char *dpip_tag, *cmd = NULL, *url = NULL, *size_str = NULL;
char *d_cmd, *src_str;
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);
/* 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);
/* 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");
/* 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);
a_Dpip_dsh_write_str(sh, 0, d_cmd);
dFree(d_cmd);
a_Dpip_dsh_printf(sh, 0,
"Content-type: text/plain\n\n"
".----------------.\n"
"| Hello World! |\n"
"'----------------'\n\n");
/* Show the dpip tag we received */
a_Dpip_dsh_printf(sh, 0, "Dpip tag received: ");
a_Dpip_dsh_printf(sh, 0, dpip_tag);
dFree(dpip_tag);
dpip_tag = a_Dpip_dsh_read_token(sh, 1);
a_Dpip_dsh_printf(sh, 0, "\nDpip tag received: ");
a_Dpip_dsh_printf(sh, 0, dpip_tag ? dpip_tag : "None");
a_Dpip_dsh_printf(sh, 1, "\n\n");
//dFree(dpip_tag);
size_str = a_Dpip_get_attr(dpip_tag, "data_size");
data_size = strtol(size_str, NULL, 10);
while (bytes_read < data_size &&
(src_str = a_Dpip_dsh_read_token(sh, 1))) {
bytes_read += strlen(src_str);
//a_Dpip_dsh_write_str(sh, 0, src_str);
a_Dpip_dsh_write_str(sh, 1, src_str);
dFree(src_str);
}
dFree(cmd);
dFree(url);
dFree(size_str);
dFree(dpip_tag);
/* Finish the SockHandler */
a_Dpip_dsh_close(sh);
a_Dpip_dsh_free(sh);
return 0;
}
|