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#ifndef _WINSOCK_DEPRECATED_NO_WARNINGS 26d4afb5ceSopenharmony_ci#define _WINSOCK_DEPRECATED_NO_WARNINGS 27d4afb5ceSopenharmony_ci#endif 28d4afb5ceSopenharmony_ci#include "private-lib-core.h" 29d4afb5ceSopenharmony_ci 30d4afb5ceSopenharmony_ciint lws_plat_apply_FD_CLOEXEC(int n) 31d4afb5ceSopenharmony_ci{ 32d4afb5ceSopenharmony_ci return 0; 33d4afb5ceSopenharmony_ci} 34d4afb5ceSopenharmony_ci 35d4afb5ceSopenharmony_cilws_fop_fd_t 36d4afb5ceSopenharmony_ci_lws_plat_file_open(const struct lws_plat_file_ops *fops, const char *filename, 37d4afb5ceSopenharmony_ci const char *vpath, lws_fop_flags_t *flags) 38d4afb5ceSopenharmony_ci{ 39d4afb5ceSopenharmony_ci HANDLE ret; 40d4afb5ceSopenharmony_ci WCHAR buf[MAX_PATH]; 41d4afb5ceSopenharmony_ci lws_fop_fd_t fop_fd; 42d4afb5ceSopenharmony_ci LARGE_INTEGER llFileSize = {0}; 43d4afb5ceSopenharmony_ci 44d4afb5ceSopenharmony_ci MultiByteToWideChar(CP_UTF8, 0, filename, -1, buf, LWS_ARRAY_SIZE(buf)); 45d4afb5ceSopenharmony_ci if (((*flags) & 7) == _O_RDONLY) 46d4afb5ceSopenharmony_ci ret = CreateFileW(buf, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, 47d4afb5ceSopenharmony_ci NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); 48d4afb5ceSopenharmony_ci else 49d4afb5ceSopenharmony_ci ret = CreateFileW(buf, GENERIC_WRITE, 0, NULL, 50d4afb5ceSopenharmony_ci CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); 51d4afb5ceSopenharmony_ci 52d4afb5ceSopenharmony_ci if (ret == NULL) 53d4afb5ceSopenharmony_ci goto bail; 54d4afb5ceSopenharmony_ci 55d4afb5ceSopenharmony_ci fop_fd = malloc(sizeof(*fop_fd)); 56d4afb5ceSopenharmony_ci if (!fop_fd) 57d4afb5ceSopenharmony_ci goto bail; 58d4afb5ceSopenharmony_ci 59d4afb5ceSopenharmony_ci fop_fd->fops = fops; 60d4afb5ceSopenharmony_ci#if defined(__MINGW32__) 61d4afb5ceSopenharmony_ci /* we use filesystem_priv */ 62d4afb5ceSopenharmony_ci fop_fd->fd = (int)(intptr_t)ret; 63d4afb5ceSopenharmony_ci#else 64d4afb5ceSopenharmony_ci fop_fd->fd = ret; 65d4afb5ceSopenharmony_ci#endif 66d4afb5ceSopenharmony_ci fop_fd->filesystem_priv = ret; 67d4afb5ceSopenharmony_ci fop_fd->flags = *flags; 68d4afb5ceSopenharmony_ci fop_fd->len = GetFileSize(ret, NULL); 69d4afb5ceSopenharmony_ci if(GetFileSizeEx(ret, &llFileSize)) 70d4afb5ceSopenharmony_ci fop_fd->len = llFileSize.QuadPart; 71d4afb5ceSopenharmony_ci 72d4afb5ceSopenharmony_ci fop_fd->pos = 0; 73d4afb5ceSopenharmony_ci 74d4afb5ceSopenharmony_ci return fop_fd; 75d4afb5ceSopenharmony_ci 76d4afb5ceSopenharmony_cibail: 77d4afb5ceSopenharmony_ci return NULL; 78d4afb5ceSopenharmony_ci} 79d4afb5ceSopenharmony_ci 80d4afb5ceSopenharmony_ciint 81d4afb5ceSopenharmony_ci_lws_plat_file_close(lws_fop_fd_t *fop_fd) 82d4afb5ceSopenharmony_ci{ 83d4afb5ceSopenharmony_ci HANDLE fd = (*fop_fd)->filesystem_priv; 84d4afb5ceSopenharmony_ci 85d4afb5ceSopenharmony_ci free(*fop_fd); 86d4afb5ceSopenharmony_ci *fop_fd = NULL; 87d4afb5ceSopenharmony_ci 88d4afb5ceSopenharmony_ci CloseHandle((HANDLE)fd); 89d4afb5ceSopenharmony_ci 90d4afb5ceSopenharmony_ci return 0; 91d4afb5ceSopenharmony_ci} 92d4afb5ceSopenharmony_ci 93d4afb5ceSopenharmony_cilws_fileofs_t 94d4afb5ceSopenharmony_ci_lws_plat_file_seek_cur(lws_fop_fd_t fop_fd, lws_fileofs_t offset) 95d4afb5ceSopenharmony_ci{ 96d4afb5ceSopenharmony_ci LARGE_INTEGER l; 97d4afb5ceSopenharmony_ci 98d4afb5ceSopenharmony_ci l.QuadPart = offset; 99d4afb5ceSopenharmony_ci if (!SetFilePointerEx((HANDLE)fop_fd->filesystem_priv, l, NULL, FILE_CURRENT)) 100d4afb5ceSopenharmony_ci { 101d4afb5ceSopenharmony_ci lwsl_err("error seeking from cur %ld, offset %ld\n", (long)fop_fd->pos, (long)offset); 102d4afb5ceSopenharmony_ci return -1; 103d4afb5ceSopenharmony_ci } 104d4afb5ceSopenharmony_ci 105d4afb5ceSopenharmony_ci LARGE_INTEGER zero; 106d4afb5ceSopenharmony_ci zero.QuadPart = 0; 107d4afb5ceSopenharmony_ci LARGE_INTEGER newPos; 108d4afb5ceSopenharmony_ci if (!SetFilePointerEx((HANDLE)fop_fd->filesystem_priv, zero, &newPos, FILE_CURRENT)) 109d4afb5ceSopenharmony_ci { 110d4afb5ceSopenharmony_ci lwsl_err("error seeking from cur %ld, offset %ld\n", (long)fop_fd->pos, (long)offset); 111d4afb5ceSopenharmony_ci return -1; 112d4afb5ceSopenharmony_ci } 113d4afb5ceSopenharmony_ci fop_fd->pos = newPos.QuadPart; 114d4afb5ceSopenharmony_ci 115d4afb5ceSopenharmony_ci return newPos.QuadPart; 116d4afb5ceSopenharmony_ci} 117d4afb5ceSopenharmony_ci 118d4afb5ceSopenharmony_ciint 119d4afb5ceSopenharmony_ci_lws_plat_file_read(lws_fop_fd_t fop_fd, lws_filepos_t *amount, 120d4afb5ceSopenharmony_ci uint8_t *buf, lws_filepos_t len) 121d4afb5ceSopenharmony_ci{ 122d4afb5ceSopenharmony_ci DWORD _amount; 123d4afb5ceSopenharmony_ci 124d4afb5ceSopenharmony_ci if (!ReadFile((HANDLE)fop_fd->filesystem_priv, buf, (DWORD)len, &_amount, NULL)) { 125d4afb5ceSopenharmony_ci *amount = 0; 126d4afb5ceSopenharmony_ci 127d4afb5ceSopenharmony_ci return 1; 128d4afb5ceSopenharmony_ci } 129d4afb5ceSopenharmony_ci 130d4afb5ceSopenharmony_ci fop_fd->pos += _amount; 131d4afb5ceSopenharmony_ci *amount = (unsigned long)_amount; 132d4afb5ceSopenharmony_ci 133d4afb5ceSopenharmony_ci return 0; 134d4afb5ceSopenharmony_ci} 135d4afb5ceSopenharmony_ci 136d4afb5ceSopenharmony_ciint 137d4afb5ceSopenharmony_ci_lws_plat_file_write(lws_fop_fd_t fop_fd, lws_filepos_t *amount, 138d4afb5ceSopenharmony_ci uint8_t* buf, lws_filepos_t len) 139d4afb5ceSopenharmony_ci{ 140d4afb5ceSopenharmony_ci DWORD _amount; 141d4afb5ceSopenharmony_ci 142d4afb5ceSopenharmony_ci if (!WriteFile((HANDLE)fop_fd->filesystem_priv, buf, (DWORD)len, &_amount, NULL)) { 143d4afb5ceSopenharmony_ci *amount = 0; 144d4afb5ceSopenharmony_ci 145d4afb5ceSopenharmony_ci return 1; 146d4afb5ceSopenharmony_ci } 147d4afb5ceSopenharmony_ci 148d4afb5ceSopenharmony_ci fop_fd->pos += _amount; 149d4afb5ceSopenharmony_ci *amount = (unsigned long)_amount; 150d4afb5ceSopenharmony_ci 151d4afb5ceSopenharmony_ci return 0; 152d4afb5ceSopenharmony_ci} 153d4afb5ceSopenharmony_ci 154d4afb5ceSopenharmony_ci 155d4afb5ceSopenharmony_ciint 156d4afb5ceSopenharmony_cilws_plat_write_cert(struct lws_vhost *vhost, int is_key, int fd, void *buf, 157d4afb5ceSopenharmony_ci size_t len) 158d4afb5ceSopenharmony_ci{ 159d4afb5ceSopenharmony_ci int n; 160d4afb5ceSopenharmony_ci 161d4afb5ceSopenharmony_ci n = (int)write(fd, buf, (unsigned int)len); 162d4afb5ceSopenharmony_ci 163d4afb5ceSopenharmony_ci lseek(fd, 0, SEEK_SET); 164d4afb5ceSopenharmony_ci 165d4afb5ceSopenharmony_ci return (size_t)n != len; 166d4afb5ceSopenharmony_ci} 167d4afb5ceSopenharmony_ci 168d4afb5ceSopenharmony_ciint 169d4afb5ceSopenharmony_cilws_plat_write_file(const char *filename, void *buf, size_t len) 170d4afb5ceSopenharmony_ci{ 171d4afb5ceSopenharmony_ci int m, fd; 172d4afb5ceSopenharmony_ci 173d4afb5ceSopenharmony_ci fd = lws_open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0600); 174d4afb5ceSopenharmony_ci 175d4afb5ceSopenharmony_ci if (fd == -1) 176d4afb5ceSopenharmony_ci return -1; 177d4afb5ceSopenharmony_ci 178d4afb5ceSopenharmony_ci m = (int)write(fd, buf, (unsigned int)len); 179d4afb5ceSopenharmony_ci close(fd); 180d4afb5ceSopenharmony_ci 181d4afb5ceSopenharmony_ci return (size_t)m != len; 182d4afb5ceSopenharmony_ci} 183d4afb5ceSopenharmony_ci 184d4afb5ceSopenharmony_ciint 185d4afb5ceSopenharmony_cilws_plat_read_file(const char *filename, void *buf, size_t len) 186d4afb5ceSopenharmony_ci{ 187d4afb5ceSopenharmony_ci int n, fd = lws_open(filename, O_RDONLY); 188d4afb5ceSopenharmony_ci if (fd == -1) 189d4afb5ceSopenharmony_ci return -1; 190d4afb5ceSopenharmony_ci 191d4afb5ceSopenharmony_ci n = (int)read(fd, buf, (unsigned int)len); 192d4afb5ceSopenharmony_ci close(fd); 193d4afb5ceSopenharmony_ci 194d4afb5ceSopenharmony_ci return n; 195d4afb5ceSopenharmony_ci} 196d4afb5ceSopenharmony_ci 197