⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rtpp_util.c

📁 RTP Proxy,用于Voip网络数据的代理传递
💻 C
字号:
/* * Copyright (c) 2004-2006 Maxim Sobolev <sobomax@FreeBSD.org> * Copyright (c) 2006-2007 Sippy Software, Inc., http://www.sippysoft.com * 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. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. * * $Id: rtpp_util.c,v 1.6 2008/03/18 02:26:29 sobomax Exp $ * */#include <sys/types.h>#include <sys/socket.h>#include <sys/time.h>#include <sys/uio.h>#include <netinet/in.h>#include <arpa/inet.h>#include <fcntl.h>#include <grp.h>#include <netdb.h>#include <pwd.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include "rtpp_util.h"#include "rtpp_log.h"intishostseq(struct sockaddr *ia1, struct sockaddr *ia2){    if (ia1->sa_family != ia2->sa_family)	return 0;    switch (ia1->sa_family) {    case AF_INET:	return (satosin(ia1)->sin_addr.s_addr ==	  satosin(ia2)->sin_addr.s_addr);    case AF_INET6:	return (memcmp(&satosin6(ia1)->sin6_addr.s6_addr[0],	  &satosin6(ia2)->sin6_addr.s6_addr[0],	  sizeof(struct in6_addr)) == 0);    default:	break;    }    /* Can't happen */    abort();}intishostnull(struct sockaddr *ia){    struct in6_addr *ap;    switch (ia->sa_family) {    case AF_INET:	return (satosin(ia)->sin_addr.s_addr == INADDR_ANY);    case AF_INET6:	ap = &satosin6(ia)->sin6_addr;	return ((*(const uint32_t *)(const void *)(&ap->s6_addr[0]) == 0) &&		(*(const uint32_t *)(const void *)(&ap->s6_addr[4]) == 0) &&		(*(const uint32_t *)(const void *)(&ap->s6_addr[8]) == 0) &&		(*(const uint32_t *)(const void *)(&ap->s6_addr[12]) == 0));    default:	break;    }    abort();}char *addr2char_r(struct sockaddr *ia, char *buf, int size){    void *addr;    switch (ia->sa_family) {    case AF_INET:	addr = &(satosin(ia)->sin_addr);	break;    case AF_INET6:	addr = &(satosin6(ia)->sin6_addr);	break;    default:	abort();    }    return (char *)((void *)inet_ntop(ia->sa_family, addr, buf, size));}const char *addr2char(struct sockaddr *ia){    static char buf[256];    return(addr2char_r(ia, buf, sizeof(buf)));}doublegetctime(void){    struct timeval timev;    if (gettimeofday(&timev, NULL) == -1)	return -1;    return timev.tv_sec + ((double)timev.tv_usec) / 1000000.0;}intresolve(struct sockaddr *ia, int pf, const char *host,  const char *servname, int flags){    int n;    struct addrinfo hints, *res;    memset(&hints, 0, sizeof(hints));    hints.ai_flags = flags;	     /* We create listening sockets */    hints.ai_family = pf;	       /* Protocol family */    hints.ai_socktype = SOCK_DGRAM;     /* UDP */    n = getaddrinfo(host, servname, &hints, &res);    if (n == 0) {	/* Use the first socket address returned */	memcpy(ia, res->ai_addr, res->ai_addrlen);	freeaddrinfo(res);    }    return n;}voidseedrandom(void){    int fd;    unsigned long junk;    struct timeval tv;    fd = open("/dev/random", O_RDONLY, 0);    if (fd >= 0) {	read(fd, &junk, sizeof(junk));	close(fd);    }    gettimeofday(&tv, NULL);    srandom((getpid() << 16) ^ tv.tv_sec ^ tv.tv_usec ^ junk);}intdrop_privileges(struct cfg *cf, char *uname, char *gname){    struct passwd *pp;    struct group *gp;    if (gname != NULL) {	gp = getgrnam(gname);	if (gp == NULL) {	    rtpp_log_ewrite(RTPP_LOG_ERR, cf->glog, "can't find ID for the group: %s", gname);	    return -1;	}	if (setgid(gp->gr_gid) != 0) {	    rtpp_log_ewrite(RTPP_LOG_ERR, cf->glog, "can't set current group ID: %d", gp->gr_gid);	    return -1;	}    }    if (uname == NULL)	return 0;    pp = getpwnam(uname);    if (pp == NULL) {	rtpp_log_ewrite(RTPP_LOG_ERR, cf->glog, "can't find ID for the user: %s", uname);	return -1;    }    if (gname == NULL) {	if (setgid(pp->pw_gid) != 0) {	    rtpp_log_ewrite(RTPP_LOG_ERR, cf->glog, "can't set current group ID: %d", pp->pw_gid);	    return -1;	}    }    if (setuid(pp->pw_uid) != 0) {	rtpp_log_ewrite(RTPP_LOG_ERR, cf->glog, "can't set current user ID: %d", pp->pw_uid);	return -1;    }    return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -