4#include "gsPlatformUtil.h"
12 #include "win32/gsUtilWin32.c"
14 #include "linux/gsUtilLinux.c"
16 #include "macosx/gsUtilMacOSX.c"
18 #include "nitro/gsUtilNitro.c"
20 #include "ps2/gsUtilPs2.c"
22 #include "ps3/gsUtilPs3.c"
24 #include "psp/gsUtilPSP.c"
25#elif defined(_REVOLUTION)
26 #include "revolution/gsUtilRevolution.c"
28 #error "Missing or unsupported platform"
31#if defined(__cplusplus)
47#if defined(_WIN32) || defined(_UNIX) || defined (_REVOLUTION)
48 int finishedResolving;
64#if (defined(_WIN32) || defined(_UNIX) || defined (_REVOLUTION)) && !defined(GSI_NO_THREADS) && !defined(GSI_NO_ASYNC_DNS)
69 DWORD WINAPI gsiResolveHostnameThread(
void * arg)
75 GSIResolveHostnameHandle handle = (GSIResolveHostnameHandle)arg;
84 hostent = gethostbyname(handle->hostname);
88 handle->ip = *(
unsigned int *)hostent->h_addr_list[0];
93 handle->ip = GSI_ERROR_RESOLVING_HOSTNAME;
99 handle->finishedResolving = 1;
106 gsiExitThread(handle->threadID);
118static void *gsiResolveHostnameThread(
void * arg)
120 static GSICriticalSection aHostnameCrit;
121 static int aInitialized = 0;
125 GSIResolveHostnameHandle handle = (GSIResolveHostnameHandle)arg;
129 gsiInitializeCriticalSection(&aHostnameCrit);
132 gsiEnterCriticalSection(&aHostnameCrit);
135 aHostAddr = gethostbyname(handle->hostname);
140 ip = inet_ntoa(*(in_addr *)aHostAddr->addrList[0]);
142 gsDebugFormat(GSIDebugCat_HTTP, GSIDebugType_State, GSIDebugLevel_Comment,
143 "Resolved host '%s' to ip '%s'\n", handle->hostname, ip);
145 handle->ip = inet_addr(ip);
151 handle->ip = GSI_ERROR_RESOLVING_HOSTNAME;
156 handle->finishedResolving = 1;
158 gsiLeaveCriticalSection(&aHostnameCrit);
171static void gsiResolveHostnameThread(
void * arg)
173 GSIResolveHostnameHandle handle = (GSIResolveHostnameHandle)arg;
174 struct addrinfo hints, *result = NULL;
180 memset(&hints, 0,
sizeof(hints));
181 hints.ai_family = PF_UNSPEC;
182 hints.ai_socktype = SOCK_STREAM;
185 error = getaddrinfo(handle->hostname,
"http", &hints, &result);
190 ip = inet_ntoa((*(
struct sockaddr_in*)result->ai_addr).sin_addr);
192 gsDebugFormat(GSIDebugCat_HTTP, GSIDebugType_State, GSIDebugLevel_Comment,
193 "Resolved host '%s' to ip '%s'\n", handle->hostname, ip);
196 handle->ip = inet_addr(ip);
199 freeaddrinfo(result);
204 handle->ip = GSI_ERROR_RESOLVING_HOSTNAME;
210 handle->finishedResolving = 1;
213 gsiExitThread(handle->threadID);
219int gsiStartResolvingHostname(
const char * hostname, GSIResolveHostnameHandle * handle)
225 GS_ASSERT_STR(gsi_false,
"PS2 Threading unsupported in current version of the SDK\n");
234 info->hostname = goastrdup(hostname);
242 info->finishedResolving = 0;
244 gsDebugFormat(GSIDebugCat_Common, GSIDebugType_State, GSIDebugLevel_Comment,
245 "(Asynchrounous) DNS lookup starting\n");
248 if(gsiStartThread(gsiResolveHostnameThread, (0x1000), info, &info->threadID) == -1)
250 gsifree(info->hostname);
251 info->hostname = NULL;
263void gsiCancelResolvingHostname(GSIResolveHostnameHandle handle)
266 gsiCancelThread(handle->threadID);
268 if (handle->hostname)
270 gsifree(handle->hostname);
271 handle->hostname = NULL;
277unsigned int gsiGetResolvedIP(GSIResolveHostnameHandle handle)
282 if(!handle->finishedResolving)
283 return GSI_STILL_RESOLVING_HOSTNAME;
289 gsiCleanupThread(handle->threadID);
290 gsifree(handle->hostname);
312int gsiStartResolvingHostname(
const char * hostname, GSIResolveHostnameHandle * handle)
317 gsDebugFormat(GSIDebugCat_HTTP, GSIDebugType_State, GSIDebugLevel_Comment,
318 "(NON-Asynchrounous) DNS lookup starting\n");
321 hostent = gethostbyname(hostname);
331 info->ip = *(
unsigned int *)hostent->h_addr_list[0];
339void gsiCancelResolvingHostname(GSIResolveHostnameHandle handle)
345unsigned int gsiGetResolvedIP(GSIResolveHostnameHandle handle)
349 unsigned int ip = handle->ip;
361char * goastrdup(
const char *src)
366 res = (
char *)gsimalloc(strlen(src) + 1);
372unsigned short * goawstrdup(
const unsigned short *src)
377 res = (
unsigned short *)gsimalloc((wcslen((
wchar_t*)src) + 1) *
sizeof(
unsigned short));
379 wcscpy((
wchar_t*)res, (
const wchar_t*)src);
385char *_strlwr(
char *
string)
390 *
string = (char)tolower(*
string);
397char *_strupr(
char *
string)
402 *
string = (char)toupper(*
string);
419 XNetStartupParams xnsp;
420 memset(&xnsp,0,
sizeof(xnsp));
421 xnsp.cfgSizeOfStruct=
sizeof(xnsp);
422 xnsp.cfgFlags=XNET_STARTUP_BYPASS_SECURITY;
423 if(0 != XNetStartup(&xnsp))
425 OutputDebugString(
"XNetStartup failed\n");
430 #if (!defined(_XBOX) || defined(_X360)) && (defined(GSI_WINSOCK2) || defined(_X360))
431 WSAStartup(MAKEWORD(2,2), &data);
433 WSAStartup(MAKEWORD(1,1), &data);
453extern int sceCdReadClock();
455#if !defined(__MWERKS__) && !defined(_PS2)
456typedef unsigned char u_char;
471static unsigned long GetTicks()
474 asm volatile (
" mfc0 %0, $9 " :
"=r" (ticks));
478#define DEC(x) (10*(x/16)+(x%16))
479#define _BASE_YEAR 70L
480#define _MAX_YEAR 138L
481#define _LEAP_YEAR_ADJUST 17L
482int _days[] = {-1, 30, 58, 89, 119, 150, 180, 211, 242, 272, 303, 333, 364};
484static time_t _gmtotime_t (
497 if ( ((
long)(yr -= 1900) < _BASE_YEAR) || ((
long)yr > _MAX_YEAR) )
500 tmpdays = dy + _days[mo - 1];
501 if ( !(yr & 3) && (mo > 2) )
504 tmptim = (long)yr - _BASE_YEAR;
506 tmptim = ( ( ( ( tmptim ) * 365L
507 + ((long)(yr - 1) >> 2) - (long)_LEAP_YEAR_ADJUST
513 tb.tm_yday = tmpdays;
518 return (tmptim >= 0) ? (time_t)tmptim : (time_t)(-1);
521time_t time(time_t *timer)
524 sceCdCLOCK clocktime;
526 sceCdReadClock(&clocktime);
528 tim = _gmtotime_t ( DEC(clocktime.year)+2000,
529 DEC(clocktime.month),
532 DEC(clocktime.minute),
533 DEC(clocktime.second));
546gsi_time current_time()
549 return (GetTickCount());
553 static unsigned int msec = 0;
554 static unsigned int lastticks = 0;
555 sceCdCLOCK lasttimecalled;
559 sceCdReadClock(&lasttimecalled);
560 msec = (
unsigned int)(DEC(lasttimecalled.day) * 86400000) +
561 (
unsigned int)(DEC(lasttimecalled.hour) * 3600000) +
562 (
unsigned int)(DEC(lasttimecalled.minute) * 60000) +
563 (
unsigned int)(DEC(lasttimecalled.second) * 1000);
566 ticks = (
unsigned int)GetTicks();
567 if(lastticks > ticks)
568 msec += (
unsigned int)(((
unsigned int)(-1) - lastticks) + ticks) / 300000;
570 msec += (
unsigned int)(ticks-lastticks) / 300000;
578 gettimeofday(&time, NULL);
579 return (time.tv_sec * 1000 + time.tv_usec / 1000);
582 assert(OS_IsTickAvailable() == TRUE);
583 return (gsi_time)OS_TicksToMilliSeconds(OS_GetTick());
586 struct SceRtcTick ticks;
589 result = sceRtcGetCurrentTick(&ticks);
593 result = sceRtcGetCurrentClock(&time, 0);
596 result = sceRtcGetTick(&time, &ticks);
601 return (gsi_time)(ticks.tick / 1000);
604 return (gsi_time)(sys_time_get_system_time()/1000);
606#elif defined(_REVOLUTION)
607 OSTick aTickNow= OSGetTick();
608 gsi_time aMilliseconds = (gsi_time)OSTicksToMilliseconds(aTickNow);
609 return aMilliseconds;
617gsi_time current_time_hires()
620#if (!defined(_M_IX86) || (defined(_INTEGRAL_MAX_BITS) && _INTEGRAL_MAX_BITS >= 64))
621 static LARGE_INTEGER counterFrequency;
622 static BOOL haveCounterFrequency = FALSE;
623 static BOOL haveCounter = FALSE;
626 if(!haveCounterFrequency)
628 haveCounter = QueryPerformanceFrequency(&counterFrequency);
629 haveCounterFrequency = TRUE;
634 if(QueryPerformanceCounter(&count))
636 return (gsi_time)(count.QuadPart * 1000000 / counterFrequency.QuadPart);
641 return (current_time() / 1000);
646 static unsigned int msec = 0;
647 static unsigned int lastticks = 0;
648 sceCdCLOCK lasttimecalled;
652 sceCdReadClock(&lasttimecalled);
653 msec = (
unsigned int)(DEC(lasttimecalled.day) * 86400000) +
654 (
unsigned int)(DEC(lasttimecalled.hour) * 3600000) +
655 (
unsigned int)(DEC(lasttimecalled.minute) * 60000) +
656 (
unsigned int)(DEC(lasttimecalled.second) * 1000);
660 ticks = (
unsigned int)GetTicks();
661 if(lastticks > ticks)
662 msec += ((
sizeof(
unsigned int) - lastticks) + ticks) / 300;
664 msec += (
unsigned int)(ticks-lastticks) / 300;
671 struct SceRtcTick ticks;
674 result = sceRtcGetCurrentTick(&ticks);
678 result = sceRtcGetCurrentClock(&time, 0);
681 result = sceRtcGetTick(&time, &ticks);
686 return (gsi_time)(ticks.tick);
692 gettimeofday(&time, NULL);
693 return (time.tv_sec * 1000000 + time.tv_usec);
697 assert(OS_IsTickAvailable() == TRUE);
698 return (gsi_time)OS_TicksToMicroSeconds(OS_GetTick());
702 return (gsi_time)sys_time_get_system_time();
707void msleep(gsi_time msec)
720 msec -= (msec / 1000);
726 DelayThread(msec * 1000);
730 sceKernelDelayThread(msec * 1000);
739 sys_timer_usleep(msec* 1000);
740#elif defined (_REVOLUTION)
741 OSSleepMilliseconds(msec);
752#if defined(_NITRO) || defined(_REVOLUTION)
755#define MKTIME_ERROR (time_t)(-1)
758#define DAY_SEC (24L * 60L * 60L)
759#define YEAR_SEC (365L * DAY_SEC)
760#define FOUR_YEAR_SEC (1461L * DAY_SEC)
761#define DEC_SEC 315532800L
764#define LEAP_YEAR_ADJUST 17L
768#define ChkAdd(dest, src1, src2) ( ((src1 >= 0L) && (src2 >= 0L) \
769 && (dest < 0L)) || ((src1 < 0L) && (src2 < 0L) && (dest >= 0L)) )
772#define ChkMul(dest, src1, src2) ( src1 ? (dest/src1 != src2) : 0 )
774int _lpdays[] = { -1, 30, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 };
775int _days[] = { -1, 30, 58, 89, 119, 150, 180, 211, 242, 272, 303, 333, 364 };
777const char _dnames[] = {
"SunMonTueWedThuFriSat" };
779const char _mnames[] = {
"JanFebMarAprMayJunJulAugSepOctNovDec" };
781static struct tm tb = { 0 };
786static char * store_dt(
char *,
int);
787static char * store_dt(
char *p,
int val)
789 *p++ = (char)(_T(
'0') + val / 10);
790 *p++ = (char)(_T(
'0') + val % 10);
798struct tm * gsiSecondsToDate(
const time_t *timp)
800#if !defined(_NITRO) && !defined(_REVOLUTION)
806 time_t caltim = *timp;
810 struct tm *ptb = &tb;
821 tmptim = (int)(caltim / FOUR_YEAR_SEC);
822 caltim -= ((long)tmptim * FOUR_YEAR_SEC);
827 tmptim = (tmptim * 4) + 70;
829 if ( caltim >= YEAR_SEC )
834 if ( caltim >= YEAR_SEC )
843 if ( caltim >= (YEAR_SEC + DAY_SEC) )
846 caltim -= (YEAR_SEC + DAY_SEC);
862 ptb->tm_year = tmptim;
868 ptb->tm_yday = (int)(caltim / DAY_SEC);
869 caltim -= (long)(ptb->tm_yday) * DAY_SEC;
880 for ( tmptim = 1 ; mdays[tmptim] < ptb->tm_yday ; tmptim++ ) ;
882 ptb->tm_mon = --tmptim;
884 ptb->tm_mday = ptb->tm_yday - mdays[tmptim];
889 ptb->tm_wday = ((int)(*timp / DAY_SEC) + BASE_DOW) % 7;
895 ptb->tm_hour = (int)(caltim / 3600);
896 caltim -= (long)ptb->tm_hour * 3600L;
898 ptb->tm_min = (int)(caltim / 60);
899 ptb->tm_sec = (int)(caltim - (ptb->tm_min) * 60);
902 return( (
struct tm *)ptb );
909time_t gsiDateToSeconds(
struct tm *tb)
911#if !defined(_NITRO) && !defined(_REVOLUTION)
917 time_t tmptm1, tmptm2, tmptm3;
922 if ( ((tmptm1 = tb->tm_year) < BASE_YEAR - 1) || (tmptm1 > MAX_YEAR + 1) )
931 if ( (tb->tm_mon < 0) || (tb->tm_mon > 11) ) {
936 tmptm1 += (tb->tm_mon / 12);
938 if ( (tb->tm_mon %= 12) < 0 ) {
946 if ( (tmptm1 < BASE_YEAR - 1) || (tmptm1 > MAX_YEAR + 1) )
956 tmptm2 = _days[tb->tm_mon];
957 if ( !(tmptm1 & 3) && (tb->tm_mon > 1) )
968 tmptm3 = (tmptm1 - BASE_YEAR) * 365L + ((tmptm1 - 1L) >> 2)
979 tmptm1 = tmptm3 + (tmptm2 = (long)(tb->tm_mday));
980 if ( ChkAdd(tmptm1, tmptm3, tmptm2) )
988 tmptm2 = tmptm1 * 24L;
989 if ( ChkMul(tmptm2, tmptm1, 24L) )
992 tmptm1 = tmptm2 + (tmptm3 = (long)tb->tm_hour);
993 if ( ChkAdd(tmptm1, tmptm2, tmptm3) )
1002 tmptm2 = tmptm1 * 60L;
1003 if ( ChkMul(tmptm2, tmptm1, 60L) )
1004 return MKTIME_ERROR;
1006 tmptm1 = tmptm2 + (tmptm3 = (long)tb->tm_min);
1007 if ( ChkAdd(tmptm1, tmptm2, tmptm3) )
1008 return MKTIME_ERROR;
1016 tmptm2 = tmptm1 * 60L;
1017 if ( ChkMul(tmptm2, tmptm1, 60L) )
1018 return MKTIME_ERROR;
1020 tmptm1 = tmptm2 + (tmptm3 = (long)tb->tm_sec);
1021 if ( ChkAdd(tmptm1, tmptm2, tmptm3) )
1022 return MKTIME_ERROR;
1026 if ( (tbtemp = gsiSecondsToDate(&tmptm1)) == NULL )
1027 return MKTIME_ERROR;
1034 return (time_t)tmptm1;
1041char * gsiSecondsToString(
const time_t *timp)
1043#if !defined(_NITRO) && !defined(_REVOLUTION)
1054 ptm = gsiSecondsToDate(timp);
1060 day = ptm->tm_wday * 3;
1061 mon = ptm->tm_mon * 3;
1063 for (i=0; i < 3; i++,p++) {
1064 *p = *(_dnames + day + i);
1065 *(p+4) = *(_mnames + mon + i);
1073 p = store_dt(p, ptm->tm_mday);
1075 p = store_dt(p, ptm->tm_hour);
1077 p = store_dt(p, ptm->tm_min);
1079 p = store_dt(p, ptm->tm_sec);
1081 p = store_dt(p, 19 + (ptm->tm_year/100));
1082 p = store_dt(p, ptm->tm_year%100);
1086 return ((
char *) buf);
1095#define LONGRAND_MAX 2147483647L
1097static long randomnum = 1;
1099static long nextlongrand(
long seed)
1104 lo = RANa *(
unsigned long)(seed & 0xFFFF);
1105 hi = RANa *((
unsigned long)seed >> 16);
1106 lo += (hi & 0x7FFF) << 16;
1108 if (lo > LONGRAND_MAX)
1115 if (lo > LONGRAND_MAX)
1125static long longrand(
void)
1127 randomnum = nextlongrand(randomnum);
1132void Util_RandSeed(
unsigned long seed)
1135 randomnum = seed ? (long)(seed & LONGRAND_MAX) : 1;
1138int Util_RandInt(
int low,
int high)
1140 unsigned int range = (
unsigned int)high-low;
1146 num = (int)(longrand() % range);
1158static void QuartToTrip(
char *quart,
char *trip,
int inlen)
1161 trip[0] = (char)(quart[0] << 2 | quart[1] >> 4);
1163 trip[1] = (char)((quart[1] & 0x0F) << 4 | quart[2] >> 2);
1165 trip[2] = (char)((quart[2] & 0x3) << 6 | quart[3]);
1168static void TripToQuart(
const char *trip,
char *quart,
int inlen)
1170 unsigned char triptemp[3];
1172 for (i = 0; i < inlen ; i++)
1174 triptemp[i] = (
unsigned char)trip[i];
1181 quart[0] = (char)(triptemp[0] >> 2);
1182 quart[1] = (char)(((triptemp[0] & 3) << 4) | (triptemp[1] >> 4));
1183 quart[2] = (char)((triptemp[1] & 0x0F) << 2 | (triptemp[2] >> 6));
1184 quart[3] = (char)(triptemp[2] & 0x3F);
1188const char defaultEncoding[] = {
'+',
'/',
'='};
1189const char alternateEncoding[] = {
'[',
']',
'_'};
1190const char urlSafeEncodeing[] = {
'-',
'_',
'='};
1192void B64Decode(
const char *input,
char *output,
int inlen,
int * outlen,
int encodingType)
1194 const char *encoding = NULL;
1195 const char *holdin = input;
1206 switch(encodingType)
1209 encoding = alternateEncoding;
1212 encoding = urlSafeEncodeing;
1214 default: encoding = defaultEncoding;
1217 GS_ASSERT(inlen >= 0);
1227 while (readpos < inlen && input[readpos] != encoding[2])
1234 if (input[readpos] >=
'0' && input[readpos] <=
'9')
1235 block[readpos%4] = (char)(input[readpos] - 48 + 52);
1236 else if (input[readpos] >=
'a' && input[readpos] <=
'z')
1237 block[readpos%4] = (char)(input[readpos] - 71);
1238 else if (input[readpos] >=
'A' && input[readpos] <=
'Z')
1239 block[readpos%4] = (char)(input[readpos] - 65);
1240 else if (input[readpos] == encoding[0])
1241 block[readpos%4] = 62;
1242 else if (input[readpos] == encoding[1])
1243 block[readpos%4] = 63;
1246 else if (input[readpos] == encoding[2])
1248 else if (input[readpos] ==
'\0')
1262 QuartToTrip(block, &output[writepos], 4);
1269 if ((readpos != 0) && (readpos%4 != 0))
1272 memset(&block[readpos%4], encoding[2], (
unsigned int)4-(readpos%4));
1273 QuartToTrip(block, &output[writepos], readpos%4);
1290void B64Encode(
const char *input,
char *output,
int inlen,
int encodingType)
1292 const char *encoding;
1293 char *holdout = output;
1300 switch(encodingType)
1303 encoding = alternateEncoding;
1306 encoding = urlSafeEncodeing;
1308 default: encoding = defaultEncoding;
1314 TripToQuart(input, output, min(todo, 3));
1322 else if (inlen % 3 == 2)
1325 while (output > holdout)
1328 if (output >= lastchar)
1329 *output = encoding[2];
1330 else if (*output <= 25)
1331 *output = (char)(*output + 65);
1332 else if (*output <= 51)
1333 *output = (char)(*output + 71);
1334 else if (*output <= 61)
1335 *output = (char)(*output + 48 - 52);
1336 else if (*output == 62)
1337 *output = encoding[0];
1338 else if (*output == 63)
1339 *output = encoding[1];
1343int B64DecodeLen(
const char *input,
int encodingType)
1345 const char *encoding;
1346 const char *holdin = input;
1348 switch(encodingType)
1351 encoding = alternateEncoding;
1354 encoding = urlSafeEncodeing;
1356 default: encoding = defaultEncoding;
1361 if (*input == encoding[2])
1362 return (input - holdin) / 4 * 3 + (input - holdin - 1) % 4;
1366 return (input - holdin) / 4 * 3;
1369void B64InitEncodeStream(
B64StreamData *data,
const char *input,
int len,
int encodingType)
1371 data->input = input;
1373 data->encodingType = encodingType;
1376gsi_bool B64EncodeStream(
B64StreamData *data,
char output[4])
1378 const char *encoding;
1388 switch(data->encodingType)
1391 encoding = alternateEncoding;
1394 encoding = urlSafeEncodeing;
1396 default: encoding = defaultEncoding;
1399 TripToQuart(data->input, output, min(data->len, 3));
1403 for(i = 0 ; i < 4 ; i++)
1407 *c = (char)(*c + 65);
1409 *c = (char)(*c + 71);
1411 *c = (char)(*c + 48 - 52);
1420 output[3] = encoding[2];
1422 output[2] = encoding[2];
1430void gsiPadRight(
char *cArray,
char padChar,
int cLength);
1431char * gsiXxteaAlg(
const char *sIn,
int nIn,
char key[XXTEA_KEY_SIZE],
int bEnc,
int *nOut);
1433void gsiPadRight(
char *cArray,
char padChar,
int cLength)
1436 int length = (int)strlen(cArray);
1438 diff = cLength - length;
1439 memset(&cArray[length], padChar, (
size_t)diff);
1451char * gsiXxteaAlg(
const char *sIn,
int nIn,
char key[XXTEA_KEY_SIZE],
int bEnc,
int *nOut)
1454 unsigned int *k, *v, z, y;
1455 char *oStr = NULL, *pStr = NULL;
1459 if (!sIn || !key[0] || nIn == 0)
1473 gsiPadRight( key ,
'\0', XXTEA_KEY_SIZE);
1474 k = (
unsigned int *)key;
1477 sIn2 = (
char *)gsimalloc((
size_t)(4 * nIn));
1479 gsiPadRight( sIn2,
'\0', 4*nIn);
1480 v = (
unsigned int *)sIn2;
1486 i = ( int )( 6 + 52/nIn );
1490 unsigned int sum = 0;
1495 e = ( int )( sum >> 2 );
1496 for ( p = -1; ++p < nIn; )
1498 y = v[( p < n1 ) ? p + 1 : 0 ];
1500 ( (( z >> 5 ) ^ ( y << 2 ))
1501 + (( y >> 3 ) ^ ( z << 4 )))
1503 + ( k[( p ^ e ) & 3 ] ^ z )));
1509 unsigned int sum = (
unsigned int ) i * 0x9E3779B9;
1512 int e = ( int )( sum >> 2 );
1513 for ( p = nIn; p-- != 0; )
1515 z = v[( p != 0 ) ? p - 1 : n1 ];
1517 ( (( z >> 5 ) ^ ( y << 2 ))
1518 + (( y >> 3 ) ^ ( z << 4 )))
1520 + ( k[( p ^ e ) & 3 ] ^ z )));
1529 oStr = (
char *)gsimalloc((
size_t)(4 * nIn + 1));
1532 for ( i = -1; ++i < nIn; )
1534 unsigned int q = v[ i ];
1536 *pStr++ = (char)(q & 0xFF);
1537 *pStr++ = (char)(( q >> 8 ) & 0xFF);
1538 *pStr++ = (char)(( q >> 16 ) & 0xFF);
1539 *pStr++ = (char)(( q >> 24 ) & 0xFF);
1555char * gsXxteaEncrypt(
const char * iStr,
int iLength,
char key[XXTEA_KEY_SIZE],
int *oLength)
1557 return gsiXxteaAlg( iStr, iLength, key, 1, oLength );
1568char * gsXxteaDecrypt(
const char * iStr,
int iLength,
char key[XXTEA_KEY_SIZE],
int *oLength)
1570 return gsiXxteaAlg( iStr, iLength, key, 0, oLength);
1578void gsiCheckStack(
void)
1582 OS_CheckStack(OS_GetCurrentThread());
1584 static gsi_bool checkFailed = gsi_false;
1587 OSStackStatus status = OS_GetStackStatus(OS_GetCurrentThread());
1590 const char * reason;
1591 if(status == OS_STACK_OVERFLOW)
1592 reason =
"OVERFLOW";
1593 else if(status == OS_STACK_ABOUT_TO_OVERFLOW)
1594 reason =
"ABOUT TO OVERFLOW";
1595 else if(status == OS_STACK_UNDERFLOW)
1596 reason =
"UNDERFLOW";
1598 reason =
"UNKOWN REASON";
1600 OS_TPrintf(
"STACK CHECK FAILED!: %s\n", reason);
1602 checkFailed = gsi_true;
1614int GOAGetLastError(SOCKET s)
1617 int soval =
sizeof(val);
1618 if (0 != getsockopt(s,SOL_SOCKET,SO_ERROR,&val,&soval))
1626static const char * GOAGetUniqueID_Internal(
void)
1628 static char keyval[17];
1636 IP_GetMacAddr(NULL, MAC);
1639 sprintf(keyval,
"%02X%02X%02X%02X%02X%02X0000",
1657#include <net/if_dl.h>
1660#include <net/if_ether.h>
1662static const char * GetMAC(
void)
1664 static struct sceEENetEtherAddr linkAddress;
1665 struct sceEENetIfname * interfaces;
1666 struct sceEENetIfname * interface;
1671 const unsigned char * MAC = NULL;
1674 sceEENetGetIfnames(NULL, &num);
1675 interfaces = (
struct sceEENetIfname *)gsimalloc(num *
sizeof(
struct sceEENetIfname));
1678 sceEENetGetIfnames(interfaces, &num);
1681 for(i = 0 ; i < num ; i++)
1684 interface = &interfaces[i];
1689 if(sceEENetGetIfinfo(interface->ifn_name, sceEENET_IFINFO_IFTYPE, &type, &len) != 0)
1694 if(type != sceEENET_IFTYPE_ETHER)
1699 len =
sizeof(linkAddress);
1700 if(sceEENetGetIfinfo(interface->ifn_name, sceEENET_IFINFO_MACADDR, &linkAddress, &len) != 0)
1702 MAC = linkAddress.ether_addr_octet;
1709 gsifree(interfaces);
1714#elif defined(SN_SYSTEMS)
1716 static const char * GetMAC(
void)
1719 int len =
sizeof(MAC);
1723 rcode = sndev_get_status(0, SN_DEV_STAT_MAC, MAC, &len);
1724 if((rcode != 0) || (len != 6))
1730#elif defined(INSOCK)
1732 static const char * GetMAC(
void)
1735 static char MAC[16];
1736 extern sceSifMClientData gGSIInsockClientData;
1737 extern u_int gGSIInsockSocketBuffer[NETBUFSIZE] __attribute__((aligned(64)));
1739 int result = sceInetInterfaceControl(&gGSIInsockClientData, &gGSIInsockSocketBuffer,
1740 1, sceInetCC_GetHWaddr, MAC,
sizeof(MAC));
1741 if (result == sceINETE_OK)
1750static const char * GOAGetUniqueID_Internal(
void)
1752 static char keyval[17];
1764 static char errorMAC[6] = { 1, 2, 3, 4, 5, 6 };
1769 sprintf(keyval,
"%02X%02X%02X%02X%02X%02X0000",
1784#if ((defined(_WIN32) && !defined(_XBOX)) || defined(_UNIX))
1786static void GenerateID(
char *keyval)
1789 const char crypttab[63] =
"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
1793 if (QueryPerformanceCounter(&l1))
1794 seed = (l1.LowPart ^ l1.HighPart);
1797 Util_RandSeed(seed ^ GetTickCount() ^ (
unsigned long)time(NULL) ^ clock());
1799 Util_RandSeed(time(NULL) ^ clock());
1801 for (i = 0; i < 19; i++)
1802 if (i == 4 || i == 9 || i == 14)
1805 keyval[i] = crypttab[Util_RandInt(0, 62)];
1810#define PATH_MAX MAX_PATH
1814#define REG_KEY "Software\\GameSpy\\GameSpy 3D\\Registration"
1817const char * GOAGetUniqueID_Internal(
void)
1819 static char keyval[PATH_MAX] =
"";
1825 DWORD thetype = REG_SZ;
1826 DWORD len = MAX_PATH;
1829 if (RegOpenKeyExA(HKEY_CURRENT_USER, REG_KEY, 0, KEY_ALL_ACCESS, &thekey) != ERROR_SUCCESS)
1833 ret = RegQueryValueExA(thekey, (LPCSTR)
"Crypt", 0, &thetype, (LPBYTE)keyval, &len);
1836 f = fopen(
"id.bin",
"r");
1841 ret = fread(keyval,1,19,f);
1847 if (ret != 0 || strlen(keyval) != 19)
1853 ret = RegCreateKeyExA(HKEY_CURRENT_USER, REG_KEY, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &thekey, &disp);
1855 RegSetValueExA(thekey, (LPCSTR)
"Crypt", 0, REG_SZ, (
const LPBYTE)keyval, strlen(keyval)+1);
1857 f = fopen(
"id.bin",
"w");
1860 fwrite(keyval,1,19,f);
1868 RegCloseKey(thekey);
1873 memmove(keyval + 4, keyval + 5, 4);
1874 memmove(keyval + 8, keyval + 10, 4);
1875 memmove(keyval + 12, keyval + 15, 4);
1885const char * GOAGetUniqueID_Internal(
void);
1889#if (!defined(_PS2) && !defined(_PS3) && !defined(_XBOX) && !defined(_PSP)) || defined(UNIQUEID)
1890GetUniqueIDFunction GOAGetUniqueID = GOAGetUniqueID_Internal;
1895#if defined(__cplusplus)
@ string
string value
Definition json.hpp:2859
Definition gsPlatformUtil.h:68
Definition gsPlatformUtil.c:43