Fixes in Windows
git-svn-id: http://voip.null.ro/svn/yate@730 acf43c95-373e-0410-b603-e72c3f656dc1
This commit is contained in:
parent
589b63a931
commit
3786b22abe
|
@ -4,6 +4,8 @@ Thu Mar 30 2006 Paul Chitescu <paulc-devel@null.ro>
|
||||||
- Added many options that can be set per external module instance
|
- Added many options that can be set per external module instance
|
||||||
- Updated the PHP libraries to support the new functions
|
- Updated the PHP libraries to support the new functions
|
||||||
- Changed the return values of GetEvent() to comply with typechecks in PHP5
|
- Changed the return values of GetEvent() to comply with typechecks in PHP5
|
||||||
|
- Added extmodule and yradius to the Visual C++ workspace
|
||||||
|
- Made some fixes for Windows, solved some bugs exposed by the compiler
|
||||||
|
|
||||||
Wed Mar 29 2006 Paul Chitescu <paulc-devel@null.ro>
|
Wed Mar 29 2006 Paul Chitescu <paulc-devel@null.ro>
|
||||||
- Modified conference based on Andrew McDonald's idea of N-way mixing
|
- Modified conference based on Andrew McDonald's idea of N-way mixing
|
||||||
|
|
|
@ -436,7 +436,11 @@ bool File::canRetry() const
|
||||||
{
|
{
|
||||||
if (!m_error)
|
if (!m_error)
|
||||||
return true;
|
return true;
|
||||||
return (m_error == EAGAIN) || (m_error == EINTR) || (m_error == EWOULDBLOCK);
|
return (m_error == EAGAIN) || (m_error == EINTR)
|
||||||
|
#ifndef _WINDOWS
|
||||||
|
|| (m_error == EWOULDBLOCK)
|
||||||
|
#endif
|
||||||
|
;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool File::setBlocking(bool block)
|
bool File::setBlocking(bool block)
|
||||||
|
|
|
@ -236,7 +236,7 @@ ConfRoom::ConfRoom(const String& name, const NamedList& params)
|
||||||
m_rate = params.getIntValue("rate",m_rate);
|
m_rate = params.getIntValue("rate",m_rate);
|
||||||
m_maxusers = params.getIntValue("maxusers",m_maxusers);
|
m_maxusers = params.getIntValue("maxusers",m_maxusers);
|
||||||
m_notify = params.getValue("notify");
|
m_notify = params.getValue("notify");
|
||||||
m_lonely = params.getValue("lonely");
|
m_lonely = params.getBoolValue("lonely");
|
||||||
s_rooms.append(this);
|
s_rooms.append(this);
|
||||||
// create outgoing call to room record utility channel
|
// create outgoing call to room record utility channel
|
||||||
const char* callto = params.getValue("record");
|
const char* callto = params.getValue("record");
|
||||||
|
@ -422,9 +422,9 @@ void ConfConsumer::Consume(const DataBlock& data, unsigned long tStamp)
|
||||||
// use square of the energy as extracting the square root is expensive
|
// use square of the energy as extracting the square root is expensive
|
||||||
sum2 = (sum2 * DECAY_STORE + (int64_t)(samp*samp) * ATTACK_RATE) / DECAY_TOTAL;
|
sum2 = (sum2 * DECAY_STORE + (int64_t)(samp*samp) * ATTACK_RATE) / DECAY_TOTAL;
|
||||||
if (min2 > sum2)
|
if (min2 > sum2)
|
||||||
min2 = sum2;
|
min2 = (unsigned int)sum2;
|
||||||
}
|
}
|
||||||
m_energy2 = sum2;
|
m_energy2 = (unsigned int)sum2;
|
||||||
// TODO: find a better algorithm to adjust the noise threshold
|
// TODO: find a better algorithm to adjust the noise threshold
|
||||||
min2 += min2 >> SHIFT_LEVEL;
|
min2 += min2 >> SHIFT_LEVEL;
|
||||||
// try to keep noise threshold slightly above minimum energy
|
// try to keep noise threshold slightly above minimum energy
|
||||||
|
@ -468,7 +468,7 @@ void ConfConsumer::consumed(const int* mixed, unsigned int samples)
|
||||||
int64_t sum2 = m_energy2;
|
int64_t sum2 = m_energy2;
|
||||||
while (n--)
|
while (n--)
|
||||||
sum2 = (sum2 * DECAY_STORE) / DECAY_TOTAL;
|
sum2 = (sum2 * DECAY_STORE) / DECAY_TOTAL;
|
||||||
m_energy2 = sum2;
|
m_energy2 = (unsigned int)sum2;
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,10 +24,18 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <yatephone.h>
|
#include <yatephone.h>
|
||||||
|
|
||||||
|
#ifdef _WINDOWS
|
||||||
|
|
||||||
|
#include <process.h>
|
||||||
|
|
||||||
|
#else
|
||||||
#include <yatepaths.h>
|
#include <yatepaths.h>
|
||||||
|
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <sys/wait.h>
|
#include <sys/wait.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
@ -280,9 +288,16 @@ private:
|
||||||
|
|
||||||
static bool runProgram(const char *script, const char *args)
|
static bool runProgram(const char *script, const char *args)
|
||||||
{
|
{
|
||||||
|
#ifdef _WINDOWS
|
||||||
|
int pid = ::_spawnl(_P_DETACH,script,args,NULL);
|
||||||
|
if (pid < 0) {
|
||||||
|
Debug(DebugWarn, "Failed to _spawnl(): %d: %s", errno, strerror(errno));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
#else
|
||||||
int pid = ::fork();
|
int pid = ::fork();
|
||||||
if (pid < 0) {
|
if (pid < 0) {
|
||||||
Debug(DebugWarn, "Failed to fork(): %s", strerror(errno));
|
Debug(DebugWarn, "Failed to fork(): %d: %s", errno, strerror(errno));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (!pid) {
|
if (!pid) {
|
||||||
|
@ -291,6 +306,7 @@ static bool runProgram(const char *script, const char *args)
|
||||||
// Try to immunize child from ^C and ^\ the console may receive
|
// Try to immunize child from ^C and ^\ the console may receive
|
||||||
::signal(SIGINT,SIG_IGN);
|
::signal(SIGINT,SIG_IGN);
|
||||||
::signal(SIGQUIT,SIG_IGN);
|
::signal(SIGQUIT,SIG_IGN);
|
||||||
|
|
||||||
// And restore default handlers for other signals
|
// And restore default handlers for other signals
|
||||||
::signal(SIGTERM,SIG_DFL);
|
::signal(SIGTERM,SIG_DFL);
|
||||||
::signal(SIGHUP,SIG_DFL);
|
::signal(SIGHUP,SIG_DFL);
|
||||||
|
@ -301,10 +317,11 @@ static bool runProgram(const char *script, const char *args)
|
||||||
if (debugAt(DebugInfo))
|
if (debugAt(DebugInfo))
|
||||||
::fprintf(stderr, "Execing program '%s' '%s'\n", script, args);
|
::fprintf(stderr, "Execing program '%s' '%s'\n", script, args);
|
||||||
::execl(script, script, args, (char *)NULL);
|
::execl(script, script, args, (char *)NULL);
|
||||||
::fprintf(stderr, "Failed to execute '%s': %s\n", script, strerror(errno));
|
::fprintf(stderr, "Failed to execute '%s': %d: %s\n", script, errno, strerror(errno));
|
||||||
// Shit happened. Die as quick and brutal as possible
|
// Shit happened. Die as quick and brutal as possible
|
||||||
::_exit(1);
|
::_exit(1);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
Debug(DebugInfo,"Launched external program %s", script);
|
Debug(DebugInfo,"Launched external program %s", script);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -353,7 +370,7 @@ void ExtModSource::run()
|
||||||
int64_t dly = tpos - Time::now();
|
int64_t dly = tpos - Time::now();
|
||||||
if (dly > 0) {
|
if (dly > 0) {
|
||||||
XDebug("ExtModSource",DebugAll,"Sleeping for " FMT64 " usec",dly);
|
XDebug("ExtModSource",DebugAll,"Sleeping for " FMT64 " usec",dly);
|
||||||
Thread::usleep(dly);
|
Thread::usleep((unsigned long)dly);
|
||||||
}
|
}
|
||||||
if (r <= 0)
|
if (r <= 0)
|
||||||
continue;
|
continue;
|
||||||
|
@ -361,7 +378,7 @@ void ExtModSource::run()
|
||||||
Forward(buf,m_total/2);
|
Forward(buf,m_total/2);
|
||||||
buf.clear(false);
|
buf.clear(false);
|
||||||
m_total += r;
|
m_total += r;
|
||||||
tpos += (r*1000000ULL/m_brate);
|
tpos += (r*(u_int64_t)1000000/m_brate);
|
||||||
} while (r > 0);
|
} while (r > 0);
|
||||||
Debug(DebugAll,"ExtModSource [%p] end of data total=%u",this,m_total);
|
Debug(DebugAll,"ExtModSource [%p] end of data total=%u",this,m_total);
|
||||||
m_chan->setRunning(false);
|
m_chan->setRunning(false);
|
||||||
|
@ -763,8 +780,10 @@ void ExtModReceiver::die(bool clearChan)
|
||||||
|
|
||||||
// Now terminate the process and close its stdout pipe
|
// Now terminate the process and close its stdout pipe
|
||||||
closeIn();
|
closeIn();
|
||||||
|
#ifndef _WINDOWS
|
||||||
if (m_pid > 0)
|
if (m_pid > 0)
|
||||||
::kill(m_pid,SIGTERM);
|
::kill(m_pid,SIGTERM);
|
||||||
|
#endif
|
||||||
if (chan && clearChan)
|
if (chan && clearChan)
|
||||||
chan->disconnect();
|
chan->disconnect();
|
||||||
unuse();
|
unuse();
|
||||||
|
@ -806,7 +825,7 @@ bool ExtModReceiver::received(Message &msg, int id)
|
||||||
while (ok) {
|
while (ok) {
|
||||||
Thread::yield();
|
Thread::yield();
|
||||||
lock();
|
lock();
|
||||||
ok = m_waiting.find(&h);
|
ok = (m_waiting.find(&h) != 0);
|
||||||
if (ok && tout && (Time::now() > tout)) {
|
if (ok && tout && (Time::now() > tout)) {
|
||||||
Debug(DebugWarn,"Message '%s' did not return in %d msec [%p]",
|
Debug(DebugWarn,"Message '%s' did not return in %d msec [%p]",
|
||||||
msg.c_str(),m_timeout,this);
|
msg.c_str(),m_timeout,this);
|
||||||
|
@ -825,6 +844,9 @@ bool ExtModReceiver::received(Message &msg, int id)
|
||||||
|
|
||||||
bool ExtModReceiver::create(const char *script, const char *args)
|
bool ExtModReceiver::create(const char *script, const char *args)
|
||||||
{
|
{
|
||||||
|
#ifdef _WINDOWS
|
||||||
|
return false;
|
||||||
|
#else
|
||||||
String tmp(script);
|
String tmp(script);
|
||||||
int pid;
|
int pid;
|
||||||
HANDLE ext2yate[2];
|
HANDLE ext2yate[2];
|
||||||
|
@ -898,6 +920,7 @@ bool ExtModReceiver::create(const char *script, const char *args)
|
||||||
closeAudio();
|
closeAudio();
|
||||||
m_pid = pid;
|
m_pid = pid;
|
||||||
return true;
|
return true;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void ExtModReceiver::cleanup()
|
void ExtModReceiver::cleanup()
|
||||||
|
@ -905,6 +928,7 @@ void ExtModReceiver::cleanup()
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
Debugger debug(DebugAll,"ExtModReceiver::cleanup()"," [%p]",this);
|
Debugger debug(DebugAll,"ExtModReceiver::cleanup()"," [%p]",this);
|
||||||
#endif
|
#endif
|
||||||
|
#ifndef _WINDOWS
|
||||||
// We must call waitpid from here - same thread we started the child
|
// We must call waitpid from here - same thread we started the child
|
||||||
if (m_pid > 0) {
|
if (m_pid > 0) {
|
||||||
// No thread switching if possible
|
// No thread switching if possible
|
||||||
|
@ -923,6 +947,7 @@ void ExtModReceiver::cleanup()
|
||||||
Debug(DebugMild,"Failed waitpid on %d: %s",m_pid,strerror(errno));
|
Debug(DebugMild,"Failed waitpid on %d: %s",m_pid,strerror(errno));
|
||||||
m_pid = 0;
|
m_pid = 0;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
unuse();
|
unuse();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -359,8 +359,8 @@ WpData::WpData(WpSpan* span, const char* card, const char* device, Configuration
|
||||||
|
|
||||||
m_samples = cfg.getIntValue("general","samples",m_samples);
|
m_samples = cfg.getIntValue("general","samples",m_samples);
|
||||||
m_samples = cfg.getIntValue(sect,"samples",m_samples);
|
m_samples = cfg.getIntValue(sect,"samples",m_samples);
|
||||||
m_swap = cfg.getIntValue("general","bitswap",m_swap);
|
m_swap = cfg.getBoolValue("general","bitswap",m_swap);
|
||||||
m_swap = cfg.getIntValue(sect,"bitswap",m_swap);
|
m_swap = cfg.getBoolValue(sect,"bitswap",m_swap);
|
||||||
}
|
}
|
||||||
|
|
||||||
WpData::~WpData()
|
WpData::~WpData()
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
/**
|
/**
|
||||||
* wpchan.cpp
|
* wpchanw.cpp
|
||||||
* This file is part of the YATE Project http://YATE.null.ro
|
* This file is part of the YATE Project http://YATE.null.ro
|
||||||
*
|
*
|
||||||
* Wanpipe PRI cards telephony driver
|
* Wanpipe PRI cards telephony driver for Windows
|
||||||
*
|
*
|
||||||
* Yet Another Telephony Engine - a fully featured software PBX and IVR
|
* Yet Another Telephony Engine - a fully featured software PBX and IVR
|
||||||
* Copyright (C) 2004, 2005 Null Team
|
* Copyright (C) 2004, 2005 Null Team
|
||||||
|
@ -115,13 +115,14 @@ private:
|
||||||
class WpData : public Thread
|
class WpData : public Thread
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
WpData(WpSpan* span, const char* card, const char* device, Thread::Priority prio);
|
WpData(WpSpan* span, const char* card, const char* device, Configuration& cfg, const String& sect);
|
||||||
~WpData();
|
~WpData();
|
||||||
virtual void run();
|
virtual void run();
|
||||||
private:
|
private:
|
||||||
WpSpan* m_span;
|
WpSpan* m_span;
|
||||||
HANDLE m_fd;
|
HANDLE m_fd;
|
||||||
WpChan **m_chans;
|
WpChan **m_chans;
|
||||||
|
bool m_swap;
|
||||||
};
|
};
|
||||||
|
|
||||||
class WpReader : public Thread
|
class WpReader : public Thread
|
||||||
|
@ -165,6 +166,14 @@ INIT_PLUGIN(WpDriver);
|
||||||
#define WP_BUFFER 8188 // maximum length of data = 8K - 4
|
#define WP_BUFFER 8188 // maximum length of data = 8K - 4
|
||||||
|
|
||||||
|
|
||||||
|
static Thread::Priority cfgPriority(Configuration& cfg, const String& sect)
|
||||||
|
{
|
||||||
|
String tmp(cfg.getValue(sect,"thread"));
|
||||||
|
if (tmp.null())
|
||||||
|
tmp = cfg.getValue("general","thread");
|
||||||
|
return Thread::priority(tmp);
|
||||||
|
}
|
||||||
|
|
||||||
static void dump_buffer(const void* buf, int len)
|
static void dump_buffer(const void* buf, int len)
|
||||||
{
|
{
|
||||||
String s;
|
String s;
|
||||||
|
@ -435,15 +444,17 @@ void WpConsumer::Consume(const DataBlock &data, unsigned long tStamp)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
WpData::WpData(WpSpan* span, const char* card, const char* device, Thread::Priority prio)
|
WpData::WpData(WpSpan* span, const char* card, const char* device, Configuration& cfg, const String& sect)
|
||||||
: Thread("WpData",prio), m_span(span), m_fd(INVALID_HANDLE_VALUE), m_chans(0)
|
: Thread("WpData",cfgPriority(cfg,sect)), m_span(span), m_fd(INVALID_HANDLE_VALUE), m_chans(0), m_swap(true)
|
||||||
{
|
{
|
||||||
DDebug(&__plugin,DebugAll,"WpData::WpData(%p) [%p]",span,this);
|
DDebug(&__plugin,DebugAll,"WpData::WpData(%p,'%s','%s') [%p]",span,card,device,this);
|
||||||
HANDLE fd = wp_open(card,device);
|
HANDLE fd = wp_open(card,device);
|
||||||
if (fd != INVALID_HANDLE_VALUE) {
|
if (fd != INVALID_HANDLE_VALUE) {
|
||||||
m_fd = fd;
|
m_fd = fd;
|
||||||
m_span->m_data = this;
|
m_span->m_data = this;
|
||||||
}
|
}
|
||||||
|
m_swap = cfg.getBoolValue("general","bitswap",m_swap);
|
||||||
|
m_swap = cfg.getBoolValue(sect,"bitswap",m_swap);
|
||||||
}
|
}
|
||||||
|
|
||||||
WpData::~WpData()
|
WpData::~WpData()
|
||||||
|
@ -491,7 +502,7 @@ void WpData::run()
|
||||||
for (b = 0; b < bchans; b++) {
|
for (b = 0; b < bchans; b++) {
|
||||||
WpSource *s = m_chans[b]->m_wp_s;
|
WpSource *s = m_chans[b]->m_wp_s;
|
||||||
if (s)
|
if (s)
|
||||||
s->put(PriDriver::bitswap(*dat));
|
s->put(m_swap ? PriDriver::bitswap(*dat) : *dat);
|
||||||
dat++;
|
dat++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -508,7 +519,8 @@ void WpData::run()
|
||||||
for (int n = samp; n > 0; n--) {
|
for (int n = samp; n > 0; n--) {
|
||||||
for (b = 0; b < bchans; b++) {
|
for (b = 0; b < bchans; b++) {
|
||||||
WpConsumer *c = m_chans[b]->m_wp_c;
|
WpConsumer *c = m_chans[b]->m_wp_c;
|
||||||
*dat++ = PriDriver::bitswap(c ? c->get() : 0xff);
|
unsigned char d = c ? c->get() : 0xff;
|
||||||
|
*dat++ = m_swap ? PriDriver::bitswap(d) : d;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
m_span->unlock();
|
m_span->unlock();
|
||||||
|
@ -551,14 +563,6 @@ bool WpChan::openData(const char* format, int echoTaps)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static Thread::Priority cfgPriority(Configuration& cfg, const String& sect)
|
|
||||||
{
|
|
||||||
String tmp(cfg.getValue(sect,"thread"));
|
|
||||||
if (tmp.null())
|
|
||||||
tmp = cfg.getValue("general","thread");
|
|
||||||
return Thread::priority(tmp);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
PriSpan* WpDriver::createSpan(PriDriver* driver, int span, int first, int chans, Configuration& cfg, const String& sect)
|
PriSpan* WpDriver::createSpan(PriDriver* driver, int span, int first, int chans, Configuration& cfg, const String& sect)
|
||||||
{
|
{
|
||||||
|
@ -579,7 +583,7 @@ PriSpan* WpDriver::createSpan(PriDriver* driver, int span, int first, int chans,
|
||||||
WpWriter* wr = new WpWriter(ps,card,dev);
|
WpWriter* wr = new WpWriter(ps,card,dev);
|
||||||
WpReader* rd = new WpReader(ps,card,dev);
|
WpReader* rd = new WpReader(ps,card,dev);
|
||||||
dev = cfg.getValue(sect,"bgroup","IF1");
|
dev = cfg.getValue(sect,"bgroup","IF1");
|
||||||
WpData* dat = new WpData(ps,card,dev,cfgPriority(cfg,sect));
|
WpData* dat = new WpData(ps,card,dev,cfg,sect);
|
||||||
wr->startup();
|
wr->startup();
|
||||||
rd->startup();
|
rd->startup();
|
||||||
dat->startup();
|
dat->startup();
|
||||||
|
|
|
@ -271,7 +271,7 @@ public:
|
||||||
bool packTo(DataBlock& data) const;
|
bool packTo(DataBlock& data) const;
|
||||||
bool getString(String& retval) const;
|
bool getString(String& retval) const;
|
||||||
inline bool isValid() const
|
inline bool isValid() const
|
||||||
{ return m_type; }
|
{ return (m_type != 0); }
|
||||||
inline bool isVendor() const
|
inline bool isVendor() const
|
||||||
{ return (m_type && (m_type->code == 26)) && (m_vendor == 0); }
|
{ return (m_type && (m_type->code == 26)) && (m_vendor == 0); }
|
||||||
inline int vendor() const
|
inline int vendor() const
|
||||||
|
@ -738,7 +738,7 @@ bool RadAttrib::getString(String& retval) const
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case a_int:
|
case a_int:
|
||||||
retval = ntohl(*(int32_t*)m_value.data());
|
retval = (int)ntohl(*(int32_t*)m_value.data());
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return false;
|
return false;
|
||||||
|
@ -747,7 +747,7 @@ bool RadAttrib::getString(String& retval) const
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
unsigned char RadiusClient::s_sessionId = (Time::now() & 0xff);
|
unsigned char RadiusClient::s_sessionId = (unsigned char)(Time::now() & 0xff);
|
||||||
|
|
||||||
RadiusClient::~RadiusClient()
|
RadiusClient::~RadiusClient()
|
||||||
{
|
{
|
||||||
|
|
|
@ -194,6 +194,12 @@ Package=<4>
|
||||||
Begin Project Dependency
|
Begin Project Dependency
|
||||||
Project_Dep_Name _dbpbx
|
Project_Dep_Name _dbpbx
|
||||||
End Project Dependency
|
End Project Dependency
|
||||||
|
Begin Project Dependency
|
||||||
|
Project_Dep_Name _yradius
|
||||||
|
End Project Dependency
|
||||||
|
Begin Project Dependency
|
||||||
|
Project_Dep_Name _extmodule
|
||||||
|
End Project Dependency
|
||||||
}}}
|
}}}
|
||||||
|
|
||||||
###############################################################################
|
###############################################################################
|
||||||
|
@ -582,6 +588,21 @@ Package=<4>
|
||||||
|
|
||||||
###############################################################################
|
###############################################################################
|
||||||
|
|
||||||
|
Project: "_yradius"=.\_yradius.dsp - Package Owner=<4>
|
||||||
|
|
||||||
|
Package=<5>
|
||||||
|
{{{
|
||||||
|
}}}
|
||||||
|
|
||||||
|
Package=<4>
|
||||||
|
{{{
|
||||||
|
Begin Project Dependency
|
||||||
|
Project_Dep_Name Libyate
|
||||||
|
End Project Dependency
|
||||||
|
}}}
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
|
||||||
Project: "_yrtpchan"=.\_yrtpchan.dsp - Package Owner=<4>
|
Project: "_yrtpchan"=.\_yrtpchan.dsp - Package Owner=<4>
|
||||||
|
|
||||||
Package=<5>
|
Package=<5>
|
||||||
|
|
|
@ -72,6 +72,7 @@ typedef signed __int64 int64_t;
|
||||||
typedef unsigned __int64 u_int64_t;
|
typedef unsigned __int64 u_int64_t;
|
||||||
typedef unsigned __int64 uint64_t;
|
typedef unsigned __int64 uint64_t;
|
||||||
|
|
||||||
|
typedef int pid_t;
|
||||||
typedef int socklen_t;
|
typedef int socklen_t;
|
||||||
typedef unsigned long in_addr_t;
|
typedef unsigned long in_addr_t;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue