static int run10(UNUSED int argc, void **argv) { int fd; ssize_t total; assert(argc == 1); fd = (intptr_t)(argv[0]); total = 0; while (true) { ssize_t nread; char buf[1024]; if ((nread = mrkthr_read_allb(fd, buf, sizeof(buf))) <= 0) { break; } total += nread; } //CTRACE("received %ld bytes", total); TRACEC("."); close(fd); return 0; }
static int mymonitor(UNUSED int argc, UNUSED void **argv) { while (!shutting_down) { if (mrkthr_sleep(1000) != 0) { break; } TRACEC("pub:%ld\t%ld\t%ld\n", mygauge_flush(&published), mygauge_flush(&published_bytes), mygauge_flush(&oframes)); } return 0; }
static int run11(UNUSED int argc, void **argv) { mnbytes_t *fpath, *sport; int sock, fd; struct stat sb; off_t offset; assert(argc == 1); fpath = argv[0]; assert(fpath != NULL); BYTES_INCREF(fpath); sock = -1; fd = -1; sport = bytes_printf("%d", port); offset = 0; if ((sock = mrkthr_socket_connect(host, BCDATA(sport), AF_INET)) == -1) { goto err; } if ((fd = open(BCDATA(fpath), O_RDONLY)) == -1) { goto err; } if (fstat(fd, &sb) != 0) { goto err; } if (mrkthr_sendfile(fd, sock, &offset, sb.st_size) != 0) { goto err; } //CTRACE("sent %ld bytes of %s", sb.st_size, BDATA(fpath)); TRACEC("."); end: if (sock != -1) { close(sock); } if (fd != -1) { close(fd); } BYTES_DECREF(&fpath); BYTES_DECREF(&sport); return 0; err: goto end; }
static int traversedir_cb(const char *dir, struct dirent *de, void *udata) { int res; amqp_channel_t *chan; char *path; res = 0; chan = udata; if (de != NULL) { struct stat sb; int fd; char *buf; path = path_join(dir, de->d_name); if (stat(path, &sb) != 0) { perror("stat"); goto end; } //CTRACE("P: %s (%ld)", path, sb.st_size); TRACEC(">"); if ((fd = open(path, O_RDONLY)) == -1) { perror("open"); goto end; } if ((buf = malloc(sb.st_size)) == NULL) { FAIL("malloc"); } if (read(fd, buf, sb.st_size) == -1) { perror("read"); goto end; } res = amqp_channel_publish(chan, "", dest, 0, my_header_completion_cb, NULL, buf, sb.st_size); free(path); free(buf); } end: return res; }
static int my_content_cb(UNUSED amqp_frame_t *method, UNUSED amqp_frame_t *header, char *data, UNUSED void *udata) { //TRACE("---"); //D8(data, header->payload.header->body_size); //TRACE("---"); //CTRACE("C: %s", data); //CTRACE("C: %ld", header->payload.header->body_size); if (data != NULL) { free(data); } TRACEC("<"); return 0; }
void driver::load(const std::wstring &name, const std::wstring &file, const std::wstring &devfile) { TRACEV("[driver] [load(3)] > Entering routine."); if(m_loaded) throw std::exception("driver already loaded", 0); { tstring strBuf = boost::str(tformat(_T("[driver] [load(3)] loading driver - name: [%1%], file: [%2%], devfile: [%3%]")) % name.c_str() % file.c_str() % devfile.c_str() ); TRACEBUFI(strBuf); } m_name = name; m_file = file; m_devfile = devfile; SC_HANDLE manager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); if(!manager) throw win32_error("OpenSCManager"); SC_HANDLE service = CreateService(manager, m_name.c_str(), m_name.c_str(), SERVICE_ALL_ACCESS, SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL, m_file.c_str(), NULL, NULL, NULL, NULL, NULL); if(!service) { DWORD err = 0; TRACEERR("[driver] [load(3)]", L"driver not currently installed as service", err = GetLastError()); err = 0; service = OpenService(manager, m_name.c_str(), SERVICE_ALL_ACCESS); if(!service) { TRACEERR("[driver] [load(3)]", L"opening service", err = GetLastError()); CloseServiceHandle(manager); throw win32_error("OpenService", err); } // make sure it has the same path as m_file. DWORD bytes; BOOL ret = QueryServiceConfig(service, NULL, 0, &bytes); if(ret || (err = GetLastError()) != ERROR_INSUFFICIENT_BUFFER) { TRACEERR("[driver] [load(3)]", L"calling QueryServiceConfig", err); CloseServiceHandle(service); CloseServiceHandle(manager); throw win32_error("QueryServiceConfig", err); } err = 0; // reset error-code, so that nobody else accidentally trips over it. QUERY_SERVICE_CONFIG *qsc = (QUERY_SERVICE_CONFIG*)malloc(bytes); if(!qsc) { TRACEERR("[driver] [load(3)]", L"allocating memory for QueryServiceConfig", err = GetLastError()); CloseServiceHandle(service); CloseServiceHandle(manager); throw std::bad_alloc(); } ret = QueryServiceConfig(service, qsc, bytes, &bytes); if(!ret) { TRACEERR("[driver] [load(3)]", L"second call to QueryServiceConfig", err = GetLastError()); CloseServiceHandle(service); CloseServiceHandle(manager); throw win32_error("QueryServiceConfig", err); } bool del = _wcsicmp(qsc->lpBinaryPathName, m_file.c_str()) != 0; if (del) { // check for e.g. \??\C:\WINDOWS\System32\DRIVERS\ipfltdrv.sys wchar_t * descr = _wgetenv(L"WINDIR"); if (descr) { wstring strFullPath(L"\\??\\"); strFullPath += descr; strFullPath += L"\\"; strFullPath += m_file; tstring strBuf = boost::str(tformat(_T("[driver] [load(3)] comparing against driver full-path:[%1%]")) % strFullPath ); TRACEBUFI(strBuf); del = _wcsicmp(qsc->lpBinaryPathName, strFullPath.c_str()) != 0; } else { TRACEW("[driver] [load(3)] WINDIR environment variable not found!"); } } tstring strBuf = boost::str(tformat(_T("[driver] [load(3)] service name: [%1%], file name: [%2%]")) % qsc->lpBinaryPathName % m_file.c_str() ); TRACEBUFI(strBuf); free(qsc); // paths don't match, remove service and recreate. if(del) { TRACEW("[driver] [load(3)] paths don't match, removing and recreating driver-service"); TCHAR buf[128]; // if it's not removable, bail out. if(!this->removable) { TRACEC("[driver] [load(3)] ERROR trying to remove driver-service"); CloseServiceHandle(service); CloseServiceHandle(manager); throw std::exception("unremovable service mismatch", 0); } // check if its running SERVICE_STATUS status; ret = QueryServiceStatus(service, &status); if(!ret) { TRACEERR("[driver] [load(3)]", L"ERROR calling QueryServiceStatus", err = GetLastError()); CloseServiceHandle(service); CloseServiceHandle(manager); throw win32_error("QueryServiceStatus", err); } // and stop it if it is. switch(status.dwCurrentState) { case SERVICE_STOPPED: TRACEI("[driver] [load(3)] service state: [SERVICE_STOPPED]"); break; case SERVICE_START_PENDING: TRACEI("[driver] [load(3)] service state: [SERVICE_START_PENDING]"); break; case SERVICE_STOP_PENDING: TRACEI("[driver] [load(3)] service state: [SERVICE_STOP_PENDING]"); break; case SERVICE_RUNNING: TRACEI("[driver] [load(3)] service state: [SERVICE_RUNNING]"); break; case SERVICE_CONTINUE_PENDING: TRACEI("[driver] [load(3)] service state: [SERVICE_CONTINUE_PENDING]"); break; case SERVICE_PAUSE_PENDING: TRACEI("[driver] [load(3)] service state: [SERVICE_PAUSE_PENDING]"); break; case SERVICE_PAUSED: TRACEI("[driver] [load(3)] service state: [SERVICE_PAUSED]"); break; default: swprintf_s(buf, _countof(buf), L"[driver] [load(3)] * ERROR: Unknown service state: [%u]", status.dwCurrentState); TRACEBUFE(buf); break; } if(status.dwCurrentState != SERVICE_STOPPED && status.dwCurrentState != SERVICE_STOP_PENDING) { ret = ControlService(service, SERVICE_CONTROL_STOP, &status); if(!ret) { TRACEERR("[driver] [load(3)]", L"ERROR stopping driver-service", err = GetLastError()); CloseServiceHandle(service); CloseServiceHandle(manager); throw win32_error("ControlService", err); } } // now delete the service. ret = DeleteService(service); err = GetLastError(); CloseServiceHandle(service); if(!ret && err != ERROR_SERVICE_MARKED_FOR_DELETE) { TRACEERR("[driver] [load(3)]", L"ERROR deleting driver-service", err); CloseServiceHandle(manager); throw win32_error("DeleteService", err); } // finally recreate it. service = CreateService(manager, m_name.c_str(), m_name.c_str(), SERVICE_ALL_ACCESS, SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL, m_file.c_str(), NULL, NULL, NULL, NULL, NULL); if(!service && (err = GetLastError()) == ERROR_SERVICE_MARKED_FOR_DELETE) { TRACEW("[driver] [load(3)] Service marked for delete; trying closing/reopening SCM"); CloseServiceHandle(manager); Sleep(10000); manager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); if (!manager) { TRACEERR("[driver] [load(3)]", L"ERROR while re-opening SCM", err = GetLastError()); throw win32_error("OpenSCManager 2", err); } service = CreateService(manager, m_name.c_str(), m_name.c_str(), SERVICE_ALL_ACCESS, SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL, m_file.c_str(), NULL, NULL, NULL, NULL, NULL); } if(!service) { TRACEERR("[driver] [load(3)]", L"ERROR re-creating driver-service", err = GetLastError()); CloseServiceHandle(manager); throw win32_error("CreateService", err); } TRACEI("[driver] [load(3)] finished re-creating driver-service"); } } SERVICE_STATUS status; if(QueryServiceStatus(service, &status)) { if (status.dwCurrentState == SERVICE_RUNNING) { TRACES("[driver] [load(3)] Driver-service is running"); m_started = true; } else if (status.dwCurrentState == SERVICE_START_PENDING) { TRACEI("[driver] [load(3)] Driver-service is starting"); } else { TRACEI("[driver] [load(3)] driver-service not running"); TCHAR buf[128]; swprintf_s(buf, _countof(buf), L"[driver] [load(3)] - service state: [%u]", status.dwCurrentState); TRACEBUFW(buf); } } CloseServiceHandle(service); CloseServiceHandle(manager); m_loaded = true; TRACEV("[driver] [load(3)] < Leaving routine."); }