UNPKG

enet

Version:

The ENet Networking Library cross compiled to javascript

197 lines (187 loc) 6.45 kB
mergeInto(LibraryManager.library, { inet_ntop__deps: ['__setErrNo', '$ERRNO_CODES','inet_ntop4','inet_ntop6'], inet_ntop: function(af, src, dst, size){ switch(af){ case {{{ cDefine('AF_INET') }}}: return _inet_ntop4(src,dst,size); case {{{ cDefine('AF_INET6') }}}: return _inet_ntop6(src,dst,size); default: ___setErrNo(ERRNO_CODES.EAFNOSUPPORT); return 0; } }, inet_pton__deps: ['__setErrNo', '$ERRNO_CODES','inet_pton4','inet_pton6'], inet_pton: function(af,src,dst){ switch(af){ case {{{ cDefine('AF_INET') }}}: return _inet_pton4(src,dst); case {{{ cDefine('AF_INET6') }}}: return _inet_pton6(src,dst); default: ___setErrNo(ERRNO_CODES.EAFNOSUPPORT); return -1; } }, inet_addr: function(ptr) { var b = Pointer_stringify(ptr).split("."); if (b.length !== 4) return -1; // we return -1 for error, and otherwise a uint32. this helps inet_pton differentiate return (Number(b[0]) | (Number(b[1]) << 8) | (Number(b[2]) << 16) | (Number(b[3]) << 24)) >>> 0; }, inet_aton_raw: function(str) { var b = str.split("."); return (Number(b[0]) | (Number(b[1]) << 8) | (Number(b[2]) << 16) | (Number(b[3]) << 24)) >>> 0; }, inet_ntoa_raw: function(addr) { return (addr & 0xff) + '.' + ((addr >> 8) & 0xff) + '.' + ((addr >> 16) & 0xff) + '.' + ((addr >> 24) & 0xff) }, inet_ntoa__deps: ['inet_ntoa_raw'], inet_ntoa: function(in_addr) { if (!_inet_ntoa.buffer) { _inet_ntoa.buffer = _malloc(1024); } var addr = getValue(in_addr, 'i32'); var str = _inet_ntoa_raw(addr); writeStringToMemory(str.substr(0, 1024), _inet_ntoa.buffer); return _inet_ntoa.buffer; }, inet_aton__deps: ['inet_addr'], inet_aton: function(cp, inp) { var addr = _inet_addr(cp); setValue(inp, addr, 'i32'); if (addr < 0) return 0; return 1; }, inet_ntop4__deps: ['__setErrNo', '$ERRNO_CODES','inet_ntoa_raw'], inet_ntop4: function(src,dst,size){ var str = _inet_ntoa_raw(getValue(src, 'i32')); if(str.length+1 > size){ ___setErrNo(ERRNO_CODES.ENOSPC); return 0; } writeStringToMemory(str,dst); return dst; }, inet_ntop6__deps: ['__setErrNo', '$ERRNO_CODES','inet_ntop6_raw'], inet_ntop6: function(src, dst, size){ var str = _inet_ntop6_raw(src); if(str.length+1 > size){ ___setErrNo(ERRNO_CODES.ENOSPC); return 0; } writeStringToMemory(str,dst); return dst; }, inet_ntop6_raw__deps: ['htons'], inet_ntop6_raw: function(src){ var str = ""; var word=0; var longest=0; var lastzero=0; var zstart=0; var len=0; var i=0; var hasipv4 = true; var v4part = ""; for(i=0;i<10;i++){ if(HEAPU8[src+i] !== 0) {hasipv4 = false;break;} } if(hasipv4){ v4part = HEAPU8[src+12]+"."+HEAPU8[src+13]+"."+HEAPU8[src+14]+"."+HEAPU8[src+15]; if(HEAPU8[src+10]==255 && HEAPU8[src+11]==255) { str="::ffff:";//IPv4-mapped IPv6 address str+=v4part; return str; } if(HEAPU8[src+11]==0 && HEAPU8[src+11]==0){//IPv4-compatible str="::"; //loopback or any ? if(v4part == "0.0.0.0") v4part = ""; if(v4part == "0.0.0.1") v4part = "1"; str+=v4part; return str; } } //first run to find the longest consecutive zeros for(word=0;word<8;word++){ if(HEAPU16[(src+word*2)>>1]==0) { if(word - lastzero > 1){ len = 0; } lastzero = word; len++; } if(len > longest) { longest = len; zstart = word - longest + 1; } } for(word=0;word<8;word++){ if(longest>1){ if(HEAPU16[(src+word*2)>>1]==0 && word >= zstart && word < (zstart+longest) ){ if(word==zstart) { str+=":"; if(zstart==0) str+=":"; } continue; } } str+=Number(_htons(HEAPU16[(src+word*2)>>1])).toString(16); str+= word<7? ":" : ""; } return str; }, inet_pton4__deps: ['inet_addr'], inet_pton4: function(src,dst){ var ret = _inet_addr(src); if (ret == -1 || isNaN(ret)) return 0; setValue(dst, ret, 'i32'); return 1; }, inet_pton6__deps: ['inet_pton6_raw'], inet_pton6:function(src,dst){ return _inet_pton6_raw(Pointer_stringify(src),dst); }, inet_pton6_raw__deps:['htons'], inet_pton6_raw: function(addr,dst){ var words; var w,offset,z,i; /* http://home.deds.nl/~aeron/regex/ */ var valid6regx=/^((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\3)::|:\b|$))|(?!\2\3)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4})$/i if(!valid6regx.test(addr)){ return 0; } if(addr == "::"){ for(i=0;i<16;i++) HEAPU8[dst+i]=0; return 1; } if(addr.indexOf("::")==0){ addr = addr.replace("::","Z:"); }else{ addr = addr.replace("::",":Z:"); } if(addr.indexOf(".")>0){ addr = addr.replace(new RegExp('[.]', 'g'),":"); words = addr.split(":"); words[words.length-4] = parseInt(words[words.length-4]) + parseInt(words[words.length-3])*256; words[words.length-3] = parseInt(words[words.length-2]) + parseInt(words[words.length-1])*256; words = words.slice(0,words.length-2); }else{ words = addr.split(":"); } offset = 0; z=0; for(w=0;w<words.length;w++){ if(typeof words[w] === 'string'){ if(words[w]=='Z'){ for(z=0; z< (8 - words.length+1); z++){ HEAPU16[(dst+(w+z)*2)>>1] = 0; } offset = z-1; }else{ HEAPU16[(dst+(w+offset)*2)>>1] = _htons(parseInt(words[w],16)); } }else HEAPU16[(dst+(w+offset)*2)>>1] = words[w]; } return 1; } });