#include "config.h" #include AppConfig g_cfg; size_t safe_strcpy(char*dest,const char*src,size_t size){ if(!dest||size==0) return 0; dest[0]=0; if(!src) return 0; size_t i=0; for(;is && isspace((unsigned char)e[-1])) *--e=0; return s; } void config_defaults(AppConfig*c){ memset(c,0,sizeof(*c)); safe_strcpy(c->cms_ip, "117.131.63.98", sizeof(c->cms_ip)); /* from screenshot */ c->cms_port = DEFAULT_CMS_PORT; /* 7031 */ safe_strcpy(c->device_id,"AX5324540", sizeof(c->device_id)); safe_strcpy(c->license, "abc12345", sizeof(c->license)); safe_strcpy(c->proto_version, ISUP_PROTO_VERSION, sizeof(c->proto_version)); c->sms_port = DEFAULT_SMS_PORT; /* 7660 */ c->alarm_port = 7200; safe_strcpy(c->rtmp_host,"127.0.0.1",sizeof(c->rtmp_host)); c->rtmp_port = DEFAULT_RTMP_PORT; /* 1935 */ safe_strcpy(c->rtmp_app, "live", sizeof(c->rtmp_app)); c->fps=SIM_FPS; c->width=SIM_IMAGE_WIDTH; c->height=SIM_IMAGE_HEIGHT; c->bitrate_kbps=SIM_BITRATE/1000; safe_strcpy(c->log_file,"./isup.log",sizeof(c->log_file)); c->log_level=LOG_INFO; c->simulate=0; } int config_load(const char*path,AppConfig*c){ config_defaults(c); FILE*f=fopen(path,"r"); if(!f){ LOG_WARN("config '%s' not found, using defaults",path); return SUCCESS; } char line[512]; while(fgets(line,sizeof(line),f)){ if(line[0]=='#'||line[0]==';'||line[0]=='\n') continue; char*val=strchr(line,':'); if(!val) val=strchr(line,'='); if(!val) continue; *val=0; char*k=str_trim(line); char*v=str_trim(val+1); #define EQ(x) (strcmp(k,x)==0) if(EQ("cms_ip")) safe_strcpy(c->cms_ip,v,sizeof(c->cms_ip)); else if(EQ("cms_port")) c->cms_port=atoi(v); else if(EQ("device_id")) safe_strcpy(c->device_id,v,sizeof(c->device_id)); else if(EQ("license")) safe_strcpy(c->license,v,sizeof(c->license)); else if(EQ("proto_version")) safe_strcpy(c->proto_version,v,sizeof(c->proto_version)); else if(EQ("sms_port")) c->sms_port=atoi(v); else if(EQ("alarm_port")) c->alarm_port=atoi(v); else if(EQ("rtmp_host")) safe_strcpy(c->rtmp_host,v,sizeof(c->rtmp_host)); else if(EQ("rtmp_port")) c->rtmp_port=atoi(v); else if(EQ("rtmp_app")) safe_strcpy(c->rtmp_app,v,sizeof(c->rtmp_app)); else if(EQ("fps")) c->fps=atoi(v); else if(EQ("width")) c->width=atoi(v); else if(EQ("height")) c->height=atoi(v); else if(EQ("bitrate_kbps")) c->bitrate_kbps=atoi(v); else if(EQ("log_file")) safe_strcpy(c->log_file,v,sizeof(c->log_file)); else if(EQ("log_level")) c->log_level=atoi(v); else if(EQ("simulate")) c->simulate=atoi(v); } fclose(f); if(c->fps<=0){ LOG_WARN("invalid fps<=0, reset to %d",SIM_FPS); c->fps=SIM_FPS; } /* FIX: div-by-zero */ return SUCCESS; } int config_save(const char*path,const AppConfig*c){ FILE*f=fopen(path,"w"); if(!f) return FAILURE; fprintf(f,"# Hikvision ISUP client config (generated)\n"); fprintf(f,"cms_ip=%s\ncms_port=%d\ndevice_id=%s\nlicense=%s\nproto_version=%s\n", c->cms_ip,c->cms_port,c->device_id,c->license,c->proto_version); fprintf(f,"sms_port=%d\nalarm_port=%d\nrtmp_host=%s\nrtmp_port=%d\nrtmp_app=%s\n", c->sms_port,c->alarm_port,c->rtmp_host,c->rtmp_port,c->rtmp_app); fprintf(f,"fps=%d\nwidth=%d\nheight=%d\nbitrate_kbps=%d\nlog_file=%s\nlog_level=%d\nsimulate=%d\n", c->fps,c->width,c->height,c->bitrate_kbps,c->log_file,c->log_level,c->simulate); fclose(f); return SUCCESS; } void config_print(const AppConfig*c){ LOG_INFO("config: platform=%s:%d dev=%s proto=%s rtmp=%s:%d/%s fps=%d %dx%d @%dkbps", c->cms_ip,c->cms_port,c->device_id,c->proto_version,c->rtmp_host,c->rtmp_port, c->rtmp_app,c->fps,c->width,c->height,c->bitrate_kbps); }