int tagconfs(void) { uint8_t backup[8]; char tbuf[500]; const char *sta; char inp[90]; const char *s; char tok[90]; conference_t *mc; struct iterator *iterator; int i; int screenl; for (i = 0; i < 8; i++) { backup[i] = selcfg[2048 + i]; } vagain: DDPut("[2J[H"); i = 0; screenl = user.user_screenlength; iterator = conference_iterator(); while ((mc = (conference_t *) iterator_next(iterator))) { if (checkconfaccess(mc->conf.CONF_NUMBER, &user)) { i++; if (i == 3) { DDPut("\n"); i = 1; screenl--; if (screenl == 1) { int hot; DDPut(sd[morepromptstr]); hot = HotKey(0); DDPut("\r \r"); if (hot == 'N' || hot == 'n' || !checkcarrier()) break; if (hot == 'C' || hot == 'c') { screenl = 20000000; } else { screenl = user.user_screenlength; } } } if (isconftagged(mc->conf.CONF_NUMBER)) { sta = "ON"; } else sta = "OFF"; ddprintf(sd[togglinestr], mc->conf.CONF_NUMBER, mc->conf.CONF_NAME, sta); } } iterator_discard(iterator); DDPut("\n"); for (;;) { DDPut(sd[tcpromptstr]); inp[0] = 0; if (!(Prompt(inp, 80, 0))) return 0; s = inp; if (!*inp) { strlcpy(inp, "s", sizeof inp); } for (;;) { if (strtoken(tok, &s, sizeof tok) > sizeof tok) continue; if (!*tok) break; if (!strcasecmp(tok, "c")) { for (i = 0; i < 8; i++) { selcfg[2048 + i] = backup[i]; } return 0; } else if (!strcasecmp(tok, "v")) { goto vagain; } else if (!strcasecmp(tok, "s")) { int selfd; snprintf(tbuf, sizeof tbuf, "users/%d/selected.dat", user.user_account_id); selfd = open(tbuf, O_WRONLY | O_CREAT, 0666); if (selfd != -1) { fsetperm(selfd, 0666); safe_write(selfd, &selcfg, 2056); close(selfd); } return 0; } else if (!strcasecmp(tok, "-")) { for (i = 0; i < 8; i++) { selcfg[2048 + i] = 0; } DDPut(sd[tcalloffstr]); } else if (!strcasecmp(tok, "+")) { for (i = 0; i < 8; i++) { selcfg[2048 + i] = 255; } DDPut(sd[tcallonstr]); } else { i = atoi(tok); if (i > 0 && i < 65 && checkconfaccess(i, &user)) { iterator = conference_iterator(); while ((mc = (conference_t *) iterator_next(iterator))) { if (mc->conf.CONF_NUMBER == i) { if (selcfg[2048 + (mc->conf.CONF_NUMBER - 1) / 8] & (1L << (mc->conf.CONF_NUMBER - 1) % 8)) { selcfg[2048 + (mc->conf.CONF_NUMBER - 1) / 8] &= ~(1L << (mc->conf.CONF_NUMBER - 1) % 8); } else { selcfg[2048 + (mc->conf.CONF_NUMBER - 1) / 8] |= (1L << (mc->conf.CONF_NUMBER - 1) % 8); } break; } } iterator_discard(iterator); } } } } }
/* build_target_list() * * inputs - pointer to given source (oper/client etc.) * - pointer to list of nicks/channels * - pointer to table to place results * - pointer to text (only used if source_p is an oper) * output - number of valid entities * side effects - target_table is modified to contain a list of * pointers to channels or clients * if source client is an oper * all the classic old bizzare oper privmsg tricks * are parsed and sent as is, if prefixed with $ * to disambiguate. * */ static int build_target_list(int p_or_n, const char *command, struct Client *source_p, char *nicks_channels, const char *text) { int type = 0; char *p = NULL, *nick = NULL; char *target_list = NULL; struct Channel *chptr = NULL; struct Client *target_p = NULL; target_list = nicks_channels; ntargets = 0; for (nick = strtoken(&p, target_list, ","); nick; nick = strtoken(&p, NULL, ",")) { const char *with_prefix = NULL; /* * Channels are privmsg'd a lot more than other clients, moved up * here plain old channel msg? */ if (IsChanPrefix(*nick)) { if ((chptr = hash_find_channel(nick))) { if (!duplicate_ptr(chptr)) { if (ntargets >= ConfigGeneral.max_targets) { sendto_one_numeric(source_p, &me, ERR_TOOMANYTARGETS, nick, ConfigGeneral.max_targets); return 1; } targets[ntargets].ptr = chptr; targets[ntargets++].type = ENTITY_CHANNEL; } } else { if (p_or_n != NOTICE) sendto_one_numeric(source_p, &me, ERR_NOSUCHNICK, nick); } continue; } /* Look for a PRIVMSG/NOTICE to another client */ if ((target_p = find_person(source_p, nick))) { if (!duplicate_ptr(target_p)) { if (ntargets >= ConfigGeneral.max_targets) { sendto_one_numeric(source_p, &me, ERR_TOOMANYTARGETS, nick, ConfigGeneral.max_targets); return 1; } targets[ntargets].ptr = target_p; targets[ntargets].type = ENTITY_CLIENT; targets[ntargets++].flags = 0; } continue; } /* @#channel or +#channel message ? */ type = 0; with_prefix = nick; /* Allow %+@ if someone wants to do that */ while (1) { if (*nick == '@') type |= CHFL_CHANOP; else if (*nick == '%') type |= CHFL_CHANOP | CHFL_HALFOP; else if (*nick == '+') type |= CHFL_CHANOP | CHFL_HALFOP | CHFL_VOICE; else break; ++nick; } if (type) { if (EmptyString(nick)) /* If it's a '\0' dump it, there is no recipient */ { sendto_one_numeric(source_p, &me, ERR_NORECIPIENT, command); continue; } /* * At this point, nick+1 should be a channel name i.e. #foo or &foo * if the channel is found, fine, if not report an error */ if ((chptr = hash_find_channel(nick))) { if (IsClient(source_p) && !HasFlag(source_p, FLAGS_SERVICE)) { if (!has_member_flags(find_channel_link(source_p, chptr), CHFL_CHANOP|CHFL_HALFOP|CHFL_VOICE)) { sendto_one_numeric(source_p, &me, ERR_CHANOPRIVSNEEDED, with_prefix); return -1; } } if (!duplicate_ptr(chptr)) { if (ntargets >= ConfigGeneral.max_targets) { sendto_one_numeric(source_p, &me, ERR_TOOMANYTARGETS, nick, ConfigGeneral.max_targets); return 1; } targets[ntargets].ptr = chptr; targets[ntargets].type = ENTITY_CHANOPS_ON_CHANNEL; targets[ntargets++].flags = type; } } else { if (p_or_n != NOTICE) sendto_one_numeric(source_p, &me, ERR_NOSUCHNICK, nick); } continue; } if (*nick == '$' || strchr(nick, '@')) handle_special(p_or_n, command, source_p, nick, text); else { if (p_or_n != NOTICE) { if (!IsDigit(*nick) || MyClient(source_p)) sendto_one_numeric(source_p, &me, ERR_NOSUCHNICK, nick); } } } return 1; }
int download(const char *params) { char parbuf[512]; char bigbuf[10000]; const char *srcstrh; int discon = 0; struct FFlag *myf; FILE *listh; char lastfile[100]; int keepc = 1; bgrun = 0; wasbg = 0; setprotocol(); changenodestatus("Downloading"); TypeFile("download", TYPE_MAKE | TYPE_CONF | TYPE_WARN); if (!conference()->conf.CONF_FILEAREAS) { DDPut(sd[dlnoareasstr]); return 0; } if ((protocol->PROTOCOL_TYPE == 3 || protocol->PROTOCOL_TYPE == 2) && !conference()->conf.CONF_UPLOADAREA) { DDPut(sd[dlnouploadsstr]); return 0; } if (protocol->PROTOCOL_TYPE == 2 || protocol->PROTOCOL_TYPE == 3) { if (cleantemp() == -1) { DDPut(sd[tempcleanerrstr]); return 0; } if (!freespace()) return 0; maketmplist(); } srcstrh = params; for (;;) { if (strtoken(parbuf, &srcstrh, sizeof parbuf) > sizeof parbuf) continue; if (!*parbuf) break; flagfile(parbuf, 1); } for (;;) { typedlprompt(); bigbuf[0] = 0; if (!(Prompt(bigbuf, 200, 0))) return 0; if (!bigbuf[0]) { break; } else if (!strcasecmp(bigbuf, "a")) { return 0; } else { srcstrh = bigbuf; for (;;) { if (strtoken(parbuf, &srcstrh, sizeof parbuf) > sizeof parbuf) continue; if (!*parbuf) break; flagfile(parbuf, 1); } } } if (!filestagged) return 0; listtags(); if (estimsecs(bytestagged) > timeleft) { DDPut(sd[dlnotimestr]); return 0; } for (;;) { DDPut(sd[dlproceedstr]); bigbuf[0] = 0; if (!(Prompt(bigbuf, 3, 0))) return 0; if (!bigbuf[0] || bigbuf[0] == 'p' || bigbuf[0] == 'P') break; else if (bigbuf[0] == 'e' || bigbuf[0] == 'E') { taged(0); } else if (bigbuf[0] == 'd' || bigbuf[0] == 'D') { discon = 1; break; } else if (bigbuf[0] == 'a' || bigbuf[0] == 'A') { return 0; } } snprintf(parbuf, sizeof parbuf, "%s/dszlog.%d", DDTMP, node); sprintf(&parbuf[250], "%s/ddfilelist.%d", DDTMP, node); unlink(&parbuf[250]); if (!(listh = fopen(&parbuf[250], "w"))) return 0; myf = (struct FFlag *) flaggedfiles->lh_Head; while (myf->fhead.ln_Succ) { char tbu[256]; snprintf(tbu, sizeof tbu, "%s%s\n", myf->f_path, myf->f_filename); fputs(tbu, listh); myf = (struct FFlag *) myf->fhead.ln_Succ; } fclose(listh); *lastfile = 0; if (protocol->PROTOCOL_TYPE == 2 || protocol->PROTOCOL_TYPE == 3) { if ((!(user.user_toggles & (1L << 15))) && (maincfg.CFG_FLAGS & (1L << 11))) { initbgchecker(); } } sendfiles(&parbuf[250], lastfile, sizeof lastfile); if (protocol->PROTOCOL_TYPE == 2 || protocol->PROTOCOL_TYPE == 3) { upload(2); } if (*lastfile) { myf = (struct FFlag *) flaggedfiles->lh_Head; while (myf->fhead.ln_Succ && keepc) { struct FFlag *oldf; struct DD_DownloadLog ddl; char lbuf[100]; int logfd; snprintf(lbuf, sizeof lbuf, "%s/logfiles/downloadlog.dat", origdir); logfd = open(lbuf, O_WRONLY | O_CREAT, 0666); if (logfd != -1) { fsetperm(logfd, 0666); memset((char *) &ddl, 0, sizeof(struct DD_DownloadLog)); ddl.DL_SLOT = user.user_account_id; strlcpy(ddl.DL_FILENAME, myf->f_filename, sizeof ddl.DL_FILENAME); ddl.DL_FILESIZE = myf->f_size; ddl.DL_TIME = time(0); ddl.DL_BPSRATE = bpsrate; ddl.DL_NODE = node; ddl.DL_CONF = (unsigned char) myf->f_conf; lseek(logfd, 0, SEEK_END); safe_write(logfd, &ddl, sizeof(struct DD_DownloadLog)); close(logfd); } if (!(myf->f_flags & FLAG_FREE)) { user.user_dlbytes += myf->f_size; user.user_dlfiles++; } if (!strcasecmp(lastfile, myf->f_filename)) keepc = 0; Remove((struct Node *) myf); oldf = myf; myf = (struct FFlag *) myf->fhead.ln_Succ; free(oldf); } } recountfiles(); unlink(&parbuf[250]); if (discon) { if (autodisconnect()) return 2; } return 1; }
int IntStateQuery() { /* qstat -f Job Id: 11.cream-12.pd.infn.it Job_Name = cream_579184706 job_state = R ctime = Wed Apr 23 11:39:55 2008 exec_host = cream-wn-029.pn.pd.infn.it/0 */ /* Filled entries: batch_id wn_addr status udate Filled by submit script: blah_id Unfilled entries: exitreason */ FILE *fp; char *line=NULL; char **token; int maxtok_t=0; job_registry_entry en; int ret; char *timestamp; time_t tmstampepoch; char *batch_str=NULL; char *wn_str=NULL; char *twn_str=NULL; char *status_str=NULL; char *ex_str=NULL; int ex_code=0; char *cp=NULL; char *command_string=NULL; job_registry_entry *ren=NULL; int first=TRUE; time_t now; char *string_now=NULL; command_string=make_message("%s%s/qstat -f",batch_command,pbs_binpath); fp = popen(command_string,"r"); en.status=UNDEFINED; JOB_REGISTRY_ASSIGN_ENTRY(en.wn_addr,"\0"); JOB_REGISTRY_ASSIGN_ENTRY(en.exitreason,"\0"); JOB_REGISTRY_ASSIGN_ENTRY(en.updater_info,"\0"); en.exitcode=-1; bupdater_free_active_jobs(&bact); if(fp!=NULL){ while(!feof(fp) && (line=get_line(fp))){ if(line && strlen(line)==0){ free(line); continue; } if ((cp = strrchr (line, '\n')) != NULL){ *cp = '\0'; } do_log(debuglogfile, debug, 3, "%s: line in IntStateQuery is:%s\n",argv0,line); now=time(0); string_now=make_message("%d",now); if(line && strstr(line,"Job Id: ")){ if(!first && en.status!=UNDEFINED && ren && ren->status!=REMOVED && ren->status!=COMPLETED){ if ((ret=job_registry_update_recn_select(rha, &en, ren->recnum, JOB_REGISTRY_UPDATE_WN_ADDR| JOB_REGISTRY_UPDATE_STATUS| JOB_REGISTRY_UPDATE_UDATE| JOB_REGISTRY_UPDATE_UPDATER_INFO| JOB_REGISTRY_UPDATE_EXITCODE| JOB_REGISTRY_UPDATE_EXITREASON)) < 0){ if(ret != JOB_REGISTRY_NOT_FOUND){ fprintf(stderr,"Update of record returns %d: ",ret); perror(""); } } else { if(ret==JOB_REGISTRY_SUCCESS){ if (en.status == REMOVED || en.status == COMPLETED) { do_log(debuglogfile, debug, 2, "%s: registry update in IntStateQuery for: jobid=%s wn=%s status=%d exitcode=%d\n",argv0,en.batch_id,en.wn_addr,en.status,en.exitcode); job_registry_unlink_proxy(rha, &en); }else{ do_log(debuglogfile, debug, 2, "%s: registry update in IntStateQuery for: jobid=%s wn=%s status=%d\n",argv0,en.batch_id,en.wn_addr,en.status); } } if (remupd_conf != NULL){ if (ret=job_registry_send_update(remupd_head_send,&en,NULL,NULL)<=0){ do_log(debuglogfile, debug, 2, "%s: Error creating endpoint in IntStateQuery\n",argv0); } } } en.status = UNDEFINED; JOB_REGISTRY_ASSIGN_ENTRY(en.wn_addr,"\0"); JOB_REGISTRY_ASSIGN_ENTRY(en.exitreason,"\0"); JOB_REGISTRY_ASSIGN_ENTRY(en.updater_info,"\0"); en.exitcode=-1; } maxtok_t = strtoken(line, ':', &token); batch_str=strdel(token[1]," "); JOB_REGISTRY_ASSIGN_ENTRY(en.batch_id,batch_str); JOB_REGISTRY_ASSIGN_ENTRY(en.updater_info,string_now); en.exitcode=-1; bupdater_push_active_job(&bact, en.batch_id); free(batch_str); freetoken(&token,maxtok_t); if(!first) free(ren); if ((ren=job_registry_get(rha, en.batch_id)) == NULL){ fprintf(stderr,"Get of record returns error for %s ",en.batch_id); perror(""); } first=FALSE; }else if(line && strstr(line,"job_state = ")){ maxtok_t = strtoken(line, '=', &token); status_str=strdel(token[1]," "); if(status_str && strcmp(status_str,"Q")==0){ en.status=IDLE; en.exitcode=-1; JOB_REGISTRY_ASSIGN_ENTRY(en.wn_addr,"\0"); }else if(status_str && strcmp(status_str,"W")==0){ en.status=IDLE; en.exitcode=-1; }else if(status_str && strcmp(status_str,"R")==0){ en.status=RUNNING; en.exitcode=-1; }else if(status_str && strcmp(status_str,"C")==0){ en.status=COMPLETED; JOB_REGISTRY_ASSIGN_ENTRY(en.exitreason,"\0"); }else if(status_str && strcmp(status_str,"H")==0){ en.status=HELD; en.exitcode=-1; JOB_REGISTRY_ASSIGN_ENTRY(en.wn_addr,"\0"); } free(status_str); freetoken(&token,maxtok_t); }else if(line && strstr(line,"unable to run job")){ en.status=IDLE; en.exitcode=-1; }else if(line && strstr(line,"exit_status = ")){ maxtok_t = strtoken(line, '=', &token); ex_str=strdel(token[1]," "); ex_code=atoi(ex_str); if(ex_code==0){ en.exitcode=0; }else if(ex_code==271){ en.status=REMOVED; en.exitcode=-999; }else{ en.exitcode=ex_code; } free(ex_str); freetoken(&token,maxtok_t); }else if(line && strstr(line,"exec_host = ")){ maxtok_t = strtoken(line, '=', &token); twn_str=strdup(token[1]); if(twn_str == NULL){ sysfatal("strdup failed for twn_str in IntStateQuery: %r"); } freetoken(&token,maxtok_t); maxtok_t = strtoken(twn_str, '/', &token); wn_str=strdel(token[0]," "); JOB_REGISTRY_ASSIGN_ENTRY(en.wn_addr,wn_str); free(twn_str); free(wn_str); freetoken(&token,maxtok_t); }else if(line && strstr(line,"mtime = ")){ maxtok_t = strtoken(line, ' ', &token); timestamp=make_message("%s %s %s %s %s",token[2],token[3],token[4],token[5],token[6]); tmstampepoch=str2epoch(timestamp,"L"); free(timestamp); en.udate=tmstampepoch; freetoken(&token,maxtok_t); } free(line); free(string_now); } pclose(fp); } if(en.status!=UNDEFINED && ren && ren->status!=REMOVED && ren->status!=COMPLETED){ if ((ret=job_registry_update_recn_select(rha, &en, ren->recnum, JOB_REGISTRY_UPDATE_WN_ADDR| JOB_REGISTRY_UPDATE_STATUS| JOB_REGISTRY_UPDATE_UDATE| JOB_REGISTRY_UPDATE_UPDATER_INFO| JOB_REGISTRY_UPDATE_EXITCODE| JOB_REGISTRY_UPDATE_EXITREASON)) < 0){ if(ret != JOB_REGISTRY_NOT_FOUND){ fprintf(stderr,"Update of record returns %d: ",ret); perror(""); } } else { if(ret==JOB_REGISTRY_SUCCESS){ if (en.status == REMOVED || en.status == COMPLETED) { do_log(debuglogfile, debug, 2, "%s: registry update in IntStateQuery for: jobid=%s wn=%s status=%d exitcode=%d\n",argv0,en.batch_id,en.wn_addr,en.status,en.exitcode); job_registry_unlink_proxy(rha, &en); }else{ do_log(debuglogfile, debug, 2, "%s: registry update in IntStateQuery for: jobid=%s wn=%s status=%d\n",argv0,en.batch_id,en.wn_addr,en.status); } } if (remupd_conf != NULL){ if (ret=job_registry_send_update(remupd_head_send,&en,NULL,NULL)<=0){ do_log(debuglogfile, debug, 2, "%s: Error creating endpoint in IntStateQuery\n",argv0); } } } } free(ren); free(command_string); return 0; }
/* ** m_whowas ** parv[0] = sender prefix ** parv[1] = nickname queried */ int m_whowas(aClient *cptr, aClient *sptr, int parc, char *parv[]) { Reg aName *wp, *wp2 = NULL; Reg int j = 0; Reg anUser *up = NULL; int max = -1; char *p = NULL, *nick, *s; if (parc < 2) { sendto_one(sptr, replies[ERR_NONICKNAMEGIVEN], ME, BadTo(parv[0])); return 1; } if (parc > 2) max = atoi(parv[2]); if (parc > 3) if (hunt_server(cptr,sptr,":%s WHOWAS %s %s :%s", 3,parc,parv)) return 3; parv[1] = canonize(parv[1]); if (!MyConnect(sptr)) max = MIN(max, 20); for (s = parv[1]; (nick = strtoken(&p, s, ",")); s = NULL) { wp = wp2 = &was[(ww_index ? ww_index : ww_size) - 1]; j = 0; do { if (mycmp(nick, wp->ww_nick) == 0) { up = wp->ww_user; sendto_one(sptr, replies[RPL_WHOWASUSER], ME, BadTo(parv[0]), wp->ww_nick, up->username, up->host, wp->ww_info); sendto_one(sptr, replies[RPL_WHOISSERVER], ME, BadTo(parv[0]), wp->ww_nick, up->server, myctime(wp->ww_logout)); j++; } if (max > 0 && j >= max) break; if (wp == was) wp = &was[ww_size - 1]; else wp--; } while (wp != wp2); if (up == NULL) { if (strlen(nick) > (size_t) NICKLEN) nick[NICKLEN] = '\0'; sendto_one(sptr, replies[ERR_WASNOSUCHNICK], ME, BadTo(parv[0]), nick); } else up = NULL; if (p) p[-1] = ','; } sendto_one(sptr, replies[RPL_ENDOFWHOWAS], ME, BadTo(parv[0]), parv[1]); return 2; }
static int build_target_list(int p_or_n, char *command, struct Client *client_p, struct Client *source_p, char *nicks_channels, char *text) { int type; char *p, *nick, *target_list, ncbuf[BUFSIZE]; struct Channel *chptr=NULL; struct Client *target_p; /* Sigh, we can't mutilate parv[1] incase we need it to send to a hub */ if (!ServerInfo.hub && (uplink != NULL) && IsCapable(uplink, CAP_LL)) { strncpy(ncbuf, nicks_channels, BUFSIZE); target_list = ncbuf; } else target_list = nicks_channels; /* skip strcpy for non-lazyleafs */ ntargets = 0; for (nick = strtoken(&p, target_list, ","); nick; nick = strtoken(&p, (char *)NULL, ",")) { char *with_prefix; /* * channels are privmsg'd a lot more than other clients, moved up * here plain old channel msg? */ if (IsChanPrefix(*nick)) { /* ignore send of local channel to a server (should not happen) */ if (IsServer(client_p) && *nick == '&') continue; if ((chptr = hash_find_channel(nick)) != NULL) { if (!duplicate_ptr(chptr)) { if (ntargets >= ConfigFileEntry.max_targets) { sendto_one(source_p, form_str(source_p,ERR_TOOMANYTARGETS), me.name, source_p->name, nick); return (1); } targets[ntargets].ptr = (void *)chptr; targets[ntargets++].type = ENTITY_CHANNEL; } } else { if (!ServerInfo.hub && (uplink != NULL) && IsCapable(uplink, CAP_LL)) return -1; else if (p_or_n != NOTICE) sendto_one(source_p, form_str(source_p,ERR_NOSUCHNICK), me.name, source_p->name, nick); } continue; } /* look for a privmsg to another client */ if ((target_p = find_person(nick)) != NULL) { if (!duplicate_ptr(target_p)) { if (ntargets >= ConfigFileEntry.max_targets) { sendto_one(source_p, form_str(source_p,ERR_TOOMANYTARGETS), me.name, source_p->name, nick); return (1); } targets[ntargets].ptr = (void *)target_p; targets[ntargets].type = ENTITY_CLIENT; targets[ntargets++].flags = 0; } continue; } /* @#channel or +#channel message ? */ type = 0; with_prefix = nick; /* allow %+@ if someone wants to do that */ for (;;) { if (*nick == '@') type |= MODE_CHANOP; else if (*nick == '%') type |= MODE_CHANOP | MODE_HALFOP; else if (*nick == '+') type |= MODE_CHANOP | MODE_HALFOP | MODE_VOICE; else break; nick++; } if (type != 0) { /* suggested by Mortiis */ if (*nick == '\0') /* if its a '\0' dump it, there is no recipient */ { sendto_one(source_p, form_str(source_p,ERR_NORECIPIENT), me.name, source_p->name, command); continue; } /* At this point, nick+1 should be a channel name i.e. #foo or &foo * if the channel is found, fine, if not report an error */ if ((chptr = hash_find_channel(nick)) != NULL) { if(!is_any_op(chptr, source_p) && !is_voiced(chptr, source_p)) { sendto_one(source_p, form_str(source_p,ERR_CHANOPRIVSNEEDED), me.name, source_p->name, with_prefix); return(-1); } if (!duplicate_ptr(chptr)) { if (ntargets >= ConfigFileEntry.max_targets) { sendto_one(source_p, form_str(source_p,ERR_TOOMANYTARGETS), me.name, source_p->name, nick); return (1); } targets[ntargets].ptr = (void *)chptr; targets[ntargets].type = ENTITY_CHANOPS_ON_CHANNEL; targets[ntargets++].flags = type; } } else { if (!ServerInfo.hub && (uplink != NULL) && IsCapable(uplink, CAP_LL)) return -1; else if (p_or_n != NOTICE) sendto_one(source_p, form_str(source_p,ERR_NOSUCHNICK), me.name, source_p->name, nick); } continue; } if(IsOper(source_p) && ((*nick == '$') || strchr(nick, '@'))) { handle_opers(p_or_n, command, client_p, source_p, nick, text); } else { if (!ServerInfo.hub && (uplink != NULL) && IsCapable(uplink, CAP_LL)) return -1; else if(p_or_n != NOTICE) sendto_one(source_p, form_str(source_p,ERR_NOSUCHNICK), me.name, source_p->name, nick); } /* continue; */ } return (1); }
/* * mr_capab - CAPAB message handler * parv[0] = sender prefix * parv[1] = space-separated list of capabilities * */ static void mr_capab(struct Client *client_p, struct Client *source_p, int parc, char *parv[]) { int i; int cap; char *p; char *s; #ifdef HAVE_LIBCRYPTO struct EncCapability *ecap; unsigned int cipher = 0; #endif /* ummm, this shouldn't happen. Could argue this should be logged etc. */ if (client_p->localClient == NULL) return; if (client_p->localClient->caps && !(IsCapable(client_p, CAP_TS6))) { exit_client(client_p, client_p, "CAPAB received twice"); return; } else SetCapable(client_p, CAP_CAP); for (i = 1; i < parc; i++) { for (s = strtoken(&p, parv[i], " "); s; s = strtoken(&p, NULL, " ")) { #ifdef HAVE_LIBCRYPTO if ((strncmp(s, "ENC:", 4) == 0)) { /* Skip the "ENC:" portion */ s += 4; /* Check the remaining portion against the list of ciphers we * have available (CipherTable). */ for (ecap = CipherTable; ecap->name; ecap++) { if ((irccmp(ecap->name, s) == 0) && (ecap->cap & CAP_ENC_MASK)) { cipher = ecap->cap; break; } } /* Since the name and capabilities matched, use it. */ if (cipher != 0) { SetCapable(client_p, CAP_ENC); client_p->localClient->enc_caps |= cipher; } else { /* cipher is still zero; we didn't find a matching entry. */ exit_client(client_p, client_p, "Cipher selected is not available here."); return; } } else /* normal capab */ #endif if ((cap = find_capability(s)) != 0) SetCapable(client_p, cap); } } }
static void do_list(struct Client *source_p, int parc, char *parv[]) { struct ListTask *lt; int no_masked_channels; if (MyConnect(source_p)) { if (source_p->localClient->list_task != NULL) { free_list_task(source_p->localClient->list_task, source_p); sendto_one(source_p, form_str(RPL_LISTEND), me.name, source_p->name); return; } } lt = (struct ListTask *) MyMalloc(sizeof(struct ListTask)); lt->users_max = UINT_MAX; lt->created_max = UINT_MAX; lt->topicts_max = UINT_MAX; if (MyConnect(source_p)) source_p->localClient->list_task = lt; no_masked_channels = 1; if (parc > 1) { char *opt, *save; dlink_list *list; int i, errors = 0; for (opt = strtoken(&save, parv[1], ","); opt != NULL; opt = strtoken(&save, NULL, ",")) switch (*opt) { case '<': if ((i = atoi(opt + 1)) > 0) lt->users_max = (unsigned int) i - 1; else errors = 1; break; case '>': if ((i = atoi(opt + 1)) >= 0) lt->users_min = (unsigned int) i + 1; else errors = 1; break; case '-': break; case 'C': case 'c': switch (*++opt) { case '<': if ((i = atoi(opt + 1)) >= 0) lt->created_max = (unsigned int) (CurrentTime - 60 * i); else errors = 1; break; case '>': if ((i = atoi(opt + 1)) >= 0) lt->created_min = (unsigned int) (CurrentTime - 60 * i); else errors = 1; break; default: errors = 1; } break; case 'T': case 't': switch (*++opt) { case '<': if ((i = atoi(opt + 1)) >= 0) lt->topicts_min = (unsigned int) (CurrentTime - 60 * i); else errors = 1; break; case '>': if ((i = atoi(opt + 1)) >= 0) lt->topicts_max = (unsigned int) (CurrentTime - 60 * i); else errors = 1; break; default: errors = 1; } break; default: if (*opt == '!') { list = <->hide_mask; opt++; } else list = <->show_mask; if (has_wildcards(opt + !!IsChanPrefix(*opt))) { if (list == <->show_mask) no_masked_channels = 0; } else if (!IsChanPrefix(*opt)) errors = 1; if (!errors) { char *s; DupString(s, opt); dlinkAdd(s, make_dlink_node(), list); } } if (errors) { free_list_task(lt, source_p); sendto_one(source_p, form_str(ERR_LISTSYNTAX), MyConnect(source_p) ? me.name : ID(&me), MyConnect(source_p) ? source_p->name : ID(source_p)); return; } } if (MyConnect(source_p)) dlinkAdd(source_p, make_dlink_node(), &listing_client_list); sendto_one(source_p, form_str(RPL_LISTSTART), MyConnect(source_p) ? me.name : ID(&me), MyConnect(source_p) ? source_p->name : ID(source_p)); safe_list_channels(source_p, lt, no_masked_channels && lt->show_mask.head != NULL, !MyConnect(source_p)); }
/* m_sajoin() - Lamego - Wed Jul 21 20:04:48 1999 Copied off PTlink IRCd (C) PTlink coders team. Coded for Sadmin by Stskeeps also Modified by NiQuiL ([email protected]) parv[0] - sender parv[1] - nick to make join parv[2] - channel(s) to join */ DLLFUNC CMD_FUNC(m_sajoin) { aClient *acptr; char jbuf[BUFSIZE]; int did_anything = 0; if (!IsSAdmin(sptr) && !IsULine(sptr)) { sendto_one(sptr, err_str(ERR_NOPRIVILEGES), me.name, parv[0]); return 0; } if (parc < 3) { sendto_one(sptr, err_str(ERR_NEEDMOREPARAMS), me.name, parv[0], "SAJOIN"); return 0; } if (!(acptr = find_person(parv[1], NULL))) { sendto_one(sptr, err_str(ERR_NOSUCHNICK), me.name, parv[0], parv[1]); return 0; } if (MyClient(acptr)) { char *name, *p = NULL; int i, parted = 0; *jbuf = 0; /* Now works like m_join */ for (i = 0, name = strtoken(&p, parv[2], ","); name; name = strtoken(&p, NULL, ",")) { aChannel *chptr; Membership *lp; if (strlen(name) > CHANNELLEN) name[CHANNELLEN] = 0; clean_channelname(name); if (*name == '0' && !atoi(name)) { (void)strcpy(jbuf, "0"); i = 1; parted = 1; continue; } if (check_channelmask(sptr, cptr, name) == -1 || *name == '0' || !IsChannelName(name)) { sendto_one(sptr, err_str(ERR_NOSUCHCHANNEL), me.name, parv[0], name); continue; } chptr = get_channel(acptr, name, 0); if (!parted && chptr && (lp = find_membership_link(acptr->user->channel, chptr))) { sendto_one(sptr, err_str(ERR_USERONCHANNEL), me.name, parv[0], parv[1], name); continue; } if (*jbuf) (void)strlcat(jbuf, ",", sizeof jbuf); (void)strlncat(jbuf, name, sizeof jbuf, sizeof(jbuf) - i - 1); i += strlen(name) + 1; } if (!*jbuf) return -1; i = 0; strcpy(parv[2], jbuf); *jbuf = 0; for (name = strtoken(&p, parv[2], ","); name; name = strtoken(&p, NULL, ",")) { int flags; aChannel *chptr; Membership *lp; if (*name == '0' && !atoi(name)) { did_anything = 1; while ((lp = acptr->user->channel)) { chptr = lp->chptr; sendto_channel_butserv(chptr, acptr, ":%s PART %s :%s", acptr->name, chptr->chname, "Left all channels"); if (MyConnect(acptr)) RunHook4(HOOKTYPE_LOCAL_PART, acptr, acptr, chptr, "Left all channels"); remove_user_from_channel(acptr, chptr); } sendto_serv_butone_token(acptr, acptr->name, MSG_JOIN, TOK_JOIN, "0"); strcpy(jbuf, "0"); i = 1; continue; } flags = (ChannelExists(name)) ? CHFL_DEOPPED : CHFL_CHANOP; chptr = get_channel(acptr, name, CREATE); if (chptr && (lp = find_membership_link(acptr->user->channel, chptr))) continue; if ((chptr->mode.mode & MODE_ONLYSECURE) && !IsSecure(acptr)) { sendnotice(sptr, "You cannot SAJOIN %s to %s because the channel is +z and the user is not connected via SSL", acptr->name, chptr->chname); continue; } join_channel(chptr, acptr, acptr, flags); did_anything = 1; if (*jbuf) (void)strlcat(jbuf, ",", sizeof jbuf); (void)strlncat(jbuf, name, sizeof jbuf, sizeof(jbuf) - i - 1); i += strlen(name) + 1; } if (did_anything) { sendnotice(acptr, "*** You were forced to join %s", jbuf); sendto_realops("%s used SAJOIN to make %s join %s", sptr->name, acptr->name, jbuf); sendto_serv_butone(&me, ":%s GLOBOPS :%s used SAJOIN to make %s join %s", me.name, sptr->name, acptr->name, jbuf); /* Logging function added by XeRXeS */ ircd_log(LOG_SACMDS,"SAJOIN: %s used SAJOIN to make %s join %s", sptr->name, parv[1], jbuf); } } else { sendto_one(acptr, ":%s SAJOIN %s %s", parv[0], parv[1], parv[2]); /* Logging function added by XeRXeS */ ircd_log(LOG_SACMDS,"SAJOIN: %s used SAJOIN to make %s join %s", sptr->name, parv[1], parv[2]); } return 0; }
int IntStateQuery() { FILE *fp; char *line=NULL; char **token; char **token_l; char **token_e; int maxtok_t=0; int maxtok_l=0; int maxtok_e=0; job_registry_entry en; int ret; time_t tmstampepoch; char *cp=NULL; char *batch_str=NULL; char *command_string=NULL; job_registry_entry *ren=NULL; int isresumed=FALSE; int first=TRUE; time_t now; char *string_now=NULL; command_string=make_message("%s/scontrol -a show jobid",slurm_binpath); fp = popen(command_string,"r"); en.status=UNDEFINED; JOB_REGISTRY_ASSIGN_ENTRY(en.wn_addr,"\0"); JOB_REGISTRY_ASSIGN_ENTRY(en.exitreason,"\0"); JOB_REGISTRY_ASSIGN_ENTRY(en.updater_info,"\0"); en.exitcode=-1; bupdater_free_active_jobs(&bact); if(fp!=NULL){ while(!feof(fp) && (line=get_line(fp))){ if(line && strlen(line)==0){ free(line); continue; } if ((cp = strrchr (line, '\n')) != NULL){ *cp = '\0'; } do_log(debuglogfile, debug, 3, "%s: line in IntStateQuery is:%s\n",argv0,line); now=time(0); string_now=make_message("%d",now); maxtok_t = strtoken(line, ' ', &token); if(line && strstr(line,"JobId=")){ isresumed=FALSE; if(!first && en.status!=UNDEFINED && ren && ren->status!=REMOVED && ren->status!=COMPLETED){ if ((ret=job_registry_update_recn_select(rha, &en, ren->recnum, JOB_REGISTRY_UPDATE_WN_ADDR| JOB_REGISTRY_UPDATE_STATUS| JOB_REGISTRY_UPDATE_UDATE| JOB_REGISTRY_UPDATE_UPDATER_INFO| JOB_REGISTRY_UPDATE_EXITCODE| JOB_REGISTRY_UPDATE_EXITREASON)) < 0){ if(ret != JOB_REGISTRY_NOT_FOUND){ fprintf(stderr,"Update of record returns %d: ",ret); perror(""); } } else { if(ret==JOB_REGISTRY_SUCCESS){ if (en.status == REMOVED || en.status == COMPLETED) { do_log(debuglogfile, debug, 2, "%s: registry update in IntStateQuery for: jobid=%s creamjobid=%s wn=%s status=%d exitcode=%d\n",argv0,en.batch_id,en.user_prefix,en.wn_addr,en.status,en.exitcode); job_registry_unlink_proxy(rha, &en); }else{ do_log(debuglogfile, debug, 2, "%s: registry update in IntStateQuery for: jobid=%s creamjobid=%s wn=%s status=%d\n",argv0,en.batch_id,en.user_prefix,en.wn_addr,en.status); } if (remupd_conf != NULL){ if ((ret=job_registry_send_update(remupd_head_send,&en,NULL,NULL))<=0){ do_log(debuglogfile, debug, 2, "%s: Error creating endpoint in IntStateQuery\n",argv0); } } } } en.status = UNDEFINED; JOB_REGISTRY_ASSIGN_ENTRY(en.exitreason,"\0"); JOB_REGISTRY_ASSIGN_ENTRY(en.updater_info,"\0"); JOB_REGISTRY_ASSIGN_ENTRY(en.wn_addr,"\0"); en.exitcode=-1; } en.status = UNDEFINED; maxtok_l = strtoken(token[0], '=', &token_l); batch_str=strdup(token_l[1]); JOB_REGISTRY_ASSIGN_ENTRY(en.batch_id,batch_str); JOB_REGISTRY_ASSIGN_ENTRY(en.updater_info,string_now); en.exitcode=-1; bupdater_push_active_job(&bact, en.batch_id); do_log(debuglogfile, debug, 4, "%s: bupdater_push_active_job done for %s\n",argv0,en.batch_id); free(batch_str); freetoken(&token_l,maxtok_l); if(!first) free(ren); if ((ren=job_registry_get(rha, en.batch_id)) == NULL){ fprintf(stderr,"Get of record returns error "); perror(""); } if(ren){ if(strlen(ren->updater_info)>0){ en.udate=ren->udate; }else{ en.udate=time(0); } } first=FALSE; }else if(line && strstr(line," JobState=")){ if(token[0] && strstr(line,"JobState=")){ maxtok_l = strtoken(token[0], '=', &token_l); if(token_l[1] && strstr(token_l[1],"PENDING")){ en.status=IDLE; en.exitcode=-1; JOB_REGISTRY_ASSIGN_ENTRY(en.updater_info,string_now); }else if(token_l[1] && strstr(token_l[1],"RUNNING")){ en.status=RUNNING; en.exitcode=-1; JOB_REGISTRY_ASSIGN_ENTRY(en.updater_info,string_now); }else if(token_l[1] && strstr(token_l[1],"COMPLETED")){ en.status=COMPLETED; en.exitcode=0; JOB_REGISTRY_ASSIGN_ENTRY(en.updater_info,string_now); }else if(token_l[1] && strstr(token_l[1],"CANCELLED")){ en.status=REMOVED; en.exitcode=-999; JOB_REGISTRY_ASSIGN_ENTRY(en.updater_info,string_now); }else if(token_l[1] && strstr(token_l[1],"FAILED")){ en.status=COMPLETED; en.exitcode=0; JOB_REGISTRY_ASSIGN_ENTRY(en.updater_info,string_now); }else if(token_l[1] && strstr(token_l[1],"SUSPENDED")){ en.status=HELD; en.exitcode=-1; JOB_REGISTRY_ASSIGN_ENTRY(en.updater_info,string_now); }else if(token_l[1] && strstr(token_l[1],"COMPLETING")){ bupdater_remove_active_job(&bact, en.batch_id); } freetoken(&token_l,maxtok_l); } }else if(line && strstr(line," BatchHost=")){ if(token[0] && strstr(line,"BatchHost=")){ maxtok_l = strtoken(token[0], '=', &token_l); if(en.status!=IDLE){ JOB_REGISTRY_ASSIGN_ENTRY(en.wn_addr,token_l[1]); } freetoken(&token_l,maxtok_l); } }else if(line && strstr(line," ExitCode=")){ if(token[3] && strstr(line,"ExitCode=")){ maxtok_l = strtoken(token[3], '=', &token_l); maxtok_e = strtoken(token_l[1], ':', &token_e); if(en.status==COMPLETED){ en.exitcode=atoi(token_e[0]); } freetoken(&token_l,maxtok_l); freetoken(&token_e,maxtok_e); } }else if(line && strstr(line," SubmitTime=")){ if(en.status==IDLE){ if(token[0] && strstr(line,"SubmitTime=")){ maxtok_l = strtoken(token[0], '=', &token_l); tmstampepoch=str2epoch(token_l[1],"N"); en.udate=tmstampepoch; freetoken(&token_l,maxtok_l); } } }else if(line && strstr(line," StartTime=")){ if(en.status==RUNNING){ if(token[0] && strstr(line,"StartTime=")){ maxtok_l = strtoken(token[0], '=', &token_l); tmstampepoch=str2epoch(token_l[1],"N"); en.udate=tmstampepoch; freetoken(&token_l,maxtok_l); } } if(en.status==COMPLETED || en.status==REMOVED){ if(token[1] && strstr(line,"EndTime=")){ maxtok_l = strtoken(token[1], '=', &token_l); tmstampepoch=str2epoch(token_l[1],"N"); en.udate=tmstampepoch; freetoken(&token_l,maxtok_l); } } }else if(line && strstr(line," SuspendTime=")){ if(en.status==HELD){ if(token[1] && strstr(line,"SuspendTime=")){ maxtok_l = strtoken(token[1], '=', &token_l); tmstampepoch=str2epoch(token_l[1],"N"); en.udate=tmstampepoch; freetoken(&token_l,maxtok_l); } } } free(line); free(string_now); freetoken(&token,maxtok_t); } pclose(fp); } if(en.status!=UNDEFINED && ren && ren->status!=REMOVED && ren->status!=COMPLETED){ if ((ret=job_registry_update_recn_select(rha, &en, ren->recnum, JOB_REGISTRY_UPDATE_WN_ADDR| JOB_REGISTRY_UPDATE_STATUS| JOB_REGISTRY_UPDATE_UDATE| JOB_REGISTRY_UPDATE_UPDATER_INFO| JOB_REGISTRY_UPDATE_EXITCODE| JOB_REGISTRY_UPDATE_EXITREASON)) < 0){ if(ret != JOB_REGISTRY_NOT_FOUND){ fprintf(stderr,"Update of record returns %d: ",ret); perror(""); } } else { if(ret==JOB_REGISTRY_SUCCESS){ if (en.status == REMOVED || en.status == COMPLETED) { do_log(debuglogfile, debug, 2, "%s: registry update in IntStateQuery for: jobid=%s creamjobid=%s wn=%s status=%d exitcode=%d\n",argv0,en.batch_id,en.user_prefix,en.wn_addr,en.status,en.exitcode); job_registry_unlink_proxy(rha, &en); }else{ do_log(debuglogfile, debug, 2, "%s: registry update in IntStateQuery for: jobid=%s creamjobid=%s wn=%s status=%d\n",argv0,en.batch_id,en.user_prefix,en.wn_addr,en.status); } if (remupd_conf != NULL){ if ((ret=job_registry_send_update(remupd_head_send,&en,NULL,NULL))<=0){ do_log(debuglogfile, debug, 2, "%s: Error creating endpoint in IntStateQuery\n",argv0); } } } } } free(ren); free(command_string); return 0; }
int FinalStateQuery(time_t start_date, int logs_to_read) { FILE *fp; char *line=NULL; char **token; char **token_l; int maxtok_t=0; int maxtok_l=0; job_registry_entry en; int ret; time_t tmstampepoch; char *cp=NULL; char *command_string=NULL; time_t now; char *string_now=NULL; job_registry_entry *ren=NULL; command_string=make_message("%s/sacct -nap -o JobID,JobName,State,ExitCode,submit,start,end 2>/dev/null",slurm_binpath); fp = popen(command_string,"r"); do_log(debuglogfile, debug, 3, "%s: command_string in FinalStateQuery is:%s\n",argv0,command_string); en.status=UNDEFINED; JOB_REGISTRY_ASSIGN_ENTRY(en.exitreason,"\0"); if(fp!=NULL){ while(!feof(fp) && (line=get_line(fp))){ if(line && strlen(line)==0){ free(line); continue; } if ((cp = strrchr (line, '\n')) != NULL){ *cp = '\0'; } en.status=UNDEFINED; do_log(debuglogfile, debug, 3, "%s: line in FinalStateQuery is:%s\n",argv0,line); now=time(0); string_now=make_message("%d",now); maxtok_t = strtoken(line, '|', &token); JOB_REGISTRY_ASSIGN_ENTRY(en.batch_id,token[0]); JOB_REGISTRY_ASSIGN_ENTRY(en.updater_info,string_now); if(token[2] && strstr(token[2],"COMPLETED")){ en.status=COMPLETED; JOB_REGISTRY_ASSIGN_ENTRY(en.updater_info,string_now); }else if(token[2] && strstr(token[2],"CANCELLED")){ en.status=REMOVED; en.exitcode=-999; JOB_REGISTRY_ASSIGN_ENTRY(en.updater_info,string_now); }else if(token[2] && strstr(token[2],"FAILED")){ en.status=COMPLETED; JOB_REGISTRY_ASSIGN_ENTRY(en.updater_info,string_now); } if(!(token[6] && strstr(token[6],"Unknown"))){ tmstampepoch=str2epoch(token[6],"N"); en.udate=tmstampepoch; } if(en.status==COMPLETED){ maxtok_l = strtoken(token[3], ':', &token_l); en.exitcode=atoi(token_l[0]); freetoken(&token_l,maxtok_l); } if ((ren=job_registry_get(rha, en.batch_id)) == NULL){ fprintf(stderr,"Get of record returns error "); perror(""); } if(en.status!=UNDEFINED && en.status!=IDLE && ren && ren->status!=REMOVED && ren->status!=COMPLETED){ if ((ret=job_registry_update_select(rha, &en, JOB_REGISTRY_UPDATE_UDATE | JOB_REGISTRY_UPDATE_STATUS | JOB_REGISTRY_UPDATE_UPDATER_INFO | JOB_REGISTRY_UPDATE_EXITCODE | JOB_REGISTRY_UPDATE_EXITREASON )) < 0){ if(ret != JOB_REGISTRY_NOT_FOUND){ fprintf(stderr,"Update of record returns %d: ",ret); perror(""); } } else { do_log(debuglogfile, debug, 2, "%s: f registry update in FinalStateQuery for: jobid=%s creamjobid=%s status=%d\n",argv0,en.batch_id,en.user_prefix,en.status); if (en.status == REMOVED || en.status == COMPLETED){ job_registry_unlink_proxy(rha, &en); } if (remupd_conf != NULL){ if ((ret=job_registry_send_update(remupd_head_send,&en,NULL,NULL))<=0){ do_log(debuglogfile, debug, 2, "%s: Error creating endpoint in FinalStateQuery\n",argv0); } } } } free(string_now); free(line); freetoken(&token,maxtok_t); free(ren); } pclose(fp); } free(command_string); return 0; }
DLLFUNC CMD_FUNC(m_sapart) { aClient *acptr; aChannel *chptr; Membership *lp; char *name, *p = NULL; int i; char *comment = (parc > 3 && parv[3] ? parv[3] : NULL); char commentx[512]; char jbuf[BUFSIZE]; if (!IsSAdmin(sptr) && !IsULine(sptr)) { sendto_one(sptr, err_str(ERR_NOPRIVILEGES), me.name, parv[0]); return 0; } if (parc < 3) { sendto_one(sptr, err_str(ERR_NEEDMOREPARAMS), me.name, parv[0], "SAPART"); return 0; } if (!(acptr = find_person(parv[1], NULL))) { sendto_one(sptr, err_str(ERR_NOSUCHNICK), me.name, parv[0], parv[1]); return 0; } if (MyClient(acptr)) { /* Now works like m_join */ *jbuf = 0; for (i = 0, name = strtoken(&p, parv[2], ","); name; name = strtoken(&p, NULL, ",")) { if (!(chptr = get_channel(acptr, name, 0))) { sendto_one(sptr, err_str(ERR_NOSUCHCHANNEL), me.name, parv[0], name); continue; } if (!(lp = find_membership_link(acptr->user->channel, chptr))) { sendto_one(sptr, err_str(ERR_USERNOTINCHANNEL), me.name, parv[0], parv[1], name); continue; } if (*jbuf) (void)strlcat(jbuf, ",", sizeof jbuf); (void)strlncat(jbuf, name, sizeof jbuf, sizeof(jbuf) - i - 1); i += strlen(name) + 1; } if (!*jbuf) return -1; strcpy(parv[2], jbuf); if (comment) { strcpy(commentx, "SAPart: "); strlcat(commentx, comment, 512); } parv[0] = parv[1]; // nick parv[1] = parv[2]; // chan parv[2] = comment ? commentx : NULL; // comment if (comment) { sendnotice(acptr, "*** You were forced to part %s (%s)", parv[1], commentx); sendto_realops("%s used SAPART to make %s part %s (%s)", sptr->name, parv[0], parv[1], comment); sendto_server(&me, 0, 0, ":%s GLOBOPS :%s used SAPART to make %s part %s (%s)", me.name, sptr->name, parv[0], parv[1], comment); /* Logging function added by XeRXeS */ ircd_log(LOG_SACMDS,"SAPART: %s used SAPART to make %s part %s (%s)", sptr->name, parv[0], parv[1], comment); } else { sendnotice(acptr, "*** You were forced to part %s", parv[1]); sendto_realops("%s used SAPART to make %s part %s", sptr->name, parv[0], parv[1]); sendto_server(&me, 0, 0, ":%s GLOBOPS :%s used SAPART to make %s part %s", me.name, sptr->name, parv[0], parv[1]); /* Logging function added by XeRXeS */ ircd_log(LOG_SACMDS,"SAPART: %s used SAPART to make %s part %s", sptr->name, parv[0], parv[1]); } do_cmd(acptr, acptr, "PART", comment ? 3 : 2, parv); } else { if (comment) { sendto_one(acptr, ":%s SAPART %s %s :%s", parv[0], parv[1], parv[2], comment); /* Logging function added by XeRXeS */ ircd_log(LOG_SACMDS,"SAPART: %s used SAPART to make %s part %s (%s)", sptr->name, parv[1], parv[2], comment); } else { sendto_one(acptr, ":%s SAPART %s %s", parv[0], parv[1], parv[2]); /* Logging function added by XeRXeS */ ircd_log(LOG_SACMDS,"SAPART: %s used SAPART to make %s part %s", sptr->name, parv[1], parv[2]); } } return 0; }
/* mo_flags() * * parv[0] = sender prefix * parv[1] = parameter */ static void mo_flags(struct Client *client_p, struct Client *source_p, int parc, char *parv[]) { int i,j; int isadd; int isgood; unsigned int setflags; char *p; char *flag; if (parc < 2) { /* Generate a list of what flags you have and what you are missing, ** and send it to the user */ sendto_one(source_p, ":%s NOTICE %s :Current flags:%s", me.name, parv[0], set_flags_to_string(source_p)); sendto_one(source_p, ":%s NOTICE %s :Current missing flags:%s", me.name, parv[0], unset_flags_to_string(source_p)); return; } /* Preserve the current flags */ setflags = source_p->umodes; /* XXX - change this to support a multiple last parameter like ISON */ for (i = 1; i < parc; i++) { for (flag = strtoken(&p, parv[i], " "); flag; flag = strtoken(&p, NULL, " ")) { /* We default to being in ADD mode */ isadd = 1; /* We default to being in BAD mode */ isgood = 0; if (!isalpha(*flag)) { if (*flag == '-') isadd = 0; else if (*flag == '+') isadd = 1; ++flag; } /* support ALL here */ if (!irccmp(flag, "ALL")) { if (isadd) source_p->umodes |= FL_ALL_OPER_FLAGS; else source_p->umodes &= ~FL_ALL_OPER_FLAGS; sendto_one(source_p, ":%s NOTICE %s :Current flags:%s", me.name, parv[0], set_flags_to_string(source_p)); sendto_one(source_p, ":%s NOTICE %s :Current missing flags:%s", me.name, parv[0], unset_flags_to_string(source_p)); send_umode_out(client_p, source_p, setflags); return; } if (!irccmp(flag, "NICKCHANGES")) { if (!IsOperN(source_p)) { sendto_one(source_p, ":%s NOTICE %s :*** You have no nick_changes flag;", me.name,parv[0]); continue; } if (isadd) source_p->umodes |= UMODE_NCHANGE; else source_p->umodes &= ~UMODE_NCHANGE; isgood = 1; continue; } for (j = 0; flag_table[j].name; j++) { if (!irccmp(flag, flag_table[j].name)) { if (isadd) source_p->umodes |= flag_table[j].mode; else source_p->umodes &= ~ (flag_table[j].mode); isgood = 1; continue; } } /* This for ended without matching a valid FLAG, here is where * I want to operate differently than ircd-comstud, and just ignore * the invalid flag, send a warning and go on. */ if (!isgood) sendto_one(source_p, ":%s NOTICE %s :Invalid FLAGS: %s (IGNORING)", me.name, parv[0], flag); } } /* All done setting the flags, print the notices out to the user ** telling what flags they have and what flags they are missing */ sendto_one(source_p, ":%s NOTICE %s :Current flags:%s", me.name, parv[0], set_flags_to_string(source_p)); sendto_one(source_p, ":%s NOTICE %s :Current missing flags:%s", me.name, parv[0], unset_flags_to_string(source_p)); send_umode_out(client_p, source_p, setflags); }
/* * m_ison added by Darren Reed 13/8/91 to act as an efficent user indicator * with respect to cpu/bandwidth used. Implemented for NOTIFY feature in * clients. Designed to reduce number of whois requests. Can process * nicknames in batches as long as the maximum buffer length. * * format: * ISON :nicklist */ static void m_ison(struct Client *client_p, struct Client *source_p, int parc, char *parv[]) { struct Client *target_p; char *nick; char *p; char *current_insert_point, *current_insert_point2; int len; int i; int done = 0; current_insert_point2 = buf2; *buf2 = '\0'; ircsprintf(buf, form_str(RPL_ISON), me.name, parv[0]); len = strlen(buf); current_insert_point = buf + len; /* rfc1489 is ambigious about how to handle ISON * this should handle both interpretations. */ for (i = 1; i < parc; i++) { for (nick = strtoken(&p, parv[i], " "); nick; nick = strtoken(&p, NULL, " ")) { target_p = find_person(nick); if(target_p == NULL && (IsOper(source_p) || !ConfigServerHide.hide_servers)) { target_p = find_server(nick); } if(target_p != NULL) { len = strlen(target_p->name); if((current_insert_point + (len + 5)) < (buf + sizeof(buf))) { memcpy((void *) current_insert_point, (void *) target_p->name, len); current_insert_point += len; *current_insert_point++ = ' '; } else { done = 1; break; } } } if(done) break; } /* current_insert_point--; * Do NOT take out the trailing space, it breaks ircII * --Rodder */ *current_insert_point = '\0'; *current_insert_point2 = '\0'; sendto_one(source_p, "%s", buf); }
int PollDB() { FILE *fd; job_registry_entry *en; job_registry_handle *rha; job_registry_handle *rhc; char *buffer=NULL; char *cdate=NULL; time_t now; int maxtok,i,maxtokl,j; char **tbuf; char **lbuf; int len=0,flen=0; struct stat sbuf; int rc; char *regfile; char *cp=NULL; int to_sleep=FALSE; int skip_reg_open=FALSE; int ret; rha=job_registry_init(registry_file, BY_BATCH_ID); if (rha == NULL){ do_log(debuglogfile, debug, 1, "%s: Error initialising job registry %s\n",argv0,registry_file); fprintf(stderr,"%s: Error initialising job registry %s :",argv0,registry_file); perror(""); } for(;;){ now=time(NULL); to_sleep=TRUE; /* cycle over connections: sleep if startnotify, startnotifyjob and sentendonce are not set. If startnotifyjob is set the conn is served. */ for(i=0; i<MAX_CONNECTIONS; i++){ if(!connections[i].startnotify && !connections[i].startnotifyjob && !(connections[i].firstnotify && connections[i].sentendonce)) continue; if(connections[i].startnotify) to_sleep=FALSE; if(connections[i].startnotifyjob){ to_sleep=FALSE; rhc=job_registry_init(registry_file, BY_USER_PREFIX); if (rhc == NULL){ do_log(debuglogfile, debug, 1, "%s: Error initialising job registry %s\n",argv0,registry_file); fprintf(stderr,"%s: Error initialising job registry %s :",argv0,registry_file); perror(""); } do_log(debuglogfile, debug, 2, "%s:Job list for notification:%s\n",argv0,connections[i].joblist_string); maxtok=strtoken(connections[i].joblist_string,',',&tbuf); for(j=0;j<maxtok;j++){ if ((en=job_registry_get(rhc, tbuf[j])) != NULL){ buffer=ComposeClassad(en); }else{ if(remupd_conf == NULL){ cdate=iepoch2str(now); maxtokl=strtoken(tbuf[j],'_',&lbuf); if(lbuf[1]){ if ((cp = strrchr (lbuf[1], '\n')) != NULL){ *cp = '\0'; } if ((cp = strrchr (lbuf[1], '\r')) != NULL){ *cp = '\0'; } buffer=make_message("[BlahJobName=\"%s\"; ClientJobId=\"%s\"; JobStatus=4; JwExitCode=999; ExitReason=\"BUpdater is not able to find the job anymore\"; Reason=\"BUpdater is not able to find the job anymore\"; ChangeTime=\"%s\"; ]\n",tbuf[j],lbuf[1],cdate); } freetoken(&lbuf,maxtokl); free(cdate); }else{ maxtokl=strtoken(tbuf[j],':',&lbuf); JOB_REGISTRY_ASSIGN_ENTRY(en->batch_id,lbuf[0]); JOB_REGISTRY_ASSIGN_ENTRY(en->blah_id,lbuf[1]); freetoken(&lbuf,maxtokl); en->status = 0; if ((ret=job_registry_append(rhc, en))<0){ if(ret != JOB_REGISTRY_NOT_FOUND){ fprintf(stderr,"Update of record returns %d: ",ret); perror(""); } }else{ if(ret==JOB_REGISTRY_SUCCESS){ do_log(debuglogfile, debug, 2, "%s: registry append in PollDB for: jobid=%s blahjobid=%s\n",argv0,en->batch_id,en->blah_id); } } } } free(en); len=strlen(buffer); if(connections[i].finalbuffer != NULL){ flen=strlen(connections[i].finalbuffer); }else{ flen=0; } connections[i].finalbuffer = realloc(connections[i].finalbuffer,flen+len+2); if (connections[i].finalbuffer == NULL){ sysfatal("can't realloc finalbuffer in PollDB: %r"); } if(flen==0){ connections[i].finalbuffer[0]='\000'; } strcat(connections[i].finalbuffer,buffer); free(buffer); } freetoken(&tbuf,maxtok); if(connections[i].finalbuffer != NULL){ if(NotifyCream(connections[i].finalbuffer,&connections[i])!=-1){ /* change last notification time */ connections[i].lastnotiftime=now; connections[i].startnotifyjob=FALSE; } free(connections[i].finalbuffer); connections[i].finalbuffer=NULL; } job_registry_destroy(rhc); } if(connections[i].firstnotify && connections[i].sentendonce){ to_sleep=FALSE; if(NotifyCream("NTFDATE/END\n",&connections[i])!=-1){ connections[i].startnotify=TRUE; connections[i].sentendonce=FALSE; connections[i].firstnotify=FALSE; connections[i].startnotifyjob=FALSE; } } } if(to_sleep){ sleep(loop_interval); continue; } regfile=make_message("%s/registry",registry_file); rc=stat(regfile,&sbuf); free(regfile); skip_reg_open=TRUE; for(i=0; i<MAX_CONNECTIONS; i++){ if(sbuf.st_mtime>=connections[i].lastnotiftime){ skip_reg_open=FALSE; break; } } if(skip_reg_open){ do_log(debuglogfile, debug, 3, "Skip registry opening: mtime:%d lastn:%d\n",sbuf.st_mtime,connections[i].lastnotiftime); sleep(loop_interval); continue; } do_log(debuglogfile, debug, 3, "Normal registry opening\n"); fd = job_registry_open(rha, "r"); if (fd == NULL) { do_log(debuglogfile, debug, 1, "%s: Error opening job registry %s\n",argv0,registry_file); fprintf(stderr,"%s: Error opening job registry %s :",argv0,registry_file); perror(""); sleep(loop_interval); continue; } if (job_registry_rdlock(rha, fd) < 0) { do_log(debuglogfile, debug, 1, "%s: Error read locking registry %s\n",argv0,registry_file); fprintf(stderr,"%s: Error read locking registry %s :",argv0,registry_file); perror(""); sleep(loop_interval); continue; } while ((en = job_registry_get_next(rha, fd)) != NULL) { for(i=0; i<MAX_CONNECTIONS; i++){ if(connections[i].creamfilter==NULL) continue; if(en->mdate >= connections[i].lastnotiftime && en->mdate < now && en->user_prefix && strstr(en->user_prefix,connections[i].creamfilter)!=NULL && strlen(en->updater_info)>0) { buffer=ComposeClassad(en); len=strlen(buffer); if(connections[i].finalbuffer != NULL){ flen=strlen(connections[i].finalbuffer); }else{ flen=0; } connections[i].finalbuffer = realloc(connections[i].finalbuffer,flen+len+2); if (connections[i].finalbuffer == NULL){ sysfatal("can't realloc finalbuffer in PollDB: %r"); } if(flen==0){ connections[i].finalbuffer[0]='\000'; } strcat(connections[i].finalbuffer,buffer); free(buffer); } } free(en); } for(i=0; i<MAX_CONNECTIONS; i++){ if(connections[i].finalbuffer != NULL){ if(NotifyCream(connections[i].finalbuffer,&connections[i])!=-1){ /* change last notification time */ connections[i].lastnotiftime=now; } free(connections[i].finalbuffer); connections[i].finalbuffer=NULL; } } fclose(fd); sleep(loop_interval); } job_registry_destroy(rha); return 0; }
/* ** DoNumeric (replacement for the old do_numeric) ** ** parc number of arguments ('sender' counted as one!) ** parv[0] pointer to 'sender' (may point to empty string) (not used) ** parv[1]..parv[parc-1] ** pointers to additional parameters, this is a NULL ** terminated list (parv[parc] == NULL). ** ** *WARNING* ** Numerics are mostly error reports. If there is something ** wrong with the message, just *DROP* it! Don't even think of ** sending back a neat error message -- big danger of creating ** a ping pong error message... */ int do_numeric(int numeric, aClient *cptr, aClient *sptr, int parc, char *parv[]) { aClient *acptr; aChannel *chptr; char *nick, *p; int i; /* Is this an outgoing connect, and we get a numeric 451 (not registered) back for the * magic command __PANGPANG__ and we did not send a SERVER message yet? * Then this means we are dealing with an Unreal server <3.2.9 and we should send the * SERVER command right now. */ if (!IsServer(sptr) && !IsPerson(sptr) && (numeric == 451) && (parc > 2) && strstr(parv[1], "__PANGPANG__") && IsHandshake(cptr) && sptr->serv && !IsServerSent(sptr)) { send_server_message(sptr); return 0; } if (parc < 1 || !IsServer(sptr)) return 0; /* Remap low number numerics. */ if (numeric < 100) numeric += 100; /* ** Prepare the parameter portion of the message into 'buffer'. ** (Because the buffer is twice as large as the message buffer ** for the socket, no overflow can occur here... ...on current ** assumptions--bets are off, if these are changed --msa) ** Note: if buffer is non-empty, it will begin with SPACE. */ buffer[0] = '\0'; if (parc > 2) { /* * For strlcat nazis, please read above */ for (i = 2; i < (parc - 1); i++) { (void)strcat(buffer, " "); (void)strcat(buffer, parv[i]); } (void)strcat(buffer, " :"); (void)strcat(buffer, parv[parc - 1]); } else sendto_realops("do_numeric( %i, %s, %s, %i, { %s, %s } )!", numeric, cptr->name, sptr->name, parc, parv[0], parv[1] ? parv[1] : "<null>"); for (; (nick = strtoken(&p, parv[1], ",")); parv[1] = NULL) { if ((acptr = find_client(nick, (aClient *)NULL))) { /* ** Drop to bit bucket if for me... ** ...one might consider sendto_ops ** here... --msa ** And so it was done. -avalon ** And regretted. Dont do it that way. Make sure ** it goes only to non-servers. -avalon ** Check added to make sure servers don't try to loop ** with numerics which can happen with nick collisions. ** - Avalon */ if (!IsMe(acptr) && IsPerson(acptr)) { /* Added for .U3.2. drop remote 'You are not on ** that channel', we should be synced anyway, ** and this is an annoying message with TSpre7 ** still on the net; would result in numeric 442 for ** every KICK... Can be removed when TSpre7 is gone. ** --Run if (numeric==ERR_NOTONCHANNEL) return 0; */ sendto_prefix_one(acptr, sptr, ":%s %d %s%s", parv[0], numeric, nick, buffer); } else if (IsServer(acptr) && acptr->from != cptr) sendto_prefix_one(acptr, sptr, ":%s %d %s%s", parv[0], numeric, nick, buffer); } else if ((acptr = find_server_quick(nick))) { if (!IsMe(acptr) && acptr->from != cptr) sendto_prefix_one(acptr, sptr, ":%s %d %s%s", parv[0], numeric, nick, buffer); } else if ((chptr = find_channel(nick, (aChannel *)NULL))) sendto_channel_butone(cptr, sptr, chptr, ":%s %d %s%s", parv[0], numeric, chptr->chname, buffer); } return 0; }
/* ** m_kill ** parv[0] = sender prefix ** parv[1] = kill victim(s) - comma separated list ** parv[2] = kill path */ DLLFUNC int m_kill(aClient *cptr, aClient *sptr, int parc, char *parv[]) { aClient *acptr; anUser *auser; char inpath[HOSTLEN * 2 + USERLEN + 5]; char *oinpath = get_client_name(cptr, FALSE); char *user, *path, *killer, *nick, *p, *s; int chasing = 0, kcount = 0; if (parc < 2 || *parv[1] == '\0') { sendto_one(sptr, err_str(ERR_NEEDMOREPARAMS), me.name, parv[0], "KILL"); return 0; } user = parv[1]; path = parv[2]; /* Either defined or NULL (parc >= 2!!) */ strlcpy(inpath, oinpath, sizeof inpath); #ifndef ROXnet if (IsServer(cptr) && (s = (char *)index(inpath, '.')) != NULL) *s = '\0'; /* Truncate at first "." */ #endif if (!IsPrivileged(cptr)) { sendto_one(sptr, err_str(ERR_NOPRIVILEGES), me.name, parv[0]); return 0; } if (IsAnOper(cptr)) { if (BadPtr(path)) { sendto_one(sptr, err_str(ERR_NEEDMOREPARAMS), me.name, parv[0], "KILL"); return 0; } if (strlen(path) > (size_t)TOPICLEN) path[TOPICLEN] = '\0'; } if (MyClient(sptr)) user = (char *)canonize(user); for (p = NULL, nick = strtoken(&p, user, ","); nick; nick = strtoken(&p, NULL, ",")) { chasing = 0; if (!(acptr = find_client(nick, NULL))) { /* ** If the user has recently changed nick, we automaticly ** rewrite the KILL for this new nickname--this keeps ** servers in synch when nick change and kill collide */ if (!(acptr = get_history(nick, (long)KILLCHASETIMELIMIT))) { sendto_one(sptr, err_str(ERR_NOSUCHNICK), me.name, parv[0], nick); continue; } sendto_one(sptr, ":%s %s %s :*** KILL changed from %s to %s", me.name, IsWebTV(sptr) ? "PRIVMSG" : "NOTICE", parv[0], nick, acptr->name); chasing = 1; } if ((!MyConnect(acptr) && MyClient(cptr) && !OPCanGKill(cptr)) || (MyConnect(acptr) && MyClient(cptr) && !OPCanLKill(cptr))) { sendto_one(sptr, err_str(ERR_NOPRIVILEGES), me.name, parv[0]); continue; } if (IsServer(acptr) || IsMe(acptr)) { sendto_one(sptr, err_str(ERR_CANTKILLSERVER), me.name, parv[0]); continue; } if (!IsPerson(acptr)) { /* Nick exists but user is not registered yet: IOTW "doesn't exist". -- Syzop */ sendto_one(sptr, err_str(ERR_NOSUCHNICK), me.name, parv[0], nick); continue; } if (IsServices(acptr) && !(IsNetAdmin(sptr) || IsULine(sptr))) { sendto_one(sptr, err_str(ERR_KILLDENY), me.name, parv[0], parv[1]); return 0; } /* From here on, the kill is probably going to be successful. */ kcount++; if (!IsServer(sptr) && (kcount > MAXKILLS)) { sendto_one(sptr, ":%s %s %s :*** Too many targets, kill list was truncated. Maximum is %d.", me.name, IsWebTV(sptr) ? "PRIVMSG" : "NOTICE", parv[0], MAXKILLS); break; } if (!IsServer(cptr)) { /* ** The kill originates from this server, initialize path. ** (In which case the 'path' may contain user suplied ** explanation ...or some nasty comment, sigh... >;-) ** ** ...!operhost!oper ** ...!operhost!oper (comment) */ strlcpy(inpath, GetHost(cptr), sizeof inpath); if (kcount < 2) { /* Only check the path the first time around, or it gets appended to itself. */ if (!BadPtr(path)) { (void)ircsprintf(buf, "%s%s (%s)", cptr->name, IsOper(sptr) ? "" : "(L)", path); path = buf; } else path = cptr->name; } } else if (BadPtr(path)) path = "*no-path*"; /* Bogus server sending??? */ /* ** Notify all *local* opers about the KILL (this includes the one ** originating the kill, if from this server--the special numeric ** reply message is not generated anymore). ** ** Note: "acptr->name" is used instead of "user" because we may ** have changed the target because of the nickname change. */ auser = acptr->user; sendto_snomask_normal(SNO_KILLS, "*** Notice -- Received KILL message for %s!%s@%s from %s Path: %s!%s", acptr->name, auser->username, IsHidden(acptr) ? auser->virthost : auser->realhost, parv[0], inpath, path); #if defined(USE_SYSLOG) && defined(SYSLOG_KILL) if (IsOper(sptr)) syslog(LOG_DEBUG, "KILL From %s For %s Path %s!%s", parv[0], acptr->name, inpath, path); #endif /* * By otherguy */ ircd_log (LOG_KILL, "KILL (%s) by %s(%s!%s)", make_nick_user_host (acptr->name, acptr->user->username, GetHost(acptr)), parv[0], inpath, path); /* ** And pass on the message to other servers. Note, that if KILL ** was changed, the message has to be sent to all links, also ** back. ** Suicide kills are NOT passed on --SRB */ if (!MyConnect(acptr) || !MyConnect(sptr) || !IsAnOper(sptr)) { sendto_serv_butone(cptr, ":%s KILL %s :%s!%s", parv[0], acptr->name, inpath, path); if (chasing && IsServer(cptr)) sendto_one(cptr, ":%s KILL %s :%s!%s", me.name, acptr->name, inpath, path); acptr->flags |= FLAGS_KILLED; } /* ** Tell the victim she/he has been zapped, but *only* if ** the victim is on current server--no sense in sending the ** notification chasing the above kill, it won't get far ** anyway (as this user don't exist there any more either) */ if (MyConnect(acptr)) sendto_prefix_one(acptr, sptr, ":%s KILL %s :%s!%s", parv[0], acptr->name, inpath, path); /* ** Set FLAGS_KILLED. This prevents exit_one_client from sending ** the unnecessary QUIT for this. (This flag should never be ** set in any other place) */ if (MyConnect(acptr) && MyConnect(sptr) && IsAnOper(sptr)) (void)ircsprintf(buf2, "[%s] Local kill by %s (%s)", me.name, sptr->name, BadPtr(parv[2]) ? sptr->name : parv[2]); else { if ((killer = index(path, ' '))) { while ((killer >= path) && *killer && *killer != '!') killer--; if (!*killer) killer = path; else killer++; } else killer = path; (void)ircsprintf(buf2, "Killed (%s)", killer); } if (MyClient(sptr)) RunHook3(HOOKTYPE_LOCAL_KILL, sptr, acptr, parv[2]); if (exit_client(cptr, acptr, sptr, buf2) == FLUSH_BUFFER) return FLUSH_BUFFER; } return 0; }
static void do_list(struct Client *source_p, char *arg) { struct ListTask *lt = NULL; int no_masked_channels = 1; if (source_p->connection->list_task) { free_list_task(source_p); sendto_one_numeric(source_p, &me, RPL_LISTEND); return; } lt = MyCalloc(sizeof(struct ListTask)); lt->users_max = UINT_MAX; lt->created_max = UINT_MAX; lt->topicts_max = UINT_MAX; source_p->connection->list_task = lt; if (!EmptyString(arg)) { char *opt, *save = NULL; dlink_list *list = NULL; int i = 0, errors = 0; for (opt = strtoken(&save, arg, ","); opt; opt = strtoken(&save, NULL, ",")) { switch (*opt) { case '<': if ((i = atoi(opt + 1)) > 0) lt->users_max = (unsigned int)i - 1; else errors = 1; break; case '>': if ((i = atoi(opt + 1)) >= 0) lt->users_min = (unsigned int)i + 1; else errors = 1; break; case 'C': case 'c': switch (*++opt) { case '<': if ((i = atoi(opt + 1)) >= 0) lt->created_max = (unsigned int)(CurrentTime - 60 * i); else errors = 1; break; case '>': if ((i = atoi(opt + 1)) >= 0) lt->created_min = (unsigned int)(CurrentTime - 60 * i); else errors = 1; break; default: errors = 1; } break; case 'T': case 't': switch (*++opt) { case '<': if ((i = atoi(opt + 1)) >= 0) lt->topicts_min = (unsigned int)(CurrentTime - 60 * i); else errors = 1; break; case '>': if ((i = atoi(opt + 1)) >= 0) lt->topicts_max = (unsigned int)(CurrentTime - 60 * i); else errors = 1; break; case ':': if (strlcpy(lt->topic, opt + 1, sizeof(lt->topic)) == 0) errors = 1; break; default: errors = 1; } break; default: if (*opt == '!') { list = <->hide_mask; opt++; } else list = <->show_mask; if (has_wildcards(opt + !!IsChanPrefix(*opt))) { if (list == <->show_mask) no_masked_channels = 0; } else if (!IsChanPrefix(*opt)) errors = 1; if (!errors) dlinkAdd(xstrdup(opt), make_dlink_node(), list); } } if (errors) { free_list_task(source_p); sendto_one_numeric(source_p, &me, ERR_LISTSYNTAX); return; } } dlinkAdd(source_p, make_dlink_node(), &listing_client_list); sendto_one_numeric(source_p, &me, RPL_LISTSTART); safe_list_channels(source_p, no_masked_channels && lt->show_mask.head != NULL); }
/* * * DoNumeric (replacement for the old do_numeric) * * * parc number of arguments ('sender' counted as one!) * parv[0] pointer to 'sender' (may point to empty string) * parv[1]..parv[parc-1] * pointers to additional parameters, this is a NULL * terminated list (parv[parc] == NULL). * * *WARNING* * Numerics are mostly error reports. If there is something * wrong with the message, just *DROP* it! Don't even think of * sending back a neat error message -- big danger of creating * a ping pong error message... */ int do_numeric(int numeric, aClient *cptr, aClient *sptr, int parc, char *parv[]) { aClient *acptr; aChannel *chptr; char *nick, *p; int i; if (parc < 1 || !IsServer(sptr)) return 0; /* Remap low number numerics. */ if (numeric < 100) numeric += 100; /* * Prepare the parameter portion of the message into 'buffer'. * (Because the buffer is twice as large as the message buffer for * the socket, no overflow can occur here... ...on current * assumptions--bets are off, if these are changed --msa) * Note: if buffer is non-empty, it will begin with SPACE. */ buffer[0] = '\0'; if (parc > 1) { int bpos = 0; char *p; for (i = 2; i < (parc - 1); i++) { buffer[bpos++] = ' '; for(p = parv[i]; *p; p++) buffer[bpos++] = *p; } buffer[bpos++] = ' '; buffer[bpos++] = ':'; for(p = parv[parc - 1]; *p; p++) buffer[bpos++] = *p; buffer[bpos] = '\0'; } for (; (nick = strtoken(&p, parv[1], ",")); parv[1] = NULL) { if ((acptr = find_client(nick, (aClient *) NULL))) { int dohide; /* * Drop to bit bucket if for me... ...one might consider * sendto_ops * here... --msa * And so it was done. -avalon * * And regretted. Dont do it that way. Make sure * it goes * only to non-servers. -avalon * Check added to make sure * servers don't try to loop * with numerics which can happen * with nick collisions. * - Avalon */ #ifdef HIDE_NUMERIC_SOURCE dohide = MyClient(acptr) ? 1 : 0; #else dohide = 0; #endif if (!IsMe(acptr) && IsPerson(acptr)) sendto_prefix_one(acptr, dohide ? &me : sptr, ":%s %d %s%s", dohide ? me.name : parv[0], numeric, nick, buffer); else if (IsServer(acptr) && acptr->from != cptr) sendto_prefix_one(acptr, sptr, ":%s %d %s%s", parv[0], numeric, nick, buffer); } else if ((chptr = find_channel(nick, (aChannel *) NULL))) { int dohide; #ifdef HIDE_NUMERIC_SOURCE dohide = 1; #else dohide = 0; #endif sendto_channel_butserv(chptr, dohide ? &me : sptr, ":%s %d %s%s", dohide ? me.name : parv[0], numeric, chptr->chname, buffer); sendto_channel_remote_butone(cptr, sptr, chptr, parv[0], numeric, chptr->chname, buffer); } } return 0; }
int main(int argc, char *argv[]){ FILE *fd; job_registry_entry *en; time_t now; time_t purge_time=0; char constraint[JOBID_MAX_LEN+1]; char constraint2[5]; char *query=NULL; char *queryStates=NULL; char *query_err=NULL; char *pidfile=NULL; char string_now[11]; char *tpath; int version=0; int tmptim; int finstr_len=0; int loop_interval=DEFAULT_LOOP_INTERVAL; int fsq_ret=0; int c; int confirm_time=0; static int help; static int short_help; while (1) { static struct option long_options[] = { {"help", no_argument, &help, 1}, {"usage", no_argument, &short_help, 1}, {"nodaemon", no_argument, 0, 'o'}, {"version", no_argument, 0, 'v'}, {0, 0, 0, 0} }; int option_index = 0; c = getopt_long (argc, argv, "vo",long_options, &option_index); if (c == -1){ break; } switch (c) { case 0: if (long_options[option_index].flag != 0){ break; } case 'v': version=1; break; case 'o': nodmn=1; break; case '?': break; default: abort (); } } //check if another instance is running char **ptr; char out[3]; fgets(out, sizeof(out),popen("ps -d | grep -c BUpdaterSGE","r")); strtoken(out,'\n',&ptr); if (strcmp(ptr[0],"1")!=0){ fprintf(stderr,"There is another instance of BUpdaterSGE running.\nExiting ...\n"); return -1; } freetoken(&ptr,1); if(help){ usage(); } if(short_help){ short_usage(); } argv0 = argv[0]; signal(SIGHUP,sighup); if(version) { printf("%s Version: %s\n",progname,VERSION); exit(EXIT_SUCCESS); } /* Checking configuration */ check_config_file("UPDATER"); cha = config_read(NULL); if (cha == NULL) { fprintf(stderr,"Error reading config: "); perror(""); return -1; } config_setenv(NULL); ret = config_get("bupdater_child_poll_timeout",cha); if (ret != NULL){ tmptim=atoi(ret->value); if (tmptim > 0) bfunctions_poll_timeout = tmptim*1000; } ret = config_get("bupdater_debug_level",cha); if (ret != NULL){ debug=atoi(ret->value); } ret = config_get("bupdater_debug_logfile",cha); if (ret != NULL){ debuglogname=strdup(ret->value); if(debuglogname == NULL){ sysfatal("strdup failed for debuglogname in main: %r"); } } if(debug <=0){ debug=0; } if(debuglogname){ if((debuglogfile = fopen(debuglogname, "a+"))==0){ debug = 0; } }else{ debug = 0; } ret = config_get("debug_level",cha); if (ret != NULL){ debug=atoi(ret->value); } ret = config_get("debug_logfile",cha); if (ret != NULL){ debuglogname=strdup(ret->value); if(debuglogname == NULL){ sysfatal("strdup failed for debuglogname in main: %r"); } } if(debug <=0){ debug=0; } if(debuglogname){ if((debuglogfile = fopen(debuglogname, "a+"))==0){ debug = 0; } }else{ debug = 0; } ret = config_get("sge_binpath",cha); if (ret == NULL){ do_log(debuglogfile, debug, 1, "%s: key sge_binpath not found\n",argv0); } else { sge_binpath=strdup(ret->value); if(sge_binpath == NULL){ sysfatal("strdup failed for sge_binpath in main: %r"); } } ret = config_get("sge_rootpath",cha); if (ret == NULL){ do_log(debuglogfile, debug, 1, "%s: key sge_rootpath not found\n",argv0); } else { sge_rootpath=strdup(ret->value); if(sge_rootpath == NULL){ sysfatal("strdup failed for sge_rootpath in main: %r"); } tpath=make_message("%s",sge_rootpath); if (opendir(tpath)==NULL){ do_log(debuglogfile, debug, 1, "%s: dir %s does not exist or is not readable\n",argv0,tpath); sysfatal("dir %s does not exist or is not readable: %r",tpath); } free(tpath); } ret = config_get("sge_cellname",cha); if (ret == NULL){ do_log(debuglogfile, debug, 1, "%s: key sge_cellname not found\n",argv0); } else { sge_cellname=strdup(ret->value); if(sge_cellname == NULL){ sysfatal("strdup failed for sge_cellname in main: %r"); } } ret = config_get("sge_rootpath",cha); if (ret == NULL){ if(debug){ fprintf(debuglogfile, "%s: key sge_rootpath not found\n",argv0); fflush(debuglogfile); } } else { sge_rootpath=strdup(ret->value); if(sge_rootpath == NULL){ sysfatal("strdup failed for sge_rootpath in main: %r"); } } ret = config_get("sge_cellname",cha); if (ret == NULL){ if(debug){ fprintf(debuglogfile, "%s: key sge_cellname not found\n",argv0); fflush(debuglogfile); } } else { sge_cellname=strdup(ret->value); if(sge_cellname == NULL){ sysfatal("strdup failed for sge_cellname in main: %r"); } } ret = config_get("job_registry",cha); if (ret == NULL){ do_log(debuglogfile, debug, 1, "%s: key job_registry not found\n",argv0); sysfatal("job_registry not defined. Exiting"); } else { reg_file=strdup(ret->value); if(reg_file == NULL){ sysfatal("strdup failed for reg_file in main: %r"); } } ret = config_get("purge_interval",cha); if (ret == NULL){ do_log(debuglogfile, debug, 1, "%s: key purge_interval not found using the default:%d\n",argv0,purge_interval); } else { purge_interval=atoi(ret->value); } ret = config_get("finalstate_query_interval",cha); if (ret == NULL){ do_log(debuglogfile, debug, 1, "%s: key finalstate_query_interval not found using the default:%d\n",argv0,finalstate_query_interval); } else { finalstate_query_interval=atoi(ret->value); } ret = config_get("alldone_interval",cha); if (ret == NULL){ do_log(debuglogfile, debug, 1, "%s: key alldone_interval not found using the default:%d\n",argv0,alldone_interval); } else { alldone_interval=atoi(ret->value); } ret = config_get("bupdater_loop_interval",cha); if (ret == NULL){ do_log(debuglogfile, debug, 1, "%s: key bupdater_loop_interval not found using the default:%d\n",argv0,loop_interval); } else { loop_interval=atoi(ret->value); } ret = config_get("bupdater_pidfile",cha); if (ret == NULL){ do_log(debuglogfile, debug, 1, "%s: key bupdater_pidfile not found\n",argv0); } else { pidfile=strdup(ret->value); if(pidfile == NULL){ sysfatal("strdup failed for pidfile in main: %r"); } } ret = config_get("job_registry_use_mmap",cha); if (ret == NULL){ do_log(debuglogfile, debug, 1, "%s: key job_registry_use_mmap not found. Default is NO\n",argv0); } else { do_log(debuglogfile, debug, 1, "%s: key job_registry_use_mmap is set to %s\n",argv0,ret->value); } if( !nodmn ) daemonize(); if( pidfile ){ writepid(pidfile); free(pidfile); } config_free(cha); rha=job_registry_init(reg_file, BY_BATCH_ID); if (rha == NULL){ do_log(debuglogfile, debug, 1, "%s: Error initialising job registry %s\n",argv0,reg_file); fprintf(stderr,"%s: Error initialising job registry %s :",argv0,reg_file); perror(""); } for(;;){ /* Purge old entries from registry */ now=time(0); if(now - purge_time > 86400){ if(job_registry_purge(reg_file, now-purge_interval,0)<0){ do_log(debuglogfile, debug, 1, "%s: Error purging job registry %s\n",argv0,reg_file); fprintf(stderr,"%s: Error purging job registry %s :",argv0,reg_file); perror(""); }else{ purge_time=time(0); } } //IntStateQuery(); fd = job_registry_open(rha, "r"); if (fd == NULL) { do_log(debuglogfile, debug, 1, "%s: Error opening job registry %s\n",argv0,reg_file); fprintf(stderr,"%s: Error opening job registry %s :",argv0,reg_file); perror(""); sleep(loop_interval); } if (job_registry_rdlock(rha, fd) < 0) { do_log(debuglogfile, debug, 1, "%s: Error read locking job registry %s\n",argv0,reg_file); fprintf(stderr,"%s: Error read locking job registry %s :",argv0,reg_file); perror(""); sleep(loop_interval); } job_registry_firstrec(rha,fd); fseek(fd,0L,SEEK_SET); if((query=calloc(STR_CHARS*2,1)) == 0){ sysfatal("can't malloc query %r"); } if((queryStates=calloc(STR_CHARS*2,1)) == 0){ sysfatal("can't malloc query %r"); } query[0]=' '; queryStates[0]=' '; while ((en = job_registry_get_next(rha, fd)) != NULL) { if(((now - en->mdate) > finalstate_query_interval) && en->status!=3 && en->status!=4) { /* create the constraint that will be used in condor_history command in FinalStateQuery*/ snprintf(constraint, sizeof(constraint), " %s",en->batch_id); if (en->status==0) snprintf(constraint2, sizeof(constraint2), " u"); if (en->status==1) snprintf(constraint2, sizeof(constraint2), " q"); if (en->status==2) snprintf(constraint2, sizeof(constraint2), " r"); if (en->status==5) snprintf(constraint2, sizeof(constraint2), " h"); query=realloc(query,strlen(query)+strlen(constraint)+1); queryStates=realloc(queryStates,strlen(queryStates)+strlen(constraint2)+1); strcat(query,constraint); strcat(queryStates,constraint2); runfinal=TRUE; } /* Assign Status=4 and ExitStatus=-1 to all entries that after alldone_interval are still not in a final state(3 or 4) */ if((now - en->mdate > alldone_interval) && en->status!=3 && en->status!=4 && !runfinal) { time_t now; now=time(0); snprintf(string_now,sizeof(string_now),"%d",now); AssignState(en->batch_id,"4" ,"-1","\0","\0",string_now); } free(en); } if(runfinal){ if((query_err=calloc((int)strlen(query),1)) == 0) sysfatal("can't malloc query_err %r"); FinalStateQuery(query,queryStates,query_err); free(query_err); } free(query); free(queryStates); fclose(fd); if (runfinal){ runfinal=FALSE; } sleep (loop_interval); } //for job_registry_destroy(rha); return(0); }
static void do_ison(struct Client *client_p, struct Client *up, struct Client *source_p, int parc, char *parv[]) { struct Client *target_p = NULL; char *nick; char *p; char *current_insert_point, *current_insert_point2; char buf[IRCD_BUFSIZE]; char buf2[IRCD_BUFSIZE]; int len; int i; int done = 0; int relay_to_hub = 0; current_insert_point2 = buf2; *buf2 = '\0'; len = ircsprintf(buf, form_str(RPL_ISON), me.name, parv[0]); current_insert_point = buf + len; /* rfc1459 is ambigious about how to handle ISON * this should handle both interpretations. */ for (i = 1; i < parc; i++) { for (nick = strtoken(&p, parv[i], " "); nick; nick = strtoken(&p, NULL, " ")) { if ((target_p = find_person(client_p, nick))) { len = strlen(target_p->name); if ((current_insert_point + (len + 5)) < (buf + sizeof(buf))) { memcpy(current_insert_point, target_p->name, len); current_insert_point += len; *current_insert_point++ = ' '; } else { done = 1; break; } } if (up) { /* Build up a single list, for use if we relay.. */ len = strlen(nick); if ((current_insert_point2 + len + 5) < (buf2 + sizeof(buf2))) { memcpy(current_insert_point2, nick, len); current_insert_point2 += len; *current_insert_point2++ = ' '; } if (target_p == NULL) { /* * XXX Ick. we need to ask our hub if nick is online. * it's probably safest to relay the whole command, * unless we can answer it fully ourselves. * -davidt */ relay_to_hub = 1; /* Also cache info about nick */ sendto_one(up, ":%s NBURST %s", ID_or_name(&me, up), nick); } } } if (done) break; } /* current_insert_point--; * Do NOT take out the trailing space, it breaks ircII * --Rodder */ *current_insert_point = '\0'; *current_insert_point2 = '\0'; if (relay_to_hub) sendto_one(up, ":%s ISON :%s", ID_or_name(source_p, up), buf2); else sendto_one(source_p, "%s", buf); }
int FinalStateQuery(char *query,char *queryStates, char *query_err){ char line[STR_CHARS],fail[6],qExit[10],qFailed[10],qHostname[100],qStatus[2],command_string[100]; char **saveptr1,**saveptr2,**list_query,**list_queryStates; FILE *file_output; int numQuery=0,numQueryStates=0,j=0,l=0,cont=0,cont2=0, nq=0; time_t now; char string_now[11]; job_registry_entry en; int iret; numQuery=strtoken(query,' ',&list_query); nq=numQuery; numQueryStates=strtoken(queryStates,' ',&list_queryStates); if (numQuery!=numQueryStates) return 1; sprintf(command_string,"%s/qstat -u '*'",sge_binpath); if (debug) do_log(debuglogfile, debug, 1, "+-+line 433, command_string:%s\n",command_string); //load in qstatJob list of jobids from qstat command exec file_output = popen(command_string,"r"); if (file_output == NULL) return 0; while (fgets(line,sizeof(line), file_output) != NULL){ cont=strtoken(line, ' ', &saveptr1); if ((strcmp(saveptr1[0],"job-ID")!=0)&&(strncmp(saveptr1[0],"-",1)!=0)){ for (l=0;l<nq;l++){ if (strcmp(list_query[l],saveptr1[0])==0){ if (strcmp(list_queryStates[l],saveptr1[4])!=0){ now=time(0); sprintf(string_now,"%d",now); if (strcmp(saveptr1[4],"u")==0){ JOB_REGISTRY_ASSIGN_ENTRY(en.batch_id,list_query[l]); en.status=0; en.exitcode=0; JOB_REGISTRY_ASSIGN_ENTRY(en.wn_addr,""); JOB_REGISTRY_ASSIGN_ENTRY(en.exitreason,"0"); JOB_REGISTRY_ASSIGN_ENTRY(en.updater_info,string_now) en.udate=now; if ((iret=job_registry_update(rha, &en)) < 0){ fprintf(stderr,"Update of record returns %d: \nJobId: %d", iret,en.batch_id); perror(""); } } if (strcmp(saveptr1[4],"q")==0){ JOB_REGISTRY_ASSIGN_ENTRY(en.batch_id,list_query[l]); en.status=1; en.exitcode=0; JOB_REGISTRY_ASSIGN_ENTRY(en.wn_addr,""); JOB_REGISTRY_ASSIGN_ENTRY(en.exitreason,"0"); JOB_REGISTRY_ASSIGN_ENTRY(en.updater_info,string_now) en.udate=now; if ((iret=job_registry_update(rha, &en)) < 0){ fprintf(stderr,"Update of record returns %d: \nJobId: %d", iret,en.batch_id); perror(""); } } if (strcmp(saveptr1[4],"r")==0){ cont2=strtoken(saveptr1[7], '@', &saveptr2); JOB_REGISTRY_ASSIGN_ENTRY(en.batch_id,list_query[l]); en.status=2; en.exitcode=0; JOB_REGISTRY_ASSIGN_ENTRY(en.wn_addr,saveptr2[1]); JOB_REGISTRY_ASSIGN_ENTRY(en.exitreason,"0"); JOB_REGISTRY_ASSIGN_ENTRY(en.updater_info,string_now) en.udate=now; if ((iret=job_registry_update(rha, &en)) < 0){ fprintf(stderr,"Update of record returns %d: \nJobId: %d", iret,en.batch_id); perror(""); } freetoken(&saveptr2,cont2); } if ((strcmp(saveptr1[4],"hr")==0)||strcmp(saveptr1[4],"hqw")==0){ JOB_REGISTRY_ASSIGN_ENTRY(en.batch_id,list_query[l]); en.status=5; en.exitcode=0; JOB_REGISTRY_ASSIGN_ENTRY(en.wn_addr,""); JOB_REGISTRY_ASSIGN_ENTRY(en.exitreason,"0"); JOB_REGISTRY_ASSIGN_ENTRY(en.updater_info,string_now) en.udate=now; if ((iret=job_registry_update(rha, &en)) < 0){ fprintf(stderr,"Update of record returns %d: \nJobId: %d", iret,en.batch_id); perror(""); } } } //i must put out element from query for (j=l;j<nq;j++) if (list_query[j+1]!=NULL) strcpy(list_query[j],list_query[j+1]); for (j=l;j<nq;j++) if (list_queryStates[j+1]!=NULL) strcpy(list_queryStates[j],list_queryStates[j+1]); nq--; break; } } } line[0]='\0'; freetoken(&saveptr1,cont); } pclose( file_output ); sprintf(query_err,"\0"); //now we have check in list_query only states that not change status //because they're not in qstat result for (l=0; l<nq; l++){ sprintf(command_string,"%s/qacct -j '%s'",sge_binpath,list_query[l]); if (debug) do_log(debuglogfile, debug, 1, "+-+line 520,command_string:%s\n",command_string); file_output = popen(command_string,"r"); if (file_output == NULL) return 1; //if a job number is here means that job was in query previously and //if now it's not in query and not finished (NULL qstat) it was deleted //or it's on transition time if (fgets( line,sizeof(line), file_output )==NULL){ strcat(query_err,list_query[l]); strcat(query_err," "); pclose( file_output ); continue; } //there is no problem to lost first line with previous fgets, because //it's only a line of ============================================= while (fgets( line,sizeof(line), file_output )!=NULL){ cont=strtoken(line, ' ', &saveptr1); if (strcmp(saveptr1[0],"hostname")==0) strcpy(qHostname,saveptr1[1]);; if (strcmp(saveptr1[0],"failed")==0) strcpy(qFailed,saveptr1[1]); if (strcmp(saveptr1[0],"exit_status")==0) strcpy(qExit,saveptr1[1]); freetoken(&saveptr1,cont); } pclose( file_output ); now=time(0); sprintf(string_now,"%d",now); if ((strcmp(qExit,"137")==0)||(strcmp(qExit,"143")==0)){ JOB_REGISTRY_ASSIGN_ENTRY(en.batch_id,list_query[l]); en.status=3; en.exitcode=atoi(qExit); JOB_REGISTRY_ASSIGN_ENTRY(en.wn_addr,qHostname); JOB_REGISTRY_ASSIGN_ENTRY(en.exitreason,""); JOB_REGISTRY_ASSIGN_ENTRY(en.updater_info,string_now) en.udate=now; if ((iret=job_registry_update(rha, &en)) < 0){ fprintf(stderr,"Update of record returns %d: \nJobId: %d", iret,en.batch_id); perror(""); }else job_registry_unlink_proxy(rha, &en); }else{ JOB_REGISTRY_ASSIGN_ENTRY(en.batch_id,list_query[l]); en.status=4; en.exitcode=atoi(qExit); JOB_REGISTRY_ASSIGN_ENTRY(en.wn_addr,qHostname); JOB_REGISTRY_ASSIGN_ENTRY(en.exitreason,qFailed); JOB_REGISTRY_ASSIGN_ENTRY(en.updater_info,string_now) en.udate=now; if ((iret=job_registry_update(rha, &en)) < 0){ fprintf(stderr,"Update of record returns %d: \nJobId: %d", iret,en.batch_id); perror(""); }else job_registry_unlink_proxy(rha, &en); } } freetoken(&list_query,numQuery); freetoken(&list_queryStates,numQueryStates); if (debug) do_log(debuglogfile, debug, 1, "+-+query_err:%s\n",query_err); //now check acumulated error jobids to verify if they are an error or not if (strcmp(query_err,"\0")!=0){ sleep(60); cont=0; int n=0; char cmd[10]="\0"; cont=strtoken(query_err, ' ', &list_query); while (n < cont){ if(list_query[n]) strcpy(cmd,list_query[n]); else return 1; sprintf(command_string,"%s/qacct -j '%s'",sge_binpath,cmd); if (debug) do_log(debuglogfile, debug, 1, "+-+line 587 error, command_string:%s\n",command_string); file_output = popen(command_string,"r"); if (file_output == NULL) return 1; //if a job number is here means that job was in query previously and //if now it's not in query and not finished (NULL qstat) it was deleted if (fgets( line,sizeof(line), file_output )==NULL){ JOB_REGISTRY_ASSIGN_ENTRY(en.batch_id,cmd); en.status=3; en.exitcode=3; JOB_REGISTRY_ASSIGN_ENTRY(en.wn_addr,""); JOB_REGISTRY_ASSIGN_ENTRY(en.exitreason,"reason=3"); now=time(0); sprintf(string_now,"%d",now); JOB_REGISTRY_ASSIGN_ENTRY(en.updater_info,string_now) en.udate=now; if ((iret=job_registry_update(rha, &en)) < 0){ fprintf(stderr,"Update of record returns %d: \nJobId: %d", iret,en.batch_id); perror(""); }else job_registry_unlink_proxy(rha, &en); pclose( file_output ); n++; continue; } //there is no problem to lost first line with previous fgets, because //it's only a line of ============================================= while (fgets( line,sizeof(line), file_output )!=NULL){ cont=strtoken(line, ' ', &saveptr1); if (strcmp(saveptr1[0],"hostname")==0) strcpy(qHostname,saveptr1[1]); if (strcmp(saveptr1[0],"failed")==0) strcpy(qFailed,saveptr1[1]); if (strcmp(saveptr1[0],"exit_status")==0) strcpy(qExit,saveptr1[1]); freetoken(&saveptr1,cont); } pclose( file_output ); now=time(0); sprintf(string_now,"%d",now); if ((strcmp(qExit,"137")==0)||(strcmp(qExit,"143")==0)){ JOB_REGISTRY_ASSIGN_ENTRY(en.batch_id,cmd); en.status=3; en.exitcode=atoi(qExit); JOB_REGISTRY_ASSIGN_ENTRY(en.wn_addr,qHostname); JOB_REGISTRY_ASSIGN_ENTRY(en.exitreason,""); JOB_REGISTRY_ASSIGN_ENTRY(en.updater_info,string_now) en.udate=now; if ((iret=job_registry_update(rha, &en)) < 0){ fprintf(stderr,"Update of record returns %d: \nJobId: %d", iret,en.batch_id); perror(""); }else job_registry_unlink_proxy(rha, &en); }else{ JOB_REGISTRY_ASSIGN_ENTRY(en.batch_id,cmd); en.status=4; en.exitcode=atoi(qExit); JOB_REGISTRY_ASSIGN_ENTRY(en.wn_addr,qHostname); JOB_REGISTRY_ASSIGN_ENTRY(en.exitreason,qFailed); JOB_REGISTRY_ASSIGN_ENTRY(en.updater_info,string_now) en.udate=now; if ((iret=job_registry_update(rha, &en)) < 0){ fprintf(stderr,"Update of record returns %d: \nJobId: %d", iret,en.batch_id); perror(""); }else job_registry_unlink_proxy(rha, &en); } n++; } freetoken(&list_query,cont); } return 0; }
int FinalStateQuery(char *input_string, int logs_to_read) { /* tracejob -m -l -a <jobid> In line: 04/23/2008 11:50:43 S Exit_status=0 resources_used.cput=00:00:01 resources_used.mem=11372kb resources_used.vmem=52804kb resources_used.walltime=00:10:15 there are: udate for the final state (04/23/2008 11:50:43): exitcode Exit_status= */ /* Filled entries: batch_id (a list of jobid is given, one for each tracejob call) status (always a final state 3 or 4) exitcode udate Filled by submit script: blah_id Unfilled entries: exitreason */ /* [root@cream-12 server_logs]# tracejob -m -l -a 13 Job: 13.cream-12.pd.infn.it 04/23/2008 11:40:27 S enqueuing into cream_1, state 1 hop 1 04/23/2008 11:40:27 S Job Queued at request of [email protected], owner = [email protected], job name = cream_365713239, queue = cream_1 04/23/2008 11:40:28 S Job Modified at request of [email protected] 04/23/2008 11:40:28 S Job Run at request of [email protected] 04/23/2008 11:50:43 S Exit_status=0 resources_used.cput=00:00:01 resources_used.mem=11372kb resources_used.vmem=52804kb resources_used.walltime=00:10:15 04/23/2008 11:50:44 S dequeuing from cream_1, state COMPLETE */ FILE *fp; char *line=NULL; char **token; char **jobid; int maxtok_t=0,maxtok_j=0,k; job_registry_entry en; int ret; char *timestamp; time_t tmstampepoch; char *exit_str=NULL; int failed_count=0; int time_to_add=0; time_t now; char *cp=NULL; char *command_string=NULL; char *pbs_spool=NULL; char *string_now=NULL; int tracejob_line_counter=0; do_log(debuglogfile, debug, 3, "%s: input_string in FinalStateQuery is:%s\n",argv0,input_string); maxtok_j = strtoken(input_string, ':', &jobid); for(k=0;k<maxtok_j;k++){ if(jobid[k] && strlen(jobid[k])==0) continue; pbs_spool=(pbs_spoolpath?make_message("-p %s ",pbs_spoolpath):make_message("")); command_string=make_message("%s%s/tracejob %s-m -l -a -n %d %s",batch_command,pbs_binpath,pbs_spool,logs_to_read,jobid[k]); free(pbs_spool); fp = popen(command_string,"r"); do_log(debuglogfile, debug, 3, "%s: command_string in FinalStateQuery is:%s\n",argv0,command_string); /* en.status is set =0 (UNDEFINED) here and it is tested if it is !=0 before the registry update: the update is done only if en.status is !=0*/ en.status=UNDEFINED; JOB_REGISTRY_ASSIGN_ENTRY(en.batch_id,jobid[k]); tracejob_line_counter=0; if(fp!=NULL){ while(!feof(fp) && (line=get_line(fp))){ if(line && strlen(line)==0){ free(line); continue; } if(tracejob_line_counter>tracejob_max_output){ do_log(debuglogfile, debug, 2, "%s: Tracejob output limit of %d lines reached. Skipping command.\n",argv0,tracejob_max_output); free(line); break; } if ((cp = strrchr (line, '\n')) != NULL){ *cp = '\0'; tracejob_line_counter++; } do_log(debuglogfile, debug, 3, "%s: line in FinalStateQuery is:%s\n",argv0,line); now=time(0); string_now=make_message("%d",now); if(line && (strstr(line,"Job deleted") || (strstr(line,"dequeuing from") && strstr(line,"state RUNNING")))){ maxtok_t = strtoken(line, ' ', &token); timestamp=make_message("%s %s",token[0],token[1]); tmstampepoch=str2epoch(timestamp,"A"); free(timestamp); freetoken(&token,maxtok_t); en.udate=tmstampepoch; en.status=REMOVED; en.exitcode=-999; JOB_REGISTRY_ASSIGN_ENTRY(en.updater_info,string_now); JOB_REGISTRY_ASSIGN_ENTRY(en.exitreason,"\0"); }else if(line && strstr(line," Exit_status=") && en.status != REMOVED){ maxtok_t = strtoken(line, ' ', &token); timestamp=make_message("%s %s",token[0],token[1]); tmstampepoch=str2epoch(timestamp,"A"); exit_str=strdup(token[3]); if(exit_str == NULL){ sysfatal("strdup failed for exit_str in FinalStateQuery: %r"); } free(timestamp); freetoken(&token,maxtok_t); if(strstr(exit_str,"Exit_status=")){ maxtok_t = strtoken(exit_str, '=', &token); if(maxtok_t == 2){ en.exitcode=atoi(token[1]); freetoken(&token,maxtok_t); }else{ en.exitcode=-1; } }else{ en.exitcode=-1; } free(exit_str); en.udate=tmstampepoch; en.status=COMPLETED; JOB_REGISTRY_ASSIGN_ENTRY(en.updater_info,string_now); JOB_REGISTRY_ASSIGN_ENTRY(en.exitreason,"\0"); } free(string_now); free(line); } pclose(fp); } if(en.status !=UNDEFINED && en.status!=IDLE){ if ((ret=job_registry_update_select(rha, &en, JOB_REGISTRY_UPDATE_UDATE | JOB_REGISTRY_UPDATE_STATUS | JOB_REGISTRY_UPDATE_UPDATER_INFO | JOB_REGISTRY_UPDATE_EXITCODE | JOB_REGISTRY_UPDATE_EXITREASON )) < 0){ if(ret != JOB_REGISTRY_NOT_FOUND){ fprintf(stderr,"Update of record returns %d: ",ret); perror(""); } } else { do_log(debuglogfile, debug, 2, "%s: registry update in FinalStateQuery for: jobid=%s exitcode=%d status=%d\n",argv0,en.batch_id,en.exitcode,en.status); if (en.status == REMOVED || en.status == COMPLETED){ job_registry_unlink_proxy(rha, &en); } if (remupd_conf != NULL){ if (ret=job_registry_send_update(remupd_head_send,&en,NULL,NULL)<=0){ do_log(debuglogfile, debug, 2, "%s: Error creating endpoint in FinalStateQuery\n",argv0); } } } }else{ failed_count++; } free(command_string); } now=time(0); if(failed_count>10){ failed_count=10; } time_to_add=pow(failed_count,1.5); next_finalstatequery=now+time_to_add; do_log(debuglogfile, debug, 3, "%s: next FinalStatequery will be in %d seconds\n",argv0,time_to_add); freetoken(&jobid,maxtok_j); return failed_count; }
void LLFloaterAO::onNotecardLoadComplete(LLVFS *vfs,const LLUUID& asset_uuid,LLAssetType::EType type,void* user_data, S32 status, LLExtStat ext_status) { if(status == LL_ERR_NOERR) { S32 size = vfs->getSize(asset_uuid, type); U8* buffer = new U8[size]; vfs->getData(asset_uuid, type, buffer, 0, size); if(type == LLAssetType::AT_NOTECARD) { LLViewerTextEditor* edit = new LLViewerTextEditor("",LLRect(0,0,0,0),S32_MAX,""); if(edit->importBuffer((char*)buffer, (S32)size)) { llinfos << "ao nc decode success" << llendl; std::string card = edit->getText(); edit->die(); LUA_CALL("OnAONotecardRead") << card << LUA_END; mAOAllAnims.clear(); mAOStands.clear(); //mAODefaultAnims.clear(); struct_stands standsloader; struct_all_anims all_anims_loader; typedef boost::tokenizer<boost::char_separator<char> > tokenizer; boost::char_separator<char> sep("\n"); tokenizer tokline(card, sep); for (tokenizer::iterator line = tokline.begin(); line != tokline.end(); ++line) { std::string strline(*line); boost::regex type("^(\\s*)(\\[ )(.*)( \\])"); boost::smatch what; if (boost::regex_search(strline, what, type)) { boost::char_separator<char> sep("|,"); std::string stranimnames(boost::regex_replace(strline, type, "")); tokenizer tokanimnames(stranimnames, sep); for (tokenizer::iterator anim = tokanimnames.begin(); anim != tokanimnames.end(); ++anim) { std::string strtoken(what[0]); std::string stranim(*anim); int state = GetStateFromToken(strtoken.c_str()); LLUUID animid(getAssetIDByName(stranim)); if (!(animid.notNull())) { cmdline_printchat(llformat("Warning: animation '%s' could not be found (Section: %s).",stranim.c_str(),strtoken.c_str())); } else { all_anims_loader.ao_id = animid; all_anims_loader.anim_name = stranim.c_str(); all_anims_loader.state = state; mAOAllAnims.push_back(all_anims_loader); if (state == STATE_AGENT_STAND) { standsloader.ao_id = animid; standsloader.anim_name = stranim.c_str(); mAOStands.push_back(standsloader); continue; } for (std::vector<struct_default_anims>::iterator iter = mAODefaultAnims.begin(); iter != mAODefaultAnims.end(); ++iter) { if (state == iter->state) iter->ao_id = animid; } } } } } llinfos << "ao nc read sucess" << llendl; loadComboBoxes(); run(); } else { llinfos << "ao nc decode error" << llendl; } } } else { llinfos << "ao nc read error" << llendl; } }
char *strtok(char *str, char *fs) { static char *pos; return strtoken(&pos, str, fs); }
/* m_dccallow: * HISTORY: * Taken from bahamut 1.8.1 */ DLLFUNC int m_dccallow(aClient *cptr, aClient *sptr, int parc, char *parv[]) { Link *lp; char *p, *s; aClient *acptr; int didlist = 0, didhelp = 0, didanything = 0; char **ptr; static char *dcc_help[] = { "/DCCALLOW [<+|->nick[,<+|->nick, ...]] [list] [help]", "You may allow DCCs of files which are otherwise blocked by the IRC server", "by specifying a DCC allow for the user you want to recieve files from.", "For instance, to allow the user Bob to send you file.exe, you would type:", "/DCCALLOW +bob", "and Bob would then be able to send you files. Bob will have to resend the file", "if the server gave him an error message before you added him to your allow list.", "/DCCALLOW -bob", "Will do the exact opposite, removing him from your dcc allow list.", "/dccallow list", "Will list the users currently on your dcc allow list.", NULL }; if (!MyClient(sptr)) return 0; if (parc < 2) { sendnotice(sptr, "No command specified for DCCALLOW. " "Type '/DCCALLOW HELP' for more information."); return 0; } for (p = NULL, s = strtoken(&p, parv[1], ", "); s; s = strtoken(&p, NULL, ", ")) { if (*s == '+') { didanything = 1; if (!*++s) continue; acptr = find_person(s, NULL); if (acptr == sptr) continue; if (!acptr) { sendto_one(sptr, err_str(ERR_NOSUCHNICK), me.name, sptr->name, s); continue; } add_dccallow(sptr, acptr); } else if (*s == '-') { didanything = 1; if (!*++s) continue; acptr = find_person(s, NULL); if (acptr == sptr) continue; if (!acptr) { sendto_one(sptr, err_str(ERR_NOSUCHNICK), me.name, sptr->name, s); continue; } del_dccallow(sptr, acptr); } else if (!didlist && !myncmp(s, "list", 4)) { didanything = didlist = 1; sendto_one(sptr, ":%s %d %s :The following users are on your dcc allow list:", me.name, RPL_DCCINFO, sptr->name); for(lp = sptr->user->dccallow; lp; lp = lp->next) { if (lp->flags == DCC_LINK_REMOTE) continue; sendto_one(sptr, ":%s %d %s :%s (%s@%s)", me.name, RPL_DCCLIST, sptr->name, lp->value.cptr->name, lp->value.cptr->user->username, GetHost(lp->value.cptr)); } sendto_one(sptr, rpl_str(RPL_ENDOFDCCLIST), me.name, sptr->name, s); } else if (!didhelp && !myncmp(s, "help", 4)) { didanything = didhelp = 1; for(ptr = dcc_help; *ptr; ptr++) sendto_one(sptr, ":%s %d %s :%s", me.name, RPL_DCCINFO, sptr->name, *ptr); sendto_one(sptr, rpl_str(RPL_ENDOFDCCLIST), me.name, sptr->name, s); } } if (!didanything) { sendnotice(sptr, "Invalid syntax for DCCALLOW. Type '/DCCALLOW HELP' for more information."); return 0; } return 0; }
/* ** m_part ** parv[0] = sender prefix ** parv[1] = channel ** parv[2] = comment (added by Lefler) */ DLLFUNC CMD_FUNC(m_part) { aChannel *chptr; Membership *lp; char *p = NULL, *name; char *commentx = (parc > 2 && parv[2]) ? parv[2] : NULL; char *comment; int n; if (parc < 2 || parv[1][0] == '\0') { sendto_one(sptr, err_str(ERR_NEEDMOREPARAMS), me.name, parv[0], "PART"); return 0; } if (MyClient(sptr)) { if (IsShunned(sptr)) commentx = NULL; if (STATIC_PART) { if (!strcasecmp(STATIC_PART, "yes") || !strcmp(STATIC_PART, "1")) commentx = NULL; else if (!strcasecmp(STATIC_PART, "no") || !strcmp(STATIC_PART, "0")) ; /* keep original reason */ else commentx = STATIC_PART; } if (commentx) { n = dospamfilter(sptr, commentx, SPAMF_PART, parv[1], 0, NULL); if (n == FLUSH_BUFFER) return n; if (n < 0) commentx = NULL; } } for (; (name = strtoken(&p, parv[1], ",")); parv[1] = NULL) { chptr = get_channel(sptr, name, 0); if (!chptr) { sendto_one(sptr, err_str(ERR_NOSUCHCHANNEL), me.name, parv[0], name); continue; } if (check_channelmask(sptr, cptr, name)) continue; /* 'commentx' is the general part msg, but it can be changed * per-channel (eg some chans block badwords, strip colors, etc) * so we copy it to 'comment' and use that in this for loop :) */ comment = commentx; if (!(lp = find_membership_link(sptr->user->channel, chptr))) { /* Normal to get get when our client did a kick ** for a remote client (who sends back a PART), ** so check for remote client or not --Run */ if (MyClient(sptr)) sendto_one(sptr, err_str(ERR_NOTONCHANNEL), me.name, parv[0], name); continue; } if (!IsAnOper(sptr) && !is_chanownprotop(sptr, chptr)) { #ifdef STRIPBADWORDS int blocked = 0; #endif /* Banned? No comment allowed ;) */ if (comment && is_banned(sptr, chptr, BANCHK_MSG)) comment = NULL; /* And other things... */ if ((chptr->mode.mode & MODE_NOCOLOR) && comment) { if (strchr((char *)comment, 3) || strchr((char *)comment, 27)) { comment = NULL; } } if ((chptr->mode.mode & MODE_MODERATED) && comment && !has_voice(sptr, chptr) && !is_halfop(sptr, chptr)) { comment = NULL; } if ((chptr->mode.mode & MODE_STRIP) && comment) { comment = (char *)StripColors(comment); } #ifdef STRIPBADWORDS #ifdef STRIPBADWORDS_CHAN_ALWAYS if (comment) { comment = (char *)stripbadwords_channel(comment, &blocked); } #else if ((chptr->mode.extmode & EXTMODE_STRIPBADWORDS) && comment) { comment = (char *)stripbadwords_channel(comment, &blocked); } #endif #endif } /* +M and not logged in to services? */ if ((chptr->mode.mode & MODE_MODREG) && !IsLoggedIn(sptr) && !IsAnOper(sptr)) comment = NULL; if (MyConnect(sptr)) { Hook *tmphook; for (tmphook = Hooks[HOOKTYPE_PRE_LOCAL_PART]; tmphook; tmphook = tmphook->next) { comment = (*(tmphook->func.pcharfunc))(sptr, chptr, comment); if (!comment) break; } } /* Send to other servers... */ if (!comment) sendto_serv_butone_token(cptr, parv[0], MSG_PART, TOK_PART, "%s", chptr->chname); else sendto_serv_butone_token(cptr, parv[0], MSG_PART, TOK_PART, "%s :%s", chptr->chname, comment); if (1) { if ((chptr->mode.mode & MODE_AUDITORIUM) && !is_chanownprotop(sptr, chptr)) { if (!comment) { sendto_chanops_butone(NULL, chptr, ":%s!%s@%s PART %s", sptr->name, sptr->user->username, GetHost(sptr), chptr->chname); if (!is_chan_op(sptr, chptr) && MyClient(sptr)) sendto_one(sptr, ":%s!%s@%s PART %s", sptr->name, sptr->user->username, GetHost(sptr), chptr->chname); } else { sendto_chanops_butone(NULL, chptr, ":%s!%s@%s PART %s %s", sptr->name, sptr->user->username, GetHost(sptr), chptr->chname, comment); if (!is_chan_op(cptr, chptr) && MyClient(sptr)) sendto_one(sptr, ":%s!%s@%s PART %s %s", sptr->name, sptr->user->username, GetHost(sptr), chptr->chname, comment); } } else { if (!comment) sendto_channel_butserv(chptr, sptr, PARTFMT, parv[0], chptr->chname); else sendto_channel_butserv(chptr, sptr, PARTFMT2, parv[0], chptr->chname, comment); } if (MyClient(sptr)) RunHook4(HOOKTYPE_LOCAL_PART, cptr, sptr, chptr, comment); else RunHook4(HOOKTYPE_REMOTE_PART, cptr, sptr, chptr, comment); remove_user_from_channel(sptr, chptr); } } return 0; }
/* * m_accept - ACCEPT command handler * parv[0] = sender prefix * parv[1] = servername */ static void m_accept(struct Client *client_p, struct Client *source_p, int parc, char *parv[]) { char *nick; char *p = NULL; static char addbuf[BUFSIZE]; static char delbuf[BUFSIZE]; struct Client *target_p; int accept_num; if(*parv[1] == '*') { list_accepts(source_p); return; } build_nicklist(source_p, addbuf, delbuf, parv[1]); /* parse the delete list */ for(nick = strtoken(&p, delbuf, ","); nick != NULL; nick = strtoken(&p, NULL, ",")) { /* shouldnt happen, but lets be paranoid */ if(((target_p = find_client(nick)) == NULL) || !IsPerson(target_p)) { sendto_one(source_p, form_str(ERR_NOSUCHNICK), me.name, source_p->name, nick); continue; } /* user isnt on clients accept list */ if(!accept_message(target_p, source_p)) { sendto_one(source_p, form_str(ERR_ACCEPTNOT), me.name, source_p->name, target_p->name); continue; } del_from_accept(target_p, source_p); } /* get the number of accepts they have */ accept_num = dlink_list_length(&source_p->allow_list); /* parse the add list */ for(nick = strtoken(&p, addbuf, ","); nick; nick = strtoken(&p, NULL, ","), accept_num++) { /* shouldnt happen, but lets be paranoid */ if(((target_p = find_client(nick)) == NULL) || !IsPerson(target_p)) { sendto_one(source_p, form_str(ERR_NOSUCHNICK), me.name, source_p->name, nick); continue; } /* user is already on clients accept list */ if(accept_message(target_p, source_p)) { sendto_one(source_p, form_str(ERR_ACCEPTEXIST), me.name, source_p->name, target_p->name); continue; } if(accept_num >= ConfigFileEntry.max_accept) { sendto_one(source_p, form_str(ERR_ACCEPTFULL), me.name, source_p->name); return; } /* why is this here? */ /* del_from accept(target_p, source_p); */ add_accept(source_p, target_p); } }
int sysopdownload(const char *params) { const char *srcstrh; char parbuf[1024]; char bigbuf[4096]; int discon = 0; struct FFlag *myf; FILE *listh; char lastfile[100]; int keepc = 1; changenodestatus("SysOp download"); TypeFile("sysopdownload", TYPE_MAKE); srcstrh = params; for (;;) { if (strtoken(parbuf, &srcstrh, sizeof parbuf) > sizeof parbuf) continue; if (!*parbuf) break; sflagfile(parbuf); } for (;;) { typedlprompt(); bigbuf[0] = 0; if (!(Prompt(bigbuf, 200, 0))) return 0; if (!bigbuf[0]) { break; } else if (!strcasecmp(bigbuf, "a")) { return 0; } else { srcstrh = bigbuf; for (;;) { if (strtoken(parbuf, &srcstrh, sizeof parbuf) > sizeof parbuf) continue; if (!*parbuf) break; sflagfile(parbuf); } } } if (!filestagged) return 0; listtags(); if (estimsecs(bytestagged) > timeleft) { DDPut(sd[dlnotimestr]); return 0; } for (;;) { DDPut(sd[dlproceedstr]); bigbuf[0] = 0; if (!(Prompt(bigbuf, 3, 0))) return 0; if (!bigbuf[0] || bigbuf[0] == 'p' || bigbuf[0] == 'P') break; else if (bigbuf[0] == 'e' || bigbuf[0] == 'E') { taged(0); } else if (bigbuf[0] == 'd' || bigbuf[0] == 'D') { discon = 1; break; } else if (bigbuf[0] == 'a' || bigbuf[0] == 'A') { return 0; } } if (estimsecs(bytestagged) > timeleft) { DDPut(sd[dlnotimestr]); return 0; } snprintf(parbuf, sizeof parbuf - 250, "%s/dszlog.%d", DDTMP, node); snprintf(&parbuf[250], sizeof parbuf - 250, "%s/ddfilelist.%d", DDTMP, node); unlink(&parbuf[250]); if (!(listh = fopen(&parbuf[250], "w"))) return 0; myf = (struct FFlag *) flaggedfiles->lh_Head; while (myf->fhead.ln_Succ) { char tbu[256]; snprintf(tbu, sizeof tbu, "%s%s\n", myf->f_path, myf->f_filename); fputs(tbu, listh); myf = (struct FFlag *) myf->fhead.ln_Succ; } fclose(listh); *lastfile = 0; sendfiles(&parbuf[250], lastfile, sizeof lastfile); if (*lastfile) { myf = (struct FFlag *) flaggedfiles->lh_Head; while (myf->fhead.ln_Succ && keepc) { struct FFlag *oldf; if (!strcasecmp(lastfile, myf->f_filename)) keepc = 0; Remove((struct Node *) myf); oldf = myf; myf = (struct FFlag *) myf->fhead.ln_Succ; free(oldf); } } recountfiles(); unlink(&parbuf[250]); if (protocol->PROTOCOL_TYPE == 2 || protocol->PROTOCOL_TYPE == 3) { upload(2); } if (discon) { if (autodisconnect()) return 2; } return 1; }
int tagmessageareas(void) { uint8_t backup[32]; char tbuf[500]; const char *sta; msgbase_t *mb; int bcnt; char inp[90]; const char *s; char tok[90]; int screenl; int i, j; memcpy(backup, &selcfg[(conference()->conf.CONF_NUMBER - 1) * 32], sizeof backup); vagain: DDPut("[2J[H"); screenl = user.user_screenlength; bcnt = conference()->conf.CONF_MSGBASES; for (i = j = 0; j < bcnt; j++) { mb = conference()->msgbases[j]; i++; if (i == 3) { DDPut("\n"); i = 1; screenl--; if (screenl == 1) { int hot; DDPut(sd[morepromptstr]); hot = HotKey(0); DDPut("\r \r"); if (hot == 'N' || hot == 'n' || !checkcarrier()) break; if (hot == 'C' || hot == 'c') { screenl = 20000000; } else { screenl = user.user_screenlength; } } } if (isbasetagged(conference()->conf.CONF_NUMBER, mb->MSGBASE_NUMBER)) { sta = "ON"; } else sta = "OFF"; ddprintf(sd[tbclinestr], mb->MSGBASE_NUMBER, mb->MSGBASE_NAME, sta); } DDPut("\n"); for (;;) { DDPut(sd[tbpromptstr]); inp[0] = 0; if (!(Prompt(inp, 80, 0))) return 0; s = inp; if (!*inp) { strlcpy(inp, "s", sizeof inp); } for (;;) { if (strtoken(tok, &s, sizeof tok) > sizeof tok) continue; if (!*tok) break; if (!strcasecmp(tok, "c")) { memcpy(&selcfg[(conference()->conf.CONF_NUMBER - 1) * 32], backup, sizeof backup); return 0; } else if (!strcasecmp(tok, "v")) { goto vagain; } else if (!strcasecmp(tok, "s")) { int selfd; snprintf(tbuf, sizeof tbuf, "users/%d/selected.dat", user.user_account_id); selfd = open(tbuf, O_WRONLY | O_CREAT, 0666); if (selfd != -1) { fsetperm(selfd, 0666); safe_write(selfd, &selcfg, 2056); close(selfd); } return 0; } else if (!strcasecmp(tok, "-")) { for (i = 0; i < 32; i++) { selcfg[((conference()->conf.CONF_NUMBER - 1) * 32) + i] = 0; } DDPut(sd[tballoffstr]); } else if (!strcasecmp(tok, "+")) { bcnt = conference()->conf.CONF_MSGBASES; for (i = 0; i < bcnt; i++) { mb = conference()->msgbases[i]; selcfg[((conference()->conf.CONF_NUMBER - 1) * 32) + (mb->MSGBASE_NUMBER - 1) / 8] |= (1L << (mb->MSGBASE_NUMBER - 1) % 8); } DDPut(sd[tballonstr]); } else { i = atoi(tok); if (i) { for (j = 0; j < conference()->conf.CONF_MSGBASES; j++) { mb = conference()->msgbases[j]; if (i == mb->MSGBASE_NUMBER) { if (selcfg[((conference()->conf.CONF_NUMBER - 1) * 32) + (mb->MSGBASE_NUMBER - 1) / 8] & (1L << (mb->MSGBASE_NUMBER - 1) % 8)) { selcfg[((conference()->conf.CONF_NUMBER - 1) * 32) + (mb->MSGBASE_NUMBER - 1) / 8] &= ~(1L << (mb->MSGBASE_NUMBER - 1) % 8); } else { selcfg[((conference()->conf.CONF_NUMBER - 1) * 32) + (mb->MSGBASE_NUMBER - 1) / 8] |= (1L << (mb->MSGBASE_NUMBER - 1) % 8); } break; } } } } } } }