static void update_status_text() { static char s_buff[32]; snprintf(s_buff, sizeof(s_buff), "(%d,%d,%d) | %s | %s", s_cursor.x, s_cursor.y, s_cursor.z, get_mode_string(), get_block_name() ); text_layer_set_text(s_status_layer, s_buff); }
int mtnfile_list(char *path) { char pname[64]; char gname[64]; struct tm *tm; struct passwd *pw; struct group *gr; MTNSTAT *rst = mtn_list(mtn, path); MTNSTAT *kst = rst; STR fs = mtnfile_list_format_string(rst); while(kst){ tm = localtime(&(kst->stat.st_mtime)); if((pw = getpwuid(kst->stat.st_uid))){ strcpy(pname, pw->pw_name); }else{ sprintf(pname, "%d", kst->stat.st_uid); } if((gr = getgrgid(kst->stat.st_gid))){ strcpy(gname, gr->gr_name); }else{ sprintf(gname, "%d", kst->stat.st_gid); } printf(fs, kst->svr->host, get_mode_string(kst->stat.st_mode), pname, gname, kst->stat.st_size); printf("%02d/%02d/%02d ", (1900 + tm->tm_year) % 100, tm->tm_mon, tm->tm_mday); printf("%02d:%02d:%02d ", tm->tm_hour, tm->tm_min, tm->tm_sec); printf("%s\n", kst->name); kst = kst->next; } rst = clrstat(rst); return(0); }
static void fxp_preserve_attribs(const rfile *fi, char *dest) { mode_t m = rfile_getmode(fi); if(m != (mode_t)-1) { if(ftp->has_site_chmod_command) ftp_chmod(dest, get_mode_string(m)); } }
// ---------------------------------------------------------------- void multi_lrec_writer_output_srec(multi_lrec_writer_t* pmlw, lrec_t* poutrec, char* filename_or_command, file_output_mode_t file_output_mode, int flush_every_record, context_t* pctx) { lrec_writer_and_fp_t* pstate = lhmsv_get(pmlw->pnames_to_lrec_writers_and_fps, filename_or_command); if (pstate == NULL) { pstate = mlr_malloc_or_die(sizeof(lrec_writer_and_fp_t)); pstate->plrec_writer = lrec_writer_alloc(pmlw->pwriter_opts); MLR_INTERNAL_CODING_ERROR_IF(pstate->plrec_writer == NULL); pstate->filename_or_command = mlr_strdup_or_die(filename_or_command); char* mode_string = get_mode_string(file_output_mode); char* mode_desc = get_mode_desc(file_output_mode); if (file_output_mode == MODE_PIPE) { pstate->is_popen = TRUE; pstate->output_stream = popen(filename_or_command, mode_string); if (pstate->output_stream == NULL) { perror("popen"); fprintf(stderr, "%s: failed popen for %s on \"%s\".\n", MLR_GLOBALS.bargv0, mode_desc, filename_or_command); exit(1); } } else { pstate->is_popen = FALSE; pstate->output_stream = fopen(filename_or_command, mode_string); if (pstate->output_stream == NULL) { perror("fopen"); fprintf(stderr, "%s: failed fopen for %s on \"%s\".\n", MLR_GLOBALS.bargv0, mode_desc, filename_or_command); exit(1); } } lhmsv_put(pmlw->pnames_to_lrec_writers_and_fps, mlr_strdup_or_die(filename_or_command), pstate, FREE_ENTRY_KEY); } pstate->plrec_writer->pprocess_func(pstate->plrec_writer->pvstate, pstate->output_stream, poutrec, pctx); if (poutrec != NULL) { if (flush_every_record) fflush(pstate->output_stream); } else { if (pstate->is_popen) { // Sadly, pclose returns an error even on well-formed commands. For example, if the popened // command was "grep nonesuch" and the string "nonesuch" was not encountered, grep returns // non-zero and popen flags it as an error. We cannot differentiate these from genuine // failure cases so the best choice is to simply call pclose and ignore error codes. // If a piped-to command does fail then it should have some output to stderr which the // user can take advantage of. (void)pclose(pstate->output_stream); } else { if (fclose(pstate->output_stream) != 0) { perror("fclose"); fprintf(stderr, "%s: fclose error on \"%s\".\n", MLR_GLOBALS.bargv0, filename_or_command); exit(1); } } pstate->output_stream = NULL; } }
static const char * help_iw(void) { static xsg_string_t *string = NULL; xsg_list_t *l; int i = 0; init_iw(); if (skfd < 0) { return NULL; } if (string == NULL) { string = xsg_string_new(NULL); } else { xsg_string_truncate(string, 0); } get_iw_device_list(); for (l = device_list; l; l = l->next) { char name[128]; snprintf(name, sizeof(name), "IW_INTERFACE%d", i++); xsg_setenv(name, (char *) device_list->data, TRUE); xsg_string_append_printf(string, "%s: %s\n", name, (char *) device_list->data); } xsg_string_append(string, "\n"); for (l = device_list; l; l = l->next) { char *ifname = (char *) l->data; xsg_string_append_printf(string, "S %s:%s:%-36s%s\n", XSG_MODULE_NAME, ifname, "config:name", get_name(ifname)); xsg_string_append_printf(string, "N %s:%s:%-36s%.0f\n", XSG_MODULE_NAME, ifname, "config:nwid", get_nwid(ifname)); xsg_string_append_printf(string, "N %s:%s:%-36s%.0f\n", XSG_MODULE_NAME, ifname, "config:freq", get_freq_number(ifname)); xsg_string_append_printf(string, "S %s:%s:%-36s%s\n", XSG_MODULE_NAME, ifname, "config:freq", get_freq_string(ifname)); xsg_string_append_printf(string, "N %s:%s:%-36s%.0f\n", XSG_MODULE_NAME, ifname, "config:channel", get_channel(ifname)); xsg_string_append_printf(string, "S %s:%s:%-36s%s\n", XSG_MODULE_NAME, ifname, "config:key", get_key(ifname)); xsg_string_append_printf(string, "N %s:%s:%-36s%.0f\n", XSG_MODULE_NAME, ifname, "config:keyid", get_keyid(ifname)); xsg_string_append_printf(string, "S %s:%s:%-36s%s\n", XSG_MODULE_NAME, ifname, "config:essid", get_essid(ifname)); xsg_string_append_printf(string, "N %s:%s:%-36s%.0f\n", XSG_MODULE_NAME, ifname, "config:mode", get_mode_number(ifname)); xsg_string_append_printf(string, "S %s:%s:%-36s%s\n", XSG_MODULE_NAME, ifname, "config:mode", get_mode_string(ifname)); xsg_string_append_printf(string, "N %s:%s:%-36s%.0f\n", XSG_MODULE_NAME, ifname, "info:sensitivity", get_sens(ifname)); xsg_string_append_printf(string, "S %s:%s:%-36s%s\n", XSG_MODULE_NAME, ifname, "info:nickname", get_nickname(ifname)); xsg_string_append_printf(string, "S %s:%s:%-36s%s\n", XSG_MODULE_NAME, ifname, "info:access_point", get_ap(ifname)); xsg_string_append_printf(string, "N %s:%s:%-36s%.0f\n", XSG_MODULE_NAME, ifname, "info:bitrate", get_bitrate_number(ifname)); xsg_string_append_printf(string, "S %s:%s:%-36s%s\n", XSG_MODULE_NAME, ifname, "info:bitrate", get_bitrate_string(ifname)); xsg_string_append_printf(string, "N %s:%s:%-36s%.0f\n", XSG_MODULE_NAME, ifname, "info:rts", get_rts_number(ifname)); xsg_string_append_printf(string, "S %s:%s:%-36s%s\n", XSG_MODULE_NAME, ifname, "info:rts", get_rts_string(ifname)); xsg_string_append_printf(string, "N %s:%s:%-36s%.0f\n", XSG_MODULE_NAME, ifname, "info:fragment", get_frag_number(ifname)); xsg_string_append_printf(string, "S %s:%s:%-36s%s\n", XSG_MODULE_NAME, ifname, "info:fragment", get_frag_string(ifname)); xsg_string_append_printf(string, "S %s:%s:%-36s%s\n", XSG_MODULE_NAME, ifname, "info:power_management", get_power_management(ifname)); xsg_string_append_printf(string, "N %s:%s:%-36s%.0f\n", XSG_MODULE_NAME, ifname, "info:txpower:dbm", get_txpower_dbm(ifname)); xsg_string_append_printf(string, "N %s:%s:%-36s%.2f\n", XSG_MODULE_NAME, ifname, "info:txpower:mw", get_txpower_mw(ifname)); xsg_string_append_printf(string, "S %s:%s:%-36s%s\n", XSG_MODULE_NAME, ifname, "info:retry", get_retry(ifname)); xsg_string_append_printf(string, "N %s:%s:%-36s%.0f\n", XSG_MODULE_NAME, ifname, "stats:quality:quality", get_stats_quality_quality(ifname)); xsg_string_append_printf(string, "N %s:%s:%-36s%.0f\n", XSG_MODULE_NAME, ifname, "stats:quality:signal", get_stats_quality_signal(ifname)); xsg_string_append_printf(string, "N %s:%s:%-36s%.0f\n", XSG_MODULE_NAME, ifname, "stats:quality:noise", get_stats_quality_noise(ifname)); xsg_string_append_printf(string, "N %s:%s:%-36s%.0f\n", XSG_MODULE_NAME, ifname, "stats:discarded:nwid", get_stats_discarded_nwid(ifname)); xsg_string_append_printf(string, "N %s:%s:%-36s%.0f\n", XSG_MODULE_NAME, ifname, "stats:discarded:code", get_stats_discarded_code(ifname)); xsg_string_append_printf(string, "N %s:%s:%-36s%.0f\n", XSG_MODULE_NAME, ifname, "stats:discarded:fragment", get_stats_discarded_fragment(ifname)); xsg_string_append_printf(string, "N %s:%s:%-36s%.0f\n", XSG_MODULE_NAME, ifname, "stats:discarded:retries", get_stats_discarded_retries(ifname)); xsg_string_append_printf(string, "N %s:%s:%-36s%.0f\n", XSG_MODULE_NAME, ifname, "stats:discarded:misc", get_stats_discarded_misc(ifname)); xsg_string_append_printf(string, "N %s:%s:%-36s%.0f\n", XSG_MODULE_NAME, ifname, "stats:missed:beacon", get_stats_missed_beacon(ifname)); xsg_string_append_printf(string, "N %s:%s:%-36s%.0f\n", XSG_MODULE_NAME, ifname, "range:sensitivity", get_range_sensitivity(ifname)); xsg_string_append_printf(string, "N %s:%s:%-36s%.0f\n", XSG_MODULE_NAME, ifname, "range:max_quality:quality", get_range_max_quality_quality(ifname)); } return string->str; }
static void putfile(const char *path, struct stat *sb, unsigned opt, const char *output) { putmode_t how = putNormal; bool file_exists = false; char *dest, *dpath; int r; bool dir_created; char *dest_dir, *q_dest_dir; if((put_glob_mask && fnmatch(put_glob_mask, base_name_ptr(path), FNM_EXTMATCH) == FNM_NOMATCH) #ifdef HAVE_REGEX || (put_rx_mask_set && regexec(&put_rx_mask, base_name_ptr(path), 0, 0, 0) == REG_NOMATCH) #endif ) return; if(!output) output = "."; if(test(opt, PUT_PARENTS)) { char *p = base_dir_xptr(path); asprintf(&dest, "%s/%s/%s", output, p, base_name_ptr(path)); free(p); } else if(test(opt, PUT_OUTPUT_FILE)) dest = xstrdup(output); else asprintf(&dest, "%s/%s", output, base_name_ptr(path)); path_collapse(dest); /* make sure destination directory exists */ dpath = base_dir_xptr(dest); dest_dir = ftp_path_absolute(dpath); q_dest_dir = bash_backslash_quote(dest_dir); r = ftp_mkpath(q_dest_dir); free(q_dest_dir); free(dest_dir); if(r == -1) { transfer_mail_msg(_("failed to create directory %s\n"), dest_dir); free(dpath); free(dest); return; } dir_created = (r == 1); if(!dir_created && !test(opt, PUT_UNIQUE) && !test(opt, PUT_FORCE)) { rfile *f; f = ftp_get_file(dest); file_exists = (f != 0); if(f && risdir(f)) { /* can't overwrite a directory */ printf(_("%s: is a directory\n"), dest); free(dest); return; } } if(test(opt, PUT_APPEND)) { how = putAppend; } else if(file_exists) { if(test(opt, PUT_SKIP_EXISTING)) { printf(_("Remote file '%s' exists, skipping...\n"), shortpath(dest, 42, ftp->homedir)); free(dest); return; } else if(test(opt, PUT_NEWER)) { time_t ft = ftp_filetime(dest); if(ft != (time_t)-1 && ft >= sb->st_mtime) { printf(_("Remote file '%s' is newer than local, skipping...\n"), shortpath(dest, 42, ftp->homedir)); free(dest); return; } } else if(!test(opt, PUT_RESUME)) { if(!put_owbatch) { struct tm *fan = gmtime(&sb->st_mtime); time_t ft; int a; rfile *f; char *e; f = ftp_get_file(dest); ft = ftp_filetime(f->path); sb->st_mtime = gmt_mktime(fan); e = xstrdup(ctime(&sb->st_mtime)); a = ask(ASKYES|ASKNO|ASKUNIQUE|ASKCANCEL|ASKALL|ASKRESUME, ASKRESUME, _("Remote file '%s' exists\nLocal: %lld bytes, %sRemote: %lld bytes, %sOverwrite?"), shortpath(dest, 42, ftp->homedir), (unsigned long long) sb->st_size, e ? e : "unknown size", ftp_filesize(f->path), ctime(&ft)); free(e); if(a == ASKCANCEL) { put_quit = true; free(dest); return; } else if(a == ASKNO) { free(dest); return; } else if(a == ASKUNIQUE) opt |= PUT_UNIQUE; /* for this file only */ else if(a == ASKALL) put_owbatch = true; else if(a == ASKRESUME) opt |= PUT_RESUME; /* for this file only */ /* else a == ASKYES */ } } } if(test(opt, PUT_RESUME)) how = putResume; if(test(opt, PUT_UNIQUE)) how = putUnique; r = do_the_put(path, dest, how, opt); free(dest); if(r != 0) return; if(test(opt, PUT_PRESERVE)) { if(ftp->has_site_chmod_command) ftp_chmod(ftp->ti.local_name, get_mode_string(sb->st_mode)); } if(test(opt, PUT_DELETE_AFTER)) { bool dodel = false; if(!test(opt, PUT_FORCE) && !put_delbatch) { int a = ask(ASKYES|ASKNO|ASKCANCEL|ASKALL, ASKYES, _("Delete local file '%s'?"), shortpath(path, 42, gvLocalHomeDir)); if(a == ASKALL) { put_delbatch = true; dodel = true; } else if(a == ASKCANCEL) put_quit = true; else if(a != ASKNO) dodel = true; } else dodel = true; if(dodel) { if(unlink(path) == 0) printf(_("%s: deleted\n"), shortpath(path, 42, gvLocalHomeDir)); else printf(_("error deleting '%s': %s\n"), shortpath(path, 42, gvLocalHomeDir), strerror(errno)); } } }
/* ** m_whois ** parv[0] = sender prefix ** parv[1] = nickname masklist */ int m_whois(struct Client *cptr, struct Client *sptr, int parc, char *parv[]) { static anUser UnknownUser = { NULL, /* next */ NULL, /* channel */ NULL, /* invited */ NULL, /* silence */ NULL, /* away */ 0, /* last */ 1, /* refcount */ 0, /* joined */ "<Unknown>" /* server */ }; static char rpl_oper[] = "an IRC Operator"; static char rpl_locop[] = "an IRC Operator - Local IRC Operator"; static char rpl_sadmin[] = "an IRC Operator - Services Administrator"; static char rpl_admin[] = "an IRC Operator - Server Administrator"; static char rpl_tadmin[] = "an IRC Operator - Technical Administrator"; static char rpl_nadmin[] = "an IRC Operator - Network Administrator"; Link *lp; anUser *user; struct Client *acptr, *a2cptr; aChannel *chptr; char *nick, *name; /* char *tmp; */ char *p = NULL; int found, len, mlen; static time_t last_used=0L; char *nick_match=NULL, *user_match=NULL, *host_match=NULL, *server_match=NULL; char *name_match=NULL; int found_mode; int hits = 0; char *mename = me.name; if(sptr->user && sptr->user->vlink) mename = sptr->user->vlink->name; if (parc < 2) { sendto_one(sptr, form_str(ERR_NONICKNAMEGIVEN), mename, parv[0]); return 0; } if(parc > 2) { if (hunt_server(cptr,sptr,":%s WHOIS %s :%s", 1,parc,parv) != HUNTED_ISME) return 0; parv[1] = parv[2]; } if(!IsAnOper(sptr) && !MyConnect(sptr)) /* pace non local requests */ { if((last_used + WHOIS_WAIT) > CurrentTime) { /* Unfortunately, returning anything to a non local * request =might= increase sendq to be usable in a split hack * Sorry gang ;-( - Dianora */ return 0; } else { last_used = CurrentTime; } } /* Multiple whois from remote hosts, can be used * to flood a server off. One could argue that multiple whois on * local server could remain. Lets think about that, for now * removing it totally. * -Dianora */ /* for (tmp = parv[1]; (nick = strtoken(&p, tmp, ",")); tmp = NULL) */ nick = parv[1]; p = strchr(parv[1],','); if(p) *p = '\0'; { int invis, member, wilds; found = 0; (void)collapse(nick); wilds = (nick[0]=='$' || strchr(nick, '?') || strchr(nick, '*')); /* ** We're no longer allowing remote users to generate ** requests with wildcards. */ if (wilds && !IsAnOper(sptr)) { sendto_one(sptr, form_str(ERR_NOSUCHNICK), mename, parv[0], nick); return 0; } /* continue; */ /* If the nick doesn't have any wild cards in it, * then just pick it up from the hash table * - Dianora */ if(!wilds) { acptr = hash_find_client(nick,(struct Client *)NULL); if(!acptr) { sendto_one(sptr, form_str(ERR_NOSUCHNICK), mename, parv[0], nick); sendto_one(sptr, form_str(RPL_ENDOFWHOIS), mename, parv[0], parv[1]); return 0; /* continue; */ } if(IsStealth(acptr)) { sendto_one(sptr, form_str(ERR_NOSUCHNICK), mename, parv[0], nick); return 0; // Add by ^Stinger^ after the idea of Soldier (: } if(!IsPerson(acptr)) { sendto_one(sptr, form_str(RPL_ENDOFWHOIS), mename, parv[0], parv[1]); return 0; } /* continue; */ user = acptr->user ? acptr->user : &UnknownUser; name = (!*acptr->name) ? "?" : acptr->name; invis = IsInvisible(acptr); member = (user->channel) ? 1 : 0; a2cptr = find_server(user->server); sendto_one(sptr, form_str(RPL_WHOISUSER), mename, parv[0], name, acptr->username, acptr->host, acptr->info); if((IsOper(sptr) || (acptr == sptr)) && WhoisExtension) { sendto_one(sptr, form_str(RPL_WHOISREALHOST), mename, parv[0], name, acptr->realhost); } mlen = strlen(mename) + strlen(parv[0]) + 6 + strlen(name); *buf = '\0'; if (IsSsl(acptr)) { sendto_one(sptr, form_str(RPL_WHOISSECURE), mename, parv[0], parv[1]); } if(((!IsPrivate(acptr) || IsOper(sptr)) || (acptr==sptr)) && !IsStealth(acptr)) for (len = 0, *buf = '\0', lp = user->channel; lp; lp = lp->next) { chptr = lp->value.chptr; if (ShowChannel(sptr, chptr)) { if (len + strlen(chptr->chname) > (size_t) BUFSIZE - 4 - mlen) { sendto_one(sptr, ":%s %d %s %s :%s", mename, RPL_WHOISCHANNELS, parv[0], name, buf); *buf = '\0'; len = 0; } found_mode = user_channel_mode(acptr, chptr); #ifdef HIDE_OPS if(is_chan_op(sptr,chptr)) #endif { if(found_mode & CHFL_CHANOP) *(buf + len++) = '@'; #ifdef HALFOPS else if (found_mode & CHFL_HALFOP) *(buf + len++) = '%'; #endif else if (found_mode & CHFL_VOICE) *(buf + len++) = '+'; } if (len) *(buf + len) = '\0'; (void)strcpy(buf + len, chptr->chname); len += strlen(chptr->chname); (void)strcat(buf + len, " "); len++; } } if (buf[0] != '\0') sendto_one(sptr, form_str(RPL_WHOISCHANNELS), mename, parv[0], name, buf); if(IsAnOper(sptr) || !HideServerOnWhois) { #ifdef SERVERHIDE if (!(IsAnOper(sptr) || acptr == sptr)) sendto_one(sptr, form_str(RPL_WHOISSERVER), mename, parv[0], name, NetworkName, NetworkDesc); else #endif if(acptr->user && acptr->user->vlink) sendto_one(sptr, form_str(RPL_WHOISSERVER), mename, parv[0], name, user->vlink->name, user->vlink->passwd); else { if(!IsService(acptr) || IsAnOper(sptr) || !HideServicesServer) sendto_one(sptr, form_str(RPL_WHOISSERVER), mename, parv[0], name, user->server, a2cptr?a2cptr->info:"*Not On This Net*"); } } /* if(IsAnOper(sptr) || HideServerOnWhois) */ if (IsIdentified(acptr)) sendto_one(sptr, form_str(RPL_WHOISIDENTIFIED), mename, parv[0], name); if (IsHelper(acptr)) sendto_one(sptr, form_str(RPL_WHOISHELPOP), mename, parv[0], name); if(IsOper(sptr) && WhoisExtension) { sendto_one(sptr, form_str(RPL_WHOISMODE), mename, parv[0], name, get_mode_string(acptr)); } if (user->away) sendto_one(sptr, form_str(RPL_AWAY), mename, parv[0], name, user->away); if(!IsHideOper(acptr) || IsOper(sptr)) { if (IsNetAdmin(acptr)) sendto_one(sptr, form_str(RPL_WHOISOPERATOR), mename, parv[0], name, rpl_nadmin); else if (IsTechAdmin(acptr)) sendto_one(sptr, form_str(RPL_WHOISOPERATOR), mename, parv[0], name, rpl_tadmin); else if (IsSAdmin(acptr)) sendto_one(sptr, form_str(RPL_WHOISOPERATOR), mename, parv[0], name, rpl_sadmin); else if (IsAdmin(acptr)) sendto_one(sptr, form_str(RPL_WHOISOPERATOR), mename, parv[0], name, rpl_admin); else if (IsOper(acptr)) sendto_one(sptr, form_str(RPL_WHOISOPERATOR), mename, parv[0], name, rpl_oper); else if (IsLocOp(acptr)) sendto_one(sptr, form_str(RPL_WHOISOPERATOR), mename, parv[0], name, rpl_locop); } #ifdef WHOIS_NOTICE if ((IsOper(acptr)) && ((acptr)->umodes & UMODE_SPY) && (MyConnect(sptr)) && (IsPerson(sptr)) && (acptr != sptr) && !is_silenced(sptr, acptr)) sendto_one(acptr, ":%s NOTICE %s :*** Notice -- %s (%s@%s) is doing a /whois on you.", me.name, acptr->name, parv[0], sptr->username, sptr->realhost); #endif /* #ifdef WHOIS_NOTICE */ if ((acptr->user #ifdef SERVERHIDE && IsAnOper(sptr) #endif && MyConnect(acptr))) sendto_one(sptr, form_str(RPL_WHOISIDLE), mename, parv[0], name, CurrentTime - user->last, acptr->firsttime); sendto_one(sptr, form_str(RPL_ENDOFWHOIS), mename, parv[0], parv[1]); return 0; /* continue; */ } /* wild is true so here we go */ if(nick[0]==':') /* real name match */ { name_match = &nick[1]; nick_match = NULL; } else if(nick[0]=='$') /* server name match */ { server_match = &nick[1]; nick_match = NULL; } else { host_match = strchr(nick,'@'); if(host_match) { if(*host_match) *(host_match++) = '\0'; user_match=nick; if(host_match=='\0') host_match="*"; if(user_match=='\0') user_match="*"; } else nick_match = nick; } for (acptr = GlobalClientList; acptr; acptr = acptr->next) { if (IsServer(acptr)) continue; /* * I'm always last :-) and acptr->next == NULL!! */ if (IsMe(acptr)) break; /* * 'Rules' established for sending a WHOIS reply: * * * - if wildcards are being used dont send a reply if * the querier isnt any common channels and the * client in question is invisible and wildcards are * in use (allow exact matches only); * * - only send replies about common or public channels * the target user(s) are on; */ /* If its an unregistered client, ignore it, it can be "seen" on a /trace anyway -Dianora */ if(!IsRegistered(acptr)) continue; user = acptr->user ? acptr->user : &UnknownUser; name = (!*acptr->name) ? "?" : acptr->name; if( (server_match && !match(server_match, user->server)) || (nick_match && !match(nick, name)) || (host_match && !match(host_match, acptr->realhost) && !match(host_match, acptr->host)) || (user_match && !match(user_match, acptr->username)) || (name_match && !match(name_match, acptr->info)) ) continue; ++hits; a2cptr = find_server(user->server); sendto_one(sptr, form_str(RPL_WHOISUSER), mename, parv[0], name, acptr->username, IsOper(sptr) ? acptr->realhost : acptr->host, acptr->info); found = 1; mlen = strlen(mename) + strlen(parv[0]) + 6 + strlen(name); for (len = 0, *buf = '\0', lp = user->channel; lp; lp = lp->next) { chptr = lp->value.chptr; if (ShowChannel(sptr, chptr)) { if (len + strlen(chptr->chname) > (size_t) BUFSIZE - 4 - mlen) { sendto_one(sptr, ":%s %d %s %s :%s", mename, RPL_WHOISCHANNELS, parv[0], name, buf); *buf = '\0'; len = 0; } found_mode = user_channel_mode(acptr, chptr); #ifdef HIDE_OPS if(is_chan_op(sptr,chptr)) #endif { if (found_mode & CHFL_CHANOP) *(buf + len++) = '@'; #ifdef HALFOPS else if (found_mode & CHFL_HALFOP) *(buf + len++) = '%'; #endif else if (found_mode & CHFL_VOICE) *(buf + len++) = '+'; } if (len) *(buf + len) = '\0'; (void)strcpy(buf + len, chptr->chname); len += strlen(chptr->chname); (void)strcat(buf + len, " "); len++; } } if (buf[0] != '\0') sendto_one(sptr, form_str(RPL_WHOISCHANNELS), mename, parv[0], name, buf); #ifdef SERVERHIDE if (!(IsAnOper(sptr) || acptr == sptr)) sendto_one(sptr, form_str(RPL_WHOISSERVER), mename, parv[0], name, NetworkName, NetworkDesc); else #endif sendto_one(sptr, form_str(RPL_WHOISSERVER), mename, parv[0], name, user->server, a2cptr?a2cptr->info:"*Not On This Net*"); if (user->away) sendto_one(sptr, form_str(RPL_AWAY), mename, parv[0], name, user->away); if (IsNetAdmin(acptr)) sendto_one(sptr, form_str(RPL_WHOISOPERATOR), mename, parv[0], name, rpl_nadmin); else if (IsTechAdmin(acptr)) sendto_one(sptr, form_str(RPL_WHOISOPERATOR), mename, parv[0], name, rpl_tadmin); else if (IsSAdmin(acptr)) sendto_one(sptr, form_str(RPL_WHOISOPERATOR), mename, parv[0], name, rpl_sadmin); else if (IsAdmin(acptr)) sendto_one(sptr, form_str(RPL_WHOISOPERATOR), mename, parv[0], name, rpl_admin); else if (IsAnOper(acptr)) sendto_one(sptr, form_str(RPL_WHOISOPERATOR), mename, parv[0], name, rpl_oper); #ifdef WHOIS_NOTICE if ((MyOper(acptr)) && ((acptr)->umodes & UMODE_SPY) && (MyConnect(sptr)) && (IsPerson(sptr)) && (acptr != sptr)) sendto_one(acptr, ":%s NOTICE %s :*** Notice -- %s (%s@%s) is doing a /whois on you.", mename, acptr->name, parv[0], sptr->username, sptr->realhost); #endif /* #ifdef WHOIS_NOTICE */ if ((acptr->user #ifdef SERVERHIDE && IsAnOper(sptr) #endif && MyConnect(acptr))) sendto_one(sptr, form_str(RPL_WHOISIDLE), mename, parv[0], name, CurrentTime - user->last, acptr->firsttime); if(hits>50) { sendto_one(sptr,":%s NOTICE %s :Aborting /whois output as flood prevention", mename, sptr->name); break; } } if (!found) sendto_one(sptr, form_str(ERR_NOSUCHNICK), mename, parv[0], nick); else sendto_one(sptr,":%s NOTICE %s :This /whois matched \2%i\2 user(s)", mename, sptr->name,hits); /* if (p) p[-1] = ','; */ } sendto_one(sptr, form_str(RPL_ENDOFWHOIS), mename, parv[0], parv[1]); return 0; }