xref: /aosp_15_r20/external/libwebsockets/lib/secure-streams/cpp/lssFile.cxx (revision 1c60b9aca93fdbc9b5f19b2d2194c91294b22281)
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