BOOL DLLCALL semfile_check(time_t* t, const char* fname) { time_t ft; if(*t==0) /* uninitialized */ *t=time(NULL); if((ft=fdate(fname))==-1 || ft<=*t) return(FALSE); *t=ft; return(TRUE); }
int sbbs_t::exec_misc(csi_t* csi, char *path) { char str[512],tmp[512],buf[1025],ch,op,*p,**pp,**pp1,**pp2; ushort w; uint i=0,j; long l,*lp=NULL,*lp1=NULL,*lp2=NULL; void *vp; struct dirent *de; struct tm tm; switch(*(csi->ip++)) { case CS_VAR_INSTRUCTION: switch(*(csi->ip++)) { /* sub-op-code stored as next byte */ case PRINT_VAR: pp=getstrvar(csi,*(long *)csi->ip); if(!pp || !*pp) { lp=getintvar(csi,*(long *)csi->ip); if(lp) bprintf("%ld",*lp); } else putmsg(cmdstr(*pp,path,csi->str,buf) ,P_SAVEATR|P_NOABORT|P_NOATCODES); csi->ip+=4; return(0); case VAR_PRINTF: case VAR_PRINTF_LOCAL: op=*(csi->ip-1); p=format_string(this, csi); if(op==VAR_PRINTF) putmsg(cmdstr(p,path,csi->str,buf),P_SAVEATR|P_NOABORT|P_NOATCODES); else { if(online==ON_LOCAL) eprintf(LOG_INFO,"%s",cmdstr(p,path,csi->str,buf)); else lputs(LOG_INFO,cmdstr(p,path,csi->str,buf)); } free(p); return(0); case SHOW_VARS: bprintf("shell str=(%08lX) %s\r\n" ,csi->str,csi->str); for(i=0;i<csi->str_vars;i++) bprintf("local str[%d]=(%08lX) (%08lX) %s\r\n" ,i,csi->str_var_name[i] ,csi->str_var[i] ,csi->str_var[i]); for(i=0;i<csi->int_vars;i++) bprintf("local int[%d]=(%08lX) (%08lX) %ld\r\n" ,i,csi->int_var_name[i] ,csi->int_var[i] ,csi->int_var[i]); for(i=0;i<global_str_vars;i++) bprintf("global str[%d]=(%08lX) (%08lX) %s\r\n" ,i,global_str_var_name[i] ,global_str_var[i] ,global_str_var[i]); for(i=0;i<global_int_vars;i++) bprintf("global int[%d]=(%08lX) (%08lX) %ld\r\n" ,i,global_int_var_name[i] ,global_int_var[i] ,global_int_var[i]); return(0); case DEFINE_STR_VAR: if(getstrvar(csi,*(long *)csi->ip)) { csi->ip+=4; return(0); } csi->str_vars++; csi->str_var=(char **)realloc(csi->str_var ,sizeof(char *)*csi->str_vars); csi->str_var_name=(long *)realloc(csi->str_var_name ,sizeof(long)*csi->str_vars); if(csi->str_var==NULL || csi->str_var_name==NULL) { /* REALLOC failed */ errormsg(WHERE,ERR_ALLOC,"local str var" ,sizeof(char *)*csi->str_vars); if(csi->str_var_name) { free(csi->str_var_name); csi->str_var_name=0; } if(csi->str_var) { free(csi->str_var); csi->str_var=0; } csi->str_vars=0; } else { csi->str_var_name[csi->str_vars-1]=*(long *)csi->ip; csi->str_var[csi->str_vars-1]=0; } csi->ip+=4; /* Skip variable name */ return(0); case DEFINE_INT_VAR: if(getintvar(csi,*(long *)csi->ip)) { csi->ip+=4; return(0); } csi->int_vars++; csi->int_var=(long *)realloc(csi->int_var ,sizeof(char *)*csi->int_vars); csi->int_var_name=(long *)realloc(csi->int_var_name ,sizeof(long)*csi->int_vars); if(csi->int_var==NULL || csi->int_var_name==NULL) { /* REALLOC failed */ errormsg(WHERE,ERR_ALLOC,"local int var" ,sizeof(char *)*csi->int_vars); if(csi->int_var_name) { free(csi->int_var_name); csi->int_var_name=0; } if(csi->int_var) { free(csi->int_var); csi->int_var=0; } csi->int_vars=0; } else { csi->int_var_name[csi->int_vars-1]=*(long *)csi->ip; csi->int_var[csi->int_vars-1]=0; } csi->ip+=4; /* Skip variable name */ return(0); case DEFINE_GLOBAL_STR_VAR: if(getstrvar(csi,*(long *)csi->ip)) { csi->ip+=4; return(0); } global_str_vars++; global_str_var=(char **)realloc(global_str_var ,sizeof(char *)*global_str_vars); global_str_var_name=(long *)realloc(global_str_var_name ,sizeof(long)*global_str_vars); if(global_str_var==NULL || global_str_var_name==NULL) { /* REALLOC failed */ errormsg(WHERE,ERR_ALLOC,"global str var" ,sizeof(char *)*global_str_vars); if(global_str_var_name) { free(global_str_var_name); global_str_var_name=0; } if(global_str_var) { free(global_str_var); global_str_var=0; } global_str_vars=0; } else { global_str_var_name[global_str_vars-1]= *(long *)csi->ip; global_str_var[global_str_vars-1]=0; } csi->ip+=4; /* Skip variable name */ return(0); case DEFINE_GLOBAL_INT_VAR: if(getintvar(csi,*(long *)csi->ip)) { csi->ip+=4; return(0); } global_int_vars++; global_int_var=(long *)realloc(global_int_var ,sizeof(char *)*global_int_vars); global_int_var_name=(long *)realloc(global_int_var_name ,sizeof(long)*global_int_vars); if(global_int_var==NULL || global_int_var_name==NULL) { /* REALLOC failed */ errormsg(WHERE,ERR_ALLOC,"local int var" ,sizeof(char *)*global_int_vars); if(global_int_var_name) { free(global_int_var_name); global_int_var_name=0; } if(global_int_var) { free(global_int_var); global_int_var=0; } global_int_vars=0; } else { global_int_var_name[global_int_vars-1] =*(long *)csi->ip; global_int_var[global_int_vars-1]=0; } csi->ip+=4; /* Skip variable name */ return(0); case SET_STR_VAR: pp=getstrvar(csi,*(long *)csi->ip); csi->ip+=4; /* Skip variable name */ if(pp) *pp=copystrvar(csi,*pp ,cmdstr((char *)csi->ip,path,csi->str,buf)); while(*(csi->ip++)); /* Find NULL */ return(0); case SET_INT_VAR: lp=getintvar(csi,*(long *)csi->ip); csi->ip+=4; /* Skip variable name */ if(lp) *lp=*(long *)csi->ip; csi->ip+=4; /* Skip value */ return(0); case COMPARE_STR_VAR: pp=getstrvar(csi,*(long *)csi->ip); csi->ip+=4; /* Skip variable name */ if(pp && *pp) csi->logic=stricmp(*pp ,cmdstr((char *)csi->ip,path,csi->str,buf)); else { /* Uninitialized str var */ if(*(csi->ip)==0) /* Blank static str */ csi->logic=LOGIC_TRUE; else csi->logic=LOGIC_FALSE; } while(*(csi->ip++)); /* Find NULL */ return(0); case STRSTR_VAR: pp=getstrvar(csi,*(long *)csi->ip); csi->ip+=4; /* Skip variable name */ if(pp && *pp && strstr(*pp ,cmdstr((char *)csi->ip,path,csi->str,buf))) csi->logic=LOGIC_TRUE; else csi->logic=LOGIC_FALSE; while(*(csi->ip++)); /* Find NULL */ return(0); case STRNCMP_VAR: i=*csi->ip++; pp=getstrvar(csi,*(long *)csi->ip); csi->ip+=4; /* Skip variable name */ if(pp && *pp) csi->logic=strnicmp(*pp ,cmdstr((char *)csi->ip,path,csi->str,buf),i); else csi->logic=LOGIC_FALSE; while(*(csi->ip++)); /* Find NULL */ return(0); case STRNCMP_VARS: i=*csi->ip++; pp1=getstrvar(csi,*(long *)csi->ip); csi->ip+=4; /* Skip variable name */ pp2=getstrvar(csi,*(long *)csi->ip); csi->ip+=4; if(pp1 && *pp1 && pp2 && *pp2) csi->logic=strnicmp(*pp1,*pp2,i); else csi->logic=LOGIC_FALSE; return(0); case STRSTR_VARS: pp1=getstrvar(csi,*(long *)csi->ip); csi->ip+=4; /* Skip variable name */ pp2=getstrvar(csi,*(long *)csi->ip); csi->ip+=4; if(pp1 && *pp1 && pp2 && *pp2 && strstr(*pp1,*pp2)) csi->logic=LOGIC_TRUE; else csi->logic=LOGIC_FALSE; return(0); case COMPARE_INT_VAR: lp=getintvar(csi,*(long *)csi->ip); csi->ip+=4; /* Skip variable name */ l=*(long *)csi->ip; csi->ip+=4; /* Skip static value */ if(!lp) { /* Unknown variable */ csi->logic=LOGIC_FALSE; return(0); } if(*lp>l) csi->logic=LOGIC_GREATER; else if(*lp<l) csi->logic=LOGIC_LESS; else csi->logic=LOGIC_EQUAL; return(0); case COMPARE_VARS: lp1=lp2=0; pp1=getstrvar(csi,*(long *)csi->ip); if(!pp1) lp1=getintvar(csi,*(long *)csi->ip); csi->ip+=4; /* Skip variable name */ pp2=getstrvar(csi,*(long *)csi->ip); if(!pp2) lp2=getintvar(csi,*(long *)csi->ip); csi->ip+=4; /* Skip variable name */ if(((!pp1 || !*pp1) && !lp1) || ((!pp2 || !*pp2) && !lp2)) { if(pp1 && pp2) /* Both unitialized or blank */ csi->logic=LOGIC_TRUE; else csi->logic=LOGIC_FALSE; return(0); } if(pp1) { /* ASCII */ if(!pp2) { ultoa(*lp2,tmp,10); csi->logic=stricmp(*pp1,tmp); } else csi->logic=stricmp(*pp1,*pp2); return(0); } /* Binary */ if(!lp2) { l=strtol(*pp2,0,0); if(*lp1>l) csi->logic=LOGIC_GREATER; else if(*lp1<l) csi->logic=LOGIC_LESS; else csi->logic=LOGIC_EQUAL; return(0); } if(*lp1>*lp2) csi->logic=LOGIC_GREATER; else if(*lp1<*lp2) csi->logic=LOGIC_LESS; else csi->logic=LOGIC_EQUAL; return(0); case COPY_VAR: lp1=lp2=0; pp1=getstrvar(csi,*(long *)csi->ip); if(!pp1) lp1=getintvar(csi,*(long *)csi->ip); csi->ip+=4; /* Skip variable name */ pp2=getstrvar(csi,*(long *)csi->ip); if(!pp2) lp2=getintvar(csi,*(long *)csi->ip); csi->ip+=4; /* Skip variable name */ if((!pp1 && !lp1) || ((!pp2 || !*pp2) && !lp2)) { csi->logic=LOGIC_FALSE; return(0); } csi->logic=LOGIC_TRUE; if(pp1) { /* ASCII */ if(!pp2) ultoa(*lp2,tmp,10); else strcpy(tmp,*pp2); *pp1=copystrvar(csi,*pp1,tmp); return(0); } if(!lp2) *lp1=strtol(*pp2,0,0); else *lp1=*lp2; return(0); case SWAP_VARS: lp1=lp2=0; pp1=getstrvar(csi,*(long *)csi->ip); if(!pp1) lp1=getintvar(csi,*(long *)csi->ip); csi->ip+=4; /* Skip variable name */ pp2=getstrvar(csi,*(long *)csi->ip); if(!pp2) lp2=getintvar(csi,*(long *)csi->ip); csi->ip+=4; /* Skip variable name */ if(((!pp1 || !*pp1) && !lp1) || ((!pp2 || !*pp2) && !lp2)) { csi->logic=LOGIC_FALSE; return(0); } csi->logic=LOGIC_TRUE; if(pp1) { /* ASCII */ if(!pp2) { if(!strnicmp(*pp2,"0x",2)) { l=strtol((*pp1)+2,0,16); ultoa(*lp2,tmp,16); } else { l=atol(*pp1); ultoa(*lp2,tmp,10); } *pp1=copystrvar(csi,*pp1,tmp); *lp2=l; } else { p=*pp1; *pp1=*pp2; *pp2=p; } return(0); } /* Binary */ if(!lp2) { if(!strnicmp(*pp2,"0x",2)) { l=strtol((*pp2)+2,0,16); ultoa(*lp1,tmp,16); } else { l=atol(*pp2); ultoa(*lp1,tmp,10); } *pp2=copystrvar(csi,*pp2,tmp); *lp1=l; } else { l=*lp1; *lp1=*lp2; *lp2=l; } return(0); case CAT_STR_VAR: pp=getstrvar(csi,*(long *)csi->ip); csi->ip+=4; /* Skip variable name */ strcpy(tmp,(char *)csi->ip); while(*(csi->ip++)); if(pp && *pp) for(i=0;i<MAX_SYSVARS;i++) if(*pp==sysvar_p[i]) break; if(pp && *pp!=csi->str && i==MAX_SYSVARS) { if(*pp) *pp=(char *)realloc(*pp,strlen(*pp)+strlen(tmp)+1); else *pp=(char *)realloc(*pp,strlen(tmp)+1); } if(pp && *pp) strcat(*pp,tmp); return(0); case CAT_STR_VARS: pp1=getstrvar(csi,*(long *)csi->ip); csi->ip+=4; /* Skip dest variable name */ pp2=getstrvar(csi,*(long *)csi->ip); csi->ip+=4; /* Skip source variable name */ /* Concatenate an int var to a str var (as char) */ if(pp2==NULL) { lp=getintvar(csi,*(long *)(csi->ip-4)); if(lp==NULL) { csi->logic=LOGIC_FALSE; return(0); } pp=pp1; tmp[0]=(uchar)*lp; tmp[1]=0; if(pp && *pp) for(i=0;i<MAX_SYSVARS;i++) if(*pp==sysvar_p[i]) break; if(pp && *pp!=csi->str && i==MAX_SYSVARS) { if(*pp) *pp=(char *)realloc(*pp,strlen(*pp)+strlen(tmp)+1); else *pp=(char *)realloc(*pp,strlen(tmp)+1); } if(pp && *pp) strcat(*pp,tmp); return(0); } if(!pp1 || !pp2 || !*pp2) { csi->logic=LOGIC_FALSE; return(0); } csi->logic=LOGIC_TRUE; if(*pp1) for(i=0;i<MAX_SYSVARS;i++) if(*pp1==sysvar_p[i]) break; if(*pp1!=csi->str && (!*pp1 || i==MAX_SYSVARS)) { if(*pp1) *pp1=(char *)realloc(*pp1,strlen(*pp1)+strlen(*pp2)+1); else *pp1=(char *)realloc(*pp1,strlen(*pp2)+1); } strcat(*pp1,*pp2); return(0); case FORMAT_STR_VAR: pp=getstrvar(csi,*(long *)csi->ip); csi->ip+=4; /* Skip variable name */ p=format_string(this, csi); cmdstr(p,path,csi->str,str); if(pp) *pp=copystrvar(csi,*pp,str); free(p); return(0); case FORMAT_TIME_STR: pp=getstrvar(csi,*(long *)csi->ip); csi->ip+=4; /* Skip variable name */ strcpy(str,(char *)csi->ip); while(*(csi->ip++)); /* Find NULL */ lp=getintvar(csi,*(long *)csi->ip); csi->ip+=4; if(pp && lp) { if(localtime_r((time_t *)lp,&tm)!=NULL) { strftime(buf,128,str,&tm); *pp=copystrvar(csi,*pp,buf); } } return(0); case TIME_STR: pp=getstrvar(csi,*(long *)csi->ip); csi->ip+=4; /* Skip str variable name */ lp=getintvar(csi,*(long *)csi->ip); csi->ip+=4; /* Skip int variable name */ if(pp && lp) { strcpy(str,timestr((time_t *)lp)); *pp=copystrvar(csi,*pp,str); } return(0); case DATE_STR: pp=getstrvar(csi,*(long *)csi->ip); csi->ip+=4; /* Skip str variable name */ lp=getintvar(csi,*(long *)csi->ip); csi->ip+=4; /* Skip int variable name */ if(pp && lp) { unixtodstr(&cfg,*lp,str); *pp=copystrvar(csi,*pp,str); } return(0); case SECOND_STR: pp=getstrvar(csi,*(long *)csi->ip); csi->ip+=4; /* Skip str variable name */ lp=getintvar(csi,*(long *)csi->ip); csi->ip+=4; /* Skip int variable name */ if(pp && lp) { sectostr(*lp,str); *pp=copystrvar(csi,*pp,str); } return(0); case STRUPR_VAR: pp=getstrvar(csi,*(long *)csi->ip); csi->ip+=4; if(pp && *pp) strupr(*pp); return(0); case STRLWR_VAR: pp=getstrvar(csi,*(long *)csi->ip); csi->ip+=4; if(pp && *pp) strlwr(*pp); return(0); case TRUNCSP_STR_VAR: pp=getstrvar(csi,*(long *)csi->ip); csi->ip+=4; if(pp && *pp) truncsp(*pp); return(0); case STRIP_CTRL_STR_VAR: pp=getstrvar(csi,*(long *)csi->ip); csi->ip+=4; if(pp && *pp) strip_ctrl(*pp); return(0); case ADD_INT_VAR: case SUB_INT_VAR: case MUL_INT_VAR: case DIV_INT_VAR: case MOD_INT_VAR: case AND_INT_VAR: case OR_INT_VAR: case NOT_INT_VAR: case XOR_INT_VAR: i=*(csi->ip-1); lp=getintvar(csi,*(long *)csi->ip); csi->ip+=4; l=*(long *)csi->ip; csi->ip+=4; if(!lp) return(0); switch(i) { case ADD_INT_VAR: *lp+=l; break; case SUB_INT_VAR: *lp-=l; break; case MUL_INT_VAR: *lp*=l; break; case DIV_INT_VAR: *lp/=l; break; case MOD_INT_VAR: *lp%=l; break; case AND_INT_VAR: *lp&=l; break; case OR_INT_VAR: *lp|=l; break; case NOT_INT_VAR: *lp&=~l; break; case XOR_INT_VAR: *lp^=l; break; } return(0); case COMPARE_ANY_BITS: case COMPARE_ALL_BITS: i=*(csi->ip-1); lp=getintvar(csi,*(long *)csi->ip); csi->ip+=4; l=*(long *)csi->ip; csi->ip+=4; csi->logic=LOGIC_FALSE; if(!lp) return(0); if(i==COMPARE_ANY_BITS) { if(((*lp)&l)!=0) csi->logic=LOGIC_TRUE; } else { if(((*lp)&l)==l) csi->logic=LOGIC_TRUE; } return(0); case ADD_INT_VARS: case SUB_INT_VARS: case MUL_INT_VARS: case DIV_INT_VARS: case MOD_INT_VARS: case AND_INT_VARS: case OR_INT_VARS: case NOT_INT_VARS: case XOR_INT_VARS: i=*(csi->ip-1); lp1=getintvar(csi,*(long *)csi->ip); csi->ip+=4; lp2=getintvar(csi,*(long *)csi->ip); if(!lp2) { pp=getstrvar(csi,*(long *)csi->ip); if(!pp || !*pp) return(0); l=strtol(*pp,0,0); } else l=*lp2; csi->ip+=4; if(!lp1) return(0); switch(i) { case ADD_INT_VARS: *lp1+=l; break; case SUB_INT_VARS: *lp1-=l; break; case MUL_INT_VARS: *lp1*=l; break; case DIV_INT_VARS: *lp1/=l; break; case MOD_INT_VARS: *lp1%=l; break; case AND_INT_VARS: *lp1&=l; break; case OR_INT_VARS: *lp1|=l; break; case NOT_INT_VARS: *lp1&=~l; break; case XOR_INT_VARS: *lp1^=l; break; } return(0); case RANDOM_INT_VAR: lp=getintvar(csi,*(long *)csi->ip); csi->ip+=4; l=*(long *)csi->ip; csi->ip+=4; if(lp) *lp=sbbs_random(l); return(0); case TIME_INT_VAR: lp=getintvar(csi,*(long *)csi->ip); csi->ip+=4; if(lp) *lp=time(NULL); return(0); case DATE_STR_TO_INT: lp=getintvar(csi,*(long *)csi->ip); csi->ip+=4; pp=getstrvar(csi,*(long *)csi->ip); csi->ip+=4; if(lp && pp && *pp) *lp=dstrtounix(&cfg,*pp); return(0); case STRLEN_INT_VAR: lp=getintvar(csi,*(long *)csi->ip); csi->ip+=4; pp=getstrvar(csi,*(long *)csi->ip); csi->ip+=4; if(lp) { if(pp && *pp) *lp=strlen(*pp); else *lp=0; } return(0); case CRC16_TO_INT: lp=getintvar(csi,*(long *)csi->ip); csi->ip+=4; pp=getstrvar(csi,*(long *)csi->ip); csi->ip+=4; if(lp) { if(pp && *pp) *lp=crc16(*pp,0); else *lp=0; } return(0); case CRC32_TO_INT: lp=getintvar(csi,*(long *)csi->ip); csi->ip+=4; pp=getstrvar(csi,*(long *)csi->ip); csi->ip+=4; if(lp) { if(pp && *pp) *lp=crc32(*pp,0); else *lp=0; } return(0); case CHKSUM_TO_INT: lp=getintvar(csi,*(long *)csi->ip); csi->ip+=4; pp=getstrvar(csi,*(long *)csi->ip); csi->ip+=4; if(lp) { *lp=0; if(pp && *pp) { i=0; while(*((*pp)+i)) *lp+=(uchar)*((*pp)+(i++)); } } return(0); case FLENGTH_TO_INT: lp=getintvar(csi,*(long *)csi->ip); csi->ip+=4; pp=getstrvar(csi,*(long *)csi->ip); csi->ip+=4; if(lp) { if(pp && *pp) *lp=flength(*pp); else *lp=0; } return(0); case FTIME_TO_INT: lp=getintvar(csi,*(long *)csi->ip); csi->ip+=4; pp=getstrvar(csi,*(long *)csi->ip); csi->ip+=4; if(lp) { if(pp && *pp) *lp=fdate(*pp); else *lp=0; } return(0); case CHARVAL_TO_INT: case COPY_FIRST_CHAR: // duplicate functionality - doh! lp=getintvar(csi,*(long *)csi->ip); csi->ip+=4; pp=getstrvar(csi,*(long *)csi->ip); csi->ip+=4; if(lp) { if(pp && *pp) *lp=**pp; else *lp=0; } return(0); case GETSTR_VAR: case GETLINE_VAR: case GETNAME_VAR: case GETSTRUPR_VAR: case GETSTR_MODE: pp=getstrvar(csi,*(long *)csi->ip); csi->ip+=4; i=*(csi->ip++); csi->logic=LOGIC_FALSE; switch(*(csi->ip-6)) { case GETNAME_VAR: getstr(buf,i,K_UPRLWR); break; case GETSTRUPR_VAR: getstr(buf,i,K_UPPER); break; case GETLINE_VAR: getstr(buf,i,K_LINE); break; case GETSTR_MODE: l=*(long *)csi->ip; csi->ip+=4; if(l&K_EDIT) { if(pp && *pp) strcpy(buf,*pp); else buf[0]=0; } getstr(buf,i,l); break; default: getstr(buf,i,0); } if(sys_status&SS_ABORT) return(0); if(pp) { *pp=copystrvar(csi,*pp,buf); csi->logic=LOGIC_TRUE; } return(0); case GETNUM_VAR: pp=getstrvar(csi,*(long *)csi->ip); if(!pp) lp=getintvar(csi,*(long *)csi->ip); csi->ip+=4; i=*(short *)csi->ip; csi->ip+=2; csi->logic=LOGIC_FALSE; l=getnum(i); if(!pp && !lp) return(0); if(pp) { if(l<=0) str[0]=0; else ultoa(l,str,10); *pp=copystrvar(csi,*pp,str); csi->logic=LOGIC_TRUE; return(0); } if(lp) { *lp=l; csi->logic=LOGIC_TRUE; } return(0); case SHIFT_STR_VAR: pp=getstrvar(csi,*(long *)csi->ip); csi->ip+=4; i=*(csi->ip++); if(!pp || !*pp) return(0); if(strlen(*pp)>=i) memmove(*pp,*pp+i,strlen(*pp)+1); return(0); case SHIFT_TO_FIRST_CHAR: case SHIFT_TO_LAST_CHAR: i=*(csi->ip-1); pp=getstrvar(csi,*(long *)csi->ip); csi->ip+=4; ch=*(csi->ip++); csi->logic=LOGIC_FALSE; if(!pp || !*pp) return(0); if(i==SHIFT_TO_FIRST_CHAR) p=strchr(*pp,ch); else /* _TO_LAST_CHAR */ p=strrchr(*pp,ch); if(p==NULL) return(0); csi->logic=LOGIC_TRUE; i=p-*pp; if(i>0) memmove(*pp,*pp+i,strlen(p)+1); return(0); case CHKFILE_VAR: pp=getstrvar(csi,*(long *)csi->ip); csi->ip+=4; if(pp && *pp && fexistcase(cmdstr(*pp,path,csi->str,buf))) csi->logic=LOGIC_TRUE; else csi->logic=LOGIC_FALSE; return(0); case PRINTFILE_VAR_MODE: pp=getstrvar(csi,*(long *)csi->ip); csi->ip+=4; i=*(short *)(csi->ip); csi->ip+=2; if(pp && *pp) printfile(*pp,i); return(0); case PRINTTAIL_VAR_MODE: pp=getstrvar(csi,*(long *)csi->ip); csi->ip+=4; i=*(short *)(csi->ip); csi->ip+=2; j=*csi->ip; csi->ip++; if(pp && *pp) printtail(*pp,j,i); return(0); case TELNET_GATE_VAR: l=*(ulong *)(csi->ip); // Mode csi->ip+=4; pp=getstrvar(csi,*(long *)csi->ip); csi->ip+=4; if(pp && *pp) telnet_gate(*pp,l); return(0); case TELNET_GATE_STR: l=*(ulong *)(csi->ip); // Mode csi->ip+=4; strcpy(str,(char *)csi->ip); while(*(csi->ip++)); /* Find NULL */ telnet_gate(str,l); return(0); case COPY_CHAR: pp=getstrvar(csi,*(long *)csi->ip); if(pp==NULL) lp=getintvar(csi,*(long *)csi->ip); csi->ip+=4; if(pp==NULL && lp!=NULL) *lp=csi->cmd; else if(pp!=NULL) { sprintf(tmp,"%c",csi->cmd); *pp=copystrvar(csi,*pp,tmp); } return(0); case COMPARE_FIRST_CHAR: pp=getstrvar(csi,*(long *)csi->ip); csi->ip+=4; ch=*(csi->ip++); /* char const */ if(pp==NULL || *pp==NULL) csi->logic=LOGIC_FALSE; else { if(**pp==ch) csi->logic=LOGIC_EQUAL; else if(**pp>ch) csi->logic=LOGIC_GREATER; else csi->logic=LOGIC_LESS; } return(0); case SEND_FILE_VIA: case RECEIVE_FILE_VIA: j=*(csi->ip-1); ch=*(csi->ip++); /* Protocol */ cmdstr((char *)csi->ip,csi->str,csi->str,str); while(*(csi->ip++)); /* Find NULL */ for(i=0;i<cfg.total_prots;i++) if(cfg.prot[i]->mnemonic==ch && chk_ar(cfg.prot[i]->ar,&useron)) break; csi->logic=LOGIC_FALSE; if(i<cfg.total_prots) if(protocol(cfg.prot[i],j==SEND_FILE_VIA ? XFER_DOWNLOAD : XFER_UPLOAD ,str,str,true)==0) csi->logic=LOGIC_TRUE; return(0); case SEND_FILE_VIA_VAR: case RECEIVE_FILE_VIA_VAR: j=*(csi->ip-1); ch=*(csi->ip++); /* Protocol */ pp=getstrvar(csi,*(long *)csi->ip); csi->ip+=4; for(i=0;i<cfg.total_prots;i++) if(cfg.prot[i]->mnemonic==ch && chk_ar(cfg.prot[i]->ar,&useron)) break; csi->logic=LOGIC_FALSE; if(!pp || !(*pp)) return(0); if(i<cfg.total_prots) if(protocol(cfg.prot[i] ,j==SEND_FILE_VIA_VAR ? XFER_DOWNLOAD : XFER_UPLOAD ,*pp,*pp,true)==0) csi->logic=LOGIC_TRUE; return(0); case MATCHUSER: lp=getintvar(csi,*(long *)csi->ip); csi->ip+=4; pp=getstrvar(csi,*(long *)csi->ip); csi->ip+=4; if(lp) { if(pp && *pp) *lp=matchuser(&cfg, *pp, TRUE /*sysop_alias*/); else *lp=0; } return(0); default: errormsg(WHERE,ERR_CHK,"var sub-instruction",*(csi->ip-1)); return(0); } case CS_FIO_FUNCTION: switch(*(csi->ip++)) { /* sub-op-code stored as next byte */ case FIO_OPEN: case FIO_OPEN_VAR: lp=getintvar(csi,*(long *)csi->ip); csi->ip+=4; w=*(ushort *)csi->ip; csi->ip+=2; csi->logic=LOGIC_FALSE; if(*(csi->ip-7)==FIO_OPEN) { cmdstr((char *)csi->ip,path,csi->str,str); while(*(csi->ip++)); } /* skip filename */ else { pp=getstrvar(csi,*(long *)csi->ip); csi->ip+=4; if(!pp || !*pp) return(0); strcpy(str,*pp); } if(csi->files>=MAX_FOPENS) return(0); if(lp) { /* Access flags are not cross-platform, so convert */ i=0; if(w&0x001) i|=O_RDONLY; if(w&0x002) i|=O_WRONLY; if(w&0x004) i|=O_RDWR; if(w&0x040) i|=O_DENYNONE; if(w&0x100) i|=O_CREAT; if(w&0x200) i|=O_TRUNC; if(w&0x400) i|=O_EXCL; if(w&0x800) i|=O_APPEND; *lp=(long)fnopen((int *)&j,str,i); if(*lp) { for(i=0;i<csi->files;i++) if(!csi->file[i]) break; csi->file[i]=(FILE *)*lp; if(i==csi->files) csi->files++; csi->logic=LOGIC_TRUE; } } return(0); case FIO_CLOSE: lp=getintvar(csi,*(long *)csi->ip); csi->ip+=4; if(lp && *lp) { csi->logic=fclose((FILE *)*lp); for(i=0;i<csi->files;i++) if(csi->file[i]==(FILE *)*lp) csi->file[i]=0; *lp=0; } else csi->logic=LOGIC_FALSE; return(0); case FIO_FLUSH: lp=getintvar(csi,*(long *)csi->ip); csi->ip+=4; if(lp && *lp) csi->logic=fflush((FILE *)*lp); else csi->logic=LOGIC_FALSE; return(0); case FIO_READ: case FIO_READ_VAR: lp1=getintvar(csi,*(long *)csi->ip); /* Handle */ csi->ip+=4; pp=getstrvar(csi,*(long *)csi->ip); if(!pp) lp2=getintvar(csi,*(long *)csi->ip); csi->ip+=4; csi->logic=LOGIC_FALSE; if(*(csi->ip-9)==FIO_READ) { i=*(short *)csi->ip; csi->ip+=2; /* Length */ } else { /* FIO_READ_VAR */ vp=getintvar(csi,*(long *)csi->ip); csi->ip+=4; if(!vp) return(0); i=*(short *)vp; } if(i>sizeof(buf)-1) i=sizeof(buf)-1; if(!lp1 || !(*lp1) || (!pp && !lp2)) return(0); if(pp) { if(i<1) { if(*pp && **pp) i=strlen(*pp); else i=128; } if((j=fread(buf,1,i,(FILE *)*lp1))==i) csi->logic=LOGIC_TRUE; buf[j]=0; if(csi->etx) { p=strchr(buf,csi->etx); if(p) *p=0; } *pp=copystrvar(csi,*pp,buf); } else { *lp2=0; if(i>4 || i<1) i=4; if(fread(lp2,1,i,(FILE *)*lp1)==i) csi->logic=LOGIC_TRUE; } return(0); case FIO_READ_LINE: lp1=getintvar(csi,*(long *)csi->ip); /* Handle */ csi->ip+=4; pp=getstrvar(csi,*(long *)csi->ip); if(!pp) lp2=getintvar(csi,*(long *)csi->ip); csi->ip+=4; csi->logic=LOGIC_FALSE; if(!lp1 || !(*lp1) || feof((FILE *)*lp1) || (!pp && !lp2)) return(0); csi->logic=LOGIC_TRUE; for(i=0;i<sizeof(buf)-1;i++) { if(!fread(buf+i,1,1,(FILE *)*lp1)) break; if(*(buf+i)==LF) { i++; break; } } buf[i]=0; if(csi->etx) { p=strchr(buf,csi->etx); if(p) *p=0; } if(pp) *pp=copystrvar(csi,*pp,buf); else *lp2=strtol(buf,0,0); return(0); case FIO_WRITE: case FIO_WRITE_VAR: lp1=getintvar(csi,*(long *)csi->ip); csi->ip+=4; pp=getstrvar(csi,*(long *)csi->ip); if(!pp) lp2=getintvar(csi,*(long *)csi->ip); csi->ip+=4; csi->logic=LOGIC_FALSE; if(*(csi->ip-9)==FIO_WRITE) { i=*(short *)csi->ip; csi->ip+=2; /* Length */ } else { /* FIO_WRITE_VAR */ vp=getintvar(csi,*(long *)csi->ip); csi->ip+=4; if(!vp) return(0); i=*(short *)vp; } if(i>sizeof(buf)-1) i=sizeof(buf)-1; if(!lp1 || !(*lp1) || (!pp && !lp2) || (pp && !*pp)) return(0); if(pp) { j=strlen(*pp); if(i<1) i=j; if(j>i) j=i; if(fwrite(*pp,1,j,(FILE *)*lp1)!=j) csi->logic=LOGIC_FALSE; else { if(j<i) { memset(buf,csi->etx,i-j); fwrite(buf,1,i-j,(FILE *)*lp1); } csi->logic=LOGIC_TRUE; } } else { if(i<1 || i>4) i=4; if(fwrite(lp2,1,i,(FILE *)*lp1)==i) csi->logic=LOGIC_TRUE; } return(0); case FIO_GET_LENGTH: lp1=getintvar(csi,*(long *)csi->ip); csi->ip+=4; lp2=getintvar(csi,*(long *)csi->ip); csi->ip+=4; if(lp1 && *lp1 && lp2) *lp2=filelength(fileno((FILE *)*lp1)); return(0); case FIO_GET_TIME: lp1=getintvar(csi,*(long *)csi->ip); csi->ip+=4; lp2=getintvar(csi,*(long *)csi->ip); csi->ip+=4; if(lp1 && *lp1 && lp2) *lp2=filetime(fileno((FILE *)*lp1)); return(0); case FIO_SET_TIME: lp1=getintvar(csi,*(long *)csi->ip); csi->ip+=4; lp2=getintvar(csi,*(long *)csi->ip); csi->ip+=4; #if 0 /* ftime */ if(lp1 && *lp1 && lp2) { ft=unixtoftime(*lp2); setftime(fileno((FILE *)*lp1),&ft); } #endif return(0); case FIO_EOF: lp=getintvar(csi,*(long *)csi->ip); csi->ip+=4; csi->logic=LOGIC_FALSE; if(lp && *lp) if(ftell((FILE *)*lp)>=filelength(fileno((FILE *)*lp))) csi->logic=LOGIC_TRUE; return(0); case FIO_GET_POS: lp1=getintvar(csi,*(long *)csi->ip); csi->ip+=4; lp2=getintvar(csi,*(long *)csi->ip); csi->ip+=4; if(lp1 && *lp1 && lp2) *lp2=ftell((FILE *)*lp1); return(0); case FIO_SEEK: case FIO_SEEK_VAR: lp1=getintvar(csi,*(long *)csi->ip); csi->ip+=4; csi->logic=LOGIC_FALSE; if(*(csi->ip-5)==FIO_SEEK) { l=*(long *)csi->ip; csi->ip+=4; } else { lp2=getintvar(csi,*(long *)csi->ip); csi->ip+=4; if(!lp2) { csi->ip+=2; return(0); } l=*lp2; } i=*(short *)csi->ip; csi->ip+=2; if(lp1 && *lp1) if(fseek((FILE *)*lp1,l,i)!=-1) csi->logic=LOGIC_TRUE; return(0); case FIO_LOCK: case FIO_LOCK_VAR: lp1=getintvar(csi,*(long *)csi->ip); csi->ip+=4; csi->logic=LOGIC_FALSE; if(*(csi->ip-5)==FIO_LOCK) { l=*(long *)csi->ip; csi->ip+=4; } else { lp2=getintvar(csi,*(long *)csi->ip); csi->ip+=4; if(!lp2) return(0); l=*lp2; } if(lp1 && *lp1) { fflush((FILE *)*lp1); csi->logic=!lock(fileno((FILE *)*lp1),ftell((FILE*)*lp1),l); } return(0); case FIO_UNLOCK: case FIO_UNLOCK_VAR: lp1=getintvar(csi,*(long *)csi->ip); csi->ip+=4; csi->logic=LOGIC_FALSE; if(*(csi->ip-5)==FIO_UNLOCK) { l=*(long *)csi->ip; csi->ip+=4; } else { lp2=getintvar(csi,*(long *)csi->ip); csi->ip+=4; if(!lp2) return(0); l=*lp2; } if(lp1 && *lp1) { fflush((FILE *)*lp1); csi->logic=!unlock(fileno((FILE *)*lp1),ftell((FILE*)*lp1),l); } return(0); case FIO_SET_LENGTH: case FIO_SET_LENGTH_VAR: lp1=getintvar(csi,*(long *)csi->ip); csi->ip+=4; csi->logic=LOGIC_FALSE; if(*(csi->ip-5)==FIO_SET_LENGTH) { l=*(long *)csi->ip; csi->ip+=4; } else { lp2=getintvar(csi,*(long *)csi->ip); csi->ip+=4; if(!lp2) return(0); l=*lp2; } if(lp1 && *lp1) csi->logic=chsize(fileno((FILE *)*lp1),l); return(0); case FIO_PRINTF: lp1=getintvar(csi,*(long *)csi->ip); csi->ip+=4; p=format_string(this, csi); if(lp1 && *lp1) { cmdstr(p,path,csi->str,str); fwrite(str,1,strlen(str),(FILE *)*lp1); } free(p); return(0); case FIO_SET_ETX: csi->etx=*(csi->ip++); return(0); case REMOVE_FILE: pp=getstrvar(csi,*(long *)csi->ip); csi->ip+=4; if(pp && *pp && remove(*pp)==0) csi->logic=LOGIC_TRUE; else csi->logic=LOGIC_FALSE; return(0); case RENAME_FILE: case COPY_FILE: case MOVE_FILE: pp1=getstrvar(csi,*(long *)csi->ip); csi->ip+=4; /* Skip variable name */ pp2=getstrvar(csi,*(long *)csi->ip); csi->ip+=4; if(pp1 && *pp1 && pp2 && *pp2) switch(*(csi->ip-9)) { case RENAME_FILE: csi->logic=rename(*pp1,*pp2); break; case COPY_FILE: csi->logic=mv(*pp1,*pp2,1); break; case MOVE_FILE: csi->logic=mv(*pp1,*pp2,0); break; } else csi->logic=LOGIC_FALSE; return(0); case GET_FILE_ATTRIB: case SET_FILE_ATTRIB: lp=getintvar(csi,*(long *)csi->ip); csi->ip+=4; pp=getstrvar(csi,*(long *)csi->ip); csi->ip+=4; if(pp && *pp && lp) { if(*(csi->ip-9)==GET_FILE_ATTRIB) *lp=getfattr(*pp); else *lp=CHMOD(*pp,(int)*lp); } return(0); case MAKE_DIR: case REMOVE_DIR: case CHANGE_DIR: pp=getstrvar(csi,*(long *)csi->ip); csi->ip+=4; if(pp && *pp) switch(*(csi->ip-5)) { case MAKE_DIR: csi->logic=MKDIR(*pp); break; case REMOVE_DIR: csi->logic=rmdir(*pp); break; case CHANGE_DIR: csi->logic=chdir(*pp); break; } else csi->logic=LOGIC_FALSE; return(0); case OPEN_DIR: lp=getintvar(csi,*(long *)csi->ip); csi->ip+=4; pp=getstrvar(csi,*(long *)csi->ip); csi->ip+=4; csi->logic=LOGIC_FALSE; if(pp && *pp && lp) { *lp=(long)opendir((char *)*pp); if(*lp) csi->logic=LOGIC_TRUE; } return(0); case READ_DIR: lp=getintvar(csi,*(long *)csi->ip); csi->ip+=4; pp=getstrvar(csi,*(long *)csi->ip); csi->ip+=4; csi->logic=LOGIC_FALSE; if(pp && lp) { de=readdir((DIR *)(*lp)); if(de!=NULL) { csi->logic=LOGIC_TRUE; *pp=copystrvar(csi,*pp,de->d_name); } } return(0); case REWIND_DIR: lp=getintvar(csi,*(long *)csi->ip); csi->ip+=4; if(lp) { rewinddir((DIR *)(*lp)); csi->logic=LOGIC_TRUE; } else csi->logic=LOGIC_FALSE; return(0); case CLOSE_DIR: lp=getintvar(csi,*(long *)csi->ip); csi->ip+=4; if(lp && closedir((DIR *)(*lp))==0) csi->logic=LOGIC_TRUE; else csi->logic=LOGIC_FALSE; return(0); default: errormsg(WHERE,ERR_CHK,"fio sub-instruction",*(csi->ip-1)); return(0); } case CS_NET_FUNCTION: return(exec_net(csi)); case CS_SWITCH: lp=getintvar(csi,*(long *)csi->ip); csi->ip+=4; if(!lp) { skipto(csi,CS_END_SWITCH); csi->ip++; } else { csi->misc|=CS_IN_SWITCH; csi->switch_val=*lp; } return(0); case CS_CASE: l=*(long *)csi->ip; csi->ip+=4; if(csi->misc&CS_IN_SWITCH && csi->switch_val!=l) skipto(csi,CS_NEXTCASE); else csi->misc&=~CS_IN_SWITCH; return(0); case CS_COMPARE_ARS: i=*(csi->ip++); /* Length of ARS stored as byte before ARS */ csi->logic=!chk_ar(csi->ip,&useron); csi->ip+=i; return(0); case CS_TOGGLE_USER_MISC: useron.misc^=*(ulong *)csi->ip; putuserrec(&cfg,useron.number,U_MISC,8,ultoa(useron.misc,tmp,16)); csi->ip+=4; return(0); case CS_COMPARE_USER_MISC: if((useron.misc&*(ulong *)csi->ip)==*(ulong *)csi->ip) csi->logic=LOGIC_TRUE; else csi->logic=LOGIC_FALSE; csi->ip+=4; return(0); case CS_TOGGLE_USER_CHAT: useron.chat^=*(ulong *)csi->ip; putuserrec(&cfg,useron.number,U_CHAT,8,ultoa(useron.chat,tmp,16)); csi->ip+=4; return(0); case CS_COMPARE_USER_CHAT: if((useron.chat&*(ulong *)csi->ip)==*(ulong *)csi->ip) csi->logic=LOGIC_TRUE; else csi->logic=LOGIC_FALSE; csi->ip+=4; return(0); case CS_TOGGLE_USER_QWK: useron.qwk^=*(ulong *)csi->ip; putuserrec(&cfg,useron.number,U_QWK,8,ultoa(useron.qwk,tmp,16)); csi->ip+=4; return(0); case CS_COMPARE_USER_QWK: if((useron.qwk&*(ulong *)csi->ip)==*(ulong *)csi->ip) csi->logic=LOGIC_TRUE; else csi->logic=LOGIC_FALSE; csi->ip+=4; return(0); case CS_REPLACE_TEXT: i=*(ushort *)csi->ip; csi->ip+=2; i--; if(i>=TOTAL_TEXT) { errormsg(WHERE,ERR_CHK,"replace text #",i); while(*(csi->ip++)); /* Find NULL */ return(0); } if(text[i]!=text_sav[i] && text[i]!=nulstr) free(text[i]); j=strlen(cmdstr((char *)csi->ip,path,csi->str,buf)); if(!j) text[i]=nulstr; else text[i]=(char *)malloc(j+1); if(!text[i]) { errormsg(WHERE,ERR_ALLOC,"replacement text",j); while(*(csi->ip++)); /* Find NULL */ text[i]=text_sav[i]; return(0); } if(j) strcpy(text[i],buf); while(*(csi->ip++)); /* Find NULL */ return(0); case CS_USE_INT_VAR: // Self-modifying code! pp=getstrvar(csi,*(long *)csi->ip); if(pp && *pp) l=strtol(*pp,0,0); else { lp=getintvar(csi,*(long *)csi->ip); if(lp) l=*lp; else l=0; } csi->ip+=4; // Variable i=*(csi->ip++); // Offset if(i<1 || csi->ip+1+i>=csi->cs+csi->length) { errormsg(WHERE,ERR_CHK,"offset",i); csi->ip++; return(0); } switch(*(csi->ip++)) { // Length case sizeof(char): *(csi->ip+i)=(char)l; break; case sizeof(short): *((short *)(csi->ip+i))=(short)l; break; case sizeof(long): *((long *)(csi->ip+i))=l; break; default: errormsg(WHERE,ERR_CHK,"length",*(csi->ip-1)); break; } return(0); default: errormsg(WHERE,ERR_CHK,"shell instruction",*(csi->ip-1)); return(0); } }
void ProgDetails::loadPage(void) { MSqlQuery query(MSqlQuery::InitCon()); QString category_type, showtype, year, syndicatedEpisodeNum; QString rating, colorcode, title_pronounce; float stars = 0.0; int partnumber = 0, parttotal = 0; int audioprop = 0, videoprop = 0, subtype = 0, generic = 0; bool recorded = false; RecordingRule* record = nullptr; if (m_progInfo.GetRecordingRuleID()) { record = new RecordingRule(); record->LoadByProgram(&m_progInfo); } if (m_progInfo.GetFilesize()) recorded = true; QString ptable = recorded ? "recordedprogram" : "program"; if (m_progInfo.GetScheduledEndTime() != m_progInfo.GetScheduledStartTime()) { query.prepare(QString("SELECT category_type, airdate, stars," " partnumber, parttotal, audioprop+0, videoprop+0," " subtitletypes+0, syndicatedepisodenumber, generic," " showtype, colorcode, title_pronounce" " FROM %1 WHERE chanid = :CHANID AND" " starttime = :STARTTIME ;").arg(ptable)); query.bindValue(":CHANID", m_progInfo.GetChanID()); query.bindValue(":STARTTIME", m_progInfo.GetScheduledStartTime()); if (query.exec() && query.next()) { category_type = query.value(0).toString(); year = query.value(1).toString(); stars = query.value(2).toFloat(); partnumber = query.value(3).toInt(); parttotal = query.value(4).toInt(); audioprop = query.value(5).toInt(); videoprop = query.value(6).toInt(); subtype = query.value(7).toInt(); syndicatedEpisodeNum = query.value(8).toString(); generic = query.value(9).toInt(); showtype = query.value(10).toString(); colorcode = query.value(11).toString(); title_pronounce = query.value(12).toString(); } else if (!query.isActive()) MythDB::DBError("ProgDetails", query); rating = getRatings( recorded, m_progInfo.GetChanID(), m_progInfo.GetScheduledStartTime()); } if (category_type.isEmpty() && !m_progInfo.GetProgramID().isEmpty()) { QString prefix = m_progInfo.GetProgramID().left(2); if (prefix == "MV") category_type = "movie"; else if (prefix == "EP") category_type = "series"; else if (prefix == "SP") category_type = "sports"; else if (prefix == "SH") category_type = "tvshow"; } addItem(tr("Title"), m_progInfo.toString(ProgramInfo::kTitleSubtitle, " - "), ProgInfoList::kLevel1); addItem(tr("Title Pronounce"), title_pronounce, ProgInfoList::kLevel2); QString s = m_progInfo.GetDescription(); QString attr; if (partnumber > 0) attr += tr("Part %1 of %2, ").arg(partnumber).arg(parttotal); if (!rating.isEmpty() && rating != "NR") attr += rating + ", "; if (category_type == "movie") { if (!year.isEmpty()) attr += year + ", "; /* see #7810, was hardcoded to 4 star system, when every theme * uses 10 stars / 5 stars with half stars */ if (stars > 0.0f) attr += tr("%n star(s)", "", roundf(stars * 10.0f)) + ", "; } if (!colorcode.isEmpty()) attr += colorcode + ", "; if (audioprop & AUD_MONO) attr += tr("Mono") + ", "; if (audioprop & AUD_STEREO) attr += tr("Stereo") + ", "; if (audioprop & AUD_SURROUND) attr += tr("Surround Sound") + ", "; if (audioprop & AUD_DOLBY) attr += tr("Dolby Sound") + ", "; if (audioprop & AUD_HARDHEAR) attr += tr("Audio for Hearing Impaired") + ", "; if (audioprop & AUD_VISUALIMPAIR) attr += tr("Audio for Visually Impaired") + ", "; if (videoprop & VID_HDTV) attr += tr("HDTV") + ", "; if (videoprop & VID_WIDESCREEN) attr += tr("Widescreen") + ", "; if (videoprop & VID_AVC) attr += tr("AVC/H.264") + ", "; if (videoprop & VID_720) attr += tr("720p Resolution") + ", "; if (videoprop & VID_1080) attr += tr("1080i/p Resolution") + ", "; if (videoprop & VID_DAMAGED) attr += tr("Damaged") + ", "; if (subtype & SUB_HARDHEAR) attr += tr("CC","Closed Captioned") + ", "; if (subtype & SUB_NORMAL) attr += tr("Subtitles Available") + ", "; if (subtype & SUB_ONSCREEN) attr += tr("Subtitled") + ", "; if (subtype & SUB_SIGNED) attr += tr("Deaf Signing") + ", "; if (generic && category_type == "series") attr += tr("Unidentified Episode") + ", "; else if (m_progInfo.IsRepeat()) attr += tr("Repeat") + ", "; if (!attr.isEmpty()) { attr.truncate(attr.lastIndexOf(',')); s += " (" + attr + ")"; } addItem(tr("Description"), s, ProgInfoList::kLevel1); QString actors, directors, producers, execProducers; QString writers, guestStars, hosts, adapters; QString presenters, commentators, guests; if (m_progInfo.GetScheduledEndTime() != m_progInfo.GetScheduledStartTime()) { if (recorded) query.prepare("SELECT role,people.name FROM recordedcredits" " AS credits" " LEFT JOIN people ON credits.person = people.person" " WHERE credits.chanid = :CHANID" " AND credits.starttime = :STARTTIME" " ORDER BY role;"); else query.prepare("SELECT role,people.name FROM credits" " LEFT JOIN people ON credits.person = people.person" " WHERE credits.chanid = :CHANID" " AND credits.starttime = :STARTTIME" " ORDER BY role;"); query.bindValue(":CHANID", m_progInfo.GetChanID()); query.bindValue(":STARTTIME", m_progInfo.GetScheduledStartTime()); if (query.exec() && query.size() > 0) { QStringList plist; QString rstr, role, pname; while(query.next()) { role = query.value(0).toString(); /* The people.name column uses utf8_bin collation. * Qt-MySQL drivers use QVariant::ByteArray for string-type * MySQL fields marked with the BINARY attribute (those using a * *_bin collation) and QVariant::String for all others. * Since QVariant::toString() uses QString::fromAscii() * (through QVariant::convert()) when the QVariant's type is * QVariant::ByteArray, we have to use QString::fromUtf8() * explicitly to prevent corrupting characters. * The following code should be changed to use the simpler * toString() approach, as above, if we do a DB update to * coalesce the people.name values that differ only in case and * change the collation to utf8_general_ci, to match the * majority of other columns, or we'll have the same problem in * reverse. */ pname = QString::fromUtf8(query.value(1) .toByteArray().constData()); if (rstr != role) { if (rstr == "actor") actors = plist.join(", "); else if (rstr == "director") directors = plist.join(", "); else if (rstr == "producer") producers = plist.join(", "); else if (rstr == "executive_producer") execProducers = plist.join(", "); else if (rstr == "writer") writers = plist.join(", "); else if (rstr == "guest_star") guestStars = plist.join(", "); else if (rstr == "host") hosts = plist.join(", "); else if (rstr == "adapter") adapters = plist.join(", "); else if (rstr == "presenter") presenters = plist.join(", "); else if (rstr == "commentator") commentators = plist.join(", "); else if (rstr == "guest") guests = plist.join(", "); rstr = role; plist.clear(); } plist.append(pname); } if (rstr == "actor") actors = plist.join(", "); else if (rstr == "director") directors = plist.join(", "); else if (rstr == "producer") producers = plist.join(", "); else if (rstr == "executive_producer") execProducers = plist.join(", "); else if (rstr == "writer") writers = plist.join(", "); else if (rstr == "guest_star") guestStars = plist.join(", "); else if (rstr == "host") hosts = plist.join(", "); else if (rstr == "adapter") adapters = plist.join(", "); else if (rstr == "presenter") presenters = plist.join(", "); else if (rstr == "commentator") commentators = plist.join(", "); else if (rstr == "guest") guests = plist.join(", "); } } addItem(tr("Actors"), actors, ProgInfoList::kLevel1); addItem(tr("Guest Star"), guestStars, ProgInfoList::kLevel1); addItem(tr("Guest"), guests, ProgInfoList::kLevel1); addItem(tr("Host"), hosts, ProgInfoList::kLevel1); addItem(tr("Presenter"), presenters, ProgInfoList::kLevel1); addItem(tr("Commentator"), commentators, ProgInfoList::kLevel1); addItem(tr("Director"), directors, ProgInfoList::kLevel1); addItem(tr("Producer"), producers, ProgInfoList::kLevel2); addItem(tr("Executive Producer"), execProducers, ProgInfoList::kLevel2); addItem(tr("Writer"), writers, ProgInfoList::kLevel2); addItem(tr("Adapter"), adapters, ProgInfoList::kLevel2); addItem(tr("Category"), m_progInfo.GetCategory(), ProgInfoList::kLevel1); query.prepare("SELECT genre FROM programgenres " "WHERE chanid = :CHANID AND starttime = :STARTTIME " "AND relevance > 0 ORDER BY relevance;"); query.bindValue(":CHANID", m_progInfo.GetChanID()); query.bindValue(":STARTTIME", m_progInfo.GetScheduledStartTime()); if (query.exec()) { s.clear(); while (query.next()) { if (!s.isEmpty()) s += ", "; s += query.value(0).toString(); } addItem(tr("Genre"), s, ProgInfoList::kLevel1); } s.clear(); if (!category_type.isEmpty()) { s = category_type; if (!m_progInfo.GetSeriesID().isEmpty()) s += " (" + m_progInfo.GetSeriesID() + ")"; if (!showtype.isEmpty()) s += " " + showtype; } addItem(tr("Type", "category_type"), s, ProgInfoList::kLevel1); s.clear(); if (m_progInfo.GetSeason() > 0) s = QString::number(m_progInfo.GetSeason()); addItem(tr("Season"), s, ProgInfoList::kLevel1); s.clear(); if (m_progInfo.GetEpisode() > 0) { if (m_progInfo.GetEpisodeTotal() > 0) s = tr("%1 of %2").arg(m_progInfo.GetEpisode()) .arg(m_progInfo.GetEpisodeTotal()); else s = QString::number(m_progInfo.GetEpisode()); } addItem(tr("Episode"), s, ProgInfoList::kLevel1); addItem(tr("Syndicated Episode Number"), syndicatedEpisodeNum, ProgInfoList::kLevel1); s.clear(); if (m_progInfo.GetOriginalAirDate().isValid() && category_type != "movie") { s = MythDate::toString(m_progInfo.GetOriginalAirDate(), MythDate::kDateFull | MythDate::kAddYear); } addItem(tr("Original Airdate"), s, ProgInfoList::kLevel1); addItem(tr("Program ID"), m_progInfo.GetProgramID(), ProgInfoList::kLevel1); // Begin MythTV information not found in the listings info QDateTime statusDate; if (m_progInfo.GetRecordingStatus() == RecStatus::WillRecord || m_progInfo.GetRecordingStatus() == RecStatus::Pending) statusDate = m_progInfo.GetScheduledStartTime(); RecordingType rectype = kSingleRecord; // avoid kNotRecording RecStatus::Type recstatus = m_progInfo.GetRecordingStatus(); if (recstatus == RecStatus::PreviousRecording || recstatus == RecStatus::NeverRecord || recstatus == RecStatus::Unknown) { query.prepare("SELECT recstatus, starttime " "FROM oldrecorded WHERE duplicate > 0 AND " "future = 0 AND " "((programid <> '' AND programid = :PROGRAMID) OR " " (title <> '' AND title = :TITLE AND " " subtitle <> '' AND subtitle = :SUBTITLE AND " " description <> '' AND description = :DECRIPTION));"); query.bindValue(":PROGRAMID", m_progInfo.GetProgramID()); query.bindValue(":TITLE", m_progInfo.GetTitle()); query.bindValue(":SUBTITLE", m_progInfo.GetSubtitle()); query.bindValue(":DECRIPTION", m_progInfo.GetDescription()); if (!query.exec()) { MythDB::DBError("showDetails", query); } else if (query.next()) { if (recstatus == RecStatus::Unknown) recstatus = RecStatus::Type(query.value(0).toInt()); if (recstatus == RecStatus::PreviousRecording || recstatus == RecStatus::NeverRecord || recstatus == RecStatus::Recorded) { statusDate = MythDate::as_utc(query.value(1).toDateTime()); } } } if (recstatus == RecStatus::Unknown) { if (recorded) { recstatus = RecStatus::Recorded; statusDate = m_progInfo.GetScheduledStartTime(); } else { // re-enable "Not Recording" status text rectype = m_progInfo.GetRecordingRuleType(); } } s = RecStatus::toString(recstatus, rectype); if (statusDate.isValid()) s += " " + MythDate::toString(statusDate, MythDate::kDateFull | MythDate::kAddYear); addItem(tr("MythTV Status"), s, ProgInfoList::kLevel1); QString recordingRule; QString lastRecorded; QString nextRecording; QString averageTimeShift; QString watchListScore; QString watchListStatus; QString searchPhrase; if (m_progInfo.GetRecordingRuleID()) { recordingRule = QString("%1, ").arg(m_progInfo.GetRecordingRuleID()); if (m_progInfo.GetRecordingRuleType() != kNotRecording) recordingRule += toString(m_progInfo.GetRecordingRuleType()); if (!(record->m_title.isEmpty())) recordingRule += QString(" \"%2\"").arg(record->m_title); query.prepare("SELECT last_record, next_record, avg_delay " "FROM record WHERE recordid = :RECORDID"); query.bindValue(":RECORDID", m_progInfo.GetRecordingRuleID()); if (query.exec() && query.next()) { if (query.value(0).toDateTime().isValid()) lastRecorded = MythDate::toString( MythDate::as_utc(query.value(0).toDateTime()), MythDate::kDateFull | MythDate::kAddYear); if (query.value(1).toDateTime().isValid()) nextRecording = MythDate::toString( MythDate::as_utc(query.value(1).toDateTime()), MythDate::kDateFull | MythDate::kAddYear); if (query.value(2).toInt() > 0) averageTimeShift = tr("%n hour(s)", "", query.value(2).toInt()); } if (recorded) { if (m_progInfo.GetRecordingPriority2() > 0) watchListScore = QString::number(m_progInfo.GetRecordingPriority2()); if (m_progInfo.GetRecordingPriority2() < 0) { switch (m_progInfo.GetRecordingPriority2()) { case wlExpireOff: watchListStatus = tr("Auto-expire off"); break; case wlWatched: watchListStatus = tr("Marked as 'watched'"); break; case wlEarlier: watchListStatus = tr("Not the earliest episode"); break; case wlDeleted: watchListStatus = tr("Recently deleted episode"); break; } } } if (record->m_searchType != kManualSearch && record->m_description != m_progInfo.GetDescription()) searchPhrase = record->m_description; } addItem(tr("Recording Rule"), recordingRule, ProgInfoList::kLevel1); addItem(tr("Search Phrase"), searchPhrase, ProgInfoList::kLevel1); s.clear(); if (m_progInfo.GetFindID()) { QDateTime fdate(QDate(1970, 1, 1),QTime(12,0,0)); fdate = fdate.addDays((int)m_progInfo.GetFindID() - 719528); s = QString("%1 (%2)").arg(m_progInfo.GetFindID()) .arg(MythDate::toString( fdate, MythDate::kDateFull | MythDate::kAddYear)); } addItem(tr("Find ID"), s, ProgInfoList::kLevel2); addItem(tr("Last Recorded"), lastRecorded, ProgInfoList::kLevel2); addItem(tr("Next Recording"), nextRecording, ProgInfoList::kLevel2); addItem(tr("Average Time Shift"), averageTimeShift, ProgInfoList::kLevel2); addItem(tr("Watch List Score"), watchListScore, ProgInfoList::kLevel2); addItem(tr("Watch List Status"), watchListStatus, ProgInfoList::kLevel2); QString recordingHost; QString recordingInput; QString recordedFilename; QString recordedFileSize; QString recordingGroup; QString storageGroup; QString playbackGroup; QString recordingProfile; recordingHost = m_progInfo.GetHostname(); recordingInput = m_progInfo.GetInputName(); if (recorded) { recordedFilename = m_progInfo.GetBasename(); recordedFileSize = QString("%1 ") .arg(m_progInfo.GetFilesize()/((double)(1<<30)),0,'f',2); recordedFileSize += tr("GB", "GigaBytes"); query.prepare("SELECT profile FROM recorded" " WHERE chanid = :CHANID" " AND starttime = :STARTTIME;"); query.bindValue(":CHANID", m_progInfo.GetChanID()); query.bindValue(":STARTTIME", m_progInfo.GetRecordingStartTime()); if (query.exec() && query.next()) { recordingProfile = m_progInfo.i18n(query.value(0).toString()); } recordingGroup = m_progInfo.i18n(m_progInfo.GetRecordingGroup()); storageGroup = m_progInfo.i18n(m_progInfo.GetStorageGroup()); playbackGroup = m_progInfo.i18n(m_progInfo.GetPlaybackGroup()); } else if (m_progInfo.GetRecordingRuleID()) { recordingProfile = record->m_recProfile; } addItem(tr("Recording Host"), recordingHost, ProgInfoList::kLevel2); addItem(tr("Recording Input"), recordingInput, ProgInfoList::kLevel2); addItem(tr("Recorded File Name"), recordedFilename, ProgInfoList::kLevel1); addItem(tr("Recorded File Size"), recordedFileSize, ProgInfoList::kLevel1); addItem(tr("Recording Profile"), recordingProfile, ProgInfoList::kLevel2); addItem(tr("Recording Group"), recordingGroup, ProgInfoList::kLevel1); addItem(tr("Storage Group"), storageGroup, ProgInfoList::kLevel2); addItem(tr("Playback Group"), playbackGroup, ProgInfoList::kLevel2); PowerPriorities(ptable); delete record; }
int main(int argc, char **argv) { char revision[16]; char error[512]; char *p,str[256],fname[256],ext,not[MAX_NOTS][9]; uchar *datbuf,*ixbbuf; int i,j,file,dirnum,libnum,desc_off,lines,nots=0 ,omode=O_WRONLY|O_CREAT|O_TRUNC; ulong l,m,n,cdt,misc=0,total_cdt=0,total_files=0,dir_files,datbuflen; time32_t uld,dld,now; long max_age=0; FILE *in,*out=NULL; sscanf("$Revision$", "%*s %s", revision); fprintf(stderr,"\nFILELIST v%s-%s (rev %s) - Generate Synchronet File " "Directory Lists\n" ,FILELIST_VER ,PLATFORM_DESC ,revision ); if(argc<2 || strcmp(argv[1],"-?")==0 || strcmp(argv[1],"-help")==0 || strcmp(argv[1],"--help")==0 || strcmp(argv[1],"/?")==0 ) { printf("\n usage: FILELIST <dir_code or - for ALL> [switches] [outfile]\n"); printf("\n"); printf("switches: -lib name All directories of specified library\n"); printf(" -not code Exclude specific directory\n"); printf(" -new days Include only new files in listing (days since upload)\n"); printf(" -cat Concatenate to existing outfile\n"); printf(" -pad Pad filename with spaces\n"); printf(" -hdr Include directory headers\n"); printf(" -cdt Include credit value\n"); printf(" -tot Include credit totals\n"); printf(" -uln Include uploader's name\n"); printf(" -uld Include upload date\n"); printf(" -dfd Include DOS file date\n"); printf(" -dld Include download date\n"); printf(" -dls Include total downloads\n"); printf(" -nod Exclude normal descriptions\n"); printf(" -noe Exclude normal descriptions, if extended " "exists\n"); printf(" -ext Include extended descriptions\n"); printf(" -jst Justify extended descriptions under normal\n"); printf(" -+ Include extended description indicator (+)\n"); printf(" -- Include offline file indicator (-)\n"); printf(" -* Short-hand for -pad -hdr -cdt -+ --\n"); exit(0); } p=getenv("SBBSCTRL"); if(p==NULL) { printf("\nSBBSCTRL environment variable not set.\n"); printf("\nExample: SET SBBSCTRL=/sbbs/ctrl\n"); exit(1); } now=time32(NULL); memset(&scfg,0,sizeof(scfg)); scfg.size=sizeof(scfg); SAFECOPY(scfg.ctrl_dir,p); if(chdir(scfg.ctrl_dir)!=0) fprintf(stderr,"!ERROR changing directory to: %s", scfg.ctrl_dir); printf("\nLoading configuration files from %s\n",scfg.ctrl_dir); if(!load_cfg(&scfg,NULL,TRUE,error)) { fprintf(stderr,"!ERROR loading configuration files: %s\n",error); exit(1); } SAFECOPY(scfg.temp_dir,"../temp"); prep_dir(scfg.ctrl_dir, scfg.temp_dir, sizeof(scfg.temp_dir)); dirnum=libnum=-1; if(argv[1][0]=='*' || strcmp(argv[1],"-")==0) misc|=ALL; else if(argv[1][0]!='-') { strupr(argv[1]); for(i=0;i<scfg.total_dirs;i++) if(!stricmp(argv[1],scfg.dir[i]->code)) break; if(i>=scfg.total_dirs) { printf("\nDirectory code '%s' not found.\n",argv[1]); exit(1); } dirnum=i; } for(i=1;i<argc;i++) { if(!stricmp(argv[i],"-lib")) { if(dirnum!=-1) { printf("\nBoth directory code and -lib parameters were used.\n"); exit(1); } i++; if(i>=argc) { printf("\nLibrary short name must follow -lib parameter.\n"); exit(1); } strupr(argv[i]); for(j=0;j<scfg.total_libs;j++) if(!stricmp(scfg.lib[j]->sname,argv[i])) break; if(j>=scfg.total_libs) { printf("\nLibrary short name '%s' not found.\n",argv[i]); exit(1); } libnum=j; } else if(!stricmp(argv[i],"-not")) { if(nots>=MAX_NOTS) { printf("\nMaximum number of -not options (%u) exceeded.\n" ,MAX_NOTS); exit(1); } i++; if(i>=argc) { printf("\nDirectory internal code must follow -not parameter.\n"); exit(1); } sprintf(not[nots++],"%.8s",argv[i]); } else if(!stricmp(argv[i],"-all")) { if(dirnum!=-1) { printf("\nBoth directory code and -all parameters were used.\n"); exit(1); } if(libnum!=-1) { printf("\nBoth library name and -all parameters were used.\n"); exit(1); } misc|=ALL; } else if(!stricmp(argv[i],"-new")) { i++; if(i>=argc) { printf("\nDays since upload must follow -new parameter.\n"); exit(1); } max_age=strtol(argv[i],NULL,0); } else if(!stricmp(argv[i],"-pad")) misc|=PAD; else if(!stricmp(argv[i],"-cat")) omode=O_WRONLY|O_CREAT|O_APPEND; else if(!stricmp(argv[i],"-hdr")) misc|=HDR; else if(!stricmp(argv[i],"-cdt")) misc|=CDT_; else if(!stricmp(argv[i],"-tot")) misc|=TOT; else if(!stricmp(argv[i],"-ext")) misc|=EXT; else if(!stricmp(argv[i],"-uln")) misc|=ULN; else if(!stricmp(argv[i],"-uld")) misc|=ULD; else if(!stricmp(argv[i],"-dld")) misc|=DLD; else if(!stricmp(argv[i],"-dfd")) misc|=DFD; else if(!stricmp(argv[i],"-dls")) misc|=DLS; else if(!stricmp(argv[i],"-nod")) misc|=NOD; else if(!stricmp(argv[i],"-jst")) misc|=(EXT|JST); else if(!stricmp(argv[i],"-noe")) misc|=(EXT|NOE); else if(!stricmp(argv[i],"-+")) misc|=PLUS; else if(!stricmp(argv[i],"--")) misc|=MINUS; else if(!stricmp(argv[i],"-*")) misc|=(HDR|PAD|CDT_|PLUS|MINUS); else if(i!=1) { if(argv[i][0]=='*' || strcmp(argv[i],"-")==0) { misc|=AUTO; continue; } if((j=nopen(argv[i],omode))==-1) { printf("\nError opening/creating %s for output.\n",argv[i]); exit(1); } out=fdopen(j,"wb"); } } if(!out && !(misc&AUTO)) { printf("\nOutput file not specified, using FILES.BBS in each " "directory.\n"); misc|=AUTO; } for(i=0;i<scfg.total_dirs;i++) { dir_files=0; if(!(misc&ALL) && i!=dirnum && scfg.dir[i]->lib!=libnum) continue; for(j=0;j<nots;j++) if(!stricmp(not[j],scfg.dir[i]->code)) break; if(j<nots) continue; if(misc&AUTO && scfg.dir[i]->seqdev) /* CD-ROM */ continue; printf("\n%-*s %s",LEN_GSNAME,scfg.lib[scfg.dir[i]->lib]->sname,scfg.dir[i]->lname); sprintf(str,"%s%s.ixb",scfg.dir[i]->data_dir,scfg.dir[i]->code); if((file=nopen(str,O_RDONLY))==-1) continue; l=filelength(file); if(misc&AUTO) { sprintf(str,"%sFILES.BBS",scfg.dir[i]->path); if((j=nopen(str,omode))==-1) { printf("\nError opening/creating %s for output.\n",str); exit(1); } out=fdopen(j,"wb"); } if(misc&HDR) { sprintf(fname,"%-*s %-*s Files: %4lu" ,LEN_GSNAME,scfg.lib[scfg.dir[i]->lib]->sname ,LEN_SLNAME,scfg.dir[i]->lname,l/F_IXBSIZE); fprintf(out,"%s\r\n",fname); memset(fname,'-',strlen(fname)); fprintf(out,"%s\r\n",fname); } if(!l) { close(file); if(misc&AUTO) fclose(out); continue; } if((ixbbuf=(uchar *)malloc(l))==NULL) { close(file); if(misc&AUTO) fclose(out); printf("\7ERR_ALLOC %s %lu\n",str,l); continue; } if(read(file,ixbbuf,l)!=(int)l) { close(file); if(misc&AUTO) fclose(out); printf("\7ERR_READ %s %lu\n",str,l); free((char *)ixbbuf); continue; } close(file); sprintf(str,"%s%s.dat",scfg.dir[i]->data_dir,scfg.dir[i]->code); if((file=nopen(str,O_RDONLY))==-1) { printf("\7ERR_OPEN %s %u\n",str,O_RDONLY); free((char *)ixbbuf); if(misc&AUTO) fclose(out); continue; } datbuflen=filelength(file); if((datbuf=malloc(datbuflen))==NULL) { close(file); printf("\7ERR_ALLOC %s %lu\n",str,datbuflen); free((char *)ixbbuf); if(misc&AUTO) fclose(out); continue; } if(read(file,datbuf,datbuflen)!=(int)datbuflen) { close(file); printf("\7ERR_READ %s %lu\n",str,datbuflen); free((char *)datbuf); free((char *)ixbbuf); if(misc&AUTO) fclose(out); continue; } close(file); m=0L; while(m<l && !ferror(out)) { for(j=0;j<12 && m<l;j++) if(j==8) str[j]=ixbbuf[m]>' ' ? '.' : ' '; else str[j]=ixbbuf[m++]; /* Turns FILENAMEEXT into FILENAME.EXT */ str[j]=0; unpadfname(str,fname); n=ixbbuf[m]|((long)ixbbuf[m+1]<<8)|((long)ixbbuf[m+2]<<16); uld=(ixbbuf[m+3]|((long)ixbbuf[m+4]<<8)|((long)ixbbuf[m+5]<<16) |((long)ixbbuf[m+6]<<24)); dld=(ixbbuf[m+7]|((long)ixbbuf[m+8]<<8)|((long)ixbbuf[m+9]<<16) |((long)ixbbuf[m+10]<<24)); m+=11; if(n>=datbuflen /* index out of bounds */ || datbuf[n+F_DESC+LEN_FDESC]!=CR) { /* corrupted data */ fprintf(stderr,"\n\7%s%s is corrupted!\n" ,scfg.dir[i]->data_dir,scfg.dir[i]->code); exit(-1); } if(max_age && ((now - uld) / (24*60*60) > max_age)) continue; fprintf(out,"%-12.12s",misc&PAD ? str : fname); total_files++; dir_files++; if(misc&PLUS && datbuf[n+F_MISC]!=ETX && (datbuf[n+F_MISC]-' ')&FM_EXTDESC) fputc('+',out); else fputc(' ',out); desc_off=12; if(misc&(CDT_|TOT)) { getrec((char *)&datbuf[n],F_CDT,LEN_FCDT,str); cdt=atol(str); total_cdt+=cdt; if(misc&CDT_) { fprintf(out,"%7lu",cdt); desc_off+=7; } } if(misc&MINUS) { sprintf(str,"%s%s",scfg.dir[i]->path,fname); if(!fexistcase(str)) fputc('-',out); else fputc(' ',out); } else fputc(' ',out); desc_off++; if(misc&DFD) { sprintf(str,"%s%s",scfg.dir[i]->path,fname); fprintf(out,"%s ",unixtodstr(&scfg,(time32_t)fdate(str),str)); desc_off+=9; } if(misc&ULD) { fprintf(out,"%s ",unixtodstr(&scfg,uld,str)); desc_off+=9; } if(misc&ULN) { getrec((char *)&datbuf[n],F_ULER,25,str); fprintf(out,"%-25s ",str); desc_off+=26; } if(misc&DLD) { fprintf(out,"%s ",unixtodstr(&scfg,dld,str)); desc_off+=9; } if(misc&DLS) { getrec((char *)&datbuf[n],F_TIMESDLED,5,str); j=atoi(str); fprintf(out,"%5u ",j); desc_off+=6; } if(datbuf[n+F_MISC]!=ETX && (datbuf[n+F_MISC]-' ')&FM_EXTDESC) ext=1; /* extended description exists */ else ext=0; /* it doesn't */ if(!(misc&NOD) && !(misc&NOE && ext)) { getrec((char *)&datbuf[n],F_DESC,LEN_FDESC,str); fprintf(out,"%s",str); } if(misc&EXT && ext) { /* Print ext desc */ sprintf(str,"%s%s.exb",scfg.dir[i]->data_dir,scfg.dir[i]->code); if(!fexist(str)) continue; if((j=nopen(str,O_RDONLY))==-1) { printf("\7ERR_OPEN %s %u\n",str,O_RDONLY); continue; } if((in=fdopen(j,"rb"))==NULL) { close(j); continue; } fseek(in,(n/F_LEN)*512L,SEEK_SET); lines=0; if(!(misc&NOE)) { fprintf(out,"\r\n"); lines++; } while(!feof(in) && !ferror(in) && ftell(in)<(long)((n/F_LEN)+1)*512L) { if(!fgets(str,128,in) || !str[0]) break; stripctrlz(str); if(lines) { if(misc&JST) fprintf(out,"%*s",desc_off,""); fputc(' ',out); /* indent one character */ } fprintf(out,"%s",str); lines++; } fclose(in); } fprintf(out,"\r\n"); } free((char *)datbuf); free((char *)ixbbuf); if(dir_files) fprintf(out,"\r\n"); /* blank line at end of dir */ if(misc&AUTO) fclose(out); } if(misc&TOT && !(misc&AUTO)) fprintf(out,"TOTALS\n------\n%lu credits/bytes in %lu files.\r\n" ,total_cdt,total_files); printf("\nDone.\n"); return(0); }
int main() { char str[128]; char compiler[128]; char fpath[MAX_PATH+1]; char* path = "."; char* glob_pattern = "*wrap*"; int i; int ch; uint u; time_t t; glob_t g; DIR* dir; DIRENT* dirent; thread_data_t thread_data; int fd; int fd2; int canrelock=0; clock_t ticks; /* Show platform details */ DESCRIBE_COMPILER(compiler); printf("%-15s: %s\n","Platform",PLATFORM_DESC); printf("%-15s: %s\n","Version",os_version(str)); printf("%-15s: %s\n","Compiler" ,compiler); printf("%-15s: %d\n","Random Number",xp_random(1000)); for(i=0;i<3;i++) { if(_beginthread( sopen_child_thread /* entry point */ ,0 /* stack size (0=auto) */ ,(void*)i /* data */ )==(unsigned long)-1) printf("_beginthread failed\n"); else SLEEP(1); } printf("Waiting for all sopen_child_threads to close...\n"); SLEEP(5000); /* wait for all threads to quit */ /* Exclusive sopen test */ printf("\nsopen() test\n"); if((fd=sopen(LOCK_FNAME,O_RDWR|O_CREAT,SH_DENYRW,S_IREAD|S_IWRITE))==-1) { perror(LOCK_FNAME); return(errno); } printf("%s is opened with an exclusive (read/write) lock\n",LOCK_FNAME); getkey(); if(_beginthread( sopen_test_thread /* entry point */ ,0 /* stack size (0=auto) */ ,NULL /* data */ )==(unsigned long)-1) printf("_beginthread failed\n"); else SLEEP(1000); close(fd); /* sopen()/lock test */ printf("\nlock() test\n"); if((fd=sopen(LOCK_FNAME,O_RDWR|O_CREAT,SH_DENYNO,S_IREAD|S_IWRITE))==-1) { perror(LOCK_FNAME); return(errno); } write(fd,"lock testing\n",LOCK_LEN); if(lock(fd,LOCK_OFFSET,LOCK_LEN)==0) printf("lock() succeeds\n"); else printf("!FAILURE: lock() non-functional (or file already locked)\n"); if(lock(fd,LOCK_OFFSET,LOCK_LEN)==0) { printf("!FAILURE: Subsequent lock of region was allowed (will skip some tests)\n"); canrelock=1; } if(_beginthread( lock_test_thread /* entry point */ ,0 /* stack size (0=auto) */ ,NULL /* data */ )==(unsigned long)-1) printf("_beginthread failed\n"); else SLEEP(1000); if(canrelock) printf("?? Skipping some tests due to inability to detect own locks\n"); else { if(lock(fd,LOCK_OFFSET,LOCK_LEN)) printf("Locks in first thread survive open()/close() in other thread\n"); else printf("!FAILURE: lock() in first thread lost by open()/close() in other thread\n"); if(lock(fd,LOCK_OFFSET+LOCK_LEN+1,LOCK_LEN)) printf("!FAILURE: file locking\n"); else printf("Record locking\n"); } if((fd2=sopen(LOCK_FNAME,O_RDWR,SH_DENYRW))==-1) { printf("Cannot reopen SH_DENYRW while lock is held\n"); close(fd2); } else { printf("!FAILURE: can reopen SH_DENYRW while lock is held\n"); } if(unlock(fd,LOCK_OFFSET,LOCK_LEN)) printf("!FAILURE: unlock() non-functional\n"); if(lock(fd,LOCK_OFFSET+LOCK_LEN+1,LOCK_LEN)) printf("Cannot re-lock after non-overlapping unlock()\n"); else printf("!FAILURE: can re-lock after non-overlappping unlock()\n"); if(lock(fd,LOCK_OFFSET,LOCK_LEN)) printf("!FAILURE: cannot re-lock unlocked area\n"); close(fd); /* getch test */ printf("\ngetch() test (ESC to continue)\n"); do { ch=getch(); printf("getch() returned %d\n",ch); } while(ch!=ESC); /* kbhit test */ printf("\nkbhit() test (any key to continue)\n"); while(!kbhit()) { printf("."); fflush(stdout); SLEEP(500); } getch(); /* remove character from keyboard buffer */ /* BEEP test */ printf("\nBEEP() test\n"); getkey(); for(i=750;i>250;i-=5) BEEP(i,15); for(;i<1000;i+=5) BEEP(i,15); /* SLEEP test */ printf("\nSLEEP(5 second) test\n"); getkey(); t=time(NULL); printf("sleeping... "); fflush(stdout); ticks=msclock(); SLEEP(5000); printf("slept %ld seconds (%ld according to msclock)\n",time(NULL)-t,(msclock()-ticks)/MSCLOCKS_PER_SEC); /* Thread SLEEP test */ printf("\nThread SLEEP(5 second) test\n"); getkey(); i=0; if(_beginthread( sleep_test_thread /* entry point */ ,0 /* stack size (0=auto) */ ,&i /* data */ )==(unsigned long)-1) printf("_beginthread failed\n"); else { SLEEP(1); /* yield to child thread */ while(i==0) { printf("."); fflush(stdout); SLEEP(1000); } } /* glob test */ printf("\nglob(%s) test\n",glob_pattern); getkey(); i=glob(glob_pattern,GLOB_MARK,NULL,&g); if(i==0) { for(u=0;u<g.gl_pathc;u++) printf("%s\n",g.gl_pathv[u]); globfree(&g); } else printf("glob(%s) returned %d\n",glob_pattern,i); /* opendir (and other directory functions) test */ printf("\nopendir(%s) test\n",path); getkey(); printf("\nDirectory of %s\n\n",FULLPATH(fpath,path,sizeof(fpath))); dir=opendir(path); while(dir!=NULL && (dirent=readdir(dir))!=NULL) { t=fdate(dirent->d_name); printf("%.24s %10lu %06o %s%c\n" ,ctime(&t) ,flength(dirent->d_name) ,getfattr(dirent->d_name) ,dirent->d_name ,isdir(dirent->d_name) ? '/':0 ); } if(dir!=NULL) closedir(dir); printf("\nFree disk space: %lu kbytes\n",getfreediskspace(path,1024)); /* Thread (and inter-process communication) test */ printf("\nSemaphore test\n"); getkey(); if(sem_init(&thread_data.parent_sem ,0 /* shared between processes */ ,0 /* initial count */ )) { printf("sem_init failed\n"); } if(sem_init(&thread_data.child_sem ,0 /* shared between processes */ ,0 /* initial count */ )) { printf("sem_init failed\n"); } if(_beginthread( sem_test_thread /* entry point */ ,0 /* stack size (0=auto) */ ,&thread_data /* data */ )==(unsigned long)-1) printf("_beginthread failed\n"); else { sem_wait(&thread_data.child_sem); /* wait for thread to begin */ for(i=0;i<10;i++) { printf("<parent>"); sem_post(&thread_data.parent_sem); sem_wait(&thread_data.child_sem); } sem_wait(&thread_data.child_sem); /* wait for thread to end */ } sem_destroy(&thread_data.parent_sem); sem_destroy(&thread_data.child_sem); printf("\nSemaphore blocking test\n"); getkey(); sem_init(&thread_data.parent_sem ,0 /* shared between processes */ ,0 /* initial count */ ); sem_init(&thread_data.child_sem ,0 /* shared between processes */ ,0 /* initial count */ ); if(_beginthread( sem_test_thread_block /* entry point */ ,0 /* stack size (0=auto) */ ,&thread_data /* data */ )==(unsigned long)-1) printf("_beginthread failed\n"); else { sem_wait(&thread_data.child_sem); /* wait for thread to begin */ for(i=0;i<10;i++) { printf("<parent>"); SLEEP(5000); sem_post(&thread_data.parent_sem); sem_wait(&thread_data.child_sem); } sem_wait(&thread_data.child_sem); /* wait for thread to end */ } printf("\nsem_trywait_block test..."); t=time(NULL); sem_trywait_block(&thread_data.parent_sem,5000); printf("\ntimed-out after %ld seconds (should be 5 seconds)\n",time(NULL)-t); sem_destroy(&thread_data.parent_sem); sem_destroy(&thread_data.child_sem); printf("\nendian check..."); memcpy(&i,"\x01\x02\x03\x04",4); if(LE_LONG(i)==67305985) { printf("OK!\n"); } else { printf("FAILED!\n"); } return 0; }
void ProgDetails::loadPage(void) { loadHTML(); MSqlQuery query(MSqlQuery::InitCon()); QString fullDateFormat = gCoreContext->GetSetting("DateFormat", "M/d/yyyy"); if (!fullDateFormat.contains("yyyy")) fullDateFormat += " yyyy"; QString category_type, showtype, year, epinum, rating, colorcode, title_pronounce; float stars = 0.0; int partnumber = 0, parttotal = 0; int audioprop = 0, videoprop = 0, subtype = 0, generic = 0; bool recorded = false; RecordingRule* record = NULL; if (m_progInfo.GetRecordingRuleID()) { record = new RecordingRule(); record->LoadByProgram(&m_progInfo); } if (m_progInfo.GetFilesize()) recorded = true; if (m_progInfo.GetScheduledEndTime() != m_progInfo.GetScheduledStartTime()) { QString ptable = "program"; if (recorded) ptable = "recordedprogram"; query.prepare(QString("SELECT category_type, airdate, stars," " partnumber, parttotal, audioprop+0, videoprop+0," " subtitletypes+0, syndicatedepisodenumber, generic," " showtype, colorcode, title_pronounce" " FROM %1 WHERE chanid = :CHANID AND" " starttime = :STARTTIME ;").arg(ptable)); query.bindValue(":CHANID", m_progInfo.GetChanID()); query.bindValue(":STARTTIME", m_progInfo.GetScheduledStartTime()); if (query.exec() && query.next()) { category_type = query.value(0).toString(); year = query.value(1).toString(); stars = query.value(2).toDouble(); partnumber = query.value(3).toInt(); parttotal = query.value(4).toInt(); audioprop = query.value(5).toInt(); videoprop = query.value(6).toInt(); subtype = query.value(7).toInt(); epinum = query.value(8).toString(); generic = query.value(9).toInt(); showtype = query.value(10).toString(); colorcode = query.value(11).toString(); title_pronounce = query.value(12).toString(); } else if (!query.isActive()) MythDB::DBError("ProgDetails", query); rating = getRatings( recorded, m_progInfo.GetChanID(), m_progInfo.GetScheduledStartTime()); } if (category_type.isEmpty() && !m_progInfo.GetProgramID().isEmpty()) { QString prefix = m_progInfo.GetProgramID().left(2); if (prefix == "MV") category_type = "movie"; else if (prefix == "EP") category_type = "series"; else if (prefix == "SP") category_type = "sports"; else if (prefix == "SH") category_type = "tvshow"; } addItem("TITLE", tr("Title"), m_progInfo.toString(ProgramInfo::kTitleSubtitle, " - ")); addItem("TITLE_PRONOUNCE", tr("Title Pronounce"), title_pronounce); QString s = m_progInfo.GetDescription(); QString attr; if (partnumber > 0) attr += QString(tr("Part %1 of %2, ")).arg(partnumber).arg(parttotal); if (!rating.isEmpty() && rating != "NR") attr += rating + ", "; if (category_type == "movie") { if (!year.isEmpty()) attr += year + ", "; if (stars > 0.0) attr += tr("%n star(s)", "", (int) (stars * 4.0)) + ", "; } if (!colorcode.isEmpty()) attr += colorcode + ", "; if (audioprop & AUD_MONO) attr += tr("Mono") + ", "; if (audioprop & AUD_STEREO) attr += tr("Stereo") + ", "; if (audioprop & AUD_SURROUND) attr += tr("Surround Sound") + ", "; if (audioprop & AUD_DOLBY) attr += tr("Dolby Sound") + ", "; if (audioprop & AUD_HARDHEAR) attr += tr("Audio for Hearing Impaired") + ", "; if (audioprop & AUD_VISUALIMPAIR) attr += tr("Audio for Visually Impaired") + ", "; if (videoprop & VID_HDTV) attr += tr("HDTV") + ", "; if (videoprop & VID_WIDESCREEN) attr += tr("Widescreen") + ", "; if (videoprop & VID_AVC) attr += tr("AVC/H.264") + ", "; if (videoprop & VID_720) attr += tr("720p Resolution") + ", "; if (videoprop & VID_1080) attr += tr("1080i/p Resolution") + ", "; if (subtype & SUB_HARDHEAR) attr += tr("CC","Closed Captioned") + ", "; if (subtype & SUB_NORMAL) attr += tr("Subtitles Available") + ", "; if (subtype & SUB_ONSCREEN) attr += tr("Subtitled") + ", "; if (subtype & SUB_SIGNED) attr += tr("Deaf Signing") + ", "; if (generic && category_type == "series") attr += tr("Unidentified Episode") + ", "; else if (m_progInfo.IsRepeat()) attr += tr("Repeat") + ", "; if (!attr.isEmpty()) { attr.truncate(attr.lastIndexOf(',')); s += " (" + attr + ")"; } addItem("DESCRIPTION", tr("Description"), s); s.clear(); if (!m_progInfo.GetCategory().isEmpty()) { s = m_progInfo.GetCategory(); query.prepare("SELECT genre FROM programgenres " "WHERE chanid = :CHANID AND starttime = :STARTTIME " "AND relevance > 0 ORDER BY relevance;"); query.bindValue(":CHANID", m_progInfo.GetChanID()); query.bindValue(":STARTTIME", m_progInfo.GetScheduledStartTime()); if (query.exec()) { while (query.next()) s += ", " + query.value(0).toString(); } } addItem("CATEGORY", tr("Category"), s); s.clear(); if (!category_type.isEmpty()) { s = category_type; if (!m_progInfo.GetSeriesID().isEmpty()) s += " (" + m_progInfo.GetSeriesID() + ")"; if (!showtype.isEmpty()) s += " " + showtype; } addItem("CATEGORY_TYPE", tr("Type", "category_type"), s); addItem("EPISODE", tr("Episode Number"), epinum); s.clear(); if (m_progInfo.GetOriginalAirDate().isValid() && category_type != "movie") { s = m_progInfo.GetOriginalAirDate().toString(fullDateFormat); } addItem("ORIGINAL_AIRDATE", tr("Original Airdate"), s); addItem("PROGRAMID", tr("Program ID"), m_progInfo.GetProgramID()); QString actors, directors, producers, execProducers; QString writers, guestStars, hosts, adapters; QString presenters, commentators, guests; if (m_progInfo.GetScheduledEndTime() != m_progInfo.GetScheduledStartTime()) { if (recorded) query.prepare("SELECT role,people.name FROM recordedcredits" " AS credits" " LEFT JOIN people ON credits.person = people.person" " WHERE credits.chanid = :CHANID" " AND credits.starttime = :STARTTIME" " ORDER BY role;"); else query.prepare("SELECT role,people.name FROM credits" " LEFT JOIN people ON credits.person = people.person" " WHERE credits.chanid = :CHANID" " AND credits.starttime = :STARTTIME" " ORDER BY role;"); query.bindValue(":CHANID", m_progInfo.GetChanID()); query.bindValue(":STARTTIME", m_progInfo.GetScheduledStartTime()); if (query.exec() && query.size() > 0) { QStringList plist; QString rstr, role, pname; while(query.next()) { role = query.value(0).toString(); /* The people.name column uses utf8_bin collation. * Qt-MySQL drivers use QVariant::ByteArray for string-type * MySQL fields marked with the BINARY attribute (those using a * *_bin collation) and QVariant::String for all others. * Since QVariant::toString() uses QString::fromAscii() * (through QVariant::convert()) when the QVariant's type is * QVariant::ByteArray, we have to use QString::fromUtf8() * explicitly to prevent corrupting characters. * The following code should be changed to use the simpler * toString() approach, as above, if we do a DB update to * coalesce the people.name values that differ only in case and * change the collation to utf8_general_ci, to match the * majority of other columns, or we'll have the same problem in * reverse. */ pname = QString::fromUtf8(query.value(1) .toByteArray().constData()); if (rstr != role) { if (rstr == "actor") actors = plist.join(", "); else if (rstr == "director") directors = plist.join(", "); else if (rstr == "producer") producers = plist.join(", "); else if (rstr == "executive_producer") execProducers = plist.join(", "); else if (rstr == "writer") writers = plist.join(", "); else if (rstr == "guest_star") guestStars = plist.join(", "); else if (rstr == "host") hosts = plist.join(", "); else if (rstr == "adapter") adapters = plist.join(", "); else if (rstr == "presenter") presenters = plist.join(", "); else if (rstr == "commentator") commentators = plist.join(", "); else if (rstr == "guest") guests = plist.join(", "); rstr = role; plist.clear(); } plist.append(pname); } if (rstr == "actor") actors = plist.join(", "); else if (rstr == "director") directors = plist.join(", "); else if (rstr == "producer") producers = plist.join(", "); else if (rstr == "executive_producer") execProducers = plist.join(", "); else if (rstr == "writer") writers = plist.join(", "); else if (rstr == "guest_star") guestStars = plist.join(", "); else if (rstr == "host") hosts = plist.join(", "); else if (rstr == "adapter") adapters = plist.join(", "); else if (rstr == "presenter") presenters = plist.join(", "); else if (rstr == "commentator") commentators = plist.join(", "); else if (rstr == "guest") guests = plist.join(", "); } } addItem("ACTORS", tr("Actors"), actors); addItem("DIRECTOR", tr("Director"), directors); addItem("PRODUCER", tr("Producer"), producers); addItem("EXECUTIVE_PRODUCER", tr("Executive Producer"), execProducers); addItem("WRITER", tr("Writer"), writers); addItem("GUEST_STAR", tr("Guest Star"), guestStars); addItem("HOST", tr("Host"), hosts); addItem("ADAPTER", tr("Adapter"), adapters); addItem("PRESENTER", tr("Presenter"), presenters); addItem("COMMENTATOR", tr("Commentator"), commentators); addItem("GUEST", tr("Guest"), guests); // Begin MythTV information not found in the listings info // msg += "<br>"; QDateTime statusDate; if (m_progInfo.GetRecordingStatus() == rsWillRecord) statusDate = m_progInfo.GetScheduledStartTime(); RecordingType rectype = kSingleRecord; // avoid kNotRecording RecStatusType recstatus = m_progInfo.GetRecordingStatus(); if (recstatus == rsPreviousRecording || recstatus == rsNeverRecord || recstatus == rsUnknown) { query.prepare("SELECT recstatus, starttime " "FROM oldrecorded WHERE duplicate > 0 AND " "future = 0 AND " "((programid <> '' AND programid = :PROGRAMID) OR " " (title <> '' AND title = :TITLE AND " " subtitle <> '' AND subtitle = :SUBTITLE AND " " description <> '' AND description = :DECRIPTION));"); query.bindValue(":PROGRAMID", m_progInfo.GetProgramID()); query.bindValue(":TITLE", m_progInfo.GetTitle()); query.bindValue(":SUBTITLE", m_progInfo.GetSubtitle()); query.bindValue(":DECRIPTION", m_progInfo.GetDescription()); if (!query.exec()) { MythDB::DBError("showDetails", query); } else if (query.next()) { if (recstatus == rsUnknown) recstatus = RecStatusType(query.value(0).toInt()); if (recstatus == rsPreviousRecording || recstatus == rsNeverRecord || recstatus == rsRecorded) { statusDate = query.value(1).toDateTime(); } } } if (recstatus == rsUnknown) { if (recorded) { recstatus = rsRecorded; statusDate = m_progInfo.GetScheduledStartTime(); } else { // re-enable "Not Recording" status text rectype = m_progInfo.GetRecordingRuleType(); } } s = toString(recstatus, rectype); if (statusDate.isValid()) s += " " + statusDate.toString(fullDateFormat); addItem("MYTHTV_STATUS", QString("MythTV " + tr("Status")), s); QString recordingRule; QString lastRecorded; QString nextRecording; QString averageTimeShift; QString watchListScore; QString watchListStatus; QString searchPhrase; if (m_progInfo.GetRecordingRuleID()) { recordingRule = QString("%1, ").arg(m_progInfo.GetRecordingRuleID()); if (m_progInfo.GetRecordingRuleType() != kNotRecording) recordingRule += toString(m_progInfo.GetRecordingRuleType()); if (!(record->m_title.isEmpty())) recordingRule += QString(" \"%2\"").arg(record->m_title); query.prepare("SELECT last_record, next_record, avg_delay " "FROM record WHERE recordid = :RECORDID"); query.bindValue(":RECORDID", m_progInfo.GetRecordingRuleID()); if (query.exec() && query.next()) { if (query.value(0).toDateTime().isValid()) lastRecorded = query.value(0).toDateTime().toString(fullDateFormat); if (query.value(1).toDateTime().isValid()) nextRecording = query.value(1).toDateTime().toString(fullDateFormat); if (query.value(2).toInt() > 0) averageTimeShift = tr("%n hour(s)", "", query.value(2).toInt()); } if (recorded) { if (m_progInfo.GetRecordingPriority2() > 0) watchListScore = QString::number(m_progInfo.GetRecordingPriority2()); if (m_progInfo.GetRecordingPriority2() < 0) { switch (m_progInfo.GetRecordingPriority2()) { case wlExpireOff: watchListStatus = tr("Auto-expire off"); break; case wlWatched: watchListStatus = tr("Marked as 'watched'"); break; case wlEarlier: watchListStatus = tr("Not the earliest episode"); break; case wlDeleted: watchListStatus = tr("Recently deleted episode"); break; } } } if (record->m_searchType != kManualSearch && record->m_description != m_progInfo.GetDescription()) { searchPhrase = record->m_description .replace("<", "<").replace(">", ">").replace("\n", " "); } } addItem("RECORDING_RULE", tr("Recording Rule"), recordingRule); addItem("LAST_RECORDED", tr("Last Recorded"), lastRecorded); addItem("NEXT_RECORDING", tr("Next Recording"), nextRecording); addItem("AVERAGE_TIME_SHIFT", tr("Average Time Shift"), averageTimeShift); addItem("WATCH_LIST_SCORE", tr("Watch List Score"), watchListScore); addItem("WATCH_LIST_STATUS", tr("Watch List Status"), watchListStatus); addItem("SEARCH_PHRASE", tr("Search Phrase"), searchPhrase); s.clear(); if (m_progInfo.GetFindID()) { QDate fdate(1970, 1, 1); fdate = fdate.addDays((int)m_progInfo.GetFindID() - 719528); s = QString("%1 (%2)").arg(m_progInfo.GetFindID()) .arg(fdate.toString(fullDateFormat)); } addItem("FINDID", tr("Find ID"), s); QString recordingHost; QString recordedFilename; QString recordedFileSize; QString recordingGroup; QString storageGroup; QString playbackGroup; QString recordingProfile; if (recorded) { recordingHost = m_progInfo.GetHostname(); recordedFilename = m_progInfo.GetBasename(); recordedFileSize = QString("%1 ") .arg(m_progInfo.GetFilesize()/((double)(1<<30)),0,'f',2); recordedFileSize += tr("GB", "GigaBytes"); query.prepare("SELECT profile FROM recorded" " WHERE chanid = :CHANID" " AND starttime = :STARTTIME;"); query.bindValue(":CHANID", m_progInfo.GetChanID()); query.bindValue(":STARTTIME", m_progInfo.GetRecordingStartTime()); if (query.exec() && query.next()) { recordingProfile = m_progInfo.i18n(query.value(0).toString()); } recordingGroup = m_progInfo.i18n(m_progInfo.GetRecordingGroup()); storageGroup = m_progInfo.i18n(m_progInfo.GetStorageGroup()); playbackGroup = m_progInfo.i18n(m_progInfo.GetPlaybackGroup()); } else if (m_progInfo.GetRecordingRuleID()) { recordingProfile = record->m_recProfile; } addItem("RECORDING_HOST", tr("Recording Host"), recordingHost); addItem("RECORDED_FILE_NAME", tr("Recorded File Name"), recordedFilename); addItem("RECORDED_FILE_SIZE", tr("Recorded File Size"), recordedFileSize); addItem("RECORDING_PROFILE", tr("Recording Profile"), recordingProfile); addItem("RECORDING_GROUP", tr("Recording Group"), recordingGroup); addItem("STORAGE_GROUP", tr("Storage Group"), storageGroup); addItem("PLAYBACK_GROUP", tr("Playback Group"), playbackGroup); m_page[m_currentPage] = m_html.join("\n"); delete record; }
BOOL DLLCALL getfiledat(scfg_t* cfg, file_t* f) { char buf[F_LEN+1],str[MAX_PATH+1]; int file; long length; SAFEPRINTF2(str,"%s%s.dat",cfg->dir[f->dir]->data_dir,cfg->dir[f->dir]->code); if((file=sopen(str,O_RDONLY|O_BINARY,SH_DENYWR))==-1) { return(FALSE); } length=(long)filelength(file); if(f->datoffset>length) { close(file); return(FALSE); } if(length%F_LEN) { close(file); return(FALSE); } lseek(file,f->datoffset,SEEK_SET); if(read(file,buf,F_LEN)!=F_LEN) { close(file); return(FALSE); } close(file); getrec(buf,F_ALTPATH,2,str); f->altpath=hptoi(str); getrec(buf,F_CDT,LEN_FCDT,str); f->cdt=atol(str); if(!f->size) { /* only read disk if this is null */ getfilepath(cfg,f,str); if((f->size=(long)flength(str))>=0) f->date=(time32_t)fdate(str); /* } else { f->size=f->cdt; f->date=0; } */ } #if 0 if((f->size>0L) && cur_cps) f->timetodl=(ushort)(f->size/(ulong)cur_cps); else #endif f->timetodl=0; getrec(buf,F_DESC,LEN_FDESC,f->desc); getrec(buf,F_ULER,LEN_ALIAS,f->uler); getrec(buf,F_TIMESDLED,5,str); f->timesdled=atoi(str); getrec(buf,F_OPENCOUNT,3,str); f->opencount=atoi(str); if(buf[F_MISC]!=ETX) f->misc=buf[F_MISC]-' '; else f->misc=0; return(TRUE); }
G_MODULE_EXPORT void sendmessageto_node(GtkWidget *wiggy, gpointer data) { char fn[MAX_PATH+1]; char str[MAX_PATH+1]; int i; int tmp; node_t node; time_t edited; struct utimbuf tb; char *msg; gtk_tree_selection_selected_foreach(sel ,get_lastselected_node ,&i); if((i=getnodedat(&cfg,i,&node,NULL))) { sprintf(str,"Error reading node data (%d)!",i); display_message("Read Error",str,"gtk-dialog-error"); } else { strcpy(fn,"/tmp/gtkmonitor-msg-XXXXXXXX"); tmp=mkstemp(fn); if(tmp!=-1) { write(tmp,"\1n\1y\1hMessage From Sysop:\1w \n\n",30); close(tmp); /* Set modified time back one second so we can tell if the sysop saved the file or not */ edited=fdate(fn); edited--; tb.actime=edited; tb.modtime=edited; utime(fn, &tb); /* If utime() failed for some reason, sleep for a second */ if(fdate(fn)!=edited) SLEEP(1000); if(!run_cmd_mutex_initalized) { pthread_mutex_init(&run_cmd_mutex, NULL); run_cmd_mutex_initalized=1; } exec_cmdstr(gtkm_conf.edit_text_file, NULL, fn); /* Spin on the lock waiting for the edit command to start */ while(!pthread_mutex_trylock(&run_cmd_mutex)) pthread_mutex_unlock(&run_cmd_mutex); /* Now, spin on the lock waiting for it to *exit* */ while(pthread_mutex_trylock(&run_cmd_mutex)) { /* Allow events to happen as normal */ while(gtk_events_pending()) { if(gtk_main_iteration()) gtk_main_quit(); } SLEEP(1); } pthread_mutex_unlock(&run_cmd_mutex); /* Now, read the message back in and send to the user */ if(fdate(fn)!=edited) { i=flength(fn); if((msg=(char *)malloc(i))==NULL) display_message("malloc() Error", "Cannot allocate enough memory for the message", "gtk-dialog-error"); else { tmp=open(fn, O_RDONLY); if(tmp==-1) display_message("open() Error", "Cannot open temp message file", "gtk-dialog-error"); else { if(read(tmp, msg, i)!=i) display_message("read() Error", "Problem reading message file", "gtk-dialog-error"); else { putsmsg(&cfg, node.useron, msg); } } free(msg); } } } } }