📄 sock_linux_kernel.c
字号:
PJ_DEF(pj_status_t) pj_sock_bind( pj_sock_t sockfd, const pj_sockaddr_t *addr, int len){ long err; mm_segment_t oldfs; PJ_CHECK_STACK(); PJ_ASSERT_RETURN(addr!=NULL && len >= sizeof(struct pj_sockaddr), PJ_EINVAL); oldfs = get_fs(); set_fs(KERNEL_DS); err = sys_bind(sockfd, (struct sockaddr*)addr, len); set_fs(oldfs); if (err) return PJ_RETURN_OS_ERROR(-err); else return PJ_SUCCESS;}/* * Bind socket. */PJ_DEF(pj_status_t) pj_sock_bind_in( pj_sock_t sockfd, pj_uint32_t addr32, pj_uint16_t port){ pj_sockaddr_in addr; PJ_CHECK_STACK(); addr.sin_family = PJ_AF_INET; addr.sin_addr.s_addr = pj_htonl(addr32); addr.sin_port = pj_htons(port); return pj_sock_bind(sockfd, &addr, sizeof(pj_sockaddr_in));}/* * Close socket. */PJ_DEF(pj_status_t) pj_sock_close(pj_sock_t sockfd){ long err; err = sys_close(sockfd); if (err != 0) return PJ_RETURN_OS_ERROR(-err); else return PJ_SUCCESS;}/* * Get remote's name. */PJ_DEF(pj_status_t) pj_sock_getpeername( pj_sock_t sockfd, pj_sockaddr_t *addr, int *namelen){ mm_segment_t oldfs; long err; PJ_CHECK_STACK(); oldfs = get_fs(); set_fs(KERNEL_DS); err = sys_getpeername( sockfd, addr, namelen); set_fs(oldfs); if (err) return PJ_RETURN_OS_ERROR(-err); else return PJ_SUCCESS;}/* * Get socket name. */PJ_DEF(pj_status_t) pj_sock_getsockname( pj_sock_t sockfd, pj_sockaddr_t *addr, int *namelen){ mm_segment_t oldfs; int err; PJ_CHECK_STACK(); oldfs = get_fs(); set_fs(KERNEL_DS); err = sys_getsockname( sockfd, addr, namelen ); set_fs(oldfs); if (err) return PJ_RETURN_OS_ERROR(-err); else return PJ_SUCCESS;}/* * Send data */PJ_DEF(pj_status_t) pj_sock_send( pj_sock_t sockfd, const void *buf, pj_ssize_t *len, unsigned flags){ return pj_sock_sendto(sockfd, buf, len, flags, NULL, 0);}/* * Send data. */PJ_DEF(pj_status_t) pj_sock_sendto( pj_sock_t sockfd, const void *buff, pj_ssize_t *len, unsigned flags, const pj_sockaddr_t *addr, int addr_len){ long err; mm_segment_t oldfs; PJ_CHECK_STACK(); oldfs = get_fs(); set_fs(KERNEL_DS); err = *len = sys_sendto( sockfd, (void*)buff, *len, flags, (void*)addr, addr_len ); set_fs(oldfs); if (err >= 0) { return PJ_SUCCESS; } else { return PJ_RETURN_OS_ERROR(-err); }}/* * Receive data. */PJ_DEF(pj_status_t) pj_sock_recv( pj_sock_t sockfd, void *buf, pj_ssize_t *len, unsigned flags){ return pj_sock_recvfrom(sockfd, buf, len, flags, NULL, NULL);}/* * Receive data. */PJ_DEF(pj_status_t) pj_sock_recvfrom( pj_sock_t sockfd, void *buff, pj_ssize_t *size, unsigned flags, pj_sockaddr_t *from, int *fromlen){ mm_segment_t oldfs; long err; PJ_CHECK_STACK(); oldfs = get_fs(); set_fs(KERNEL_DS); err = *size = sys_recvfrom( sockfd, buff, *size, flags, from, fromlen); set_fs(oldfs); if (err >= 0) { return PJ_SUCCESS; } else { return PJ_RETURN_OS_ERROR(-err); }}/* * Get socket option. */PJ_DEF(pj_status_t) pj_sock_getsockopt( pj_sock_t sockfd, pj_uint16_t level, pj_uint16_t optname, void *optval, int *optlen){ mm_segment_t oldfs; long err; PJ_CHECK_STACK(); oldfs = get_fs(); set_fs(KERNEL_DS); err = sys_getsockopt( sockfd, level, optname, optval, optlen); set_fs(oldfs); if (err) return PJ_RETURN_OS_ERROR(-err); else return PJ_SUCCESS;}/* * Set socket option. */PJ_DEF(pj_status_t) pj_sock_setsockopt( pj_sock_t sockfd, pj_uint16_t level, pj_uint16_t optname, const void *optval, int optlen){ long err; mm_segment_t oldfs; PJ_CHECK_STACK(); oldfs = get_fs(); set_fs(KERNEL_DS); err = sys_setsockopt( sockfd, level, optname, (void*)optval, optlen); set_fs(oldfs); if (err) return PJ_RETURN_OS_ERROR(-err); else return PJ_SUCCESS;}/* * Shutdown socket. */#if PJ_HAS_TCPPJ_DEF(pj_status_t) pj_sock_shutdown( pj_sock_t sockfd, int how){ long err; PJ_CHECK_STACK(); err = sys_shutdown(sockfd, how); if (err) return PJ_RETURN_OS_ERROR(-err); else return PJ_SUCCESS;}/* * Start listening to incoming connections. */PJ_DEF(pj_status_t) pj_sock_listen( pj_sock_t sockfd, int backlog){ long err; PJ_CHECK_STACK(); err = sys_listen( sockfd, backlog ); if (err) return PJ_RETURN_OS_ERROR(-err); else return PJ_SUCCESS;}/* * Connect socket. */PJ_DEF(pj_status_t) pj_sock_connect( pj_sock_t sockfd, const pj_sockaddr_t *addr, int namelen){ long err; mm_segment_t oldfs; PJ_CHECK_STACK(); oldfs = get_fs(); set_fs(KERNEL_DS); err = sys_connect( sockfd, (void*)addr, namelen ); set_fs(oldfs); if (err) return PJ_RETURN_OS_ERROR(-err); else return PJ_SUCCESS;}/* * Accept incoming connections */PJ_DEF(pj_status_t) pj_sock_accept( pj_sock_t sockfd, pj_sock_t *newsockfd, pj_sockaddr_t *addr, int *addrlen){ long err; PJ_CHECK_STACK(); PJ_ASSERT_RETURN(newsockfd != NULL, PJ_EINVAL); err = sys_accept( sockfd, addr, addrlen); if (err < 0) { *newsockfd = PJ_INVALID_SOCKET; return PJ_RETURN_OS_ERROR(-err); } else { *newsockfd = err; return PJ_SUCCESS; }}#endif /* PJ_HAS_TCP *//* * Permission to steal inet_ntoa() and inet_aton() as long as this notice below * is included: *//* * Copyright (c) 1983, 1993 * The Regents of the University of California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -