int win32_process_pipe(HANDLE* ret){ SECURITY_ATTRIBUTES sat; HANDLE tmp; sat.nLength = sizeof(SECURITY_ATTRIBUTES); sat.bInheritHandle = TRUE; sat.lpSecurityDescriptor = NULL; if(!CreatePipe(&tmp,&ret[0],&sat,0)){ OSERROR("createpipe"); // handle Win32 Error Here return 0; } DuplicateHandle(GetCurrentProcess(),tmp,GetCurrentProcess(),&ret[1],0,FALSE,DUPLICATE_SAME_ACCESS); CloseHandle(tmp); #if 0 // won't work.. /* make non-inheritable */ if(!SetHandleInformation(ret[1], HANDLE_FLAG_INHERIT, 0)){ OSERROR("sethandleinformation"); return 0; } #endif return 1; }
static PyObject * PyFB_ipstats(PyObject *self) { struct ipstat ipstat; size_t len = sizeof ipstat; PyObject *r, *t; if (sysctlbyname("net.inet.ip.stats", &ipstat, &len, NULL, 0) < 0) return OSERROR(); r = PyDict_New(); #define p(f) \ t = PyLong_FromUnsignedLong((unsigned long)ipstat.ips_##f); \ PyDict_SetItemString(r, #f, t); \ Py_DECREF(t); p(total); p(badsum); p(toosmall); p(tooshort); p(toolong); p(badhlen); p(badlen); p(badoptions); p(badvers); p(fragments); p(fragdropped); p(fragtimeout); p(reassembled); p(delivered); p(noproto); p(forward); p(forward); p(fastforward); p(cantforward); p(notmember); p(redirectsent); p(localout); p(rawout); p(odropped); p(noroute); p(fragmented); p(ofragments); p(cantfrag); p(nogif); p(badaddr); #undef p return r; }
int win32_handle_write(HANDLE h,void *p,unsigned int len,unsigned int *res){ BOOL r; r = WriteFile(h,p,len,res,NULL); if(!r){ OSERROR("WriteFile"); return 0; } return 1; }
uintptr_t win32_create_named_pipe(wchar_t* name){ HANDLE h; h = CreateNamedPipeW(name,PIPE_ACCESS_DUPLEX,PIPE_WAIT,PIPE_UNLIMITED_INSTANCES,4096,4096,0,NULL); if(h == INVALID_HANDLE_VALUE){ OSERROR("CreateNamedPipeW"); return -1; } return (uintptr_t)h; }
int win32_handle_wait(HANDLE h){ BOOL r; r = WaitForSingleObject(h,INFINITE); if(!r){ OSERROR("WaitForSingleObject"); return 0; } return 1; }
int win32_handle_close(HANDLE h){ BOOL r; r = CloseHandle(h); if(!r){ OSERROR("CloseHandle"); return 0; } return 1; }
int win32_process_wait(HANDLE process){ BOOL r; DWORD res; r = WaitForSingleObject(process,INFINITE); if(!r){ OSERROR("WaitForSingleObject"); return -1; } GetExitCodeProcess(process,&res); CloseHandle(process); return res; }
static PyObject * PyFB_tcpstats(PyObject *self) { struct tcpstat tcpstat; size_t len = sizeof tcpstat; PyObject *r, *t; if (sysctlbyname("net.inet.tcp.stats", &tcpstat, &len, NULL, 0) < 0) return OSERROR(); r = PyDict_New(); #define p(f) \ t = PyLong_FromUnsignedLong((unsigned long)tcpstat.tcps_##f); \ PyDict_SetItemString(r, #f, t); \ Py_DECREF(t); p(sndtotal); p(sndpack); p(sndbyte); p(sndrexmitpack); p(sndrexmitbyte); p(mturesent); p(sndacks); p(delack); p(sndurg); p(sndprobe); p(sndwinup); p(sndctrl); p(rcvtotal); p(rcvackpack); p(rcvackbyte); p(rcvdupack); p(rcvacktoomuch); p(rcvpack); p(rcvbyte); p(rcvduppack); p(rcvdupbyte); p(pawsdrop); p(rcvpartduppack); p(rcvpartdupbyte); p(rcvoopack); p(rcvoobyte); p(rcvpackafterwin); p(rcvbyteafterwin); p(rcvwinprobe); p(rcvwinupd); p(rcvafterclose); p(rcvbadsum); p(rcvbadoff); p(rcvshort); p(connattempt); p(accepts); p(badsyn); p(listendrop); p(connects); p(closed); p(drops); p(cachedrtt); p(cachedrttvar); p(cachedssthresh); p(conndrops); p(rttupdated); p(segstimed); p(rexmttimeo); p(timeoutdrop); p(persisttimeo); p(persistdrop); p(keeptimeo); p(keepprobe); p(keepdrops); p(predack); p(preddat); p(sc_added); p(sc_retransmitted); p(sc_dupsyn); p(sc_dropped); p(sc_completed); p(sc_bucketoverflow); p(sc_cacheoverflow); p(sc_reset); p(sc_stale); p(sc_aborted); p(sc_badack); p(sc_unreach); p(sc_zonefail); p(sc_sendcookie); p(sc_recvcookie); #undef p return r; }
uintptr_t win32_process_redirected_child(wchar_t* spec,wchar_t* dir, HANDLE std_in, HANDLE std_out, HANDLE std_err){ PROCESS_INFORMATION pi; STARTUPINFOW si; BOOL r; ZeroMemory(&pi, sizeof(PROCESS_INFORMATION)); ZeroMemory(&si, sizeof(STARTUPINFOW)); si.cb = sizeof(STARTUPINFO); si.dwFlags = STARTF_USESTDHANDLES; if(std_in != 0){ si.hStdInput = std_in; }else{ si.hStdInput = GetStdHandle(STD_INPUT_HANDLE); } if(std_out != 0){ si.hStdOutput = std_out; }else{ si.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE); } if(std_err != 0){ si.hStdError = std_err; }else{ si.hStdError = GetStdHandle(STD_ERROR_HANDLE); } r = CreateProcessW(NULL, spec, NULL, NULL, TRUE, 0, NULL, dir, &si, &pi); if(std_out != 0){ CloseHandle(std_out); } if(std_err != 0){ CloseHandle(std_err); } if (! r){ OSERROR("CreateProcess"); return 0; } CloseHandle(pi.hThread); return (uintptr_t)pi.hProcess; }
static PyObject * PyFB_udpstats(PyObject *self) { struct udpstat udpstat; size_t len = sizeof udpstat; PyObject *r, *t; if (sysctlbyname("net.inet.udp.stats", &udpstat, &len, NULL, 0) < 0) return OSERROR(); r = PyDict_New(); #define p(f) \ t = PyLong_FromUnsignedLong((unsigned long)udpstat.udps_##f); \ PyDict_SetItemString(r, #f, t); \ Py_DECREF(t); p(ipackets); p(hdrops); p(badlen); p(badsum); p(nosum); p(noport); p(noportbcast); p(fullsock); t = PyLong_FromUnsignedLong((unsigned long)udpstat.udpps_pcbhashmiss); PyDict_SetItemString(r, "pcbhashmiss", t); Py_DECREF(t); t = PyLong_FromUnsignedLong((unsigned long)( udpstat.udps_ipackets - udpstat.udps_hdrops - udpstat.udps_badlen - udpstat.udps_badsum - udpstat.udps_noport - udpstat.udps_noportbcast - udpstat.udps_fullsock )); PyDict_SetItemString(r, "delivered", t); Py_DECREF(t); p(opackets); #undef p return r; }
static PyObject * PyFB_getpwnam(PyObject *self, PyObject *args) { struct passwd *pwd; char *name; if (!PyArg_ParseTuple(args, "s:getpwnam", &name)) return NULL; errno = 0; pwd = getpwnam(name); if (pwd == NULL) { if (errno == 0) { PyErr_SetString(PyExc_KeyError, name); return NULL; } else return OSERROR(); } return PyObject_FromPasswd(pwd); }
static PyObject * PyFB_getpwuid(PyObject *self, PyObject *args) { struct passwd *pwd; int uid; if (!PyArg_ParseTuple(args, "i:getpwuid", &uid)) return NULL; errno = 0; pwd = getpwuid((uid_t)uid); if (pwd == NULL) { if (errno == 0) { PyObject *uidn = PyInt_FromLong(uid); PyErr_SetObject(PyExc_KeyError, uidn); Py_DECREF(uidn); return NULL; } else return OSERROR(); } return PyObject_FromPasswd(pwd); }
static PyObject * PyFB_ifstats(PyObject *self) { int mib_ifdata[6] = { CTL_NET, PF_LINK, NETLINK_GENERIC, IFMIB_IFDATA, 0, IFDATA_GENERAL}; struct ifmibdata ifmd; size_t len; int value, i; PyObject *r, *d, *t; len = sizeof value; if (sysctlbyname("net.link.generic.system.ifcount", &value, &len, NULL, 0) < 0) return OSERROR(); r = PyDict_New(); for (i = 1; i <= value; i++) { len = sizeof ifmd; mib_ifdata[4] = i; if (sysctl(mib_ifdata, 6, &ifmd, &len, NULL, 0) < 0) { Py_DECREF(r); PyErr_SetFromErrno(PyExc_OSError); return Py_None; } d = PyDict_New(); #define p_long(f) p(PyLong_FromUnsignedLong, unsigned long, f) #define p_str(f) p(PyString_FromString, char *, f) #define p_int(f) p(PyInt_FromLong, long, f) #define p(adoptor, castor, f) \ t = adoptor((castor)ifmd.ifmd_##f); \ PyDict_SetItemString(d, #f, t); \ Py_DECREF(t); p_str(name); p_int(pcount); p_int(flags); p_int(snd_len); p_int(snd_maxlen); p_int(snd_drops); #undef p #define p(adoptor, castor, f) \ t = adoptor((castor)ifmd.ifmd_data.ifi_##f); \ PyDict_SetItemString(d, #f, t); \ Py_DECREF(t); p_int(type); p_int(physical); p_int(addrlen); p_int(hdrlen); p_int(recvquota); p_int(xmitquota); p_long(mtu); p_long(metric); p_long(baudrate); p_long(ipackets); p_long(ierrors); p_long(opackets); p_long(oerrors); p_long(collisions); p_long(ibytes); p_long(obytes); p_long(imcasts); p_long(omcasts); p_long(iqdrops); p_long(noproto); p_long(hwassist); #undef p PyDict_SetItemString(r, ifmd.ifmd_name, d); Py_DECREF(d); } return r; }