void printsheet(void) /* Prints a copy of the spreadsheet to a file or to the printer */ { char filename[MAXINPUT + 1], s[133], colstr[MAXCOLWIDTH + 1]; FILE *file; int columns, counter1, counter2, counter3, col = 0, row, border, toppage, lcol, lrow, dummy, printed, oldlastcol; filename[0] = 0; writeprompt(MSGPRINT); if (!editstring(filename, "", MAXINPUT)) return; if (filename[0] == 0) strcpy(filename, "PRN"); if ((file = fopen(filename, "wt")) == NULL) { errormsg(MSGNOOPEN); return; } oldlastcol = lastcol; for (counter1 = 0; counter1 <= lastrow; counter1++) { for (counter2 = lastcol; counter2 < MAXCOLS; counter2++) { if (format[counter2][counter1] >= OVERWRITE) lastcol = counter2; } } if (!getyesno(&columns, MSGCOLUMNS)) return; columns = (columns == 'Y') ? 131 : 79; if (!getyesno(&border, MSGBORDER)) return; border = (border == 'Y'); while (col <= lastcol) { row = 0; toppage = TRUE; lcol = pagecols(col, border, columns) + col; while (row <= lastrow) { lrow = pagerows(row, toppage, border) + row; printed = 0; if (toppage) { for (counter1 = 0; counter1 < TOPMARGIN; counter1++) { fprintf(file, "\n"); printed++; } } for (counter1 = row; counter1 < lrow; counter1++) { if ((border) && (counter1 == row) && (toppage)) { if ((col == 0) && (border)) sprintf(s, "%*s", LEFTMARGIN, ""); else s[0] = 0; for (counter3 = col; counter3 < lcol; counter3++) { centercolstring(counter3, colstr); strcat(s, colstr); } fprintf(file, "%s\n", s); printed++; } if ((col == 0) && (border)) sprintf(s, "%-*d", LEFTMARGIN, counter1 + 1); else s[0] = 0; for (counter2 = col; counter2 < lcol; counter2++) strcat(s, cellstring(counter2, counter1, &dummy, FORMAT)); fprintf(file, "%s\n", s); printed++; } row = lrow; toppage = FALSE; if (printed < 66) fprintf(file, "%c", FORMFEED); } col = lcol; } fclose(file); lastcol = oldlastcol; } /* printsheet */
int main(int argc, char **argv) { FILE *input; signed char op; void (*preprocess_fun)(void) = NULL; void (*line_fun)(void) = NULL; void (*postprocess_fun)(void) = NULL; progname = "bayesol"; inputfile = "stdin"; inputline = 0; /* set up internationalization */ if( !setlocale(LC_ALL, "") ) { errormsg(E_WARNING, "could not set locale, internationalization disabled\n"); } else { if( options & (1<<OPTION_DEBUG) ) { errormsg(E_WARNING, "international locales not supported\n"); } } /* parse the options */ while( (op = getopt(argc, argv, "DVvinNc:")) > -1 ) { switch(op) { case 'V': fprintf(stdout, "bayesol version %s\n", VERSION); fprintf(stdout, COPYBLURB, "bayesol"); exit(1); break; case 'n': options |= (1<<OPTION_SCORES); break; case 'N': options |= (1<<OPTION_SCORES_EX); break; case 'i': options |= (1<<OPTION_I18N); break; case 'c': if( *optarg && read_riskspec(optarg) ) { options |= (1<<OPTION_RISKSPEC); } else { errormsg(E_FATAL,"could not read %s, program aborted\n", optarg); } break; case 'v': options |= (1<<OPTION_VERBOSE); break; case 'D': options |= (1<<OPTION_DEBUG); break; default: break; } } /* end option processing */ /* consistency checks */ if( !(options & (1<<OPTION_RISKSPEC)) ){ errormsg(E_ERROR,"please use -c option\n"); usage(argv); exit(0); } if( (options & (1<<OPTION_SCORES)) && (options & (1<<OPTION_SCORES_EX)) ) { errormsg(E_WARNING, "option -n is incompatible with -N, ignoring\n"); options &= ~(1<<OPTION_SCORES); } /* set up callbacks */ if( options & (1<<OPTION_RISKSPEC) ) { preprocess_fun = setup_regexes; line_fun = NULL; /* print_line; */ postprocess_fun = finish_parsing_and_score; } else { /* something wrong ? */ usage(argv); exit(0); } if( preprocess_fun ) { (*preprocess_fun)(); } /* preallocate primary text holding buffer */ textbuf_len = BUFLEN; textbuf = malloc(textbuf_len); /* now process each file on the command line, or if none provided read stdin */ while( (optind > -1) && *(argv + optind) ) { /* if it's a filename, process it */ if( (input = fopen(argv[optind], "rb")) ) { inputfile = argv[optind]; options |= (1<<INPUT_FROM_CMDLINE); if( options & (1<<OPTION_DEBUG) ) { fprintf(stdout, "processing file %s\n", argv[optind]); } if( !(options & (1<<OPTION_I18N)) ) { b_process_file(input, line_fun); } else { #if defined HAVE_MBRTOWC w_b_process_file(input, line_fun); #endif } fclose(input); } else { /* unrecognized file name */ errormsg(E_ERROR, "couldn't open %s\n", argv[optind]); usage(argv); exit(0); } optind++; } /* in case no files were specified, get input from stdin */ if( !(options & (1<<INPUT_FROM_CMDLINE)) && (input = fdopen(fileno(stdin), "rb")) ) { if( options & (1<<OPTION_DEBUG) ) { fprintf(stdout, "taking input from stdin\n"); } if( !(options & (1<<OPTION_I18N)) ) { b_process_file(input, line_fun); } else { #if defined HAVE_MBRTOWC w_b_process_file(input, line_fun); #endif } fclose(input); } if( postprocess_fun ) { (*postprocess_fun)(); } /* free some global resources */ free(textbuf); exit(exit_code); }
int main(int argc, char *argv[]) { char histlogfn[PATH_MAX]; FILE *fd; char textrepfullfn[PATH_MAX], textrepfn[1024], textrepurl[PATH_MAX]; FILE *textrep; reportinfo_t repinfo; int argi; char *envarea = NULL; void *hinfo; for (argi=1; (argi < argc); argi++) { if (argnmatch(argv[argi], "--env=")) { char *p = strchr(argv[argi], '='); loadenv(p+1, envarea); } else if (argnmatch(argv[argi], "--area=")) { char *p = strchr(argv[argi], '='); envarea = strdup(p+1); } } redirect_cgilog("reportlog"); cgidata = cgi_request(); parse_query(); load_hostnames(xgetenv("HOSTSCFG"), NULL, get_fqdn()); if ((hinfo = hostinfo(hostname)) == NULL) { errormsg("No such host"); return 1; } ip = xmh_item(hinfo, XMH_IP); displayname = xmh_item(hinfo, XMH_DISPLAYNAME); if (!displayname) displayname = hostname; sprintf(histlogfn, "%s/%s.%s", xgetenv("XYMONHISTDIR"), commafy(hostname), service); fd = fopen(histlogfn, "r"); if (fd == NULL) { errormsg("Cannot open history file"); } color = parse_historyfile(fd, &repinfo, hostname, service, st, end, 0, reportwarnlevel, reportgreenlevel, reportwarnstops, reporttime); fclose(fd); sprintf(textrepfn, "avail-%s-%s-%u-%u.txt", hostname, service, (unsigned int)getcurrenttime(NULL), (int)getpid()); sprintf(textrepfullfn, "%s/%s", xgetenv("XYMONREPDIR"), textrepfn); sprintf(textrepurl, "%s/%s", xgetenv("XYMONREPURL"), textrepfn); textrep = fopen(textrepfullfn, "w"); /* Now generate the webpage */ printf("Content-Type: %s\n\n", xgetenv("HTMLCONTENTTYPE")); generate_replog(stdout, textrep, textrepurl, hostname, service, color, style, ip, displayname, st, end, reportwarnlevel, reportgreenlevel, reportwarnstops, &repinfo); if (textrep) fclose(textrep); return 0; }
bool sbbs_t::bulkmail(uchar *ar) { char str[256],title[LEN_TITLE+1]; char msgpath[MAX_PATH+1]; char* msgbuf; char tmp[512]; int i,j,x; long msgs=0; long length; FILE* fp; smb_t smb; smbmsg_t msg; user_t user; memset(&msg,0,sizeof(msg)); title[0]=0; action=NODE_SMAL; nodesync(); if(cfg.sys_misc&SM_ANON_EM && useron.exempt&FLAG('A') && !noyes(text[AnonymousQ])) msg.hdr.attr|=MSG_ANONYMOUS; msg_tmp_fname(useron.xedit, msgpath, sizeof(msgpath)); if(!writemsg(msgpath,nulstr,title,WM_EMAIL,INVALID_SUB,"Bulk Mailing")) { bputs(text[Aborted]); return(false); } if((fp=fopen(msgpath,"r"))==NULL) { errormsg(WHERE,ERR_OPEN,msgpath,O_RDONLY); return(false); } if((length=filelength(fileno(fp)))<=0) { fclose(fp); return(false); } bputs(text[WritingIndx]); CRLF; if((msgbuf=(char*)malloc(length+1))==NULL) { errormsg(WHERE,ERR_ALLOC,msgpath,length+1); return(false); } length=fread(msgbuf,sizeof(char),length,fp); fclose(fp); if(length<0) { free(msgbuf); errormsg(WHERE,ERR_READ,msgpath,length); return(false); } msgbuf[length]=0; /* ASCIIZ */ smb_hfield_str(&msg,SENDER,useron.alias); sprintf(str,"%u",useron.number); smb_hfield_str(&msg,SENDEREXT,str); smb_hfield_str(&msg,SUBJECT,title); msg.hdr.when_written.time=time(NULL); msg.hdr.when_written.zone=sys_timezone(&cfg); memset(&smb,0,sizeof(smb)); smb.subnum=INVALID_SUB; /* mail database */ i=savemsg(&cfg, &smb, &msg, &client, msgbuf); free(msgbuf); if(i!=0) { smb_close(&smb); smb_freemsgmem(&msg); return(false); } j=lastuser(&cfg); if(*ar) for(i=1;i<=j;i++) { user.number=i; if(getuserdat(&cfg, &user)!=0) continue; if(user.misc&(DELETED|INACTIVE)) continue; if(chk_ar(ar,&user)) { if((x=bulkmailhdr(&smb, &msg, i))!=SMB_SUCCESS) { errormsg(WHERE,ERR_WRITE,smb.file,x); break; } msgs++; } } else while(online) { bputs(text[EnterAfterLastDestUser]); if(!getstr(str,LEN_ALIAS,cfg.uq&UQ_NOUPRLWR ? K_NONE:K_UPRLWR)) break; if((i=finduser(str))!=0) { if((x=bulkmailhdr(&smb, &msg, i))!=SMB_SUCCESS) { errormsg(WHERE,ERR_WRITE,smb.file,x); break; } msgs++; } } if((i=smb_open_da(&smb))==SMB_SUCCESS) { if(!msgs) smb_freemsg_dfields(&smb,&msg,SMB_ALL_REFS); else if(msgs>1) smb_incmsg_dfields(&smb,&msg,(ushort)msgs-1); smb_close_da(&smb); } smb_close(&smb); smb_freemsgmem(&msg); if(i!=SMB_SUCCESS) { errormsg(WHERE,ERR_OPEN,smb.file,i,smb.last_error); return(false); } putuserrec(&cfg,useron.number,U_EMAILS,5,ultoa(useron.emails,tmp,10)); putuserrec(&cfg,useron.number,U_ETODAY,5,ultoa(useron.etoday,tmp,10)); return(true); }
void finish_parsing() { category_count_t i; LossVector *p; real_value_t min_complexity, max_complexity; /* consistency checks */ if( !found_scores ) { errormsg(E_FATAL, "no scores found. Did you use dbacl with the -a switch?\n"); } else { min_complexity = spec.complexity[0]; max_complexity = spec.complexity[0]; for(i = 0; i < spec.num_cats; i++) { if( !spec.catname[i] ) { errormsg(E_FATAL, "too few categories scored. Is your risk specification correct?\n"); exit(0); } min_complexity = (min_complexity < spec.complexity[i]) ? min_complexity : spec.complexity[i]; max_complexity = (max_complexity > spec.complexity[i]) ? max_complexity : spec.complexity[i]; } if( min_complexity < MEANINGLESS_THRESHOLD * max_complexity ) { errormsg(E_WARNING, "\n" " There is a significant disparity between the complexities\n" " reported under each category. This most likely indicates that\n" " you've chosen categories whose features aren't comparable.\n" "\n" " The Bayes solution calculations will be meaningless.\n\n"); } } /* first, we must finish building the loss matrix We pick for each category the first lossvector which reported a match */ for(i = 0; i < spec.num_cats; i++) { for(p = spec.loss_list[i]; p != NULL; p = p->next) { if( p->found ) { break; } } if( p == NULL ) { errormsg(E_ERROR, "something's wrong with loss_list.\n"); } else { /* now build the ith row of the loss matrix */ if( options & (1<<OPTION_DEBUG) ) { fprintf(stdout, "category %s\t risk spec: %s\n", spec.catname[i], p->ve); } if( parse_loss_vec(i, p->ve) != 0 ) { errormsg(E_FATAL, "couldn't parse spec for (%s, \"%s\")\n", spec.catname[i], p->re); } } } if( options & (1<<OPTION_SCORES_EX) ) { /* modify final loss matrix for cost' function. See explanation in costs.ps, but note we don't change loss_matrix[i][j] for i != j as we should. The correction is loss_matrix'[i][j] = log(exp(loss_matrix[i][j] + 1), which has no effect for large values of loss_matrix[i][j]. For small values, the loss is irrelevant anyway. */ for(i = 0; i < spec.num_cats; i++) { if( isinf(spec.loss_matrix[i][i]) ) { spec.loss_matrix[i][i] = 0.0; } } } }
int grokdir(char *dir, file_t **filelistp) { DIR *cd; file_t *newfile; struct dirent *dirinfo; int lastchar; int filecount = 0; struct stat info; struct stat linfo; static int progress = 0; static char indicator[] = "-\\|/"; char *fullname, *name; cd = opendir(dir); if (!cd) { errormsg("could not chdir to %s\n", dir); return 0; } while ((dirinfo = readdir(cd)) != NULL) { if (strcmp(dirinfo->d_name, ".") && strcmp(dirinfo->d_name, "..")) { if (!ISFLAG(flags, F_HIDEPROGRESS)) { fprintf(stderr, "\rBuilding file list %c ", indicator[progress]); progress = (progress + 1) % 4; } newfile = (file_t*) malloc(sizeof(file_t)); if (!newfile) { errormsg("out of memory!\n"); closedir(cd); exit(1); } else newfile->next = *filelistp; newfile->device = 0; newfile->inode = 0; newfile->crcsignature = NULL; newfile->crcpartial = NULL; newfile->duplicates = NULL; newfile->hasdupes = 0; newfile->d_name = (char*)malloc(strlen(dir)+strlen(dirinfo->d_name)+2); if (!newfile->d_name) { errormsg("out of memory!\n"); free(newfile); closedir(cd); exit(1); } strcpy(newfile->d_name, dir); lastchar = strlen(dir) - 1; if (lastchar >= 0 && dir[lastchar] != '/') strcat(newfile->d_name, "/"); strcat(newfile->d_name, dirinfo->d_name); if (ISFLAG(flags, F_EXCLUDEHIDDEN)) { fullname = strdup(newfile->d_name); name = basename(fullname); if (name[0] == '.' && strcmp(name, ".") && strcmp(name, "..") ) { free(newfile->d_name); free(newfile); continue; } free(fullname); } if (filesize(newfile->d_name) == 0 && ISFLAG(flags, F_EXCLUDEEMPTY)) { free(newfile->d_name); free(newfile); continue; } if (stat(newfile->d_name, &info) == -1) { free(newfile->d_name); free(newfile); continue; } if (lstat(newfile->d_name, &linfo) == -1) { free(newfile->d_name); free(newfile); continue; } if (S_ISDIR(info.st_mode)) { if (ISFLAG(flags, F_RECURSE) && (ISFLAG(flags, F_FOLLOWLINKS) || !S_ISLNK(linfo.st_mode))) filecount += grokdir(newfile->d_name, filelistp); free(newfile->d_name); free(newfile); } else { if (ISFLAG(flags, F_MINIMUMSIZE)) { if (linfo.st_size < minimum_size) { continue; } } if (S_ISREG(linfo.st_mode) || (S_ISLNK(linfo.st_mode) && ISFLAG(flags, F_FOLLOWLINKS))) { *filelistp = newfile; filecount++; } else { free(newfile->d_name); free(newfile); } } } } closedir(cd); return filecount; }
void hardlinkfiles(file_t *files, int debug) { int counter; int groups = 0; int curgroup = 0; file_t *tmpfile; file_t *curfile; file_t **dupelist; int max = 0; int x = 0; curfile = files; while (curfile) { if (curfile->hasdupes) { counter = 1; groups++; tmpfile = curfile->duplicates; while (tmpfile) { counter++; tmpfile = tmpfile->duplicates; } if (counter > max) max = counter; } curfile = curfile->next; } max++; dupelist = (file_t**) malloc(sizeof(file_t*) * max); if (!dupelist) { errormsg("out of memory\n"); exit(1); } while (files) { if (files->hasdupes) { curgroup++; counter = 1; dupelist[counter] = files; if (debug) printf("[%d] %s\n", counter, files->d_name); tmpfile = files->duplicates; while (tmpfile) { dupelist[++counter] = tmpfile; if (debug) printf("[%d] %s\n", counter, tmpfile->d_name); tmpfile = tmpfile->duplicates; } if (debug) printf("\n"); /* preserve only the first file */ printf(" [+] %s\n", dupelist[1]->d_name); for (x = 2; x <= counter; x++) { if (unlink(dupelist[x]->d_name) == 0) { if ( link(dupelist[1]->d_name, dupelist[x]->d_name) == 0 ) { printf(" [h] %s\n", dupelist[x]->d_name); } else { printf("-- unable to create a hardlink for the file: %s\n", strerror(errno)); printf(" [!] %s ", dupelist[x]->d_name); } } else { printf(" [!] %s ", dupelist[x]->d_name); printf("-- unable to delete the file!\n"); } } printf("\n"); } files = files->next; } free(dupelist); }
/* * This routine will turn the sftmp() file into a real /tmp file or pipe */ void sh_subtmpfile(int pflag) { Shell_t *shp = &sh; int fds[2]; Sfoff_t off; register struct checkpt *pp = (struct checkpt*)shp->jmplist; register struct subshell *sp = subshell_data->pipe; if(sfset(sfstdout,0,0)&SF_STRING) { register int fd; /* save file descriptor 1 if open */ if((sp->tmpfd = fd = fcntl(1,F_DUPFD,10)) >= 0) { fcntl(fd,F_SETFD,FD_CLOEXEC); shp->fdstatus[fd] = shp->fdstatus[1]|IOCLEX; close(1); shp->fdstatus[1] = IOCLOSE; } else if(errno!=EBADF) { ((struct checkpt*)shp->jmplist)->mode = SH_JMPERREXIT; shp->toomany = 1; errormsg(SH_DICT,ERROR_system(1),e_toomany); } if(shp->subshare || !pflag) { sfdisc(sfstdout,SF_POPDISC); if((fd=sffileno(sfstdout))>=0) { shp->fdstatus[fd] = IOREAD|IOWRITE; sfsync(sfstdout); if(fd==1) fcntl(1,F_SETFD,0); else { sfsetfd(sfstdout,1); shp->fdstatus[1] = shp->fdstatus[fd]; shp->fdstatus[fd] = IOCLOSE; } goto skip; } } } if(sp && (shp->fdstatus[1]==IOCLOSE || (!shp->subshare && !(shp->fdstatus[1]&IONOSEEK)))) { struct stat statb,statx; int fd; sh_pipe(fds); sp->pipefd = fds[0]; sh_fcntl(sp->pipefd,F_SETFD,FD_CLOEXEC); /* write the data to the pipe */ if(off = sftell(sfstdout)) { write(fds[1],sfsetbuf(sfstdout,(Void_t*)sfstdout,0),(size_t)off); sfpurge(sfstdout); } if((sfset(sfstdout,0,0)&SF_STRING) || fstat(1,&statb)<0) statb.st_ino = 0; sfclose(sfstdout); if((sh_fcntl(fds[1],F_DUPFD, 1)) != 1) errormsg(SH_DICT,ERROR_system(1),e_redirect); sh_close(fds[1]); if(statb.st_ino) for(fd=0; fd < 10; fd++) { if(fd==1 || ((shp->fdstatus[fd]&(IONOSEEK|IOSEEK|IOWRITE))!=(IOSEEK|IOWRITE)) || fstat(fd,&statx)<0) continue; if(statb.st_ino==statx.st_ino && statb.st_dev==statx.st_dev) { sh_close(fd); fcntl(1,F_DUPFD, fd); } } skip: sh_iostream(shp,1); sfset(sfstdout,SF_SHARE|SF_PUBLIC,1); sfpool(sfstdout,shp->outpool,SF_WRITE); if(pp && pp->olist && pp->olist->strm == sfstdout) pp->olist->strm = 0; } }
void parse_cgi(void) { cgidata_t *postdata, *pwalk; struct tm schedtm; struct tm endtm; struct tm nowtm; memset(&schedtm, 0, sizeof(schedtm)); memset(&endtm, 0, sizeof(endtm)); postdata = cgi_request(); if (cgi_method == CGI_GET) return; /* We only want to accept posts from certain pages: svcstatus (for info), and ourselves */ /* At some point in the future, moving info lookups to their own page would be a good idea */ { char cgisource[1024]; char *p; p = csp_header("enadis"); if (p) fprintf(stdout, "%s", p); snprintf(cgisource, sizeof(cgisource), "%s/%s", xgetenv("SECURECGIBINURL"), "enadis"); if (!cgi_refererok(cgisource)) { snprintf(cgisource, sizeof(cgisource), "%s/%s", xgetenv("CGIBINURL"), "svcstatus"); if (!cgi_refererok(cgisource)) { dbgprintf("Not coming from self or svcstatus; abort\n"); return; /* Just display, don't do anything */ } } } if (!postdata) { errormsg(cgi_error()); } pwalk = postdata; while (pwalk) { /* * When handling the "go", the "Disable now" and "Schedule disable" * radio buttons mess things up. So ignore the "go" if we have seen a * "filter" request already. */ if ((strcmp(pwalk->name, "go") == 0) && (action != ACT_FILTER)) { if (strcasecmp(pwalk->value, "enable") == 0) action = ACT_ENABLE; else if (strcasecmp(pwalk->value, "disable now") == 0) action = ACT_DISABLE; else if (strcasecmp(pwalk->value, "schedule disable") == 0) action = ACT_SCHED_DISABLE; else if (strcasecmp(pwalk->value, "cancel") == 0) action = ACT_SCHED_CANCEL; else if (strcasecmp(pwalk->value, "apply filters") == 0) action = ACT_FILTER; } else if ((strcmp(pwalk->name, "go2") == 0) && (action != ACT_FILTER)) { if (strcasecmp(pwalk->value, "Disable until") == 0) disableend = DISABLE_UNTIL; } else if (strcmp(pwalk->name, "duration") == 0) { duration = atoi(pwalk->value); } else if (strcmp(pwalk->name, "untilok") == 0) { if (strcasecmp(pwalk->value, "on") == 0) { duration = -1; scale = 1; } } else if (strcmp(pwalk->name, "scale") == 0) { scale = atoi(pwalk->value); } else if (strcmp(pwalk->name, "cause") == 0) { disablemsg = strdup(pwalk->value); } else if (strcmp(pwalk->name, "hostname") == 0) { if (hostnames == NULL) { hostnames = (char **)malloc(2 * sizeof(char *)); hostnames[0] = strdup(pwalk->value); hostnames[1] = NULL; hostcount = 1; } else { hostnames = (char **)realloc(hostnames, (hostcount + 2) * sizeof(char *)); hostnames[hostcount] = strdup(pwalk->value); hostnames[hostcount+1] = NULL; hostcount++; } } else if (strcmp(pwalk->name, "enabletest") == 0) { char *val = pwalk->value; if (strcmp(val, "ALL") == 0) val = "*"; if (enabletest == NULL) { enabletest = (char **)malloc(2 * sizeof(char *)); enabletest[0] = strdup(val); enabletest[1] = NULL; enablecount = 1; } else { enabletest = (char **)realloc(enabletest, (enablecount + 2) * sizeof(char *)); enabletest[enablecount] = strdup(val); enabletest[enablecount+1] = NULL; enablecount++; } } else if (strcmp(pwalk->name, "disabletest") == 0) { char *val = pwalk->value; if (strcmp(val, "ALL") == 0) val = "*"; if (disabletest == NULL) { disabletest = (char **)malloc(2 * sizeof(char *)); disabletest[0] = strdup(val); disabletest[1] = NULL; disablecount = 1; } else { disabletest = (char **)realloc(disabletest, (disablecount + 2) * sizeof(char *)); disabletest[disablecount] = strdup(val); disabletest[disablecount+1] = NULL; disablecount++; } } else if (strcmp(pwalk->name, "year") == 0) { schedtm.tm_year = atoi(pwalk->value) - 1900; } else if (strcmp(pwalk->name, "month") == 0) { schedtm.tm_mon = atoi(pwalk->value) - 1; } else if (strcmp(pwalk->name, "day") == 0) { schedtm.tm_mday = atoi(pwalk->value); } else if (strcmp(pwalk->name, "hour") == 0) { schedtm.tm_hour = atoi(pwalk->value); } else if (strcmp(pwalk->name, "minute") == 0) { schedtm.tm_min = atoi(pwalk->value); } /* Until start */ else if (strcmp(pwalk->name, "endyear") == 0) { endtm.tm_year = atoi(pwalk->value) - 1900; } else if (strcmp(pwalk->name, "endmonth") == 0) { endtm.tm_mon = atoi(pwalk->value) - 1; } else if (strcmp(pwalk->name, "endday") == 0) { endtm.tm_mday = atoi(pwalk->value); } else if (strcmp(pwalk->name, "endhour") == 0) { endtm.tm_hour = atoi(pwalk->value); } else if (strcmp(pwalk->name, "endminute") == 0) { endtm.tm_min = atoi(pwalk->value); } /* Until end */ else if (strcmp(pwalk->name, "canceljob") == 0) { cancelid = atoi(pwalk->value); } else if (strcmp(pwalk->name, "preview") == 0) { preview = (strcasecmp(pwalk->value, "on") == 0); } else if ((strcmp(pwalk->name, "hostpattern") == 0) && pwalk->value && strlen(pwalk->value)) { hostpattern = strdup(pwalk->value); } else if ((strcmp(pwalk->name, "pagepattern") == 0) && pwalk->value && strlen(pwalk->value)) { pagepattern = strdup(pwalk->value); } else if ((strcmp(pwalk->name, "ippattern") == 0) && pwalk->value && strlen(pwalk->value)) { ippattern = strdup(pwalk->value); } else if ((strcmp(pwalk->name, "classpattern") == 0) && pwalk->value && strlen(pwalk->value)) { classpattern = strdup(pwalk->value); } pwalk = pwalk->next; } schedtm.tm_isdst = -1; schedtime = mktime(&schedtm); endtm.tm_isdst = -1; endtime = mktime(&endtm); }
int main(int argc, char *argv[]) { char dirid[PATH_MAX]; char outdir[PATH_MAX]; char bbwebenv[PATH_MAX]; char bbgencmd[PATH_MAX]; char bbgentimeopt[100]; char csvdelimopt[100]; char *bbgen_argv[20]; pid_t childpid; int childstat; char htmldelim[20]; char startstr[20], endstr[20]; int cleanupoldreps = 1; int argi, newargi; char *envarea = NULL; char *useragent = NULL; int usemultipart = 1; newargi = 0; bbgen_argv[newargi++] = bbgencmd; bbgen_argv[newargi++] = bbgentimeopt; for (argi=1; (argi < argc); argi++) { if (argnmatch(argv[argi], "--env=")) { char *p = strchr(argv[argi], '='); loadenv(p+1, envarea); } else if (argnmatch(argv[argi], "--area=")) { char *p = strchr(argv[argi], '='); envarea = strdup(p+1); } else if (strcmp(argv[1], "--noclean") == 0) { cleanupoldreps = 0; } else { bbgen_argv[newargi++] = argv[argi]; } } redirect_cgilog("bb-rep"); cgidata = cgi_request(); if (cgidata == NULL) { /* Present the query form */ sethostenv("", "", "", colorname(COL_BLUE), NULL); printf("Content-type: %s\n\n", xgetenv("HTMLCONTENTTYPE")); showform(stdout, "report", "report_form", COL_BLUE, getcurrenttime(NULL)-86400, NULL, NULL); return 0; } useragent = getenv("HTTP_USER_AGENT"); if (useragent && strstr(useragent, "KHTML")) { /* KHTML (Konqueror, Safari) cannot handle multipart documents. */ usemultipart = 0; } envcheck(reqenv); parse_query(); /* * We need to set these variables up AFTER we have put them into the bbgen_argv[] array. * We cannot do it before, because we need the environment that the the commandline options * might provide. */ if (xgetenv("BBGEN")) sprintf(bbgencmd, "%s", xgetenv("BBGEN")); else sprintf(bbgencmd, "%s/bin/bbgen", xgetenv("BBHOME")); sprintf(bbgentimeopt, "--reportopts=%u:%u:1:%s", (unsigned int)starttime, (unsigned int)endtime, style); sprintf(dirid, "%u-%u", (unsigned int)getpid(), (unsigned int)getcurrenttime(NULL)); if (!csvoutput) { sprintf(outdir, "%s/%s", xgetenv("BBREP"), dirid); mkdir(outdir, 0755); bbgen_argv[newargi++] = outdir; sprintf(bbwebenv, "BBWEB=%s/%s", xgetenv("BBREPURL"), dirid); putenv(bbwebenv); } else { sprintf(outdir, "--csv=%s/%s.csv", xgetenv("BBREP"), dirid); bbgen_argv[newargi++] = outdir; sprintf(csvdelimopt, "--csvdelim=%c", csvdelim); bbgen_argv[newargi++] = csvdelimopt; } bbgen_argv[newargi++] = NULL; if (usemultipart) { /* Output the "please wait for report ... " thing */ sprintf(htmldelim, "bbrep-%u-%u", (int)getpid(), (unsigned int)getcurrenttime(NULL)); printf("Content-type: multipart/mixed;boundary=%s\n", htmldelim); printf("\n"); printf("--%s\n", htmldelim); printf("Content-type: %s\n\n", xgetenv("HTMLCONTENTTYPE")); /* It's ok with these hardcoded values, as they are not used for this page */ sethostenv("", "", "", colorname(COL_BLUE), NULL); sethostenv_report(starttime, endtime, 97.0, 99.995); headfoot(stdout, "bbrep", "", "header", COL_BLUE); strftime(startstr, sizeof(startstr), "%b %d %Y", localtime(&starttime)); strftime(endstr, sizeof(endstr), "%b %d %Y", localtime(&endtime)); printf("<CENTER><A NAME=begindata> </A>\n"); printf("<BR><BR><BR><BR>\n"); printf("<H3>Generating report for the period: %s - %s (%s)<BR>\n", startstr, endstr, style); printf("<P><P>\n"); fflush(stdout); } /* Go do the report */ childpid = fork(); if (childpid == 0) { execv(bbgencmd, bbgen_argv); } else if (childpid > 0) { wait(&childstat); /* Ignore SIGHUP so we dont get killed during cleanup of BBREP */ signal(SIGHUP, SIG_IGN); if (WIFEXITED(childstat) && (WEXITSTATUS(childstat) != 0) ) { char msg[4096]; if (usemultipart) printf("--%s\n\n", htmldelim); sprintf(msg, "Could not generate report.<br>\nCheck that the %s/www/rep/ directory has permissions '-rwxrwxr-x' (775)<br>\n and that is is set to group %d", xgetenv("BBHOME"), (int)getgid()); errormsg(msg); } else { /* Send the browser off to the report */ if (usemultipart) { printf("Done...Report is <A HREF=\"%s/%s/%s\">here</a>.</P></BODY></HTML>\n", xgetenv("BBREPURL"), dirid, suburl); fflush(stdout); printf("--%s\n\n", htmldelim); } printf("Content-Type: %s\n\n", xgetenv("HTMLCONTENTTYPE")); printf("<HTML><HEAD>\n"); if (!csvoutput) { printf("<META HTTP-EQUIV=\"REFRESH\" CONTENT=\"0; URL=%s/%s/%s\"\n", xgetenv("BBREPURL"), dirid, suburl); printf("</HEAD><BODY>Report is available <a href=\"%s/%s/%s\">here</a></BODY></HTML>\n", xgetenv("BBREPURL"), dirid, suburl); } else { printf("<META HTTP-EQUIV=\"REFRESH\" CONTENT=\"0; URL=%s/%s.csv\"\n", xgetenv("BBREPURL"), dirid); printf("</HEAD><BODY>Report is available <a href=\"%s/%s.csv\">here</a></BODY></HTML>\n", xgetenv("BBREPURL"), dirid); } if (usemultipart) printf("\n--%s\n", htmldelim); fflush(stdout); } if (cleanupoldreps) cleandir(xgetenv("BBREP")); } else { if (usemultipart) printf("--%s\n\n", htmldelim); printf("Content-Type: %s\n\n", xgetenv("HTMLCONTENTTYPE")); errormsg("Fork failed"); } return 0; }
void parse_query(void) { cgidata_t *cwalk; int startday, startmon, startyear; int endday, endmon, endyear; struct tm tmbuf; startday = startmon = startyear = endday = endmon = endyear = -1; cwalk = cgidata; while (cwalk) { /* * cwalk->name points to the name of the setting. * cwalk->value points to the value (may be an empty string). */ if (strcasecmp(cwalk->name, "start-day") == 0) { startday = atoi(cwalk->value); } else if (strcasecmp(cwalk->name, "start-mon") == 0) { char *errptr; startmon = strtol(cwalk->value, &errptr, 10) - 1; if (errptr == cwalk->value) { for (startmon=0; (monthnames[startmon] && strcmp(cwalk->value, monthnames[startmon])); startmon++) ; if (startmon >= 12) startmon = -1; } } else if (strcasecmp(cwalk->name, "start-yr") == 0) { startyear = atoi(cwalk->value); } else if (strcasecmp(cwalk->name, "end-day") == 0) { endday = atoi(cwalk->value); } else if (strcasecmp(cwalk->name, "end-mon") == 0) { char *errptr; endmon = strtol(cwalk->value, &errptr, 10) - 1; if (errptr == cwalk->value) { for (endmon=0; (monthnames[endmon] && strcmp(cwalk->value, monthnames[endmon])); endmon++) ; if (endmon > 12) endmon = -1; } } else if (strcasecmp(cwalk->name, "end-yr") == 0) { endyear = atoi(cwalk->value); } else if (strcasecmp(cwalk->name, "style") == 0) { style = strdup(cwalk->value); } else if (strcasecmp(cwalk->name, "suburl") == 0) { suburl = strdup(cwalk->value); } else if (strcasecmp(cwalk->name, "DoReport") == 0) { csvoutput = 0; } else if (strcasecmp(cwalk->name, "DoCSV") == 0) { csvoutput = 1; } else if (strcasecmp(cwalk->name, "csvdelim") == 0) { csvdelim = *cwalk->value; } cwalk = cwalk->next; } memset(&tmbuf, 0, sizeof(tmbuf)); tmbuf.tm_mday = startday; tmbuf.tm_mon = startmon; tmbuf.tm_year = startyear - 1900; tmbuf.tm_hour = 0; tmbuf.tm_min = 0; tmbuf.tm_sec = 0; tmbuf.tm_isdst = -1; /* Important! Or we mishandle DST periods */ starttime = mktime(&tmbuf); memset(&tmbuf, 0, sizeof(tmbuf)); tmbuf.tm_mday = endday; tmbuf.tm_mon = endmon; tmbuf.tm_year = endyear - 1900; tmbuf.tm_hour = 23; tmbuf.tm_min = 59; tmbuf.tm_sec = 59; tmbuf.tm_isdst = -1; /* Important! Or we mishandle DST periods */ endtime = mktime(&tmbuf); if ((starttime == -1) || (endtime == -1) || (starttime > getcurrenttime(NULL))) errormsg("Invalid parameters"); if (endtime > getcurrenttime(NULL)) endtime = getcurrenttime(NULL); if (starttime > endtime) { /* Swap start and end times */ time_t tmp; tmp = endtime; endtime = starttime; starttime = tmp; } }
/* returns -1 on failure, >= 0 is an actual symbol value. String is * searched until terminating null or end. The empty string cannot * receive a symbol value. */ symbol_t getvalue_symbols(symbols_t *sb, bool_t generate, const char_t *begin, const char_t *end) { const byte_t *p; bool_t bdone, pdone; jump_t *j; if( sb && begin && *begin ) { if( !end ) { end = begin + strlen(begin); } if( (sb->bigs_len + (end - begin) + 1 + sizeof(symbol_t)) > sb->bigmax ) { if( !grow_mem(&sb->bigs, &sb->bigmax, sizeof(byte_t), 16) ) { errormsg(E_WARNING, "out of symbol memory\n"); return -1; } } if( sb->bigs_len == 0 ) { return next_symbols(sb, generate, begin, end); } p = sb->bigs; while( *begin && (begin < end) ) { /* skip common prefix */ while( (*begin == *p) && *begin && (begin < end) ) { p++; begin++; } bdone = ((begin == end) || (*begin == 0)); pdone = (*p == 0); /* either begin string is empty, or p string is empty, or both */ if( bdone && pdone ) { /* we found the string */ return *((symbol_t *)p); } else if( bdone ) { /* a longer p string was inserted first */ /* follow as many branches as possible */ j = find_in_jumptable(&sb->jt, p - sb->bigs); while( j && sb->bigs[j->pos] ) { p = sb->bigs + j->pos; j = find_in_jumptable(&sb->jt, p - sb->bigs); } if( j && (sb->bigs[j->pos] == 0) ) { /* found the string */ p = sb->bigs + j->pos; return *((symbol_t *)p); } else { /* there are no further branches at p */ insert_jumptable(&sb->jt, p - sb->bigs, sb->bigs_len); return next_symbols(sb, generate, begin, end); } } else { /* 0 != *begin != *p */ j = find_in_jumptable(&sb->jt, p - sb->bigs); if( !j ) { /* no branch at p, so we append begin */ insert_jumptable(&sb->jt, p - sb->bigs, sb->bigs_len); return next_symbols(sb, generate, begin, end); } /* in here, branch exists */ p = sb->bigs + j->pos; } /* and back to while */ } } return -1; }
void rm_rf(const char *dir) { char buf[4096]; snprintf(buf,sizeof buf,"rm -rf \"%s\"", dir); if (system(buf) == -1) errormsg("system(%s)",buf); }
static void _mywrite(int a,const void *b,size_t c,const char *f,int l) { if (write(a,b,c) == -1) errormsg("write(%s,%d):",f,l); }
static int convert_file(FILE *fp, char *zld, int auto_zld, int selective) { mdn_result_t r; char line1[1024]; char line2[1024]; int nl_trimmed; int ace_hack; if (mdn_converter_isasciicompatible(conv_in_ctx)) ace_hack = 1; else ace_hack = 0; line_number = 1; while (fgets(line1, sizeof(line1), fp) != NULL) { /* * Trim newline at the end. This is needed for * those ascii-comatible encodings such as UTF-5 or RACE * not to try converting newlines, which will result * in `invalid encoding' error. */ if (line1[strlen(line1) - 1] == '\n') { line1[strlen(line1) - 1] = '\0'; nl_trimmed = 1; } else { nl_trimmed = 0; } /* * Convert input line to UTF-8. */ if (ace_hack) { /* * Selectively decode those portions. */ r = selective_decode(line1, line2, 1024); } else { r = mdn_converter_localtoutf8(conv_in_ctx, line1, line2, 1024); } if (r != mdn_success) { errormsg("conversion failed at line %d: %s\n", line_number, mdn_result_tostring(r)); return (1); } if (!mdn_utf8_isvalidstring(line2)) { errormsg("conversion to utf-8 failed at line %d\n", line_number); return (1); } /* * Normalize and convert to the output codeset. */ if (selective) { r = selective_encode(line2, line1, sizeof(line1), zld, auto_zld); } else { r = encode_region(line2, line1, sizeof(line1), zld, auto_zld); } if (r != mdn_success) return (1); fputs(line1, stdout); if (nl_trimmed) putc('\n', stdout); if (flush_every_line) fflush(stdout); line_number++; } return (0); }
int b_enum(int argc, char **argv, Shbltin_t *context) { bool pflag = false, iflag = false; int i, n; ssize_t sz = -1; Namval_t *np, *tp, *mp; Namarr_t *ap; char *cp; const char *sp; struct Enum *ep; Shell_t *shp = context->shp; struct { Optdisc_t opt; Namval_t *np; } optdisc; if (cmdinit(argc, argv, context, ERROR_NOTIFY)) return -1; while ((n = optget(argv, enum_usage))) { switch (n) { case 'p': { pflag = true; break; } case 'i': { iflag = true; break; } case ':': { errormsg(SH_DICT, 2, "%s", opt_info.arg); break; } case '?': { errormsg(SH_DICT, ERROR_usage(2), "%s", opt_info.arg); __builtin_unreachable(); } default: { break; } } } argv += opt_info.index; argc -= opt_info.index; if (error_info.errors || argc != 1) { error(ERROR_USAGE | 2, "%s", optusage(NULL)); return 1; } while ((cp = *argv++)) { np = nv_open(cp, shp->var_tree, NV_VARNAME | NV_NOADD); if (!np || !(ap = nv_arrayptr(np)) || ap->fun || ap->nelem < 2) { error(ERROR_exit(1), "%s must name an array containing at least two elements", cp); } n = stktell(shp->stk); sfprintf(shp->stk, "%s.%s%c", NV_CLASS, np->nvname, 0); tp = nv_open(stkptr(shp->stk, n), shp->var_tree, NV_VARNAME); if (pflag) { sh_outenum(shp, sfstdout, tp); continue; } stkseek(shp->stk, n); n = ap->nelem; i = 0; nv_onattr(tp, NV_UINT16); nv_putval(tp, (char *)&i, NV_INTEGER); nv_putsub(np, NULL, 0L, ARRAY_SCAN); do { sz += strlen(nv_getval(np)); } while (nv_nextsub(np)); ep = calloc(1, sizeof(struct Enum)); if (!ep) { error(ERROR_system(1), "out of space"); __builtin_unreachable(); } ep->nelem = n; mp = nv_namptr(ep->node, 0); mp->nvshell = shp; nv_setsize(mp, 10); nv_onattr(mp, NV_UINT16); ep->iflag = iflag; ep->values = malloc(n * sizeof(*ep->values)); nv_putsub(np, NULL, 0L, ARRAY_SCAN); i = 0; do { sp = nv_getval(np); ep->values[i++] = strdup(sp); } while (nv_nextsub(np)); assert(n == i); ep->namfun.dsize = sizeof(struct Enum); ep->namfun.disc = &ENUM_disc; ep->namfun.type = tp; nv_onattr(tp, NV_RDONLY); nv_disc(tp, &ep->namfun, DISC_OP_FIRST); memset(&optdisc, 0, sizeof(optdisc)); optdisc.opt.infof = enuminfo; optdisc.np = tp; nv_addtype(tp, enum_type, &optdisc, sizeof(optdisc)); nv_onattr(np, NV_LTOU | NV_UTOL); } nv_open(0, shp->var_tree, 0); return error_info.errors != 0; }
int main(int argc, char **argv) { int x; int opt; FILE *file1; FILE *file2; file_t *files = NULL; file_t *curfile; file_t **match = NULL; filetree_t *checktree = NULL; int filecount = 0; int progress = 0; char **oldargv; int firstrecurse; #ifndef OMIT_GETOPT_LONG static struct option long_options[] = { { "omitfirst", 0, 0, 'f' }, { "recurse", 0, 0, 'r' }, { "recursive", 0, 0, 'r' }, { "recurse:", 0, 0, 'R' }, { "recursive:", 0, 0, 'R' }, { "quiet", 0, 0, 'q' }, { "sameline", 0, 0, '1' }, { "minimum", 0, 0, 'M' }, { "size", 0, 0, 'S' }, { "symlinks", 0, 0, 's' }, { "hardlinks", 0, 0, 'H' }, { "relink", 0, 0, 'l' }, { "linkhard", 0, 0, 'L' }, { "noempty", 0, 0, 'n' }, { "nohidden", 0, 0, 'A' }, { "delete", 0, 0, 'd' }, { "version", 0, 0, 'v' }, { "help", 0, 0, 'h' }, { "noprompt", 0, 0, 'N' }, { "debug", 0, 0, 'D' }, { "summarize", 0, 0, 'm'}, { "summary", 0, 0, 'm' }, { 0, 0, 0, 0 } }; #define GETOPT getopt_long #else #define GETOPT getopt #endif program_name = argv[0]; oldargv = cloneargs(argc, argv); while ((opt = GETOPT(argc, argv, "frRq1M:Ss::HlLnAdDvhNm" #ifndef OMIT_GETOPT_LONG , long_options, NULL #endif )) != EOF) { switch (opt) { case 'f': SETFLAG(flags, F_OMITFIRST); break; case 'r': SETFLAG(flags, F_RECURSE); break; case 'R': SETFLAG(flags, F_RECURSEAFTER); break; case 'q': SETFLAG(flags, F_HIDEPROGRESS); break; case '1': SETFLAG(flags, F_DSAMELINE); break; case 'M': SETFLAG(flags, F_MINIMUMSIZE); minimum_size = atoll(optarg); break; case 'S': SETFLAG(flags, F_SHOWSIZE); break; case 's': SETFLAG(flags, F_FOLLOWLINKS); break; case 'H': SETFLAG(flags, F_CONSIDERHARDLINKS); break; case 'n': SETFLAG(flags, F_EXCLUDEEMPTY); break; case 'A': SETFLAG(flags, F_EXCLUDEHIDDEN); break; case 'd': SETFLAG(flags, F_DELETEFILES); break; case 'L': SETFLAG(flags, F_HARDLINKFILES); break; case 'D': SETFLAG(flags, F_DEBUGINFO); break; case 'v': printf("fdupes %s\n", VERSION); exit(0); case 'h': help_text(); exit(1); case 'N': SETFLAG(flags, F_NOPROMPT); break; case 'm': SETFLAG(flags, F_SUMMARIZEMATCHES); break; default: fprintf(stderr, "Try `fdupes --help' for more information.\n"); exit(1); } } if (optind >= argc) { errormsg("no directories specified\n"); exit(1); } if (ISFLAG(flags, F_RECURSE) && ISFLAG(flags, F_RECURSEAFTER)) { errormsg("options --recurse and --recurse: are not compatible\n"); exit(1); } if (ISFLAG(flags, F_SUMMARIZEMATCHES) && ISFLAG(flags, F_DELETEFILES)) { errormsg("options --summarize and --delete are not compatible\n"); exit(1); } if (ISFLAG(flags, F_HARDLINKFILES) && ISFLAG(flags, F_DELETEFILES)) { errormsg("options --linkhard and --delete are not compatible\n"); exit(1); } if (ISFLAG(flags, F_HARDLINKFILES) && ISFLAG(flags, F_CONSIDERHARDLINKS)) { errormsg("options --linkhard and --hardlinks are not compatible\n"); exit(1); } if (ISFLAG(flags, F_RECURSEAFTER)) { firstrecurse = nonoptafter("--recurse:", argc, oldargv, argv, optind); if (firstrecurse == argc) firstrecurse = nonoptafter("-R", argc, oldargv, argv, optind); if (firstrecurse == argc) { errormsg("-R option must be isolated from other options\n"); exit(1); } /* F_RECURSE is not set for directories before --recurse: */ for (x = optind; x < firstrecurse; x++) filecount += grokdir(argv[x], &files); /* Set F_RECURSE for directories after --recurse: */ SETFLAG(flags, F_RECURSE); for (x = firstrecurse; x < argc; x++) filecount += grokdir(argv[x], &files); } else { for (x = optind; x < argc; x++) filecount += grokdir(argv[x], &files); } if (!files) { if (!ISFLAG(flags, F_HIDEPROGRESS)) fprintf(stderr, "\r%40s\r", " "); exit(0); } curfile = files; while (curfile) { if (!checktree) registerfile(&checktree, curfile); else match = checkmatch(&checktree, checktree, curfile); if (match != NULL) { file1 = fopen(curfile->d_name, "rb"); if (!file1) { curfile = curfile->next; continue; } file2 = fopen((*match)->d_name, "rb"); if (!file2) { fclose(file1); curfile = curfile->next; continue; } if (confirmmatch(file1, file2)) { registerpair(match, curfile, sort_pairs_by_mtime); //match->hasdupes = 1; //curfile->duplicates = match->duplicates; //match->duplicates = curfile; } fclose(file1); fclose(file2); } curfile = curfile->next; if (!ISFLAG(flags, F_HIDEPROGRESS)) { fprintf(stderr, "\rProgress [%d/%d] %d%% ", progress, filecount, (int)((float) progress / (float) filecount * 100.0)); progress++; } } if (!ISFLAG(flags, F_HIDEPROGRESS)) fprintf(stderr, "\r%40s\r", " "); if (ISFLAG(flags, F_DELETEFILES)) { if (ISFLAG(flags, F_NOPROMPT)) deletefiles(files, 0); else deletefiles(files, 1); } else if (ISFLAG(flags, F_HARDLINKFILES)) if (ISFLAG(flags, F_DEBUGINFO)) hardlinkfiles(files, 1); else hardlinkfiles(files, 0); else { if (ISFLAG(flags, F_SUMMARIZEMATCHES)) summarizematches(files); else printmatches(files); } while (files) { curfile = files->next; free(files->d_name); free(files->crcsignature); free(files->crcpartial); free(files); files = curfile; } for (x = 0; x < argc; x++) free(oldargv[x]); free(oldargv); purgetree(checktree); return 0; }
int sbbs_t::delmail(uint usernumber, int which) { ulong i,l; time_t now; idxrec_t *idxbuf; smbmsg_t msg; now=time(NULL); if((i=smb_getstatus(&smb))!=0) { errormsg(WHERE,ERR_READ,smb.file,i,smb.last_error); return(2); } if(!smb.status.total_msgs) return(0); if((idxbuf=(idxrec_t *)malloc(smb.status.total_msgs*sizeof(idxrec_t)))==NULL) { errormsg(WHERE,ERR_ALLOC,smb.file,smb.status.total_msgs*sizeof(idxrec_t)); return(-1); } if((i=smb_open_da(&smb))!=0) { errormsg(WHERE,ERR_OPEN,smb.file,i,smb.last_error); free(idxbuf); return(i); } if((i=smb_open_ha(&smb))!=0) { smb_close_da(&smb); errormsg(WHERE,ERR_OPEN,smb.file,i,smb.last_error); free(idxbuf); return(i); } smb_rewind(smb.sid_fp); for(l=0;l<smb.status.total_msgs;) { if(smb_fread(&smb,&msg.idx,sizeof(idxrec_t),smb.sid_fp)!=sizeof(idxrec_t)) break; if(!(msg.idx.attr&MSG_PERMANENT) && ((which==MAIL_SENT && usernumber==msg.idx.from) || (which==MAIL_YOUR && usernumber==msg.idx.to) || (which==MAIL_ANY && (usernumber==msg.idx.to || usernumber==msg.idx.from)) || which==MAIL_ALL)) { if(smb.status.max_age && (now<0?0:(uintmax_t)now)>msg.idx.time && (now-msg.idx.time)/(24L*60L*60L)>smb.status.max_age) msg.idx.attr|=MSG_DELETE; else if(msg.idx.attr&MSG_KILLREAD && msg.idx.attr&MSG_READ) msg.idx.attr|=MSG_DELETE; if(msg.idx.attr&MSG_DELETE) { /* Don't need to lock message because base is locked */ if((i=smb_getmsghdr(&smb,&msg))!=0) errormsg(WHERE,ERR_READ,smb.file,i,smb.last_error); else { if(msg.hdr.attr!=msg.idx.attr) { msg.hdr.attr=msg.idx.attr; if((i=smb_putmsghdr(&smb,&msg))!=0) errormsg(WHERE,ERR_WRITE,smb.file,i,smb.last_error); } if((i=smb_freemsg(&smb,&msg))!=0) errormsg(WHERE,ERR_REMOVE,smb.file,i,smb.last_error); if(msg.hdr.auxattr&MSG_FILEATTACH) delfattach(&cfg,&msg); smb_freemsgmem(&msg); } continue; } } idxbuf[l]=msg.idx; l++; } smb_rewind(smb.sid_fp); smb_fsetlength(smb.sid_fp,0); for(i=0;i<l;i++) smb_fwrite(&smb,&idxbuf[i],sizeof(idxrec_t),smb.sid_fp); free(idxbuf); smb.status.total_msgs=l; smb_putstatus(&smb); smb_fflush(smb.sid_fp); smb_close_ha(&smb); smb_close_da(&smb); return(0); }
void deletefiles(file_t *files, int prompt) { int counter; int groups = 0; int curgroup = 0; file_t *tmpfile; file_t *curfile; file_t **dupelist; int *preserve; char *preservestr; char *token; char *tstr; int number; int sum; int max = 0; int x; int i; curfile = files; while (curfile) { if (curfile->hasdupes) { counter = 1; groups++; tmpfile = curfile->duplicates; while (tmpfile) { counter++; tmpfile = tmpfile->duplicates; } if (counter > max) max = counter; } curfile = curfile->next; } max++; dupelist = (file_t**) malloc(sizeof(file_t*) * max); preserve = (int*) malloc(sizeof(int) * max); preservestr = (char*) malloc(INPUT_SIZE); if (!dupelist || !preserve || !preservestr) { errormsg("out of memory\n"); exit(1); } while (files) { if (files->hasdupes) { curgroup++; counter = 1; dupelist[counter] = files; if (prompt) printf("[%d] %s\n", counter, files->d_name); tmpfile = files->duplicates; while (tmpfile) { dupelist[++counter] = tmpfile; if (prompt) printf("[%d] %s\n", counter, tmpfile->d_name); tmpfile = tmpfile->duplicates; } if (prompt) printf("\n"); if (!prompt) /* preserve only the first file */ { preserve[1] = 1; for (x = 2; x <= counter; x++) preserve[x] = 0; } else /* prompt for files to preserve */ do { printf("Set %d of %d, preserve files [1 - %d, all]", curgroup, groups, counter); if (ISFLAG(flags, F_SHOWSIZE)) printf(" (%lld byte%seach)", files->size, (files->size != 1) ? "s " : " "); printf(": "); fflush(stdout); fgets(preservestr, INPUT_SIZE, stdin); i = strlen(preservestr) - 1; while (preservestr[i]!='\n'){ /* tail of buffer must be a newline */ tstr = (char*) realloc(preservestr, strlen(preservestr) + 1 + INPUT_SIZE); if (!tstr) { /* couldn't allocate memory, treat as fatal */ errormsg("out of memory!\n"); exit(1); } preservestr = tstr; if (!fgets(preservestr + i + 1, INPUT_SIZE, stdin)) break; /* stop if fgets fails -- possible EOF? */ i = strlen(preservestr)-1; } for (x = 1; x <= counter; x++) preserve[x] = 0; token = strtok(preservestr, " ,\n"); while (token != NULL) { if (strcasecmp(token, "all") == 0) for (x = 0; x <= counter; x++) preserve[x] = 1; number = 0; sscanf(token, "%d", &number); if (number > 0 && number <= counter) preserve[number] = 1; token = strtok(NULL, " ,\n"); } for (sum = 0, x = 1; x <= counter; x++) sum += preserve[x]; } while (sum < 1); /* make sure we've preserved at least one file */ printf("\n"); for (x = 1; x <= counter; x++) { if (preserve[x]) printf(" [+] %s\n", dupelist[x]->d_name); else { if (remove(dupelist[x]->d_name) == 0) { printf(" [-] %s\n", dupelist[x]->d_name); } else { printf(" [!] %s ", dupelist[x]->d_name); printf("-- unable to delete file!\n"); } } } printf("\n"); } files = files->next; } free(dupelist); free(preserve); free(preservestr); }
/* ** GUI Handler: Called when "custom" mapedit widget should be created */ GtkWidget *mapedit_create_new(gchar *widget_name, gchar *string1, gchar *string2, gint int1, gint int2) { struct MCMap *mapeditmap; GtkWidget *mapwidget=NULL; GtkArg mapedarg[11], *args = mapedarg; errormsg(MAPDEBUG1,"mapedit_create_new: Entered"); if (int1!=MPEDIT) { mapeditmap = g_malloc0(sizeof(struct MCMap)); if (!mapeditmap) { printf("Could not allocate memory for mapeditmap\n"); CloseAll(); exit(20); } } #if DEBUGLEV > 2 errormsg(MAPDEBUG3,"mapedit_create_new: widget_name=%s=%x, int1=%d, " "mapeditmap=%x ",widget_name, widget_name, int1, mapeditmap); #endif mapedarg[0].type = MAPEDIT_MapPieces; GTK_VALUE_POINTER(mapedarg[0]) = mMapPieces; mapedarg[1].type = MAPEDIT_PWidth; GTK_VALUE_UINT(mapedarg[1]) = 37; mapedarg[2].type = MAPEDIT_PLength; GTK_VALUE_UINT(mapedarg[2]) = 13; mapedarg[3].type = MAPEDIT_Default; GTK_VALUE_POINTER(mapedarg[3]) = &mDefault; mapedarg[4].type = MAPEDIT_MapWidth; GTK_VALUE_UINT(mapedarg[4]) = SELXSIZE; mapedarg[5].type = MAPEDIT_MapLength; GTK_VALUE_UINT(mapedarg[5]) = SELYSIZE; mapedarg[6].type = MAPEDIT_MapLayer; GTK_VALUE_UCHAR(mapedarg[6]) = 1; mapedarg[7].type = MAPEDIT_Map; GTK_VALUE_POINTER(mapedarg[7]) = mapeditmap; mapedarg[8].type = MAPEDIT_GetPieces; GTK_VALUE_BOOL(mapedarg[8]) = TRUE; mapedarg[9].type = MAPEDIT_Frame; GTK_VALUE_BOOL(mapedarg[9]) = TRUE; mapedarg[10].type = MAPEDIT_FrameSpace; GTK_VALUE_UCHAR(mapedarg[10]) = 4; errormsg(MAPDEBUG3,"mapedit_create_new: args=%x, args[0]=%x, args[1].type=%d",args,args[2].type,MAPEDIT_PWidth); switch(int1) { case MPGR1: InitSelectGroup(mapeditmap,0); TestMEdWindowObjs[WO_MPGRP1]=MapEditClassNew(args, 11); mapwidget=TestMEdWindowObjs[WO_MPGRP1]; break; case MPGR2: InitSelectGroup(mapeditmap,SELXSIZE*SELYSIZE); TestMEdWindowObjs[WO_MPGRP2]=MapEditClassNew(args, 11); mapwidget=TestMEdWindowObjs[WO_MPGRP2]; break; case MPGR3: InitSelectGroup(mapeditmap,SELXSIZE*SELYSIZE*2); TestMEdWindowObjs[WO_MPGRP3]=MapEditClassNew(args, 11); mapwidget=TestMEdWindowObjs[WO_MPGRP3]; break; case MPEDIT: mapedarg[4].type = MAPEDIT_MapWidth; GTK_VALUE_UINT(mapedarg[4]) = 40; mapedarg[5].type = MAPEDIT_MapLength; GTK_VALUE_UINT(mapedarg[5]) = 80; GTK_VALUE_UCHAR(mapedarg[6]) = 2; // 2 Layers! TestMEdWindowObjs[WO_EDIT]=MapEditClassNew(args, 7); mapwidget=TestMEdWindowObjs[WO_EDIT]; break; } errormsg(MAPDEBUG3,"mapedit_create_new: mapwidget=%x",mapwidget); errormsg(MAPDEBUG1,"mapedit_create_new: Finished succesfully"); return mapwidget; }
int b_print(int argc, char *argv[], Shbltin_t *context) { register Sfio_t *outfile; register int exitval=0,n, fd = 1; register Shell_t *shp = context->shp; const char *options, *msg = e_file+4; char *format = 0, *fmttype=0; int sflag = 0, nflag=0, rflag=0, vflag=0; Namval_t *vname=0; Optdisc_t disc; disc.version = OPT_VERSION; disc.infof = infof; opt_info.disc = &disc; if(argc>0) { options = sh_optprint; nflag = rflag = 0; format = 0; } else { struct print *pp = (struct print*)context; shp = pp->sh; options = pp->options; if(argc==0) { nflag = pp->echon; rflag = pp->raw; argv++; goto skip; } } while((n = optget(argv,options))) switch(n) { case 'n': nflag++; break; case 'p': fd = shp->coutpipe; msg = e_query; break; case 'f': format = opt_info.arg; break; case 's': /* print to history file */ if(!sh_histinit((void*)shp)) errormsg(SH_DICT,ERROR_system(1),e_history); fd = sffileno(shp->gd->hist_ptr->histfp); sh_onstate(shp,SH_HISTORY); sflag++; break; case 'e': rflag = 0; break; case 'r': rflag = 1; break; case 'u': if(opt_info.arg[0]=='p' && opt_info.arg[1]==0) { fd = shp->coutpipe; msg = e_query; break; } fd = (int)strtol(opt_info.arg,&opt_info.arg,10); if(*opt_info.arg) fd = -1; else if(!sh_iovalidfd(shp,fd)) fd = -1; else if(!(shp->inuse_bits&(1<<fd)) && (sh_inuse(shp,fd) || (shp->gd->hist_ptr && fd==sffileno(shp->gd->hist_ptr->histfp)))) fd = -1; break; case 'j': fmttype = "json"; case 'v': if(argc < 0) { if(!(vname = nv_open(opt_info.arg, shp->var_tree,NV_VARNAME|NV_NOARRAY))) errormsg(SH_DICT,2, "Cannot create variable %s", opt_info.arg); } else vflag='v'; break; case 'C': vflag='C'; break; case ':': /* The following is for backward compatibility */ #if OPT_VERSION >= 19990123 if(strcmp(opt_info.name,"-R")==0) #else if(strcmp(opt_info.option,"-R")==0) #endif { rflag = 1; if(error_info.errors==0) { argv += opt_info.index+1; /* special case test for -Rn */ if(strchr(argv[-1],'n')) nflag++; if(*argv && strcmp(*argv,"-n")==0) { nflag++; argv++; } goto skip2; } } else errormsg(SH_DICT,2, "%s", opt_info.arg); break; case '?': errormsg(SH_DICT,ERROR_usage(2), "%s", opt_info.arg); break; } argv += opt_info.index; if(error_info.errors || (argc<0 && !(format = *argv++))) errormsg(SH_DICT,ERROR_usage(2),"%s",optusage((char*)0)); if(vflag && format) errormsg(SH_DICT,ERROR_usage(2),"-%c and -f are mutually exclusive",vflag); skip: if(format) format = genformat(shp,format); /* handle special case of '-' operand for print */ if(argc>0 && *argv && strcmp(*argv,"-")==0 && strcmp(argv[-1],"--")) argv++; if(vname) { if(!shp->strbuf2) shp->strbuf2 = sfstropen(); outfile = shp->strbuf2; goto printv; } skip2: if(fd < 0) { errno = EBADF; n = 0; } else if(!(n=shp->fdstatus[fd])) n = sh_iocheckfd(shp,fd,fd); if(!(n&IOWRITE)) { /* don't print error message for stdout for compatibility */ if(fd==1) return(1); errormsg(SH_DICT,ERROR_system(1),msg); } if(!(outfile=shp->sftable[fd])) { sh_onstate(shp,SH_NOTRACK); n = SF_WRITE|((n&IOREAD)?SF_READ:0); shp->sftable[fd] = outfile = sfnew(NIL(Sfio_t*),shp->outbuff,IOBSIZE,fd,n); sh_offstate(shp,SH_NOTRACK); sfpool(outfile,shp->outpool,SF_WRITE); }
void CloseAll(void) { struct MCMap *SelectGroup = NULL; GtkArg mapedarg; guchar i; errormsg(MAPDEBUG1,"CloseAll: Entered"); if (mMapPieces) gdk_pixbuf_unref(mMapPieces); //if (filereq) DisposeObject( filereq); for (i=0; i<3; i++) if (!TestMEdWindowObjs[WO_MPGRP1+i]) { mapedarg.type = MAPEDIT_Map; gtk_object_getv(GTK_OBJECT(TestMEdWindowObjs[WO_MPGRP1+i]), 1, &mapedarg); SelectGroup = (struct MCMap *) GTK_VALUE_POINTER(mapedarg); #if DEBUGLEV > 2 errormsg(MAPDEBUG3,"CloseAll: Map=%x, pt=%x, SelectGroup=%x", (struct MCMap *)TestMEdWindowObjs[WO_MPGRP1+i], mapedarg.d.pointer_data, SelectGroup); #endif if (SelectGroup) { do { struct MCMap *tmap=NULL; #if DEBUGLEV > 2 errormsg(MAPDEBUG3,"CloseAll: SelectGroup=%x, " "SelectGroup->mm_Columns=%x", SelectGroup, SelectGroup->mm_Columns); #endif if (SelectGroup->mm_Columns) { int i; for (i=0; i< SELYSIZE;i++) // All columns have to be freed { #if DEBUGLEV > 2 errormsg(MAPDEBUG3,"CloseAll: SelectGroup->mm_Columns" "[%d]=%x", i, SelectGroup->mm_Columns[i]); #endif if (SelectGroup->mm_Columns[i]) g_free((void *)SelectGroup->mm_Columns[i]); SelectGroup->mm_Columns[i]=0; } g_free(SelectGroup->mm_Columns); SelectGroup->mm_Columns=NULL; } #if DEBUGLEV > 2 errormsg(MAPDEBUG3,"CloseAll: SelectGroup->mm_NextLayer=%x", SelectGroup->mm_NextLayer); #endif tmap = SelectGroup->mm_NextLayer; // Get pointer to next layer SelectGroup->mm_NextLayer = NULL; // Do not reference it again! g_free(SelectGroup); // Free this layer SelectGroup=tmap; // Set new current layer } while (SelectGroup); } } errormsg(MAPDEBUG1,"CloseAll: Finished succesfully"); }
static void emitfile(char *modname) { Module root = lookup(modname); char *tempname = tempnam(".", 0); FILE *fp; char *lfmt, *filename; #line 108 "mnt.nw" { int n = strlen(modname) - 1; if (n >= 0 && modname[n] == '*') { lfmt = locformat; filename = strsave(modname); filename[n] = 0; } else { lfmt = ""; filename = modname; } } #line 94 "mnt.nw" #line 147 "mnt.nw" if (root == NULL) { errormsg(Error, "Chunk <<%s>> is undefined", filename); return; } #line 95 "mnt.nw" fp = fopen(tempname, "w"); if (fp == NULL) errormsg(Fatal, "Can't open temporary file %s", tempname); #line 119 "mnt.nw" resetloc(); (void) expand(root, 0, 0, 0, lfmt, fp); putc('\n', fp); fclose(fp); #line 98 "mnt.nw" #line 125 "mnt.nw" { FILE *dest, *tmp; dest = fopen(filename, "r"); if (dest != NULL) { int x, y; tmp = fopen(tempname, "r"); assert(tmp); do { x = getc(tmp); y = getc(dest); } while (x == y && x != EOF); fclose(tmp); fclose(dest); if (x == y) { remove(tempname); return; } } } #line 99 "mnt.nw" remove(filename); if (rename(tempname, filename) != 0) { /* different file systems? (may have to copy) */ FILE *fp = fopen(filename, "w"); if (fp == NULL) {remove(tempname); #line 144 "mnt.nw" errormsg(Error, "Can't open output file %s", filename); return; #line 102 "mnt.nw" } #line 119 "mnt.nw" resetloc(); (void) expand(root, 0, 0, 0, lfmt, fp); putc('\n', fp); fclose(fp); #line 104 "mnt.nw" remove(tempname); } }
void sub_cfg(uint grpnum) { static int dflt,tog_dflt,opt_dflt,net_dflt,adv_dflt,bar; char str[81],str2[81],done=0,code[9],*p; int j,m,n,ptridx,q,s; uint i,subnum[MAX_OPTS+1]; static sub_t savsub; while(1) { for(i=0,j=0;i<cfg.total_subs && j<MAX_OPTS;i++) if(cfg.sub[i]->grp==grpnum) { subnum[j]=i; if(cfg.sub[subnum[0]]->qwkconf) sprintf(opt[j],"%-5u %s" ,cfg.sub[i]->qwkconf,cfg.sub[i]->lname); else sprintf(opt[j],"%s" ,cfg.sub[i]->lname); j++; } subnum[j]=cfg.total_subs; opt[j][0]=0; sprintf(str,"%s Sub-boards",cfg.grp[grpnum]->sname); i=WIN_SAV|WIN_ACT; if(j) i|=WIN_DEL|WIN_GET|WIN_DELACT; if(j<MAX_OPTS) i|=WIN_INS|WIN_XTR|WIN_INSACT; if(savsub.sname[0]) i|=WIN_PUT; SETHELP(WHERE); /* Message Sub-boards: This is a list of message sub-boards that have been configured for the selected message group. To add a sub-board, select the desired position with the arrow keys and hit INS . To delete a sub-board, select it with the arrow keys and hit DEL . To configure a sub-board, select it with the arrow keys and hit ENTER . */ i=uifc.list(i,24,1,LEN_SLNAME+5,&dflt,&bar,str,opt); if((signed)i==-1) return; if((i&MSK_ON)==MSK_INS) { i&=MSK_OFF; strcpy(str,"General"); SETHELP(WHERE); /* Sub-board Long Name: This is a description of the message sub-board which is displayed in all sub-board listings. */ if(uifc.input(WIN_MID|WIN_SAV,0,0,"Sub-board Long Name",str,LEN_SLNAME ,K_EDIT)<1) continue; sprintf(str2,"%.*s",LEN_SSNAME,str); SETHELP(WHERE); /* Sub-board Short Name: This is a short description of the message sub-board which is displayed at the main and reading messages prompts. */ if(uifc.input(WIN_MID|WIN_SAV,0,0,"Sub-board Short Name",str2,LEN_SSNAME ,K_EDIT)<1) continue; #if 0 sprintf(str3,"%.10s",str2); SETHELP(WHERE); /* Sub-board QWK Name: This is the name of the sub-board used for QWK off-line readers. */ if(uifc.input(WIN_MID|WIN_SAV,0,0,"Sub-board QWK Name",str3,10 ,K_EDIT)<1) continue; #endif sprintf(code,"%.8s",str2); p=strchr(code,' '); if(p) *p=0; strupr(code); SETHELP(WHERE); /* Sub-board Internal Code Suffix: Every sub-board must have its own unique code for Synchronet to refer to it internally. This code should be descriptive of the sub-board's topic, usually an abreviation of the sub-board's name. */ if(uifc.input(WIN_MID|WIN_SAV,0,0,"Sub-board Internal Code Suffix",code,LEN_CODE ,K_EDIT|K_UPPER)<1) continue; if(!code_ok(code)) { uifc.helpbuf=invalid_code; uifc.msg("Invalid Code"); uifc.helpbuf=0; continue; } if((cfg.sub=(sub_t **)realloc(cfg.sub,sizeof(sub_t *)*(cfg.total_subs+1)))==NULL) { errormsg(WHERE,ERR_ALLOC,nulstr,cfg.total_subs+1); cfg.total_subs=0; bail(1); continue; } for(ptridx=0;ptridx<USHRT_MAX;ptridx++) { /* Search for unused pointer indx */ for(n=0;n<cfg.total_subs;n++) if(cfg.sub[n]->ptridx==ptridx) break; if(n==cfg.total_subs) break; } if(j) { for(n=cfg.total_subs;n>subnum[i];n--) cfg.sub[n]=cfg.sub[n-1]; for(q=0;q<cfg.total_qhubs;q++) for(s=0;s<cfg.qhub[q]->subs;s++) if(cfg.qhub[q]->sub[s]>=subnum[i]) cfg.qhub[q]->sub[s]++; } if((cfg.sub[subnum[i]]=(sub_t *)malloc(sizeof(sub_t)))==NULL) { errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(sub_t)); continue; } memset((sub_t *)cfg.sub[subnum[i]],0,sizeof(sub_t)); cfg.sub[subnum[i]]->grp=grpnum; if(cfg.total_faddrs) cfg.sub[subnum[i]]->faddr=cfg.faddr[0]; else memset(&cfg.sub[subnum[i]]->faddr,0,sizeof(faddr_t)); cfg.sub[subnum[i]]->maxmsgs=500; strcpy(cfg.sub[subnum[i]]->code_suffix,code); strcpy(cfg.sub[subnum[i]]->lname,str); strcpy(cfg.sub[subnum[i]]->sname,str2); strcpy(cfg.sub[subnum[i]]->qwkname,code); if(strchr(str,'.') && strchr(str,' ')==NULL) strcpy(cfg.sub[subnum[i]]->newsgroup,str); cfg.sub[subnum[i]]->misc=(SUB_NSDEF|SUB_SSDEF|SUB_QUOTE|SUB_TOUSER |SUB_HDRMOD|SUB_FAST); cfg.sub[subnum[i]]->ptridx=ptridx; cfg.total_subs++; uifc.changes=1; continue; } if((i&MSK_ON)==MSK_DEL) { i&=MSK_OFF; SETHELP(WHERE); /* Delete Data in Sub-board: If you want to delete all the messages for this sub-board, select Yes. */ j=1; strcpy(opt[0],"Yes"); strcpy(opt[1],"No"); opt[2][0]=0; j=uifc.list(WIN_MID|WIN_SAV,0,0,0,&j,0 ,"Delete Data in Sub-board",opt); if(j==-1) continue; if(j==0) { sprintf(str,"%s%s.*" ,cfg.grp[cfg.sub[i]->grp]->code_prefix ,cfg.sub[i]->code_suffix); strlwr(str); if(!cfg.sub[subnum[i]]->data_dir[0]) sprintf(tmp,"%ssubs/",cfg.data_dir); else strcpy(tmp,cfg.sub[subnum[i]]->data_dir); delfiles(tmp,str); clearptrs(subnum[i]); } free(cfg.sub[subnum[i]]); cfg.total_subs--; for(j=subnum[i];j<cfg.total_subs;j++) cfg.sub[j]=cfg.sub[j+1]; for(q=0;q<cfg.total_qhubs;q++) for(s=0;s<cfg.qhub[q]->subs;s++) { if(cfg.qhub[q]->sub[s]==subnum[i]) cfg.qhub[q]->sub[s]=INVALID_SUB; else if(cfg.qhub[q]->sub[s]>subnum[i]) cfg.qhub[q]->sub[s]--; } uifc.changes=1; continue; } if((i&MSK_ON)==MSK_GET) { i&=MSK_OFF; savsub=*cfg.sub[subnum[i]]; continue; } if((i&MSK_ON)==MSK_PUT) { i&=MSK_OFF; ptridx=cfg.sub[subnum[i]]->ptridx; *cfg.sub[subnum[i]]=savsub; cfg.sub[subnum[i]]->ptridx=ptridx; cfg.sub[subnum[i]]->grp=grpnum; uifc.changes=1; continue; } i=subnum[i]; j=0; done=0; while(!done) { n=0; sprintf(opt[n++],"%-27.27s%s","Long Name",cfg.sub[i]->lname); sprintf(opt[n++],"%-27.27s%s","Short Name",cfg.sub[i]->sname); sprintf(opt[n++],"%-27.27s%s","QWK Name",cfg.sub[i]->qwkname); sprintf(opt[n++],"%-27.27s%s%s","Internal Code" ,cfg.grp[cfg.sub[i]->grp]->code_prefix, cfg.sub[i]->code_suffix); sprintf(opt[n++],"%-27.27s%s","Newsgroup Name",cfg.sub[i]->newsgroup); sprintf(opt[n++],"%-27.27s%.40s","Access Requirements" ,cfg.sub[i]->arstr); sprintf(opt[n++],"%-27.27s%.40s","Reading Requirements" ,cfg.sub[i]->read_arstr); sprintf(opt[n++],"%-27.27s%.40s","Posting Requirements" ,cfg.sub[i]->post_arstr); sprintf(opt[n++],"%-27.27s%.40s","Operator Requirements" ,cfg.sub[i]->op_arstr); sprintf(opt[n++],"%-27.27s%.40s","Moderated Posting User" ,cfg.sub[i]->mod_arstr); sprintf(opt[n++],"%-27.27s%lu","Maximum Messages" ,cfg.sub[i]->maxmsgs); if(cfg.sub[i]->maxage) sprintf(str,"Enabled (%u days old)",cfg.sub[i]->maxage); else strcpy(str,"Disabled"); sprintf(opt[n++],"%-27.27s%s","Purge by Age",str); if(cfg.sub[i]->maxcrcs) sprintf(str,"Enabled (%lu message CRCs)",cfg.sub[i]->maxcrcs); else strcpy(str,"Disabled"); sprintf(opt[n++],"%-27.27s%s","Duplicate Checking",str); strcpy(opt[n++],"Toggle Options..."); strcpy(opt[n++],"Network Options..."); strcpy(opt[n++],"Advanced Options..."); opt[n][0]=0; sprintf(str,"%s Sub-board",cfg.sub[i]->sname); SETHELP(WHERE); /* Sub-board Configuration: This menu allows you to configure the individual selected sub-board. Options with a trailing ... provide a sub-menu of more options. */ switch(uifc.list(WIN_ACT|WIN_SAV|WIN_RHT|WIN_BOT ,0,0,60,&opt_dflt,0,str,opt)) { case -1: done=1; break; case 0: SETHELP(WHERE); /* Sub-board Long Name: This is a description of the message sub-board which is displayed in all sub-board listings. */ strcpy(str,cfg.sub[i]->lname); /* save */ if(!uifc.input(WIN_MID|WIN_SAV,0,17,"Name to use for Listings" ,cfg.sub[i]->lname,LEN_SLNAME,K_EDIT)) strcpy(cfg.sub[i]->lname,str); /* restore */ break; case 1: SETHELP(WHERE); /* Sub-board Short Name: This is a short description of the message sub-board which is displayed at the main and reading messages prompts. */ uifc.input(WIN_MID|WIN_SAV,0,17,"Name to use for Prompts" ,cfg.sub[i]->sname,LEN_SSNAME,K_EDIT); break; case 2: SETHELP(WHERE); /* Sub-board QWK Name: This is the name of the sub-board used for QWK off-line readers. */ uifc.input(WIN_MID|WIN_SAV,0,17,"Name to use for QWK Packets" ,cfg.sub[i]->qwkname,10,K_EDIT); break; case 3: SETHELP(WHERE); /* Sub-board Internal Code Suffix: Every sub-board must have its own unique code for Synchronet to refer to it internally. This code should be descriptive of the sub-board's topic, usually an abreviation of the sub-board's name. */ strcpy(str,cfg.sub[i]->code_suffix); uifc.input(WIN_MID|WIN_SAV,0,17,"Internal Code Suffix (unique)" ,str,LEN_CODE,K_EDIT|K_UPPER); if(code_ok(str)) strcpy(cfg.sub[i]->code_suffix,str); else { uifc.helpbuf=invalid_code; uifc.msg("Invalid Code"); uifc.helpbuf=0; } break; case 4: SETHELP(WHERE); /* Newsgroup Name: This is the name of the sub-board used for newsgroup readers. If no name is configured here, a name will be automatically generated from the sub-board's name and group name. */ uifc.input(WIN_MID|WIN_SAV,0,17,"" ,cfg.sub[i]->newsgroup,sizeof(cfg.sub[i]->newsgroup)-1,K_EDIT); break; case 5: sprintf(str,"%s Access",cfg.sub[i]->sname); getar(str,cfg.sub[i]->arstr); break; case 6: sprintf(str,"%s Reading",cfg.sub[i]->sname); getar(str,cfg.sub[i]->read_arstr); break; case 7: sprintf(str,"%s Posting",cfg.sub[i]->sname); getar(str,cfg.sub[i]->post_arstr); break; case 8: sprintf(str,"%s Operator",cfg.sub[i]->sname); getar(str,cfg.sub[i]->op_arstr); break; case 9: sprintf(str,"%s Moderated Posting User",cfg.sub[i]->sname); getar(str,cfg.sub[i]->mod_arstr); break; case 10: sprintf(str,"%lu",cfg.sub[i]->maxmsgs); SETHELP(WHERE); /* Maximum Number of Messages: This value is the maximum number of messages that will be kept in the sub-board. Once this maximum number of messages is reached, the oldest messages will be automatically purged. Usually, 100 messages is a sufficient maximum. */ uifc.input(WIN_MID|WIN_SAV,0,17,"Maximum Number of Messages" ,str,9,K_EDIT|K_NUMBER); cfg.sub[i]->maxmsgs=atoi(str); cfg.sub[i]->misc|=SUB_HDRMOD; break; case 11: sprintf(str,"%u",cfg.sub[i]->maxage); SETHELP(WHERE); /* Maximum Age of Messages: This value is the maximum number of days that messages will be kept in the sub-board. */ uifc.input(WIN_MID|WIN_SAV,0,17,"Maximum Age of Messages (in days)" ,str,5,K_EDIT|K_NUMBER); cfg.sub[i]->maxage=atoi(str); cfg.sub[i]->misc|=SUB_HDRMOD; break; case 12: sprintf(str,"%lu",cfg.sub[i]->maxcrcs); SETHELP(WHERE); /* Maximum Number of CRCs: This value is the maximum number of CRCs that will be kept in the sub-board for duplicate message checking. Once this maximum number of CRCs is reached, the oldest CRCs will be automatically purged. */ uifc.input(WIN_MID|WIN_SAV,0,17,"Maximum Number of CRCs" ,str,9,K_EDIT|K_NUMBER); cfg.sub[i]->maxcrcs=atol(str); cfg.sub[i]->misc|=SUB_HDRMOD; break; case 13: while(1) { n=0; sprintf(opt[n++],"%-27.27s%s","Allow Private Posts" ,cfg.sub[i]->misc&SUB_PRIV ? cfg.sub[i]->misc&SUB_PONLY ? "Only":"Yes":"No"); sprintf(opt[n++],"%-27.27s%s","Allow Anonymous Posts" ,cfg.sub[i]->misc&SUB_ANON ? cfg.sub[i]->misc&SUB_AONLY ? "Only":"Yes":"No"); sprintf(opt[n++],"%-27.27s%s","Post Using Real Names" ,cfg.sub[i]->misc&SUB_NAME ? "Yes":"No"); sprintf(opt[n++],"%-27.27s%s","Users Can Edit Posts" ,cfg.sub[i]->misc&SUB_EDIT ? cfg.sub[i]->misc&SUB_EDITLAST ? "Last" : "Yes" : "No"); sprintf(opt[n++],"%-27.27s%s","Users Can Delete Posts" ,cfg.sub[i]->misc&SUB_DEL ? cfg.sub[i]->misc&SUB_DELLAST ? "Last" : "Yes" : "No"); sprintf(opt[n++],"%-27.27s%s","Default On for New Scan" ,cfg.sub[i]->misc&SUB_NSDEF ? "Yes":"No"); sprintf(opt[n++],"%-27.27s%s","Forced On for New Scan" ,cfg.sub[i]->misc&SUB_FORCED ? "Yes":"No"); sprintf(opt[n++],"%-27.27s%s","Default On for Your Scan" ,cfg.sub[i]->misc&SUB_SSDEF ? "Yes":"No"); sprintf(opt[n++],"%-27.27s%s","Public 'To' User" ,cfg.sub[i]->misc&SUB_TOUSER ? "Yes":"No"); sprintf(opt[n++],"%-27.27s%s","Allow Message Quoting" ,cfg.sub[i]->misc&SUB_QUOTE ? "Yes":"No"); sprintf(opt[n++],"%-27.27s%s","Suppress User Signatures" ,cfg.sub[i]->misc&SUB_NOUSERSIG ? "Yes":"No"); sprintf(opt[n++],"%-27.27s%s","Permanent Operator Msgs" ,cfg.sub[i]->misc&SUB_SYSPERM ? "Yes":"No"); sprintf(opt[n++],"%-27.27s%s","Kill Read Messages" ,cfg.sub[i]->misc&SUB_KILL ? "Yes" : (cfg.sub[i]->misc&SUB_KILLP ? "Pvt" : "No")); sprintf(opt[n++],"%-27.27s%s","Compress Messages (LZH)" ,cfg.sub[i]->misc&SUB_LZH ? "Yes" : "No"); opt[n][0]=0; SETHELP(WHERE); /* Sub-board Toggle Options: This menu allows you to toggle certain options for the selected sub-board between two or more settings, such as Yes and No. */ n=uifc.list(WIN_ACT|WIN_SAV|WIN_RHT|WIN_BOT,3,2,36,&tog_dflt,0 ,"Toggle Options",opt); if(n==-1) break; switch(n) { case 0: if(cfg.sub[i]->misc&SUB_PONLY) n=2; else n=(cfg.sub[i]->misc&SUB_PRIV) ? 0:1; strcpy(opt[0],"Yes"); strcpy(opt[1],"No"); strcpy(opt[2],"Only"); opt[3][0]=0; SETHELP(WHERE); /* Allow Private Posts on Sub-board: If you want users to be able to post private messages to other users on this sub-board, set this value to Yes. Usually, E-mail is the preferred method of private communication. If you want users to be able to post private messages only on this sub-board, select Only. */ n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0 ,"Allow Private Posts",opt); if(n==-1) break; if(!n && (cfg.sub[i]->misc&(SUB_PRIV|SUB_PONLY)) !=SUB_PRIV) { uifc.changes=1; cfg.sub[i]->misc&=~SUB_PONLY; cfg.sub[i]->misc|=SUB_PRIV; break; } if(n==1 && cfg.sub[i]->misc&SUB_PRIV) { uifc.changes=1; cfg.sub[i]->misc&=~SUB_PRIV; break; } if(n==2 && (cfg.sub[i]->misc&(SUB_PRIV|SUB_PONLY)) !=(SUB_PRIV|SUB_PONLY)) { uifc.changes=1; cfg.sub[i]->misc|=(SUB_PRIV|SUB_PONLY); } break; case 1: if(cfg.sub[i]->misc&SUB_AONLY) n=2; else n=(cfg.sub[i]->misc&SUB_ANON) ? 0:1; strcpy(opt[0],"Yes"); strcpy(opt[1],"No"); strcpy(opt[2],"Only"); opt[3][0]=0; SETHELP(WHERE); /* Allow Anonymous Posts on Sub-board: If you want users with the A exemption to be able to post anonymously on this sub-board, select Yes. If you want all posts on this sub-board to be forced anonymous, select Only. If you do not want anonymous posts allowed on this sub-board at all, select No. */ n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0 ,"Allow Anonymous Posts",opt); if(n==-1) break; if(!n && (cfg.sub[i]->misc&(SUB_ANON|SUB_AONLY)) !=SUB_ANON) { uifc.changes=1; cfg.sub[i]->misc&=~SUB_AONLY; cfg.sub[i]->misc|=SUB_ANON; break; } if(n==1 && cfg.sub[i]->misc&(SUB_ANON|SUB_AONLY)) { uifc.changes=1; cfg.sub[i]->misc&=~(SUB_ANON|SUB_AONLY); break; } if(n==2 && (cfg.sub[i]->misc&(SUB_ANON|SUB_AONLY)) !=(SUB_ANON|SUB_AONLY)) { uifc.changes=1; cfg.sub[i]->misc|=(SUB_ANON|SUB_AONLY); } break; case 2: n=(cfg.sub[i]->misc&SUB_NAME) ? 0:1; strcpy(opt[0],"Yes"); strcpy(opt[1],"No"); opt[2][0]=0; SETHELP(WHERE); /* User Real Names in Posts on Sub-board: If you allow aliases on your system, you can have messages on this sub-board automatically use the real name of the posting user by setting this option to Yes. */ n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0 ,"Use Real Names in Posts",opt); if(n==-1) break; if(!n && !(cfg.sub[i]->misc&SUB_NAME)) { uifc.changes=1; cfg.sub[i]->misc|=SUB_NAME; break; } if(n==1 && cfg.sub[i]->misc&SUB_NAME) { uifc.changes=1; cfg.sub[i]->misc&=~SUB_NAME; } break; case 3: if(cfg.sub[i]->misc&SUB_EDITLAST) n=2; else n=(cfg.sub[i]->misc&SUB_EDIT) ? 0:1; strcpy(opt[0],"Yes"); strcpy(opt[1],"No"); strcpy(opt[2],"Last Post Only"); opt[3][0]=0; SETHELP(WHERE); /* Users Can Edit Posts on Sub-board: If you wish to allow users to edit their messages after they have been posted, this option to Yes. If you wish to allow users to edit only the last message on a message base, set this option to Last Post Only. */ n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0 ,"Users Can Edit Messages",opt); if(n==-1) break; if(n==0 /* yes */ && (cfg.sub[i]->misc&(SUB_EDIT|SUB_EDITLAST)) !=SUB_EDIT ) { uifc.changes=1; cfg.sub[i]->misc|=SUB_EDIT; cfg.sub[i]->misc&=~SUB_EDITLAST; break; } if(n==1 /* no */ && cfg.sub[i]->misc&(SUB_EDIT|SUB_EDITLAST) ) { uifc.changes=1; cfg.sub[i]->misc&=~(SUB_EDIT|SUB_EDITLAST); break; } if(n==2 /* last only */ && (cfg.sub[i]->misc&(SUB_EDIT|SUB_EDITLAST)) !=(SUB_EDIT|SUB_EDITLAST) ) { uifc.changes=1; cfg.sub[i]->misc|=(SUB_EDIT|SUB_EDITLAST); break; } break; case 4: if(cfg.sub[i]->misc&SUB_DELLAST) n=2; else n=(cfg.sub[i]->misc&SUB_DEL) ? 0:1; strcpy(opt[0],"Yes"); strcpy(opt[1],"No"); strcpy(opt[2],"Last Post Only"); opt[3][0]=0; SETHELP(WHERE); /* Users Can Delete Posts on Sub-board: If you want users to be able to delete any of their own posts on this sub-board, set this option to Yes. If you want to allow users the ability to delete their message only if it is the last message on the sub-board, select Last Post Only. If you want to disallow users from deleting any of their posts, set this option to No. */ n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0 ,"Users Can Delete Posts",opt); if(n==-1) break; if(!n && (cfg.sub[i]->misc&(SUB_DEL|SUB_DELLAST)) !=SUB_DEL) { uifc.changes=1; cfg.sub[i]->misc&=~SUB_DELLAST; cfg.sub[i]->misc|=SUB_DEL; break; } if(n==1 && cfg.sub[i]->misc&SUB_DEL) { uifc.changes=1; cfg.sub[i]->misc&=~SUB_DEL; break; } if(n==2 && (cfg.sub[i]->misc&(SUB_DEL|SUB_DELLAST)) !=(SUB_DEL|SUB_DELLAST)) { uifc.changes=1; cfg.sub[i]->misc|=(SUB_DEL|SUB_DELLAST); } break; case 5: n=(cfg.sub[i]->misc&SUB_NSDEF) ? 0:1; strcpy(opt[0],"Yes"); strcpy(opt[1],"No"); opt[2][0]=0; SETHELP(WHERE); /* Default On for New Scan: If you want this sub-board to be included in all user new message scans by default, set this option to Yes. */ n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0 ,"Default On for New Scan",opt); if(n==-1) break; if(!n && !(cfg.sub[i]->misc&SUB_NSDEF)) { uifc.changes=1; cfg.sub[i]->misc|=SUB_NSDEF; break; } if(n==1 && cfg.sub[i]->misc&SUB_NSDEF) { uifc.changes=1; cfg.sub[i]->misc&=~SUB_NSDEF; } break; case 6: n=(cfg.sub[i]->misc&SUB_FORCED) ? 0:1; strcpy(opt[0],"Yes"); strcpy(opt[1],"No"); opt[2][0]=0; SETHELP(WHERE); /* Forced On for New Scan: If you want this sub-board to be included in all user new message scans even if the user has removed it from their new scan configuration, set this option to Yes. */ n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0 ,"Forced New Scan",opt); if(n==-1) break; if(!n && !(cfg.sub[i]->misc&SUB_FORCED)) { uifc.changes=1; cfg.sub[i]->misc|=SUB_FORCED; break; } if(n==1 && cfg.sub[i]->misc&SUB_FORCED) { uifc.changes=1; cfg.sub[i]->misc&=~SUB_FORCED; } break; case 7: n=(cfg.sub[i]->misc&SUB_SSDEF) ? 0:1; strcpy(opt[0],"Yes"); strcpy(opt[1],"No"); opt[2][0]=0; SETHELP(WHERE); /* Default On for Your Scan: If you want this sub-board to be included in all user personal message scans by default, set this option to Yes. */ n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0 ,"Default On for Your Scan",opt); if(n==-1) break; if(!n && !(cfg.sub[i]->misc&SUB_SSDEF)) { uifc.changes=1; cfg.sub[i]->misc|=SUB_SSDEF; break; } if(n==1 && cfg.sub[i]->misc&SUB_SSDEF) { uifc.changes=1; cfg.sub[i]->misc&=~SUB_SSDEF; } break; case 8: n=(cfg.sub[i]->misc&SUB_TOUSER) ? 0:1; strcpy(opt[0],"Yes"); strcpy(opt[1],"No"); opt[2][0]=0; SETHELP(WHERE); /* Prompt for 'To' User on Public Posts: If you want all posts on this sub-board to be prompted for a 'To' user, set this option to Yes. This is a useful option for sub-boards that are on a network that does not allow private posts. */ n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0 ,"Prompt for 'To' User on Public Posts",opt); if(n==-1) break; if(!n && !(cfg.sub[i]->misc&SUB_TOUSER)) { uifc.changes=1; cfg.sub[i]->misc|=SUB_TOUSER; break; } if(n==1 && cfg.sub[i]->misc&SUB_TOUSER) { uifc.changes=1; cfg.sub[i]->misc&=~SUB_TOUSER; } break; case 9: n=(cfg.sub[i]->misc&SUB_QUOTE) ? 0:1; strcpy(opt[0],"Yes"); strcpy(opt[1],"No"); opt[2][0]=0; SETHELP(WHERE); /* Allow Message Quoting: If you want users to be allowed to quote messages on this sub-board, set this option to Yes. */ n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0 ,"Allow Message Quoting",opt); if(n==-1) break; if(!n && !(cfg.sub[i]->misc&SUB_QUOTE)) { uifc.changes=1; cfg.sub[i]->misc|=SUB_QUOTE; break; } if(n==1 && cfg.sub[i]->misc&SUB_QUOTE) { uifc.changes=1; cfg.sub[i]->misc&=~SUB_QUOTE; } break; case 10: n=(cfg.sub[i]->misc&SUB_NOUSERSIG) ? 0:1; strcpy(opt[0],"Yes"); strcpy(opt[1],"No"); opt[2][0]=0; SETHELP(WHERE); /* Suppress User Signatures: If you do not wish to have user signatures automatically appended to messages posted in this sub-board, set this option to Yes. */ n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0 ,"Suppress User Signatures",opt); if(n==-1) break; if(!n && !(cfg.sub[i]->misc&SUB_NOUSERSIG)) { uifc.changes=1; cfg.sub[i]->misc|=SUB_NOUSERSIG; break; } if(n==1 && cfg.sub[i]->misc&SUB_NOUSERSIG) { uifc.changes=1; cfg.sub[i]->misc&=~SUB_NOUSERSIG; } break; case 11: n=(cfg.sub[i]->misc&SUB_SYSPERM) ? 0:1; strcpy(opt[0],"Yes"); strcpy(opt[1],"No"); opt[2][0]=0; SETHELP(WHERE); /* Operator Messages Automatically Permanent: If you want messages posted by System and Sub-board Operators to be automatically permanent (non-purgable) for this sub-board, set this option to Yes. */ n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0 ,"Permanent Operator Messages",opt); if(n==-1) break; if(!n && !(cfg.sub[i]->misc&SUB_SYSPERM)) { uifc.changes=1; cfg.sub[i]->misc|=SUB_SYSPERM; break; } if(n==1 && cfg.sub[i]->misc&SUB_SYSPERM) { uifc.changes=1; cfg.sub[i]->misc&=~SUB_SYSPERM; } break; case 12: if(cfg.sub[i]->misc&SUB_KILLP) n=2; else n=(cfg.sub[i]->misc&SUB_KILL) ? 0:1; strcpy(opt[0],"Yes"); strcpy(opt[1],"No"); strcpy(opt[2],"Private"); opt[3][0]=0; SETHELP(WHERE); /* Kill Read Messages Automatically: If you want messages that have been read by the intended recipient to be automatically deleted by SMBUTIL, set this option to Yes or Private if you want only private messages to be automatically deleted. */ n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0 ,"Kill Read Messages",opt); if(n==-1) break; if(!n && !(cfg.sub[i]->misc&SUB_KILL)) { uifc.changes=1; cfg.sub[i]->misc|=SUB_KILL; cfg.sub[i]->misc&=~SUB_KILLP; break; } if(n==1 && cfg.sub[i]->misc&(SUB_KILL|SUB_KILLP)) { uifc.changes=1; cfg.sub[i]->misc&=~(SUB_KILL|SUB_KILLP); } if(n==2 && !(cfg.sub[i]->misc&SUB_KILLP)) { uifc.changes=1; cfg.sub[i]->misc|=SUB_KILLP; cfg.sub[i]->misc&=~SUB_KILL; break; } break; case 13: n=(cfg.sub[i]->misc&SUB_LZH) ? 0:1; strcpy(opt[0],"Yes"); strcpy(opt[1],"No"); opt[2][0]=0; SETHELP(WHERE); /* Compress Messages with LZH Encoding: If you want all messages in this sub-board to be automatically compressed via LZH (Lempel/Ziv/Huffman algorithm used in LHarc, LHA, and other popular compression and archive programs), this option to Yes. Compression will slow down the reading and writing of messages slightly, but the storage space saved can be as much as 50 percent. Before setting this option to Yes, make sure that all of the SMB compatible mail programs you use support the LZH translation. */ n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0 ,"Compress Messages (LZH)",opt); if(n==-1) break; if(!n && !(cfg.sub[i]->misc&SUB_LZH)) { uifc.changes=1; cfg.sub[i]->misc|=SUB_LZH; break; } if(n==1 && cfg.sub[i]->misc&SUB_LZH) { uifc.changes=1; cfg.sub[i]->misc&=~SUB_LZH; } break; } } break; case 14: while(1) { n=0; sprintf(opt[n++],"%-27.27s%s","Append Tag/Origin Line" ,cfg.sub[i]->misc&SUB_NOTAG ? "No":"Yes"); sprintf(opt[n++],"%-27.27s%s","Export ASCII Only" ,cfg.sub[i]->misc&SUB_ASCII ? "Yes":"No"); sprintf(opt[n++],"%-27.27s%s","Gate Between Net Types" ,cfg.sub[i]->misc&SUB_GATE ? "Yes":"No"); sprintf(opt[n++],"%-27.27s%s","QWK Networked" ,cfg.sub[i]->misc&SUB_QNET ? "Yes":"No"); sprintf(opt[n++],"QWK Tagline"); sprintf(opt[n++],"%-27.27s%s","Internet (UUCP/NNTP)" ,cfg.sub[i]->misc&SUB_INET ? "Yes":"No"); sprintf(opt[n++],"%-27.27s%s","PostLink or PCRelay" ,cfg.sub[i]->misc&SUB_PNET ? "Yes":"No"); sprintf(opt[n++],"%-27.27s%s","FidoNet EchoMail" ,cfg.sub[i]->misc&SUB_FIDO ? "Yes":"No"); sprintf(opt[n++],"%-27.27s%s","FidoNet Address" ,smb_faddrtoa(&cfg.sub[i]->faddr,tmp)); sprintf(opt[n++],"EchoMail Origin Line"); opt[n][0]=0; SETHELP(WHERE); /* Sub-board Network Options: This menu contains options for the selected sub-board that pertain specifically to message networking. */ n=uifc.list(WIN_ACT|WIN_SAV|WIN_RHT|WIN_BOT,3,2,60,&net_dflt,0 ,"Network Options",opt); if(n==-1) break; switch(n) { case 0: n=0; strcpy(opt[0],"Yes"); strcpy(opt[1],"No"); opt[2][0]=0; SETHELP(WHERE); /* Append Tag/Origin Line to Posts: If you want to disable the automatic addition of a network tagline or origin line to the bottom of outgoing networked posts from this sub-board, set this option to No. */ n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0 ,"Append Tag/Origin Line to Posts",opt); if(n==-1) break; if(!n && cfg.sub[i]->misc&SUB_NOTAG) { uifc.changes=1; cfg.sub[i]->misc&=~SUB_NOTAG; break; } if(n==1 && !(cfg.sub[i]->misc&SUB_NOTAG)) { uifc.changes=1; cfg.sub[i]->misc|=SUB_NOTAG; } break; case 1: n=0; strcpy(opt[0],"Yes"); strcpy(opt[1],"No"); opt[2][0]=0; SETHELP(WHERE); /* Export ASCII Characters Only: If the network that this sub-board is echoed on does not allow extended ASCII (>127) or control codes (<20, not including CR), set this option to Yes. */ n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0 ,"Export ASCII Characters Only",opt); if(n==-1) break; if(n && cfg.sub[i]->misc&SUB_ASCII) { uifc.changes=1; cfg.sub[i]->misc&=~SUB_ASCII; break; } if(!n && !(cfg.sub[i]->misc&SUB_ASCII)) { uifc.changes=1; cfg.sub[i]->misc|=SUB_ASCII; } break; case 2: n=1; strcpy(opt[0],"Yes"); strcpy(opt[1],"No"); opt[2][0]=0; SETHELP(WHERE); /* Gate Between Net Types: If this sub-board is networked using more than one network technology, and you want messages to be gated between the networks, set this option to Yes. If this option is set to No, messages imported from one network type will not be exported to another network type. This is the default and should be used unless you have specific permission from both networks to gate this sub-board. Incorrectly gated sub-boards can cause duplicate messages loops and cross-posted messages. This option does not affect the exporting of messages created on your BBS. */ n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0 ,"Gate Between Net Types",opt); if(n==-1) break; if(!n && !(cfg.sub[i]->misc&SUB_GATE)) { uifc.changes=1; cfg.sub[i]->misc|=SUB_GATE; break; } if(n==1 && cfg.sub[i]->misc&SUB_GATE) { uifc.changes=1; cfg.sub[i]->misc&=~SUB_GATE; } break; case 3: n=1; strcpy(opt[0],"Yes"); strcpy(opt[1],"No"); opt[2][0]=0; SETHELP(WHERE); /* Sub-board Networked via QWK Packets: If this sub-board is networked with other BBSs via QWK packets, this option should be set to Yes. With this option set to Yes, titles of posts on this sub-board will be limited to the QWK packet limitation of 25 characters. It also allows the Network restriction to function properly. */ n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0 ,"Networked via QWK Packets",opt); if(n==-1) break; if(!n && !(cfg.sub[i]->misc&SUB_QNET)) { uifc.changes=1; cfg.sub[i]->misc|=SUB_QNET; break; } if(n==1 && cfg.sub[i]->misc&SUB_QNET) { uifc.changes=1; cfg.sub[i]->misc&=~SUB_QNET; } break; case 4: SETHELP(WHERE); /* Sub-board QWK Network Tagline: If you want to use a different QWK tagline than the configured default tagline in the Networks configuration, you should enter that tagline here. If this option is left blank, the default tagline is used. */ uifc.input(WIN_MID|WIN_SAV,0,0,nulstr,cfg.sub[i]->tagline ,sizeof(cfg.sub[i]->tagline)-1,K_MSG|K_EDIT); break; case 5: n=1; strcpy(opt[0],"Yes"); strcpy(opt[1],"No"); opt[2][0]=0; SETHELP(WHERE); /* Sub-board Networked via Internet: If this sub-board is networked to the Internet via UUCP or NNTP, this option should be set to Yes. It will allow the Network user restriction to function properly. */ n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0 ,"Networked via Internet",opt); if(n==-1) break; if(!n && !(cfg.sub[i]->misc&SUB_INET)) { uifc.changes=1; cfg.sub[i]->misc|=SUB_INET; break; } if(n==1 && cfg.sub[i]->misc&SUB_INET) { uifc.changes=1; cfg.sub[i]->misc&=~SUB_INET; } break; case 6: n=1; strcpy(opt[0],"Yes"); strcpy(opt[1],"No"); opt[2][0]=0; SETHELP(WHERE); /* Sub-board Networked via PostLink or PCRelay: If this sub-board is networked with other BBSs via PostLink or PCRelay, this option should be set to Yes. With this option set to Yes, titles of posts on this sub-board will be limited to the UTI specification limitation of 25 characters. It also allows the Network restriction to function properly. */ n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0 ,"Networked via PostLink or PCRelay",opt); if(n==-1) break; if(!n && !(cfg.sub[i]->misc&SUB_PNET)) { uifc.changes=1; cfg.sub[i]->misc|=SUB_PNET; break; } if(n==1 && cfg.sub[i]->misc&SUB_PNET) { uifc.changes=1; cfg.sub[i]->misc&=~SUB_PNET; } break; case 7: n=1; strcpy(opt[0],"Yes"); strcpy(opt[1],"No"); opt[2][0]=0; SETHELP(WHERE); /* Sub-board Networked via FidoNet EchoMail: If this sub-board is part of a FidoNet EchoMail conference, set this option to Yes. */ n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0 ,"Networked via FidoNet EchoMail",opt); if(n==-1) break; if(!n && !(cfg.sub[i]->misc&SUB_FIDO)) { uifc.changes=1; cfg.sub[i]->misc|=SUB_FIDO; break; } if(n==1 && cfg.sub[i]->misc&SUB_FIDO) { uifc.changes=1; cfg.sub[i]->misc&=~SUB_FIDO; } break; case 8: smb_faddrtoa(&cfg.sub[i]->faddr,str); SETHELP(WHERE); /* Sub-board FidoNet Address: If this sub-board is part of a FidoNet EchoMail conference, this is the address used for this sub-board. Format: Zone:Net/Node[.Point] */ uifc.input(WIN_MID|WIN_SAV,0,0,"FidoNet Address" ,str,25,K_EDIT); cfg.sub[i]->faddr=atofaddr(str); break; case 9: SETHELP(WHERE); /* Sub-board FidoNet Origin Line: If this sub-board is part of a FidoNet EchoMail conference and you want to use an origin line other than the default origin line in the Networks configuration, set this value to the desired origin line. If this option is blank, the default origin line is used. */ uifc.input(WIN_MID|WIN_SAV,0,0,nulstr,cfg.sub[i]->origline ,sizeof(cfg.sub[i]->origline)-1,K_EDIT); break; } } break; case 15: while(1) { n=0; if(cfg.sub[i]->qwkconf) sprintf(str,"Static (%u)",cfg.sub[i]->qwkconf); else strcpy(str,"Dynamic"); sprintf(opt[n++],"%-27.27s%s","QWK Conference Number" ,str); sprintf(opt[n++],"%-27.27s%s","Storage Method" ,cfg.sub[i]->misc&SUB_HYPER ? "Hyper Allocation" : cfg.sub[i]->misc&SUB_FAST ? "Fast Allocation" : "Self-packing"); if(!cfg.sub[i]->data_dir[0]) sprintf(str,"%ssubs/",cfg.data_dir); else strcpy(str,cfg.sub[i]->data_dir); sprintf(opt[n++],"%-27.27s%.40s","Storage Directory",str); sprintf(opt[n++],"%-27.27s%.40s","Semaphore File",cfg.sub[i]->post_sem); sprintf(opt[n++],"%-27.27s%u","Pointer File Index",cfg.sub[i]->ptridx); opt[n][0]=0; SETHELP(WHERE); /* Sub-board Advanced Options: This menu contains options for the selected sub-board that are advanced in nature. */ n=uifc.list(WIN_ACT|WIN_SAV|WIN_RHT|WIN_BOT,3,2,60,&adv_dflt,0 ,"Advanced Options",opt); if(n==-1) break; switch(n) { case 0: SETHELP(WHERE); /* Sub-board QWK Conference Number: If you wish to have the QWK conference number for this sub-board automatically generated by Synchronet (based on the group number and sub-board number for the user), set this option to Dynamic. If you wish to have the same QWK conference number for this sub-board regardless of which user access it, set this option to Static by entering the conference number you want to use. */ if(cfg.sub[i]->qwkconf) sprintf(str,"%u",cfg.sub[i]->qwkconf); else str[0]=0; if(uifc.input(WIN_MID|WIN_SAV,0,17 ,"QWK Conference Number (0=Dynamic)" ,str,5,K_EDIT|K_NUMBER)>=0) cfg.sub[i]->qwkconf=atoi(str); break; case 1: n=0; strcpy(opt[0],"Hyper Allocation"); strcpy(opt[1],"Fast Allocation"); strcpy(opt[2],"Self-packing"); opt[3][0]=0; SETHELP(WHERE); /* Self-Packing is the slowest storage method because it conserves disk space as it imports messages by using deleted message header and data blocks for new messages automatically. If you use this storage method, you will not need to run SMBUTIL P on this message base unless you accumilate a large number of deleted message blocks and wish to free that disk space. You can switch from self-packing to fast allocation storage method and back again as you wish. Fast Allocation is faster than self-packing because it does not search for deleted message blocks for new messages. It automatically places all new message blocks at the end of the header and data files. If you use this storage method, you will need to run SMBUTIL P on this message base periodically or it will continually use up disk space. Hyper Allocation is the fastest storage method because it does not maintain allocation files at all. Once a message base is setup to use this storage method, it should not be changed without first deleting the message base data files in your DATA\DIRS\SUBS directory for this sub-board. You must use SMBUTIL P as with the fast allocation method. */ n=uifc.list(WIN_SAV|WIN_MID,0,0,0,&n,0 ,"Storage Method",opt); if(n==-1) break; if(!n && !(cfg.sub[i]->misc&SUB_HYPER)) { uifc.changes=1; cfg.sub[i]->misc|=SUB_HYPER; cfg.sub[i]->misc&=~SUB_FAST; cfg.sub[i]->misc|=SUB_HDRMOD; break; } if(!n) break; if(cfg.sub[i]->misc&SUB_HYPER) { /* Switching from hyper */ strcpy(opt[0],"Yes"); strcpy(opt[1],"No, I want to use Hyper Allocation"); opt[2][0]=0; m=0; if(uifc.list(WIN_SAV|WIN_MID,0,0,0,&m,0 ,"Delete all messages in this sub-board?",opt)!=0) break; if(cfg.sub[i]->data_dir[0]) sprintf(str,"%s",cfg.sub[i]->data_dir); else sprintf(str,"%ssubs/",cfg.data_dir); sprintf(str2,"%s%s.*" ,cfg.grp[cfg.sub[i]->grp]->code_prefix ,cfg.sub[i]->code_suffix); strlwr(str2); delfiles(str,str2); } if(cfg.sub[i]->misc&SUB_HYPER) cfg.sub[i]->misc|=SUB_HDRMOD; if(n==1 && !(cfg.sub[i]->misc&SUB_FAST)) { uifc.changes=1; cfg.sub[i]->misc|=SUB_FAST; cfg.sub[i]->misc&=~SUB_HYPER; break; } if(n==2 && cfg.sub[i]->misc&(SUB_FAST|SUB_HYPER)) { uifc.changes=1; cfg.sub[i]->misc&=~(SUB_FAST|SUB_HYPER); break; } break; case 2: SETHELP(WHERE); /* Sub-board Storage Directory: Use this if you wish to place the data directory for this sub-board on another drive or in another directory besides the default setting. */ uifc.input(WIN_MID|WIN_SAV,0,17,"Directory" ,cfg.sub[i]->data_dir,sizeof(cfg.sub[i]->data_dir)-1,K_EDIT); break; case 3: SETHELP(WHERE); /* `Sub-board Semaphore File:` This is a filename that will be created as a semaphore (signal) to an external program or event whenever a message is posted in this sub-board. */ uifc.input(WIN_MID|WIN_SAV,0,17,"Semaphore File" ,cfg.sub[i]->post_sem,sizeof(cfg.sub[i]->post_sem)-1,K_EDIT); break; case 4: SETHELP(WHERE); /* `Sub-board Pointer Index:` You should normally have no reason to modify this value. If you get crossed-up or duplicate ptridx values, then you may want to adjust this value, but do so with great care and trepidation. */ sprintf(str,"%u",cfg.sub[i]->ptridx); if(uifc.input(WIN_MID|WIN_SAV,0,17 ,"Pointer File Index (Danger!)" ,str,5,K_EDIT|K_NUMBER)>=0) cfg.sub[i]->ptridx=atoi(str); break; } } break; } } } }
/* reads a text file as input, converting each line into a wide character representation and applies several filters. */ void w_b_process_file(FILE *input, void (*line_fun)(void)) { mbstate_t input_shiftstate; category_count_t i; RegMatch *r; regmatch_t pmatch[MAX_SUBMATCH]; submatch_order_t z; int extra_lines = 2; memset(&input_shiftstate, 0, sizeof(mbstate_t)); while( fill_textbuf(input, &extra_lines) ) { if( !fill_wc_textbuf(textbuf, &input_shiftstate) ) { continue; } /* now summarize this line if required */ if( line_fun ) { (*line_fun)(); } /* the scores are written by dbacl, so there's no need for the conversion */ if( (textbuf[0] == 's') && (strncmp(MAGIC, textbuf, 7) == 0) ) { if( !parse_dbacl_scores(textbuf) ) { errormsg(E_FATAL, "scores don't match risk specification\n"); } else if( options & (1<<OPTION_DEBUG) ) { for(i = 0; i < spec.num_cats; i++) { fprintf(stdout, "category %s\t cross_entropy %7.2f complexity %7.0f\n", spec.catname[i], spec.cross_entropy[i], spec.complexity[i]); } fprintf(stdout, "\n"); } } else { /* for each regex in our list, try for a match */ for( r = spec.regs; r != 0; r = r->next) { if( regexec(&(r->reg), textbuf, MAX_SUBMATCH, pmatch, 0) == 0 ) { r->lv->found = 1; /* convert each submatch to a number - pad remaining elements to zero */ for(z = 1; z < MAX_SUBMATCH; z++) { if(pmatch[z].rm_so > -1) { r->lv->sm[z-1] = strtod(textbuf + pmatch[z].rm_so, NULL); } else { r->lv->sm[z-1] = 0.0; } } if( options & (1<<OPTION_DEBUG) ) { fprintf(stdout, "match \"%s\"", r->lv->re); for(z = 1; (z < MAX_SUBMATCH) && (pmatch[z].rm_so > -1); z++) { fprintf(stdout, " %f", r->lv->sm[z-1]); } fprintf(stdout, "\n"); } } } } } }
int loadstatus(int maxprio, time_t maxage, int mincolor, int wantacked) { int xymondresult; char *board = NULL; char *bol, *eol; time_t now; char msg[1024]; int i; sendreturn_t *sres; sprintf(msg, "xymondboard acklevel=%d fields=hostname,testname,color,lastchange,logtime,validtime,acklist color=%s", critacklevel,colorname(mincolor)); for (i=mincolor+1; (i < COL_COUNT); i++) sprintf(msg+strlen(msg), ",%s", colorname(i)); sres = newsendreturnbuf(1, NULL); xymondresult = sendmessage(msg, NULL, XYMON_TIMEOUT, sres); if (xymondresult != XYMONSEND_OK) { freesendreturnbuf(sres); errormsg("Unable to fetch current status\n"); return 1; } else { board = getsendreturnstr(sres, 1); freesendreturnbuf(sres); } now = getcurrenttime(NULL); rbstate = rbtNew(name_compare); bol = board; while (bol && (*bol)) { char *endkey; RbtStatus status; eol = strchr(bol, '\n'); if (eol) *eol = '\0'; /* Find the config entry */ endkey = strchr(bol, '|'); if (endkey) endkey = strchr(endkey+1, '|'); if (endkey) { critconf_t *cfg; char *ackstr, *ackrtimestr, *ackvtimestr, *acklevelstr, *ackbystr, *ackmsgstr; *endkey = '\0'; cfg = get_critconfig(bol, CRITCONF_TIMEFILTER, NULL); *endkey = '|'; if (cfg) { hstatus_t *newitem = (hstatus_t *)calloc(1, sizeof(hstatus_t)); newitem->config = cfg; newitem->hostname = gettok(bol, "|"); newitem->testname = gettok(NULL, "|"); newitem->color = parse_color(gettok(NULL, "|")); newitem->lastchange = atoi(gettok(NULL, "|")); newitem->logtime = atoi(gettok(NULL, "|")); newitem->validtime = atoi(gettok(NULL, "|")); ackstr = gettok(NULL, "|"); ackrtimestr = ackvtimestr = acklevelstr = ackbystr = ackmsgstr = NULL; if (ackstr) { nldecode(ackstr); ackrtimestr = strtok(ackstr, ":"); if (ackrtimestr) ackvtimestr = strtok(NULL, ":"); if (ackvtimestr) acklevelstr = strtok(NULL, ":"); if (acklevelstr) ackbystr = strtok(NULL, ":"); if (ackbystr) ackmsgstr = strtok(NULL, ":"); } if ( (hostinfo(newitem->hostname) == NULL) || (newitem->config->priority > maxprio) || ((now - newitem->lastchange) > maxage) || (newitem->color < mincolor) || (ackmsgstr && !wantacked) ) { xfree(newitem); } else { if (ackvtimestr && ackbystr && ackmsgstr) { newitem->acktime = atoi(ackvtimestr); newitem->ackedby = strdup(ackbystr); newitem->ackmsg = strdup(ackmsgstr); } newitem->key = (char *)malloc(strlen(newitem->hostname) + strlen(newitem->testname) + 2); sprintf(newitem->key, "%s|%s", newitem->hostname, newitem->testname); status = rbtInsert(rbstate, newitem->key, newitem); } } } bol = (eol ? (eol+1) : NULL); } return 0; }
void sbbs_t::telnet_gate(char* destaddr, ulong mode, char* client_user_name, char* server_user_name, char* term_type) { char* p; uchar buf[512]; int i; int rd; uint attempts; ulong l; bool gotline; ushort port; ulong ip_addr; ulong save_console; SOCKET remote_socket; SOCKADDR_IN addr; if(mode&TG_RLOGIN) port=513; else port=IPPORT_TELNET; p=strchr(destaddr,':'); if(p!=NULL) { *p=0; port=atoi(p+1); } ip_addr=resolve_ip(destaddr); if(ip_addr==INADDR_NONE) { lprintf(LOG_NOTICE,"!TELGATE Failed to resolve address: %s",destaddr); bprintf("!Failed to resolve address: %s\r\n",destaddr); return; } if((remote_socket = open_socket(SOCK_STREAM, client.protocol)) == INVALID_SOCKET) { errormsg(WHERE,ERR_OPEN,"socket",0); return; } memset(&addr,0,sizeof(addr)); addr.sin_addr.s_addr = htonl(startup->telnet_interface); addr.sin_family = AF_INET; if((i=bind(remote_socket, (struct sockaddr *) &addr, sizeof (addr)))!=0) { lprintf(LOG_NOTICE,"!TELGATE ERROR %d (%d) binding to socket %d",i, ERROR_VALUE, remote_socket); bprintf("!ERROR %d (%d) binding to socket\r\n",i, ERROR_VALUE); close_socket(remote_socket); return; } memset(&addr,0,sizeof(addr)); addr.sin_addr.s_addr = ip_addr; addr.sin_family = AF_INET; addr.sin_port = htons(port); if((i=connect(remote_socket, (struct sockaddr *)&addr, sizeof(addr)))!=0) { lprintf(LOG_NOTICE,"!TELGATE ERROR %d (%d) connecting to server: %s" ,i,ERROR_VALUE, destaddr); bprintf("!ERROR %d (%d) connecting to server: %s\r\n" ,i,ERROR_VALUE, destaddr); close_socket(remote_socket); return; } l=1; if((i = ioctlsocket(remote_socket, FIONBIO, &l))!=0) { lprintf(LOG_NOTICE,"!TELGATE ERROR %d (%d) disabling socket blocking" ,i, ERROR_VALUE); close_socket(remote_socket); return; } lprintf(LOG_INFO,"Node %d %s gate to %s port %u on socket %d" ,cfg.node_num ,mode&TG_RLOGIN ? "RLogin" : "Telnet" ,destaddr,port,remote_socket); if(!(mode&TG_CTRLKEYS)) console|=CON_RAW_IN; if(mode&TG_RLOGIN) { p=(char*)buf; *(p++)=0; p+=sprintf(p,"%s",client_user_name==NULL ? useron.alias : client_user_name); p++; // Add NULL p+=sprintf(p,"%s",server_user_name==NULL ? useron.name : server_user_name); p++; // Add NULL if(term_type!=NULL) p+=sprintf(p,"%s",term_type); else p+=sprintf(p,"%s/%u",terminal, cur_rate); p++; // Add NULL l=p-(char*)buf; sendsocket(remote_socket,(char*)buf,l); mode|=TG_NOLF; /* Send LF (to remote host) when Telnet client sends CRLF (when not in binary mode) */ } /* This is required for gating to Unix telnetd */ if(mode&TG_NOTERMTYPE) request_telnet_opt(TELNET_DONT,TELNET_TERM_TYPE, 3000); // Re-negotiation of terminal type /* Text/NVT mode by default */ request_telnet_opt(TELNET_DONT,TELNET_BINARY_TX, 3000); if(!(telnet_mode&TELNET_MODE_OFF) && (mode&TG_PASSTHRU)) telnet_mode|=TELNET_MODE_GATE; // Pass-through telnet commands while(online) { if(!(mode&TG_NOCHKTIME)) gettimeleft(); rd=RingBufRead(&inbuf,buf,sizeof(buf)); if(rd) { #if 0 if(memchr(buf,TELNET_IAC,rd)) { char dump[2048]; dump[0]; p=dump; for(int i=0;i<rd;i++) p+=sprintf(p,"%u ",buf[i]); lprintf(LOG_DEBUG,"Node %d Telnet cmd from client: %s", cfg.node_num, dump); } #endif if(telnet_remote_option[TELNET_BINARY_TX]!=TELNET_WILL) { if(*buf==0x1d) { // ^] save_console=console; console&=~CON_RAW_IN; // Allow Ctrl-U/Ctrl-P CRLF; while(online) { SYNC; mnemonics("\1n\r\n\1h\1bTelnet Gate: \1y~D\1wisconnect, " "\1y~E\1wcho toggle, \1y~L\1wist Users, \1y~P\1wrivate message, " "\1y~Q\1wuit: "); switch(getkeys("DELPQ",0)) { case 'D': closesocket(remote_socket); break; case 'E': mode^=TG_ECHO; bprintf(text[EchoIsNow] ,mode&TG_ECHO ? text[ON]:text[OFF]); continue; case 'L': whos_online(true); continue; case 'P': nodemsg(); continue; } break; } attr(LIGHTGRAY); console=save_console; } else if(*buf<' ' && (mode&TG_CTRLKEYS)) handle_ctrlkey(*buf, K_NONE); gotline=false; if((mode&TG_LINEMODE) && buf[0]!='\r') { ungetkey(buf[0]); l=K_CHAT; if(!(mode&TG_ECHO)) l|=K_NOECHO; rd=getstr((char*)buf,sizeof(buf)-1,l); if(!rd) continue; strcat((char*)buf,crlf); rd+=2; gotline=true; } if((mode&TG_CRLF) && buf[rd-1]=='\r') buf[rd++]='\n'; else if((mode&TG_NOLF) && buf[rd-1]=='\n') rd--; if(!gotline && (mode&TG_ECHO) && rd) { RingBufWrite(&outbuf,buf,rd); } } /* Not Telnet Binary mode */ if(rd > 0) { for(attempts=0;attempts<60 && online; attempts++) /* added retry loop here, Jan-20-2003 */ { if((i=sendsocket(remote_socket,(char*)buf,rd))>=0) break; if(ERROR_VALUE!=EWOULDBLOCK) break; mswait(500); } if(i<0) { lprintf(LOG_NOTICE,"!TELGATE ERROR %d sending on socket %d",ERROR_VALUE,remote_socket); break; } } } rd=recv(remote_socket,(char*)buf,sizeof(buf),0); if(rd<0) { if(ERROR_VALUE==EWOULDBLOCK) { if(mode&TG_NODESYNC) { SYNC; } else { // Check if the node has been interrupted getnodedat(cfg.node_num,&thisnode,0); if(thisnode.misc&NODE_INTR) break; } YIELD(); continue; } lprintf(LOG_NOTICE,"!TELGATE ERROR %d receiving on socket %d",ERROR_VALUE,remote_socket); break; } if(!rd) { lprintf(LOG_INFO,"Node %d Telnet gate disconnected",cfg.node_num); break; } #if 0 if(memchr(buf,TELNET_IAC,rd)) { char dump[2048]; dump[0]; p=dump; for(int i=0;i<rd;i++) p+=sprintf(p,"%u ",buf[i]); lprintf(LOG_DEBUG,"Node %d Telnet cmd from server: %s", cfg.node_num, dump); } #endif RingBufWrite(&outbuf,buf,rd); } console&=~CON_RAW_IN; telnet_mode&=~TELNET_MODE_GATE; /* Disable Telnet Terminal Echo */ request_telnet_opt(TELNET_WILL,TELNET_ECHO); close_socket(remote_socket); lprintf(LOG_INFO,"Node %d Telnet gate to %s finished",cfg.node_num,destaddr); }
int main(int ac, char **av) { char *cmd = *av; char *normalizer[MAX_NORMALIZER]; int nnormalizer = 0; const char *in_code = NULL; const char *out_code = NULL; char *resconf_file = NULL; int no_resconf = 0; char zld[256 + 1]; int zld_specified = 0; int auto_zld = 0; char *encoding_alias = NULL; int selective = 1; FILE *fp; mdn_resconf_t resconf; #ifdef HAVE_SETLOCALE (void)setlocale(LC_ALL, ""); #endif zld[0] = '\0'; ac--; av++; while (ac > 0 && **av == '-') { #define MUST_HAVE_ARG if (ac < 2) usage(cmd) if (strcmp(*av, "-in") == 0) { MUST_HAVE_ARG; in_code = av[1]; ac--; av++; } else if (strcmp(*av, "-out") == 0) { MUST_HAVE_ARG; out_code = av[1]; ac--; av++; } else if (strcmp(*av, "-conf") == 0) { MUST_HAVE_ARG; resconf_file = av[1]; ac--; av++; } else if (strcmp(*av, "-noconf") == 0) { no_resconf = 1; } else if (strcmp(*av, "-zld") == 0) { MUST_HAVE_ARG; canonical_zld(zld, av[1]); zld_specified = 1; ac--; av++; } else if (strcmp(*av, "-auto") == 0) { auto_zld = 1; } else if (strcmp(*av, "-normalize") == 0) { MUST_HAVE_ARG; if (nnormalizer >= MAX_NORMALIZER) { errormsg("too many normalizers\n"); exit(1); } normalizer[nnormalizer++] = av[1]; ac--; av++; } else if (strcmp(*av, "-alias") == 0) { MUST_HAVE_ARG; encoding_alias = *av; } else if (strcmp(*av, "-flush") == 0) { flush_every_line = 1; } else if (strcmp(*av, "-whole") == 0) { selective = 0; } else { usage(cmd); } #undef MUST_HAVE_ARG ac--; av++; } if (ac > 1) usage(cmd); /* * Load configuration file. */ resconf = NULL; if (!no_resconf) { mdn_result_t r; r = mdn_resconf_initialize(); if (r == mdn_success) r = mdn_resconf_create(&resconf); if (r == mdn_success) r = mdn_resconf_loadfile(resconf, resconf_file); if (r != mdn_success) { errormsg("error reading configuration file: %s\n", mdn_result_tostring(r)); return (1); } } /* * Get default input/output code. */ if (in_code == NULL) in_code = mdn_localencoding_name(); if (out_code == NULL) { mdn_converter_t c; if (resconf != NULL && (c = mdn_resconf_serverconverter(resconf)) != NULL) out_code = mdn_converter_localencoding(c); } if (in_code == NULL) { errormsg("input codeset must be specified\n"); return (1); } if (out_code == NULL) { errormsg("output codeset must be specified\n"); return (1); } /* * Initialize codeset converter. */ if (!initialize_converter(in_code, out_code, encoding_alias)) return (1); /* * Initialize normalizer. */ if (nnormalizer == 0 && resconf != NULL) norm_ctx = mdn_resconf_normalizer(resconf); if (norm_ctx == NULL && !initialize_normalizer(normalizer, nnormalizer)) return (1); /* * Default ZLD. */ if (!zld_specified && resconf != NULL) { const char *conf_zld = mdn_resconf_zld(resconf); if (conf_zld != NULL) canonical_zld(zld, conf_zld); } /* * Open input file. */ if (ac > 0) { if ((fp = fopen(av[0], "r")) == NULL) { errormsg("cannot open file %s: %s\n", av[0], strerror(errno)); return (1); } } else { fp = stdin; } /* * Do the conversion. */ return convert_file(fp, zld, auto_zld, selective); }
uint sbbs_t::finduser(char *instr) { int file,i; char str[128],str2[256],str3[256],ynq[25],c,pass=1; long l,length; FILE *stream; i=atoi(instr); if(i>0) { username(&cfg, i,str2); if(str2[0] && strcmp(str2,"DELETED USER")) return(i); } strcpy(str,instr); strupr(str); SAFEPRINTF(str3,"%suser/name.dat",cfg.data_dir); if(flength(str3)<1L) return(0); if((stream=fnopen(&file,str3,O_RDONLY))==NULL) { errormsg(WHERE,ERR_OPEN,str3,O_RDONLY); return(0); } SAFEPRINTF(ynq,"%.2s",text[YN]); ynq[2]='Q'; ynq[3]=0; length=(long)filelength(file); while(pass<3) { fseek(stream,0L,SEEK_SET); /* seek to beginning for each pass */ for(l=0;l<length;l+=LEN_ALIAS+2) { if(!online) break; fread(str2,LEN_ALIAS+2,1,stream); for(c=0;c<LEN_ALIAS;c++) if(str2[c]==ETX) break; str2[c]=0; if(!c) /* deleted user */ continue; strcpy(str3,str2); strupr(str2); if(pass==1 && !strcmp(str,str2)) { fclose(stream); return((l/(LEN_ALIAS+2))+1); } if(pass==2 && strstr(str2,str)) { bprintf(text[DoYouMeanThisUserQ],str3 ,(uint)(l/(LEN_ALIAS+2))+1); c=(char)getkeys(ynq,0); if(sys_status&SS_ABORT) { fclose(stream); return(0); } if(c==text[YN][0]) { fclose(stream); return((l/(LEN_ALIAS+2))+1); } if(c=='Q') { fclose(stream); return(0); } } } pass++; } bputs(text[UnknownUser]); fclose(stream); return(0); }
void savesheet(void) /* Saves the current spreadsheet */ { char filename[MAXINPUT+1], eof = 26; int size, col, row, overwrite, file; CELLPTR cellptr; filename[0] = 0; writeprompt(MSGFILENAME); if (!editstring(filename, "", MAXINPUT)) return; if (!access(filename, 0)) { if (!getyesno(&overwrite, MSGOVERWRITE) || (overwrite == 'N')) return; } if ((file = open(filename, O_RDWR | O_CREAT | O_TRUNC | O_BINARY, S_IREAD | S_IWRITE)) == -1) { errormsg(MSGNOOPEN); return; } writef(1, 25, PROMPTCOLOR, 79, MSGSAVING); gotoxy(strlen(MSGSAVING) + 1, 25); write(file, name, strlen(name) + 1); write(file, &eof, 1); write(file, (char *)&lastcol, 2); write(file, (char *)&lastrow, 2); size = MAXCOLS; write(file, (char *)&size, 2); write(file, colwidth, sizeof(colwidth)); for (row = 0; row <= lastrow; row++) { for (col = lastcol; col >= 0; col--) { if (cell[col][row] != NULL) { cellptr = cell[col][row]; switch(cellptr->attrib) { case TEXT : size = strlen(cellptr->v.text) + 2; break; case VALUE : size = sizeof(double) + 1; break; case FORMULA : size = strlen(cellptr->v.f.formula) + 2 + sizeof(double); break; } /* switch */ write(file, (char *)&col, 2); write(file, (char *)&row, 2); write(file, (char *)&format[col][row], 1); write(file, (char *)&size, 2); write(file, (char *)cellptr, size); } } } close(file); writef(1, 25, WHITE, strlen(MSGSAVING), ""); gotoxy(1, 25); changed = FALSE; } /* savesheet */