void *probe(void *data) { int sock; struct sockaddr_in rmt; st_netfd_t rmt_nfd; struct probedef *probe = (struct probedef *)data; st_utime_t start; ST_INITIATE(probe->port); start = st_utime(); if (debug > 3) fprintf(stderr, "Connecting to: %s\n", probe->ipaddress); if (st_connect(rmt_nfd, (struct sockaddr *)&rmt, sizeof(rmt), TIMEOUT) < 0) { char buf[256]; sprintf(buf, "%s(%d): %s", probe->ipaddress, __LINE__, strerror(errno)); probe->connect = ((float) (st_utime() - start)) * 0.000001; probe->msg = strdup(buf); LOG(LOG_DEBUG, probe->msg); if (debug > 3) fprintf(stderr, "%s: %s\n", probe->ipaddress, probe->msg); goto err_close; } probe->connect = ((float) (st_utime() - start)) * 0.000001; err_close: st_netfd_close(rmt_nfd); probe->total = ((float) (st_utime() - start)) * 0.000001; done: thread_count--; return NULL; }
void _st_vp_check_clock(void) { _st_thread_t *thread; st_utime_t elapsed, now; now = st_utime(); elapsed = now - _ST_LAST_CLOCK; _ST_LAST_CLOCK = now; if (_st_curr_time && now - _st_last_tset > 999000) { _st_curr_time = time(NULL); _st_last_tset = now; } while (_ST_SLEEPQ != NULL) { thread = _ST_SLEEPQ; ST_ASSERT(thread->flags & _ST_FL_ON_SLEEPQ); if (thread->due > now) break; _ST_DEL_SLEEPQ(thread); /* If thread is waiting on condition variable, set the time out flag */ if (thread->state == _ST_ST_COND_WAIT) thread->flags |= _ST_FL_TIMEDOUT; /* Make thread runnable */ ST_ASSERT(!(thread->flags & _ST_FL_IDLE_THREAD)); thread->state = _ST_ST_RUNNABLE; _ST_ADD_RUNQ(thread); } }
/* * Initialize this Virtual Processor */ int st_init(void) { _st_thread_t *thread; if (_st_active_count) { /* Already initialized */ return 0; } /* We can ignore return value here */ //st_set_eventsys(ST_EVENTSYS_DEFAULT); st_set_eventsys(ST_EVENTSYS_ALT); if (_st_io_init() < 0) return -1; memset(&_st_this_vp, 0, sizeof(_st_vp_t)); ST_INIT_CLIST(&_ST_RUNQ); ST_INIT_CLIST(&_ST_IOQ); ST_INIT_CLIST(&_ST_ZOMBIEQ); #ifdef DEBUG ST_INIT_CLIST(&_ST_THREADQ); #endif if ((*_st_eventsys->init)() < 0) return -1; _st_this_vp.pagesize = getpagesize(); _st_this_vp.last_clock = st_utime(); /* * Create idle thread */ _st_this_vp.idle_thread = st_thread_create(_st_idle_thread_start, NULL, 0, 0); if (!_st_this_vp.idle_thread) return -1; _st_this_vp.idle_thread->flags = _ST_FL_IDLE_THREAD; _st_active_count--; _ST_DEL_RUNQ(_st_this_vp.idle_thread); /* * Initialize primordial thread */ thread = (_st_thread_t *) calloc(1, sizeof(_st_thread_t) + (ST_KEYS_MAX * sizeof(void *))); if (!thread) return -1; thread->private_data = (void **) (thread + 1); thread->state = _ST_ST_RUNNING; thread->flags = _ST_FL_PRIMORDIAL; _ST_SET_CURRENT_THREAD(thread); _st_active_count++; #ifdef DEBUG _ST_ADD_THREADQ(thread); #endif return 0; }
int st_randomize_stacks(int on) { int wason = _st_randomize_stacks; _st_randomize_stacks = on; if (on) srandom((unsigned int) st_utime()); return wason; }
int st_timecache_set(int on) { int wason = (_st_curr_time) ? 1 : 0; if (on) { _st_curr_time = time(NULL); _st_last_tset = st_utime(); } else _st_curr_time = 0; return wason; }
/* * Initialize this Virtual Processor */ extern "C" int st_init(void) { st_thread_t *thread; if (_st_active_count) { /* Already initialized */ return 0; } if (_st_io_init() < 0) return -1; memset(&_st_this_vp, 0, sizeof(st_vp_t)); ST_INIT_CLIST(&_ST_RUNQ); ST_INIT_CLIST(&_ST_IOQ); ST_INIT_CLIST(&_ST_SLEEPQ); ST_INIT_CLIST(&_ST_ZOMBIEQ); _st_this_vp.maxfd = -1; _st_this_vp.pagesize = getpagesize(); _st_this_vp.last_clock = st_utime(); /* * Create idle thread */ _st_this_vp.idle_thread = st_thread_create(_st_idle_thread_start, NULL, 0, 0); if (!_st_this_vp.idle_thread) return -1; _st_this_vp.idle_thread->flags = _ST_FL_IDLE_THREAD; _st_active_count--; _ST_DEL_RUNQ(_st_this_vp.idle_thread); /* * Initialize primordial thread */ thread = (st_thread_t *)calloc(1, sizeof(st_thread_t)+ (ST_KEYS_MAX * sizeof(void *))); if (!thread) return -1; thread->private_data = (void **)(thread + 1); thread->state = _ST_ST_RUNNING; thread->flags = _ST_FL_PRIMORDIAL; _ST_SET_CURRENT_THREAD(thread); _st_active_count++; _st_notify_event = CreateEvent(NULL, TRUE, FALSE, NULL); _st_semaphore = CreateSemaphore(NULL, 0, 10,NULL); return 0; }
void _st_vp_check_clock(void) { st_thread_t *thread; st_utime_t elapsed, now; now = st_utime(); elapsed = now - _st_this_vp.last_clock; _st_this_vp.last_clock = now; if (_st_curr_time && now - _st_last_tset > 999000) { _st_curr_time = time(NULL); _st_last_tset = now; } while (_ST_SLEEPQ.next != &_ST_SLEEPQ) { thread = _ST_THREAD_PTR(_ST_SLEEPQ.next); ST_ASSERT(thread->flags & _ST_FL_ON_SLEEPQ); if (elapsed < thread->sleep) { thread->sleep -= elapsed; _ST_SLEEPQMAX -= elapsed; break; } _ST_DEL_SLEEPQ(thread, 1); elapsed -= thread->sleep; /* If thread is waiting on condition variable, set the time out flag */ if (thread->state == _ST_ST_COND_WAIT) thread->flags |= _ST_FL_TIMEDOUT; /* Make thread runnable */ ST_ASSERT(!(thread->flags & _ST_FL_IDLE_THREAD)); thread->state = _ST_ST_RUNNABLE; _ST_ADD_RUNQ(thread); } }
void *probe(void *data) { int sock, len; struct sockaddr_in rmt; st_netfd_t rmt_nfd; struct probedef *probe = (struct probedef *)data; char buffer[1024]; st_utime_t start; ST_INITIATE(110); start = st_utime(); if (debug > 3) fprintf(stderr, "Connecting to: %s\n", probe->ipaddress); if (st_connect(rmt_nfd, (struct sockaddr *)&rmt, sizeof(rmt), TIMEOUT) < 0) { char buf[256]; sprintf(buf, "%s(%d): %s", probe->ipaddress, __LINE__, strerror(errno)); probe->connect = ((float) (st_utime() - start)) * 0.000001; probe->msg = strdup(buf); LOG(LOG_DEBUG, probe->msg); if (debug > 3) fprintf(stderr, "%s: %s\n", probe->ipaddress, probe->msg); goto err_close; } probe->connect = ((float) (st_utime() - start)) * 0.000001; // expect here: +OK POP3 xxx.xxxxxxx.xx v2000.70rh server ready memset(buffer, 0, sizeof(buffer)); len = st_read(rmt_nfd, buffer, sizeof(buffer), TIMEOUT); if (len == -1) { ST_ERROR("read", TIMEOUT); goto err_close; } if (debug > 3) fprintf(stderr, "< %s", buffer); if (buffer[0] != '+') { probe->msg = strdup(buffer); goto err_close; } if (probe->username == NULL || probe->username[0] == 0) { probe->msg = strdup("missing username"); goto err_close; } sprintf(buffer, "USER %s\n", probe->username); if (debug > 3) fprintf(stderr, "> %s", buffer); len = st_write(rmt_nfd, buffer, strlen(buffer), TIMEOUT); if (len == -1) { ST_ERROR("write", TIMEOUT); goto err_close; } // expect here: +OK User name accepted, password please memset(buffer, 0, sizeof(buffer)); len = st_read(rmt_nfd, buffer, sizeof(buffer), TIMEOUT); if (len == -1) { ST_ERROR("read", TIMEOUT); goto err_close; } if (debug > 3) fprintf(stderr, "< %s", buffer); if (buffer[0] != '+') { probe->msg = strdup(buffer); goto err_close; } sprintf(buffer, "PASS %s\n", probe->password); if (debug > 3) fprintf(stderr, "> %s", buffer); len = st_write(rmt_nfd, buffer, strlen(buffer), TIMEOUT); if (len == -1) { ST_ERROR("write", TIMEOUT); goto err_close; } // expect here: +OK Mailbox open, 62 messages memset(buffer, 0, sizeof(buffer)); len = st_read(rmt_nfd, buffer, sizeof(buffer), TIMEOUT); if (len == -1) { ST_ERROR("read", TIMEOUT); goto err_close; } if (debug > 3) fprintf(stderr, "< %s", buffer); if (buffer[0] != '+') { probe->msg = strdup(buffer); goto err_close; } sprintf(buffer, "QUIT\n"); if (debug > 3) fprintf(stderr, "> %s", buffer); len = st_write(rmt_nfd, buffer, strlen(buffer), TIMEOUT); if (len == -1) { ST_ERROR("write", TIMEOUT); goto err_close; } // expect here: +OK Sayonara memset(buffer, 0, sizeof(buffer)); len = st_read(rmt_nfd, buffer, sizeof(buffer), TIMEOUT); if (len == -1) { ST_ERROR("read", TIMEOUT); goto err_close; } if (debug > 3) fprintf(stderr, "< %s", buffer); if (buffer[0] != '+') { probe->msg = strdup(buffer); goto err_close; } err_close: st_netfd_close(rmt_nfd); probe->total = ((float) (st_utime() - start)) * 0.000001; done: thread_count--; return NULL; }