1*1c60b9acSAndroid Build Coastguard Worker /*
2*1c60b9acSAndroid Build Coastguard Worker * libwebsockets - small server side websockets and web server implementation
3*1c60b9acSAndroid Build Coastguard Worker *
4*1c60b9acSAndroid Build Coastguard Worker * Copyright (C) 2020 Andy Green <[email protected]>
5*1c60b9acSAndroid Build Coastguard Worker *
6*1c60b9acSAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining a copy
7*1c60b9acSAndroid Build Coastguard Worker * of this software and associated documentation files (the "Software"), to
8*1c60b9acSAndroid Build Coastguard Worker * deal in the Software without restriction, including without limitation the
9*1c60b9acSAndroid Build Coastguard Worker * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
10*1c60b9acSAndroid Build Coastguard Worker * sell copies of the Software, and to permit persons to whom the Software is
11*1c60b9acSAndroid Build Coastguard Worker * furnished to do so, subject to the following conditions:
12*1c60b9acSAndroid Build Coastguard Worker *
13*1c60b9acSAndroid Build Coastguard Worker * The above copyright notice and this permission notice shall be included in
14*1c60b9acSAndroid Build Coastguard Worker * all copies or substantial portions of the Software.
15*1c60b9acSAndroid Build Coastguard Worker *
16*1c60b9acSAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17*1c60b9acSAndroid Build Coastguard Worker * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18*1c60b9acSAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19*1c60b9acSAndroid Build Coastguard Worker * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20*1c60b9acSAndroid Build Coastguard Worker * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21*1c60b9acSAndroid Build Coastguard Worker * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
22*1c60b9acSAndroid Build Coastguard Worker * IN THE SOFTWARE.
23*1c60b9acSAndroid Build Coastguard Worker *
24*1c60b9acSAndroid Build Coastguard Worker * C++ classes for Secure Streams - file transaction
25*1c60b9acSAndroid Build Coastguard Worker */
26*1c60b9acSAndroid Build Coastguard Worker
27*1c60b9acSAndroid Build Coastguard Worker #include <libwebsockets.hxx>
28*1c60b9acSAndroid Build Coastguard Worker
29*1c60b9acSAndroid Build Coastguard Worker #include <stdlib.h>
30*1c60b9acSAndroid Build Coastguard Worker #include <fcntl.h>
31*1c60b9acSAndroid Build Coastguard Worker #include <unistd.h>
32*1c60b9acSAndroid Build Coastguard Worker
33*1c60b9acSAndroid Build Coastguard Worker static lws_ss_state_return_t
lssfile_rx(void * userobj,const uint8_t * buf,size_t len,int flags)34*1c60b9acSAndroid Build Coastguard Worker lssfile_rx(void *userobj, const uint8_t *buf, size_t len, int flags)
35*1c60b9acSAndroid Build Coastguard Worker {
36*1c60b9acSAndroid Build Coastguard Worker lssFile *lf = (lssFile *)userobj_to_lss(userobj);
37*1c60b9acSAndroid Build Coastguard Worker
38*1c60b9acSAndroid Build Coastguard Worker return lf->write(buf, len, flags);
39*1c60b9acSAndroid Build Coastguard Worker }
40*1c60b9acSAndroid Build Coastguard Worker
41*1c60b9acSAndroid Build Coastguard Worker static lws_ss_state_return_t
lssfile_tx(void * userobj,lws_ss_tx_ordinal_t ord,uint8_t * buf,size_t * len,int * flags)42*1c60b9acSAndroid Build Coastguard Worker lssfile_tx(void *userobj, lws_ss_tx_ordinal_t ord,uint8_t *buf, size_t *len,
43*1c60b9acSAndroid Build Coastguard Worker int *flags)
44*1c60b9acSAndroid Build Coastguard Worker {
45*1c60b9acSAndroid Build Coastguard Worker /*
46*1c60b9acSAndroid Build Coastguard Worker * TODO: we don't know how to send things yet
47*1c60b9acSAndroid Build Coastguard Worker */
48*1c60b9acSAndroid Build Coastguard Worker return LWSSSSRET_TX_DONT_SEND;
49*1c60b9acSAndroid Build Coastguard Worker }
50*1c60b9acSAndroid Build Coastguard Worker
51*1c60b9acSAndroid Build Coastguard Worker static lws_ss_state_return_t
lssfile_state(void * userobj,void * h_src,lws_ss_constate_t state,lws_ss_tx_ordinal_t ack)52*1c60b9acSAndroid Build Coastguard Worker lssfile_state(void *userobj, void *h_src, lws_ss_constate_t state,
53*1c60b9acSAndroid Build Coastguard Worker lws_ss_tx_ordinal_t ack)
54*1c60b9acSAndroid Build Coastguard Worker {
55*1c60b9acSAndroid Build Coastguard Worker lssFile *lf = (lssFile *)userobj_to_lss(userobj);
56*1c60b9acSAndroid Build Coastguard Worker
57*1c60b9acSAndroid Build Coastguard Worker lwsl_info("%s: state %s\n", __func__, lws_ss_state_name(state));
58*1c60b9acSAndroid Build Coastguard Worker
59*1c60b9acSAndroid Build Coastguard Worker switch (state) {
60*1c60b9acSAndroid Build Coastguard Worker
61*1c60b9acSAndroid Build Coastguard Worker /*
62*1c60b9acSAndroid Build Coastguard Worker * These reflect some kind of final disposition for the transaction,
63*1c60b9acSAndroid Build Coastguard Worker * that we want to report along with the completion. If no other chance
64*1c60b9acSAndroid Build Coastguard Worker * we'll report DESTROYING
65*1c60b9acSAndroid Build Coastguard Worker */
66*1c60b9acSAndroid Build Coastguard Worker
67*1c60b9acSAndroid Build Coastguard Worker case LWSSSCS_DESTROYING:
68*1c60b9acSAndroid Build Coastguard Worker case LWSSSCS_ALL_RETRIES_FAILED:
69*1c60b9acSAndroid Build Coastguard Worker case LWSSSCS_QOS_ACK_REMOTE:
70*1c60b9acSAndroid Build Coastguard Worker case LWSSSCS_QOS_NACK_REMOTE:
71*1c60b9acSAndroid Build Coastguard Worker lf->call_completion(state);
72*1c60b9acSAndroid Build Coastguard Worker
73*1c60b9acSAndroid Build Coastguard Worker if (state == LWSSSCS_DESTROYING) {
74*1c60b9acSAndroid Build Coastguard Worker /*
75*1c60b9acSAndroid Build Coastguard Worker * we get DESTROYING because we are already in the
76*1c60b9acSAndroid Build Coastguard Worker * middle of destroying the m_ss, unlink the C++ lss
77*1c60b9acSAndroid Build Coastguard Worker * from the ss handle so it won't recursively try to
78*1c60b9acSAndroid Build Coastguard Worker * destroy it
79*1c60b9acSAndroid Build Coastguard Worker */
80*1c60b9acSAndroid Build Coastguard Worker lf->m_ss = NULL;
81*1c60b9acSAndroid Build Coastguard Worker delete lf;
82*1c60b9acSAndroid Build Coastguard Worker }
83*1c60b9acSAndroid Build Coastguard Worker
84*1c60b9acSAndroid Build Coastguard Worker break;
85*1c60b9acSAndroid Build Coastguard Worker }
86*1c60b9acSAndroid Build Coastguard Worker
87*1c60b9acSAndroid Build Coastguard Worker return LWSSSSRET_OK;
88*1c60b9acSAndroid Build Coastguard Worker }
89*1c60b9acSAndroid Build Coastguard Worker
write(const uint8_t * buf,size_t len,int flags)90*1c60b9acSAndroid Build Coastguard Worker lws_ss_state_return_t lssFile::write(const uint8_t *buf, size_t len, int flags)
91*1c60b9acSAndroid Build Coastguard Worker {
92*1c60b9acSAndroid Build Coastguard Worker if (fd == LWS_INVALID_FILE) {
93*1c60b9acSAndroid Build Coastguard Worker
94*1c60b9acSAndroid Build Coastguard Worker fd = open(path.c_str(), O_WRONLY | O_CREAT | O_TRUNC, 0640);
95*1c60b9acSAndroid Build Coastguard Worker if (fd == LWS_INVALID_FILE)
96*1c60b9acSAndroid Build Coastguard Worker return LWSSSSRET_DESTROY_ME;
97*1c60b9acSAndroid Build Coastguard Worker }
98*1c60b9acSAndroid Build Coastguard Worker
99*1c60b9acSAndroid Build Coastguard Worker if (::write(fd, buf, len) != len) {
100*1c60b9acSAndroid Build Coastguard Worker close(fd);
101*1c60b9acSAndroid Build Coastguard Worker fd = LWS_INVALID_FILE;
102*1c60b9acSAndroid Build Coastguard Worker
103*1c60b9acSAndroid Build Coastguard Worker return LWSSSSRET_DESTROY_ME;
104*1c60b9acSAndroid Build Coastguard Worker }
105*1c60b9acSAndroid Build Coastguard Worker
106*1c60b9acSAndroid Build Coastguard Worker rxlen += len;
107*1c60b9acSAndroid Build Coastguard Worker
108*1c60b9acSAndroid Build Coastguard Worker if (flags & LWSSS_FLAG_EOM) {
109*1c60b9acSAndroid Build Coastguard Worker close(fd);
110*1c60b9acSAndroid Build Coastguard Worker fd = LWS_INVALID_FILE;
111*1c60b9acSAndroid Build Coastguard Worker }
112*1c60b9acSAndroid Build Coastguard Worker
113*1c60b9acSAndroid Build Coastguard Worker return LWSSSSRET_OK;
114*1c60b9acSAndroid Build Coastguard Worker }
115*1c60b9acSAndroid Build Coastguard Worker
lssFile(lws_ctx_t ctx,std::string uri,std::string _path,lsscomp_t comp,bool _psh)116*1c60b9acSAndroid Build Coastguard Worker lssFile::lssFile(lws_ctx_t ctx, std::string uri, std::string _path,
117*1c60b9acSAndroid Build Coastguard Worker lsscomp_t comp, bool _psh) :
118*1c60b9acSAndroid Build Coastguard Worker lss(ctx, uri, comp, _psh, lssfile_rx, lssfile_tx, lssfile_state)
119*1c60b9acSAndroid Build Coastguard Worker {
120*1c60b9acSAndroid Build Coastguard Worker path = _path;
121*1c60b9acSAndroid Build Coastguard Worker push = _psh;
122*1c60b9acSAndroid Build Coastguard Worker fd = LWS_INVALID_FILE;
123*1c60b9acSAndroid Build Coastguard Worker }
124*1c60b9acSAndroid Build Coastguard Worker
~lssFile()125*1c60b9acSAndroid Build Coastguard Worker lssFile::~lssFile()
126*1c60b9acSAndroid Build Coastguard Worker {
127*1c60b9acSAndroid Build Coastguard Worker if (fd == LWS_INVALID_FILE)
128*1c60b9acSAndroid Build Coastguard Worker return;
129*1c60b9acSAndroid Build Coastguard Worker
130*1c60b9acSAndroid Build Coastguard Worker close(fd);
131*1c60b9acSAndroid Build Coastguard Worker fd = LWS_INVALID_FILE;
132*1c60b9acSAndroid Build Coastguard Worker }
133