1d4afb5ceSopenharmony_ci/* 2d4afb5ceSopenharmony_ci * libwebsockets - small server side websockets and web server implementation 3d4afb5ceSopenharmony_ci * 4d4afb5ceSopenharmony_ci * Copyright (C) 2010 - 2019 Andy Green <andy@warmcat.com> 5d4afb5ceSopenharmony_ci * 6d4afb5ceSopenharmony_ci * Permission is hereby granted, free of charge, to any person obtaining a copy 7d4afb5ceSopenharmony_ci * of this software and associated documentation files (the "Software"), to 8d4afb5ceSopenharmony_ci * deal in the Software without restriction, including without limitation the 9d4afb5ceSopenharmony_ci * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 10d4afb5ceSopenharmony_ci * sell copies of the Software, and to permit persons to whom the Software is 11d4afb5ceSopenharmony_ci * furnished to do so, subject to the following conditions: 12d4afb5ceSopenharmony_ci * 13d4afb5ceSopenharmony_ci * The above copyright notice and this permission notice shall be included in 14d4afb5ceSopenharmony_ci * all copies or substantial portions of the Software. 15d4afb5ceSopenharmony_ci * 16d4afb5ceSopenharmony_ci * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17d4afb5ceSopenharmony_ci * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18d4afb5ceSopenharmony_ci * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19d4afb5ceSopenharmony_ci * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20d4afb5ceSopenharmony_ci * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 21d4afb5ceSopenharmony_ci * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 22d4afb5ceSopenharmony_ci * IN THE SOFTWARE. 23d4afb5ceSopenharmony_ci */ 24d4afb5ceSopenharmony_ci 25d4afb5ceSopenharmony_ci#include "private-lib-core.h" 26d4afb5ceSopenharmony_ci 27d4afb5ceSopenharmony_ciint lws_plat_apply_FD_CLOEXEC(int n) 28d4afb5ceSopenharmony_ci{ 29d4afb5ceSopenharmony_ci return 0; 30d4afb5ceSopenharmony_ci} 31d4afb5ceSopenharmony_ci 32d4afb5ceSopenharmony_ci 33d4afb5ceSopenharmony_cilws_fop_fd_t IRAM_ATTR 34d4afb5ceSopenharmony_ci_lws_plat_file_open(const struct lws_plat_file_ops *fops, const char *filename, 35d4afb5ceSopenharmony_ci const char *vpath, lws_fop_flags_t *flags) 36d4afb5ceSopenharmony_ci{ 37d4afb5ceSopenharmony_ci struct stat stat_buf; 38d4afb5ceSopenharmony_ci lws_fop_fd_t fop_fd; 39d4afb5ceSopenharmony_ci int ret = open(filename, *flags, 0664); 40d4afb5ceSopenharmony_ci 41d4afb5ceSopenharmony_ci if (ret < 0) 42d4afb5ceSopenharmony_ci return NULL; 43d4afb5ceSopenharmony_ci 44d4afb5ceSopenharmony_ci if (fstat(ret, &stat_buf) < 0) 45d4afb5ceSopenharmony_ci goto bail; 46d4afb5ceSopenharmony_ci 47d4afb5ceSopenharmony_ci fop_fd = lws_malloc(sizeof(*fop_fd), "fops open"); 48d4afb5ceSopenharmony_ci if (!fop_fd) 49d4afb5ceSopenharmony_ci goto bail; 50d4afb5ceSopenharmony_ci 51d4afb5ceSopenharmony_ci fop_fd->fops = fops; 52d4afb5ceSopenharmony_ci fop_fd->fd = ret; 53d4afb5ceSopenharmony_ci fop_fd->flags = *flags; 54d4afb5ceSopenharmony_ci fop_fd->filesystem_priv = NULL; /* we don't use it */ 55d4afb5ceSopenharmony_ci fop_fd->pos = 0; 56d4afb5ceSopenharmony_ci fop_fd->len = stat_buf.st_size; 57d4afb5ceSopenharmony_ci 58d4afb5ceSopenharmony_ci return fop_fd; 59d4afb5ceSopenharmony_ci 60d4afb5ceSopenharmony_cibail: 61d4afb5ceSopenharmony_ci close(ret); 62d4afb5ceSopenharmony_ci 63d4afb5ceSopenharmony_ci return NULL; 64d4afb5ceSopenharmony_ci} 65d4afb5ceSopenharmony_ci 66d4afb5ceSopenharmony_ciint IRAM_ATTR 67d4afb5ceSopenharmony_ci_lws_plat_file_close(lws_fop_fd_t *fops_fd) 68d4afb5ceSopenharmony_ci{ 69d4afb5ceSopenharmony_ci int fd = (*fops_fd)->fd; 70d4afb5ceSopenharmony_ci 71d4afb5ceSopenharmony_ci lws_free(*fops_fd); 72d4afb5ceSopenharmony_ci *fops_fd = NULL; 73d4afb5ceSopenharmony_ci 74d4afb5ceSopenharmony_ci return close(fd); 75d4afb5ceSopenharmony_ci} 76d4afb5ceSopenharmony_ci 77d4afb5ceSopenharmony_cilws_fileofs_t IRAM_ATTR 78d4afb5ceSopenharmony_ci_lws_plat_file_seek_cur(lws_fop_fd_t fops_fd, lws_fileofs_t offset) 79d4afb5ceSopenharmony_ci{ 80d4afb5ceSopenharmony_ci return lseek(fops_fd->fd, offset, SEEK_CUR); 81d4afb5ceSopenharmony_ci} 82d4afb5ceSopenharmony_ci 83d4afb5ceSopenharmony_ciint IRAM_ATTR 84d4afb5ceSopenharmony_ci_lws_plat_file_read(lws_fop_fd_t fops_fd, lws_filepos_t *amount, 85d4afb5ceSopenharmony_ci uint8_t *buf, lws_filepos_t len) 86d4afb5ceSopenharmony_ci{ 87d4afb5ceSopenharmony_ci long n; 88d4afb5ceSopenharmony_ci 89d4afb5ceSopenharmony_ci n = read(fops_fd->fd, buf, len); 90d4afb5ceSopenharmony_ci if (n == -1) { 91d4afb5ceSopenharmony_ci *amount = 0; 92d4afb5ceSopenharmony_ci return -1; 93d4afb5ceSopenharmony_ci } 94d4afb5ceSopenharmony_ci fops_fd->pos += n; 95d4afb5ceSopenharmony_ci *amount = n; 96d4afb5ceSopenharmony_ci 97d4afb5ceSopenharmony_ci return 0; 98d4afb5ceSopenharmony_ci} 99d4afb5ceSopenharmony_ci 100d4afb5ceSopenharmony_ciint IRAM_ATTR 101d4afb5ceSopenharmony_ci_lws_plat_file_write(lws_fop_fd_t fops_fd, lws_filepos_t *amount, 102d4afb5ceSopenharmony_ci uint8_t *buf, lws_filepos_t len) 103d4afb5ceSopenharmony_ci{ 104d4afb5ceSopenharmony_ci long n; 105d4afb5ceSopenharmony_ci 106d4afb5ceSopenharmony_ci n = write(fops_fd->fd, buf, len); 107d4afb5ceSopenharmony_ci if (n == -1) { 108d4afb5ceSopenharmony_ci *amount = 0; 109d4afb5ceSopenharmony_ci return -1; 110d4afb5ceSopenharmony_ci } 111d4afb5ceSopenharmony_ci fops_fd->pos += n; 112d4afb5ceSopenharmony_ci *amount = n; 113d4afb5ceSopenharmony_ci 114d4afb5ceSopenharmony_ci return 0; 115d4afb5ceSopenharmony_ci} 116d4afb5ceSopenharmony_ci 117d4afb5ceSopenharmony_ci#if defined(LWS_AMAZON_RTOS) 118d4afb5ceSopenharmony_ciint 119d4afb5ceSopenharmony_cilws_find_string_in_file(const char *filename, const char *string, int stringlen) 120d4afb5ceSopenharmony_ci{ 121d4afb5ceSopenharmony_ci return 0; 122d4afb5ceSopenharmony_ci} 123d4afb5ceSopenharmony_ci#else 124d4afb5ceSopenharmony_ciint 125d4afb5ceSopenharmony_cilws_find_string_in_file(const char *filename, const char *string, int stringlen) 126d4afb5ceSopenharmony_ci{ 127d4afb5ceSopenharmony_ci nvs_handle nvh; 128d4afb5ceSopenharmony_ci size_t s; 129d4afb5ceSopenharmony_ci int n; 130d4afb5ceSopenharmony_ci char buf[64], result[64]; 131d4afb5ceSopenharmony_ci const char *p = strchr(string, ':'), *q; 132d4afb5ceSopenharmony_ci 133d4afb5ceSopenharmony_ci if (!p) 134d4afb5ceSopenharmony_ci return 0; 135d4afb5ceSopenharmony_ci 136d4afb5ceSopenharmony_ci q = string; 137d4afb5ceSopenharmony_ci n = 0; 138d4afb5ceSopenharmony_ci while ((size_t)n < sizeof(buf) - 1 && q != p) 139d4afb5ceSopenharmony_ci buf[n++] = *q++; 140d4afb5ceSopenharmony_ci buf[n] = '\0'; 141d4afb5ceSopenharmony_ci 142d4afb5ceSopenharmony_ci ESP_ERROR_CHECK(nvs_open(filename, NVS_READWRITE, &nvh)); 143d4afb5ceSopenharmony_ci 144d4afb5ceSopenharmony_ci s = sizeof(result) - 1; 145d4afb5ceSopenharmony_ci n = nvs_get_str(nvh, buf, result, &s); 146d4afb5ceSopenharmony_ci nvs_close(nvh); 147d4afb5ceSopenharmony_ci 148d4afb5ceSopenharmony_ci if (n != ESP_OK) 149d4afb5ceSopenharmony_ci return 0; 150d4afb5ceSopenharmony_ci 151d4afb5ceSopenharmony_ci return !strcmp(p + 1, result); 152d4afb5ceSopenharmony_ci} 153d4afb5ceSopenharmony_ci#endif 154d4afb5ceSopenharmony_ci 155d4afb5ceSopenharmony_ci#if !defined(LWS_AMAZON_RTOS) 156d4afb5ceSopenharmony_ciint 157d4afb5ceSopenharmony_cilws_plat_write_file(const char *filename, void *buf, size_t len) 158d4afb5ceSopenharmony_ci{ 159d4afb5ceSopenharmony_ci nvs_handle nvh; 160d4afb5ceSopenharmony_ci int n; 161d4afb5ceSopenharmony_ci 162d4afb5ceSopenharmony_ci if (nvs_open("lws-station", NVS_READWRITE, &nvh)) { 163d4afb5ceSopenharmony_ci lwsl_notice("%s: failed to open nvs\n", __func__); 164d4afb5ceSopenharmony_ci return -1; 165d4afb5ceSopenharmony_ci } 166d4afb5ceSopenharmony_ci 167d4afb5ceSopenharmony_ci n = nvs_set_blob(nvh, filename, buf, len); 168d4afb5ceSopenharmony_ci if (n >= 0) 169d4afb5ceSopenharmony_ci nvs_commit(nvh); 170d4afb5ceSopenharmony_ci 171d4afb5ceSopenharmony_ci nvs_close(nvh); 172d4afb5ceSopenharmony_ci 173d4afb5ceSopenharmony_ci lwsl_notice("%s: wrote %s (%d)\n", __func__, filename, n); 174d4afb5ceSopenharmony_ci 175d4afb5ceSopenharmony_ci return n; 176d4afb5ceSopenharmony_ci} 177d4afb5ceSopenharmony_ci 178d4afb5ceSopenharmony_ci/* we write vhostname.cert.pem and vhostname.key.pem, 0 return means OK */ 179d4afb5ceSopenharmony_ci 180d4afb5ceSopenharmony_ciint 181d4afb5ceSopenharmony_cilws_plat_write_cert(struct lws_vhost *vhost, int is_key, int fd, void *buf, 182d4afb5ceSopenharmony_ci size_t len) 183d4afb5ceSopenharmony_ci{ 184d4afb5ceSopenharmony_ci const char *name = vhost->tls.alloc_cert_path; 185d4afb5ceSopenharmony_ci 186d4afb5ceSopenharmony_ci if (is_key) 187d4afb5ceSopenharmony_ci name = vhost->tls.key_path; 188d4afb5ceSopenharmony_ci 189d4afb5ceSopenharmony_ci return lws_plat_write_file(name, buf, len) < 0; 190d4afb5ceSopenharmony_ci} 191d4afb5ceSopenharmony_ci 192d4afb5ceSopenharmony_ciint 193d4afb5ceSopenharmony_cilws_plat_read_file(const char *filename, void *buf, size_t len) 194d4afb5ceSopenharmony_ci{ 195d4afb5ceSopenharmony_ci nvs_handle nvh; 196d4afb5ceSopenharmony_ci size_t s = 0; 197d4afb5ceSopenharmony_ci int n = 0; 198d4afb5ceSopenharmony_ci 199d4afb5ceSopenharmony_ci if (nvs_open("lws-station", NVS_READWRITE, &nvh)) { 200d4afb5ceSopenharmony_ci lwsl_notice("%s: failed to open nvs\n", __func__); 201d4afb5ceSopenharmony_ci return 1; 202d4afb5ceSopenharmony_ci } 203d4afb5ceSopenharmony_ci 204d4afb5ceSopenharmony_ci ESP_ERROR_CHECK(nvs_open("lws-station", NVS_READWRITE, &nvh)); 205d4afb5ceSopenharmony_ci if (nvs_get_blob(nvh, filename, NULL, &s) != ESP_OK) 206d4afb5ceSopenharmony_ci goto bail; 207d4afb5ceSopenharmony_ci if (s > len) 208d4afb5ceSopenharmony_ci goto bail; 209d4afb5ceSopenharmony_ci 210d4afb5ceSopenharmony_ci n = nvs_get_blob(nvh, filename, buf, &s); 211d4afb5ceSopenharmony_ci 212d4afb5ceSopenharmony_ci nvs_close(nvh); 213d4afb5ceSopenharmony_ci 214d4afb5ceSopenharmony_ci lwsl_notice("%s: read %s (%d)\n", __func__, filename, (int)s); 215d4afb5ceSopenharmony_ci 216d4afb5ceSopenharmony_ci if (n) 217d4afb5ceSopenharmony_ci return -1; 218d4afb5ceSopenharmony_ci 219d4afb5ceSopenharmony_ci return (int)s; 220d4afb5ceSopenharmony_ci 221d4afb5ceSopenharmony_cibail: 222d4afb5ceSopenharmony_ci nvs_close(nvh); 223d4afb5ceSopenharmony_ci 224d4afb5ceSopenharmony_ci return -1; 225d4afb5ceSopenharmony_ci} 226d4afb5ceSopenharmony_ci#endif /* LWS_AMAZON_RTOS */ 227