/** Process an incoming main loop control request @returns non-zero on success, 0 on failure (errno set) **/ int http_control_request(HTTPCNX *http, char *action) { char buffer[1024]; if ( strcmp(action,"resume")==0 ) { exec_mls_resume(TS_NEVER); return 1; } else if ( sscanf(action,"pauseat=%[-0-9%:A-Za-z]",buffer)==1 ) { TIMESTAMP ts; http_decode(buffer); ts = convert_to_timestamp(buffer); if ( ts!=TS_INVALID ) { exec_mls_resume(ts); return 1; } else { output_error("control command '%s' has an invalid timestamp", buffer); return 0; } } else if ( strcmp(action,"shutdown")==0 ) { output_message("server shutdown by client"); exit(XC_SUCCESS); } return 0; }
int convert_to_timestamp_stub(const char *buffer, void *data, PROPERTY *prop) { TIMESTAMP ts = convert_to_timestamp(buffer); *(int64 *)data = ts; return 1; }
char *gld_loadHndl::read_object_prop(char *buffer, size_t len){ //wchar_t wbuff[1024]; //char tbuff[1024]; char *rand_ptr = NULL; char *rand_mode_ptr = NULL; char *unit_ptr = NULL; double realval = 0.0; UNIT *unit=NULL; SAXParseException *e = NULL; void *addr = object_get_addr(obj, propname); /* get the & to set later */ if(this->obj == NULL){ sprintf(errmsg, "Null object pointer in read_object_prop(%s)", buffer); return errmsg; // no object } if(this->prop == NULL){ if (strcmp(propname, "parent")==0){ if (strcmp(propname, "root")==0){ obj->parent = NULL; } else { add_unresolved(obj,PT_object,(void*)&obj->parent,oclass,buffer,"XML",42,UR_RANKS); } } else if (strcmp(propname, "rank")==0){ obj->rank = atoi(buffer); } else if (strcmp(propname, "clock")==0){ obj->clock = atoi64(buffer); } else if (strcmp(propname, "latitude")==0){ obj->latitude = load_latitude(buffer); } else if (strcmp(propname, "longitude")==0){ obj->longitude = load_longitude(buffer); } else if (strcmp(propname, "in")==0){ obj->in_svc = convert_to_timestamp(buffer); } else if (strcmp(propname, "out")==0){ obj->out_svc = convert_to_timestamp(buffer); } else { sprintf(errmsg, "Null property pointer in read_object_prop(%s)", buffer); return errmsg; } return NULL; } // determine property type switch(prop->ptype){ case PT_double: // scan for "random" if(strncmp("random.", buffer, 7) == 0){ char temp[256]; char *modep = NULL; double first = 0.0, second = 0.0; RANDOMTYPE rt; strncpy(temp, buffer, 256); modep = strtok(temp+7, "("); if(modep == NULL){ //output_error("XML_Load: misformed random() value"); load_state = false; sprintf(errmsg, "Misformed random() value in read_object_prop(%s)", buffer); return errmsg; } rt = random_type(modep); if(rt == 0){ //output_message("XML_Load: '%s' ~ %s is not a valid random distribution", buffer, modep); load_state = false; sprintf(errmsg, "Invalid random distribution in read_object_prop(%s)", buffer); return errmsg; } else { first = atof(strtok(NULL, ",")); second = atof(strtok(NULL, ")")); realval = random_value(rt, first, second); } if(strlen(strchr(buffer, ')')+1) > 0){ /* look for units */ unit = unit_find(strchr(buffer, ')') + 2); if (unit!=NULL && prop->unit!=NULL && unit_convert_ex(unit,prop->unit,&realval)==0){ sprintf(errmsg, "Cannot convert units from %s to %s in read_object_prop(%s)", unit->name,prop->unit->name, buffer); load_state = false; return errmsg; } } } else { unit_ptr = NULL; realval = strtod(buffer, &unit_ptr); if(unit_ptr != NULL){ while(*unit_ptr == ' ') ++unit_ptr; unit = unit_find(unit_ptr); if(strlen(unit_ptr) > 0){ if (unit!=NULL && prop->unit!=NULL && unit_convert_ex(unit,prop->unit,&realval)==0){ sprintf(errmsg, "Cannot convert units from %s to %s in read_object_prop(%s)", unit->name,prop->unit->name, buffer); load_state = false; return errmsg; } } } } /* if((unit_ptr != NULL) && (*unit_ptr != '\0')){;} */ if(object_set_double_by_name(obj, propname, realval) == 0){ sprintf(errmsg, "Could not set \"%s\" to %f in read_object_prop(%s)", propname, realval, buffer); load_state = false; return errmsg; } else { return NULL; /* success */ } break; case PT_object: if(add_unresolved(obj,PT_object,(void*)addr,oclass,buffer,"XML",42,UR_NONE) == NULL){ sprintf(errmsg, "Failure with add_unresolved() in read_object_prop(%s)", buffer); return errmsg; } break; default: if(prop->ptype < _PT_LAST){ // set value by name if (object_set_value_by_name(obj, propname, buffer)==0) { //output_error("XML_Load: property %s of %s:%s could not be set to '%s'", propname, obj->oclass->name, obj->id, buffer); sprintf(errmsg, "Property %s of %s:%i could not be set to \"%s\" in read_object_prop()", propname, obj->oclass->name, obj->id, buffer); load_state = false; return errmsg; } else { ; } } else { sprintf(errmsg, "Invalid property id = %i in read_object_prop(%s)", prop->ptype, buffer); return errmsg; } } return 0; }
/** Test the daylight saving time calculations @return the number of test the failed **/ int timestamp_test(void) { #define NYEARS 50 int year; static DATETIME last_t; TIMESTAMP step = SECOND; TIMESTAMP ts; char buf1[64], buf2[64]; char steptxt[32]; TIMESTAMP *event[]={dststart,dstend}; int failed=0, succeeded=0; output_test("BEGIN: daylight saving time event test for TZ=%s...", current_tzname); convert_from_timestamp(step,steptxt,sizeof(steptxt)); for (year=0; year<NYEARS; year++) { int test; for (test=0; test<2; test++) { for (ts=(event[test])[year]-2*step; ts<(event[test])[year]+2*step;ts+=step) { DATETIME t; if (local_datetime(ts,&t)) { if (last_t.is_dst!=t.is_dst) output_test("%s + %s = %s", strdatetime(&last_t,buf1,sizeof(buf1))?buf1:"(invalid)", steptxt, strdatetime(&t,buf2,sizeof(buf2))?buf2:"(invalid)"); last_t = t; succeeded++; } else { output_test("FAILED: unable to convert ts=%"FMT_INT64"d to local time", ts); failed++; } } } } output_test("END: daylight saving time event test"); step=HOUR; convert_from_timestamp(step,steptxt,sizeof(steptxt)); output_test("BEGIN: round robin test at %s timesteps",steptxt); for (ts=DAY+tzoffset; ts<DAY*365*NYEARS; ts+=step) { DATETIME t; if (local_datetime(ts,&t)) { TIMESTAMP tt = mkdatetime(&t); convert_from_timestamp(ts,buf1,sizeof(buf1)); convert_from_timestamp(tt,buf2,sizeof(buf2)); if (tt==TS_INVALID) { output_test("FAILED: unable to extract %04d-%02d-%02d %02d:%02d:%02d %s (dow=%s, doy=%d)", t.year,t.month,t.day,t.hour,t.minute,t.second,t.tz,dow[t.weekday],t.yearday); failed++; } else if (tt!=ts) { output_test("FAILED: unable to match %04d-%02d-%02d %02d:%02d:%02d %s (dow=%s, doy=%d)\n from=%s, to=%s", t.year,t.month,t.day,t.hour,t.minute,t.second,t.tz,dow[t.weekday],t.yearday,buf1,buf2); failed++; } else if (convert_to_timestamp(buf1)!=ts) { output_test("FAILED: unable to convert %04d-%02d-%02d %02d:%02d:%02d %s (dow=%s, doy=%d) back to a timestamp\n from=%s, to=%s", t.year,t.month,t.day,t.hour,t.minute,t.second,t.tz,dow[t.weekday],t.yearday,buf1,buf2); output_test(" expected %" FMT_INT64 "d but got %" FMT_INT64 "d", ts, convert_to_timestamp(buf1)); failed++; } else succeeded++; } else { output_test("FAILED: timestamp_test: unable to convert ts=%"FMT_INT64"d to local time", ts); failed++; } } output_test("END: round robin test",steptxt); output_test("END: daylight saving time tests for %d to %d", YEAR0, YEAR0+NYEARS); output_verbose("daylight saving time tests: %d succeeded, %d failed (see '%s' for details)", succeeded, failed, global_testoutputfile); return failed; }