mirror of
https://github.com/hufrea/byedpi.git
synced 2024-12-22 14:25:44 +00:00
NetBSD Support / Portability fixes (#75)
* Use socket to detect family on NetBSD * Switch to _DEFAULT_SOURCE for CPPFLAGS * fix using signed char for detecting its type
This commit is contained in:
parent
9a9fc8a9aa
commit
ff65b9f780
2
Makefile
2
Makefile
@ -1,6 +1,6 @@
|
|||||||
TARGET = ciadpi
|
TARGET = ciadpi
|
||||||
|
|
||||||
#CPPFLAGS = -D_XOPEN_SOURCE=500
|
CPPFLAGS = -D_DEFAULT_SOURCE
|
||||||
CFLAGS += -I. -std=c99 -Wall -Wno-unused -O2
|
CFLAGS += -I. -std=c99 -Wall -Wno-unused -O2
|
||||||
WIN_LDFLAGS = -lws2_32 -lmswsock
|
WIN_LDFLAGS = -lws2_32 -lmswsock
|
||||||
|
|
||||||
|
42
desync.c
42
desync.c
@ -1,5 +1,3 @@
|
|||||||
#define _GNU_SOURCE
|
|
||||||
|
|
||||||
#include "desync.h"
|
#include "desync.h"
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
@ -10,19 +8,22 @@
|
|||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
#include <arpa/inet.h>
|
|
||||||
#include <netinet/tcp.h>
|
|
||||||
|
|
||||||
#ifdef __linux__
|
|
||||||
#include <sys/mman.h>
|
#include <sys/mman.h>
|
||||||
#include <sys/sendfile.h>
|
#include <arpa/inet.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
|
|
||||||
|
#ifndef __linux__
|
||||||
|
#include <netinet/tcp.h>
|
||||||
|
#else
|
||||||
|
#include <sys/sendfile.h>
|
||||||
|
#include <linux/tcp.h>
|
||||||
|
|
||||||
#include <sys/syscall.h>
|
#include <sys/syscall.h>
|
||||||
#define memfd_create(name, flags) syscall(__NR_memfd_create, name, flags);
|
|
||||||
|
#define memfd_create(name, flags) syscall(__NR_memfd_create, name, flags)
|
||||||
#endif
|
#endif
|
||||||
#else
|
#else
|
||||||
#include <winsock2.h>
|
#include <winsock2.h>
|
||||||
#include <windows.h>
|
|
||||||
#include <ws2tcpip.h>
|
#include <ws2tcpip.h>
|
||||||
#include <mswsock.h>
|
#include <mswsock.h>
|
||||||
#endif
|
#endif
|
||||||
@ -35,6 +36,7 @@
|
|||||||
|
|
||||||
int get_family(struct sockaddr *dst)
|
int get_family(struct sockaddr *dst)
|
||||||
{
|
{
|
||||||
|
#ifndef __NetBSD__
|
||||||
if (dst->sa_family == AF_INET6) {
|
if (dst->sa_family == AF_INET6) {
|
||||||
struct sockaddr_in6 *d6 = (struct sockaddr_in6 *)dst;
|
struct sockaddr_in6 *d6 = (struct sockaddr_in6 *)dst;
|
||||||
static char *pat = "\0\0\0\0\0\0\0\0\0\0\xff\xff";
|
static char *pat = "\0\0\0\0\0\0\0\0\0\0\xff\xff";
|
||||||
@ -43,6 +45,7 @@ int get_family(struct sockaddr *dst)
|
|||||||
return AF_INET;
|
return AF_INET;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
return dst->sa_family;
|
return dst->sa_family;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -113,12 +116,14 @@ void wait_send(int sfd)
|
|||||||
#define wait_send_if_support(sfd) // :(
|
#define wait_send_if_support(sfd) // :(
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef __linux__
|
#ifdef FAKE_SUPPORT
|
||||||
|
#ifndef _WIN32
|
||||||
ssize_t send_fake(int sfd, char *buffer,
|
ssize_t send_fake(int sfd, char *buffer,
|
||||||
int cnt, long pos, int fa, struct desync_params *opt)
|
int cnt, long pos, int fa, struct desync_params *opt)
|
||||||
{
|
{
|
||||||
struct sockaddr_in6 addr = {};
|
struct sockaddr_in6 addr = {};
|
||||||
socklen_t addr_size = sizeof(addr);
|
socklen_t addr_size = sizeof(addr);
|
||||||
|
#ifdef __linux__
|
||||||
if (opt->md5sig) {
|
if (opt->md5sig) {
|
||||||
if (getpeername(sfd,
|
if (getpeername(sfd,
|
||||||
(struct sockaddr *)&addr, &addr_size) < 0) {
|
(struct sockaddr *)&addr, &addr_size) < 0) {
|
||||||
@ -126,6 +131,7 @@ ssize_t send_fake(int sfd, char *buffer,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
struct packet pkt;
|
struct packet pkt;
|
||||||
if (opt->fake_data.data) {
|
if (opt->fake_data.data) {
|
||||||
pkt = opt->fake_data;
|
pkt = opt->fake_data;
|
||||||
@ -134,12 +140,13 @@ ssize_t send_fake(int sfd, char *buffer,
|
|||||||
pkt = cnt != IS_HTTP ? fake_tls : fake_http;
|
pkt = cnt != IS_HTTP ? fake_tls : fake_http;
|
||||||
}
|
}
|
||||||
size_t psz = pkt.size;
|
size_t psz = pkt.size;
|
||||||
|
#ifdef __linux__
|
||||||
int ffd = memfd_create("name", 0);
|
int ffd = memfd_create("name", 0);
|
||||||
if (ffd < 0) {
|
if (ffd < 0) {
|
||||||
uniperror("memfd_create");
|
uniperror("memfd_create");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
char *p = 0;
|
char *p = 0;
|
||||||
ssize_t len = -1;
|
ssize_t len = -1;
|
||||||
|
|
||||||
@ -159,6 +166,8 @@ ssize_t send_fake(int sfd, char *buffer,
|
|||||||
if (setttl(sfd, opt->ttl ? opt->ttl : 8, fa) < 0) {
|
if (setttl(sfd, opt->ttl ? opt->ttl : 8, fa) < 0) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef __linux__
|
||||||
if (opt->md5sig) {
|
if (opt->md5sig) {
|
||||||
struct tcp_md5sig md5 = {
|
struct tcp_md5sig md5 = {
|
||||||
.tcpm_keylen = 5
|
.tcpm_keylen = 5
|
||||||
@ -171,18 +180,20 @@ ssize_t send_fake(int sfd, char *buffer,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
if (opt->ip_options && fa == AF_INET
|
if (opt->ip_options && fa == AF_INET
|
||||||
&& setsockopt(sfd, IPPROTO_IP, IP_OPTIONS,
|
&& setsockopt(sfd, IPPROTO_IP, IP_OPTIONS,
|
||||||
opt->ip_options, opt->ip_options_len) < 0) {
|
opt->ip_options, opt->ip_options_len) < 0) {
|
||||||
uniperror("setsockopt IP_OPTIONS");
|
uniperror("setsockopt IP_OPTIONS");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
#ifdef __linux__
|
||||||
len = sendfile(sfd, ffd, 0, pos);
|
len = sendfile(sfd, ffd, 0, pos);
|
||||||
if (len < 0) {
|
if (len < 0) {
|
||||||
uniperror("sendfile");
|
uniperror("sendfile");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
wait_send(sfd);
|
wait_send(sfd);
|
||||||
memcpy(p, buffer, pos);
|
memcpy(p, buffer, pos);
|
||||||
|
|
||||||
@ -195,6 +206,7 @@ ssize_t send_fake(int sfd, char *buffer,
|
|||||||
uniperror("setsockopt IP_OPTIONS");
|
uniperror("setsockopt IP_OPTIONS");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
#ifdef __linux__
|
||||||
if (opt->md5sig) {
|
if (opt->md5sig) {
|
||||||
struct tcp_md5sig md5 = {
|
struct tcp_md5sig md5 = {
|
||||||
.tcpm_keylen = 0
|
.tcpm_keylen = 0
|
||||||
@ -207,15 +219,14 @@ ssize_t send_fake(int sfd, char *buffer,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (p) munmap(p, pos);
|
if (p) munmap(p, pos);
|
||||||
close(ffd);
|
close(ffd);
|
||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
#endif
|
#else
|
||||||
|
|
||||||
#ifdef _WIN32
|
|
||||||
OVERLAPPED ov = {};
|
OVERLAPPED ov = {};
|
||||||
|
|
||||||
ssize_t send_fake(int sfd, char *buffer,
|
ssize_t send_fake(int sfd, char *buffer,
|
||||||
@ -310,6 +321,7 @@ ssize_t send_fake(int sfd, char *buffer,
|
|||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
ssize_t send_oob(int sfd, char *buffer,
|
ssize_t send_oob(int sfd, char *buffer,
|
||||||
ssize_t n, long pos)
|
ssize_t n, long pos)
|
||||||
|
3
main.c
3
main.c
@ -1,5 +1,3 @@
|
|||||||
#define _GNU_SOURCE
|
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
@ -444,6 +442,7 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
while (!invalid && (rez = getopt_long(
|
while (!invalid && (rez = getopt_long(
|
||||||
argc, argv, opt, options, 0)) != -1) {
|
argc, argv, opt, options, 0)) != -1) {
|
||||||
|
|
||||||
switch (rez) {
|
switch (rez) {
|
||||||
|
|
||||||
case 'N':
|
case 'N':
|
||||||
|
20
packets.c
20
packets.c
@ -215,16 +215,16 @@ int parse_http(char *buffer, size_t bsize, char **hs, uint16_t *port)
|
|||||||
}
|
}
|
||||||
host += 6;
|
host += 6;
|
||||||
|
|
||||||
while ((buff_end - host) > 0 && isblank(*host)) {
|
while ((buff_end - host) > 0 && isblank((unsigned char) *host)) {
|
||||||
host++;
|
host++;
|
||||||
}
|
}
|
||||||
char *l_end = memchr(host, '\n', buff_end - host);
|
char *l_end = memchr(host, '\n', buff_end - host);
|
||||||
if (!l_end) {
|
if (!l_end) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
for (; isspace(*(l_end - 1)); l_end--) {}
|
for (; isspace((unsigned char) *(l_end - 1)); l_end--) {}
|
||||||
|
|
||||||
if (!(isdigit(*(l_end - 1))))
|
if (!(isdigit((unsigned char) *(l_end - 1))))
|
||||||
h_end = 0;
|
h_end = 0;
|
||||||
else {
|
else {
|
||||||
char *h = host;
|
char *h = host;
|
||||||
@ -265,7 +265,7 @@ int get_http_code(char *b, size_t n)
|
|||||||
}
|
}
|
||||||
char *e;
|
char *e;
|
||||||
long num = strtol(b + 9, &e, 10);
|
long num = strtol(b + 9, &e, 10);
|
||||||
if (num < 100 || num > 511 || !isspace(*e)) {
|
if (num < 100 || num > 511 || !isspace((unsigned char) *e)) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
return (int )num;
|
return (int )num;
|
||||||
@ -297,7 +297,7 @@ bool is_http_redirect(char *req, size_t qn, char *resp, size_t sn)
|
|||||||
if (!l_end) {
|
if (!l_end) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
for (; isspace(*(l_end - 1)); l_end--) {}
|
for (; isspace((unsigned char) *(l_end - 1)); l_end--) {}
|
||||||
|
|
||||||
if ((l_end - location) > 7) {
|
if ((l_end - location) > 7) {
|
||||||
if (!strncmp(location, "http://", 7)) {
|
if (!strncmp(location, "http://", 7)) {
|
||||||
@ -382,17 +382,17 @@ int mod_http(char *buffer, size_t bsize, int m)
|
|||||||
for (par = host - 1; *par != ':'; par--) {}
|
for (par = host - 1; *par != ':'; par--) {}
|
||||||
par -= 4;
|
par -= 4;
|
||||||
if (m & MH_HMIX) {
|
if (m & MH_HMIX) {
|
||||||
par[0] = tolower(par[0]);
|
par[0] = tolower((unsigned char) par[0]);
|
||||||
par[1] = toupper(par[1]);
|
par[1] = toupper((unsigned char) par[1]);
|
||||||
par[3] = toupper(par[3]);
|
par[3] = toupper((unsigned char) par[3]);
|
||||||
}
|
}
|
||||||
if (m & MH_DMIX) {
|
if (m & MH_DMIX) {
|
||||||
for (int i = 0; i < hlen; i += 2) {
|
for (int i = 0; i < hlen; i += 2) {
|
||||||
host[i] = toupper(host[i]);
|
host[i] = toupper((unsigned char)host[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (m & MH_SPACE) {
|
if (m & MH_SPACE) {
|
||||||
for (; !isspace(*(host + hlen)); hlen++) {}
|
for (; !isspace((unsigned char) *(host + hlen)); hlen++) {}
|
||||||
int sc = host - (par + 5);
|
int sc = host - (par + 5);
|
||||||
memmove(par + 5, host, hlen);
|
memmove(par + 5, host, hlen);
|
||||||
memset(par + 5 + hlen, '\t', sc);
|
memset(par + 5 + hlen, '\t', sc);
|
||||||
|
9
proxy.c
9
proxy.c
@ -1,4 +1,3 @@
|
|||||||
#define _GNU_SOURCE
|
|
||||||
#define EID_STR
|
#define EID_STR
|
||||||
|
|
||||||
#include "proxy.h"
|
#include "proxy.h"
|
||||||
@ -29,6 +28,10 @@
|
|||||||
#include <arpa/inet.h>
|
#include <arpa/inet.h>
|
||||||
#include <netinet/tcp.h>
|
#include <netinet/tcp.h>
|
||||||
#include <netdb.h>
|
#include <netdb.h>
|
||||||
|
|
||||||
|
#if defined(__linux__) && defined(__GLIBC__)
|
||||||
|
extern int accept4(int, struct sockaddr *__restrict, socklen_t *__restrict, int);
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
@ -392,7 +395,11 @@ int create_conn(struct poolhd *pool,
|
|||||||
}
|
}
|
||||||
val->pair = pair;
|
val->pair = pair;
|
||||||
pair->pair = val;
|
pair->pair = val;
|
||||||
|
#ifdef __NetBSD__
|
||||||
|
pair->in6 = addr.in6;
|
||||||
|
#else
|
||||||
pair->in6 = dst->in6;
|
pair->in6 = dst->in6;
|
||||||
|
#endif
|
||||||
pair->flag = FLAG_CONN;
|
pair->flag = FLAG_CONN;
|
||||||
val->type = EV_IGNORE;
|
val->type = EV_IGNORE;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user