#include "tnn.h" #ifdef L1IRC #include "conversd.h" static T_INTERFACE *ifpp; /* Zeiger auf das Aktuelle Interface.*/ void IrcAwayCommand(CONNECTION *cp); /* Username aufloesen. */ void IrcChannelCommand(CONNECTION *cp); /* CHANNEL-Kommando. */ void IrcHelpCommand(CONNECTION *cp); /* Help Kommand. */ void IrcLinksCommand(CONNECTION *cp); /* Links-Kommando. */ void IrcListCommand(CONNECTION *cp); /* List-Kommando. */ void IrcNickCommand(CONNECTION *cp); /* Nickname aufloesen. */ void IrcModeCommand(CONNECTION *cp); /* Mode-Kommando. */ void IrcNamesCommand(CONNECTION *cp); /* Names-Kommando. */ void IrcPartCommand(CONNECTION *cp); /* Channel schliessen. */ void IrcPersonalCommand(CONNECTION *cp); /* Personal-Text setzen/loeschen. */ void IrcPingCommand(CONNECTION *cp); void IrcPongCommand(CONNECTION *cp); void IrcPrivmsgCommand(CONNECTION *cp); /* MSG-Kommando. */ void IrcQuitCommand(CONNECTION *cp); /* Quit-Kommando. */ void IrcUserHostCommand(CONNECTION *cp); /* */ void IrcSquitCommand(CONNECTION *cp); void IrcUserCommand(CONNECTION *cp); void IrcWhoCommand(CONNECTION *cp); /* Who-Kommando. */ void IrcWhoisCommand(CONNECTION *cp); /* Userdaten ausgeben. */ typedef struct cmdtable_irc { char *name; void (*fnc)(CONNECTION *); char *help; } CMDTABLE_IRC; CMDTABLE_IRC cmdtable_irc[] = { {"away", IrcAwayCommand, "AWAY"}, {"channel", IrcChannelCommand, "CHAN"}, {"help", IrcHelpCommand, "HELP"}, {"nick", IrcNickCommand, "NICK"}, {"join", IrcChannelCommand, "JOIN"}, {"links", IrcLinksCommand, "LINKS"}, {"list", IrcListCommand, "LIST"}, {"mode", IrcModeCommand, "MODE"}, {"names", IrcNamesCommand, "NAMES"}, {"part", IrcPartCommand, "PART"}, {"personal", IrcPersonalCommand, "PERS"}, {"ping", IrcPingCommand, "PING"}, {"pong", IrcPongCommand, "PONG"}, {"privmsg", IrcPrivmsgCommand, "PRIVMSG"}, {"quit", IrcQuitCommand, "QUIT"}, {"user", IrcUserCommand, "USER"}, {"userhost", IrcUserHostCommand, "USERHOST"}, {"squit", IrcSquitCommand, "SQUIT"}, {"who", IrcWhoCommand, "WOH"}, {"whois", IrcWhoisCommand, "WHOIS"}, {NULL, 0, NULL} }; /* IRC-Server Einstellung aendern/setzen. */ void ccpirc(void) { MBHEAD *mbp; char ch; int tmp_fd = EOF; int newloglevel = 0; int new_tcp_port = 0; #ifdef DEBUG_MODUS lastfunc = "l1irc(ccpirc)"; #endif /* DEBUG_MODUS */ ifpp = &ifp[IRC_ID]; /* Dann Zeiger auf das IRC-Interface. */ if (issyso() && skipsp(&clicnt, &clipoi)) /* Sysop will aendern. */ { clicnt--; ch = toupper(*clipoi++); switch (ch) { case 'P': /* Sysop will IRC-Port aéndern */ if (!skipsp(&clicnt, &clipoi)) { putmsg("Invalid Parameter\r"); return; } new_tcp_port = nxtlong(&clicnt, &clipoi); /* Neuen Port ermitteln */ if ( (new_tcp_port < 1) ||(new_tcp_port > 65535)) { putmsg("TCP-Port not valid, not changed !!!\r"); return; } if (ifpp->actively == FALSE) /* IRC ist deaktiv.*/ { putmsg("TCP-Port haven not switched on!\r"); return; } /* Wenn NEUER Port und ALTER Port gleich sind, nicht neu Initialisieren.*/ if (ifpp->tcpport == Htons((unsigned short)new_tcp_port)) { putmsg("TCP-Port successfully changed\r"); return; } /* Neuen TCP-Port Initialisieren. */ if ((tmp_fd = SetupTCP(ifpp->name, (unsigned short)new_tcp_port)) != EOF) { #ifdef OS_STACK int tmp_fd_OS; if ((tmp_fd_OS = SetupOS(ifpp, (unsigned short)new_tcp_port)) != EOF) { /* alten Socket schliessen */ close(ifpp->OsSock); /* Neuen Socket merken */ ifpp->OsSock = tmp_fd_OS; } else { Close(tmp_fd); putmsg("ERROR: Changing UDP-Port failed, Port not changed !!!\r"); return; } #endif /* OS_STACK */ Close(ifpp->ISock); /* Alten Socket schliessen. */ ifpp->ISock = tmp_fd ; /* Neuen Socket merken */ } else { /* Neuen TCP-Port liess sich nicht Initialisieren. */ putmsg("ERROR: Changing UDP-Port failed, Port not changed !!!\r"); return; } ifpp->tcpport = Htons((unsigned short)new_tcp_port); putmsg("TCP-Port successfully changed\r"); return; case 'L': /* Sysop will LOGLevel aendern */ if (!skipsp(&clicnt, &clipoi)) { mbp = putals("IRC-Server:\r"); putprintf(mbp, "My LogLevel: %d\r",ifpp->log); /* Loglevel anzeigen. */ prompt(mbp); seteom(mbp); return; } newloglevel = nxtnum(&clicnt, &clipoi); /* neuen Loglevel ermitteln. */ if ( (newloglevel < 0) ||(newloglevel > 3)) /* Pruefe neuen Loglevel. */ { mbp = putals("IRC-Server:\r"); putprintf(mbp, "Error: Log level worth from 0 to 3!\r"); prompt(mbp); seteom(mbp); return; } ifpp->log = newloglevel; /* Neuen Loglevel setzen und zeigen */ mbp = putals("IRC-Server:\r"); putprintf(mbp, "My Loglevel: %d\r", ifpp->log); prompt(mbp); seteom(mbp); return; break; default: /* Ungueltiger Parameter. */ putmsg("Invalid Parameter\r"); return; } } mbp = putals("IRC-Server:\r"); /* Aktuelle Einstellungen zeigen. */ putprintf(mbp, "My TCP-Port: %u\r", Ntohs(ifpp->tcpport)); prompt(mbp); seteom(mbp); } char *get_mode_flags2irc(int flags) { static char mode[16]; char *p = mode; #ifdef DEBUG_MODUS lastfunc = "l1irc(get_mode_flags2irc)"; #endif /* DEBUG_MODUS */ p = mode; if (flags & M_CHAN_I) *p++ = 's'; if (flags & M_CHAN_M) *p++ = 'm'; if (flags & M_CHAN_T) *p++ = 't'; if (flags & M_CHAN_P) *p++ = 'i'; if (flags & M_CHAN_S) *p++ = 'p'; // always +n *p++ = 'n'; //if (flags & M_CHAN_L) //*p++ = 'l'; //*p++ = ' '; *p = 0; return mode; } /******************************************************************************/ /* */ /* Eingehende Befehle bearbeiten. */ /* */ /******************************************************************************/ void ProcessIrcInput(char *cnvinbuf, CONNECTION *cp) { CMDTABLE_IRC *IrcCmdp; char *cmd; char buffer[2048]; int cmdlen; #ifdef DEBUG_MODUS lastfunc = "l1irc(ProcessIrcInput)"; #endif /* DEBUG_MODUS */ cnvinbuf[2048] = 0; cmd = getarg(cnvinbuf, 0); /* Befehl einlesen. */ if (cmd[0] == FALSE) /* kein befehl, */ return; /* brechen wir ab. */ cmdlen = strlen(cmd); /* Befehlslange ermitteln. */ /* durchsuche Befehls-Liste. */ for (IrcCmdp = cmdtable_irc; IrcCmdp->name; IrcCmdp++) { if (!strncmp(IrcCmdp->name, cmd, cmdlen)) /* Befehl vergleichen. */ { (*IrcCmdp->fnc) (cp); /* Befehl ausfuehren. */ return; } } /* Ungueltiger Befehl. */ sprintf(buffer, ":%s 421 %s *** Unknown command '/%s'. Type /HELP for help.\n" , myhostname , (*cp->nickname ? cp->nickname : cp->name) , cmd); appenddirect(cp, buffer); } /******************************************************************************/ /* */ /* Away (Ab/Anwesend) setzen. */ /* */ /******************************************************************************/ void IrcAwayCommand(CONNECTION *cp) { char *AwayText; char buffer[2048]; #ifdef DEBUG_MODUS lastfunc = "l1irc(IrcAwayCommand)"; #endif /* DEBUG_MODUS */ AwayText = getarg(NULL, GET_ALL); /* akt. Away-Text ermitteln. */ if (*AwayText == ':') /* ':' im String. */ AwayText++; /* ':' loeschen. */ if (AwayText == NULL) /* Kein Text. */ return; /* Keine Aenderung. */ cp->away = AwayText; /* Aktualisiere den aktuellen Away-Text. */ if (*AwayText != '\0') /* Abmelden. */ sprintf(buffer, ":%s 301 %s %s : %s\n" /* IRC-Meldung vorbereiten, */ , myhostname , cp->name , (*cp->nickname ? cp->nickname : cp->name) , AwayText); else /* Anmelden. */ sprintf(buffer, ":%s 320 %s %s : is back\n" /* IRC-Meldung vorbereiten. */ , myhostname , cp->name , (*cp->nickname ? cp->nickname : cp->name)); appendstring(cp, buffer); #ifndef CONVNICK send_awaymsg(cp->name, /* Neuen Away-Text an andere Host's weiterleiten. */ cp->hosthostname, currtime, AwayText); #else send_awaymsg(cp->name, /* Neuen Away-Text an andere Host's weiterleiten. */ cp->nickname, cp->host, currtime, AwayText); #endif /* CONVNICK */ } /******************************************************************************/ /* */ /* Persoenlichen Text setzen. */ /* */ /******************************************************************************/ void IrcPersonalCommand(CONNECTION *cp) { char *pers; char buffer[2048]; #ifdef DEBUG_MODUS lastfunc = "l1irc(IrcPersonalCommand)"; #endif /* DEBUG_MODUS */ pers = getarg(NULL, GET_ALL); /* akt. Pers-Text ermitteln. */ if (*pers) { if (!strcmp(pers, "@")) /* Pers-Text soll geloescht werden. */ pers = ""; /* Pers-Text loeschen. */ personalmanager(SET, cp, pers); /* Datenbank aktualisieren. */ if (pers != cp->pers) { setstring(&(cp->pers), pers, 256); /* Neuen Pers-Text setzen. */ cp->mtime = currtime; /* Aktuelle Zeit merken. */ sprintf(buffer, ":%s 311 %s %s %s %s * :%s\n" , myhostname , cp->nickname , cp->name , (*cp->nickname ? cp->nickname : cp->name) , cp->host , (*pers && *pers != '@') ? pers : ""); appendstring(cp, buffer); #ifndef CONVNICK send_persmsg(cp->name, /* Neuen Pers-Text an andere HOST's weiterleiten.*/ myhostname, cp->channel, pers, cp->time); #else send_persmsg(cp->name, /* Neuen Pers-Text an andere HOST's weiterleiten.*/ cp->nickname, myhostname, cp->channel, pers, cp->time); #endif /* CONVNICK */ } } } void IrcNoticeCommand(CONNECTION *cp) { char buffer[2048]; int channel; char *toname, *text; CHANNEL *ch; CLIST *cl; char *q; #ifdef DEBUG_MODUS lastfunc = "l1irc(IrcNoticeCommand)"; #endif /* DEBUG_MODUS */ *buffer = 0; toname = getarg(0, 0); if (*toname && (*toname == '#' || *toname == '~')) toname++; // notice commands should not be answered if (!*toname) return; text = getarg(NULL, GET_ALL); cp->locked = 1; if (*text == ':') text++; // dcc mess if ((q = strchr(text, '\001'))) { text = q+1; if ((q = strchr(text, '\001'))) *q = 0; if (!strncasecmp(text, "AWAY ", 5)) { text = text+5; while (*text && isspace(*text & 0xff)) text++; if (strcmp(cp->away, text)) send_awaymsg(cp->name, cp->nickname, myhostname, currtime, text); return; } if (!strncasecmp(text, "ACTION ", 7)) { text = text+7; while (*text && isspace(*text & 0xff)) text++; if (strlen(text) > 384) text[384] = 0; } else { while (*text && isspace(*text & 0xff)) text++; if (strlen(text) > 384) text[384] = 0; sprintf(buffer, "*** %s@%s ack :%s:", cp->name, cp->host, text); } } if (!*buffer) sprintf(buffer, "*** %s@%s notice: %s", cp->name, cp->host, text); if (isdigit(*toname & 0xff) && ((channel = atoi(toname)) > 0 || (channel == 0 && !strcmp(toname, "0")))) { // to channel. special care must be taken for (ch = channels; ch; ch = ch->next) { if (ch->chan == channel) break; } if (!ch) return; // only channels we are on (and have permission to talk) if (cp->operator == 2) { ; } else if (cp->channel == ch->chan) { if ((ch->flags & M_CHAN_M) && !cp->channelop) return; } else { for (cl = cp->chan_list; cl; cl = cl->next) if (cl->channel == ch->chan) break; if (!cl) return; if ((ch->flags & M_CHAN_M) && !cl->channelop) return; } send_msg_to_channel("conversd", (short)channel, buffer); } else { send_msg_to_user("conversd", toname, buffer); } } void IrcChannelCommand(CONNECTION *cp) { char *chan; char buffer[2048]; WORD newchannel; struct channel *ch; struct clist *cl, *cl2; #ifdef DEBUG_MODUS lastfunc = "l1irc(IrcChannelCommand)"; #endif /* DEBUG_MODUS */ /* Channel holen. */ chan = getarg(NULL, GET_NXTLC); if (*chan == '#') chan++; newchannel = atoi(chan); for (ch = channels; ch; ch = ch->next) { if (ch->chan == newchannel) break; } for (cl = cp->chan_list; cl; cl = cl->next) { if (cl->channel == newchannel) break; } /* Gibt es einen Eintrag? */ if (cl) /* Ja, */ return; #ifdef CONVNICK send_user_change_msg(cp->name,cp->nickname, cp->host, -1, newchannel, cp->pers, cp->time); #else send_user_change_msg(cp->name,cp->host, -1, newchannel, cp->pers, cp->time); #endif /* CONV_NICKNAME */ if (!ch) cp->locked = 0; cl = (CLIST *)calloc(1, sizeof(CLIST)); cl->time = currtime; cp->mtime = currtime; if (!ch) cl->channelop = 1; else cl->channelop = 0; cl->channel = newchannel; if (!cp->chan_list || cp->chan_list->channel > cl->channel) { cl->next = cp->chan_list; cp->chan_list = cl; } else for (cl2 = cp->chan_list; cl2; cl2 = cl2->next) { if (cl2->next) { if (cl2->next->channel > atoi(chan)) { cl->next = cl2->next; cl2->next = cl; break; } } else { cl2->next = cl; cl->next = NULLCLIST; break; } } cp->channel = atoi(chan); sprintf(buffer,":%s!%s@%s JOIN :#%d\n" , (*cp->nickname ? cp->nickname : cp->name) , cp->name , cp->host , cp->channel); appendstring(cp, buffer); sprintf(buffer, ":%s MODE #%d +%s\n" ,myhostname ,cp->channel ,get_mode_flags2irc((ch ? ch->flags : 0))); appendstring(cp, buffer); IrcNamesCommand(cp); if (ch) { if (ch->topic) { sprintf(buffer, ":%s 332 %s #%d :%s\n" ,cp->host ,(*cp->nickname ? cp->nickname : cp->name) ,cp->channel ,ch->topic); appendstring(cp, buffer); sprintf(buffer, ":%s 333 %s #%d %s %ld\n" , cp->host , (*cp->nickname ? cp->nickname : cp->name) , cp->channel , ch->name , ch->time); appendstring(cp,buffer); } cp->channelop = cl->channelop; } } /* Mode einstellen. */ void IrcModeCommand(CONNECTION *cp) { CONNECTION *p; CHANNEL *ch; CLIST *cl; char buffer[2048]; char *arg, *c; int remove = 0; int channel = 0; int oldflags = 0; int op = 0; #ifdef DEBUG_MODUS lastfunc = "l1irc(IrcModeCommand)"; #endif /* DEBUG_MODUS */ arg = getarg(0, 0); if (*arg == ':') arg++; if (*arg == '#') arg++; else { if (cp->IrcMode) { if (!strcmp(arg, "*")) return; if (cp->type == CT_USER) { char *arg2 = getarg(0, 0); if (!*arg) { sprintf(buffer, ":%s 461 %s MODE :Not enough parameters\n" , cp->host , (cp->nickname ? cp->nickname : cp->name)); appendstring(cp, buffer); return; } if (strcasecmp(arg, cp->nickname)) { sprintf(buffer, ":%s 403 %s %s :No such channel\n" , cp->host , (cp->nickname ? cp->nickname : cp->name) , arg); appendstring(cp, buffer); return; } *buffer = 0; if (!*arg2) { sprintf(buffer, ":%s 211 %s %s\n" , myhostname , cp->nickname , (cp->verbose) ? "+sw" : ""); } else { if (strstr(arg2, "+s") || strstr(arg2, "+w")) cp->verbose = 1; else if (strstr(arg2, "-s") || strstr(arg2, "-w")) cp->verbose = 0; else { sprintf(buffer, ":%s 501 %s :Unknown MODE flag: %s\n" , cp->host , (cp->nickname ? cp->nickname : cp->name) , arg2); } if (!*buffer) sprintf(buffer, ":%s MODE %s %csw\n" , myhostname , cp->nickname , (cp->verbose ? '+' : '-')); appendstring(cp, buffer); } return; } } } channel = atoi(arg); if (*arg && !strcmp(arg, "*")) { channel = cp->channel; } else { if (!*arg || !(isdigit(*arg & 0xff) && (channel > 0 || (!channel && !strcmp(arg, "0"))))) { if (cp->type != CT_HOST) { if (*arg) { sprintf(buffer, ":%s 403 %s #%s :No such channel\n" , cp->host , (cp->nickname ? cp->nickname : cp->name) , arg); } else { sprintf(buffer, ":%s 461 %s MODE :Not enough parameters\n" , cp->host , (cp->nickname ? cp->nickname : cp->name)); } appendstring(cp, buffer); appendprompt(cp, 0); } return; } arg = getarg(0, 1); if (!*arg && cp->type == CT_USER) { for (ch = channels; ch; ch = ch->next) { if (ch->chan == channel) break; /* { sprintf(buffer, ":%s 324 %s %s #%d +%s\n" , cp->host , cp->name , (*cp->nickname ? cp->nickname : cp->name) , channel , get_mode_flags2irc(ch->flags)); appendstring(cp, buffer); sprintf(buffer, ":%s 329 %s %s #%d %d\n" , cp->host , cp->name , (*cp->nickname ? cp->nickname : cp->name) , channel , 0); appendstring(cp, buffer); appendprompt(cp, 0); break; }*/ } if (!ch) { sprintf(buffer, ":%s 403 %s #%d :No such channel\n" , cp->host , (cp->nickname ? cp->nickname : cp->name) , channel); appendstring(cp, buffer); appendprompt(cp, 0); } return; } for (cl = cp->chan_list; cl; cl = cl->next) { if (cl->channel == channel) { if (cl->channelop) op++; break; } } for (ch = channels; ch; ch = ch->next) { if (channel == ch->chan) break; } if (op || cp->operator == 2 || (cp->type == CT_HOST)) { if (!ch || (cp->type != CT_HOST && channel == 0 && cp->operator != 2)) { if (cp->type == CT_USER) { if (channel == 0) { sprintf(buffer, ":%s 477 %s #%d :Channel doesn't support modes\n" , cp->host , (cp->nickname ? cp->nickname : cp->name) , channel); appendstring(cp, buffer); } else { sprintf(buffer, ":%s 403 %s #%d :No such channel\n" , cp->host , (cp->nickname ? cp->nickname : cp->name) , channel); appendstring(cp, buffer); } } } return; } else { if (cp->type == CT_USER) return; oldflags = ch->flags; while (*arg) { switch (*arg) { case '+': { remove = 0; arg++; break; } case '-': { remove = 1; arg++; break; } case 'S': case 's': { if (remove && ch) { if (!cp->IrcMode) { ch->flags -= (ch->flags & M_CHAN_S); } else { ch->flags -= (ch->flags & M_CHAN_I); } } else { if (!cp->IrcMode) { ch->flags |= M_CHAN_S; } else { ch->flags |= M_CHAN_I; } } arg++; break; } case 'P': case 'p': { if (remove && ch) { if (!cp->IrcMode) { ch->flags -= (ch->flags & M_CHAN_P); } else { ch->flags -= (ch->flags & M_CHAN_S); } } else { if (!cp->IrcMode) { ch->flags |= M_CHAN_P; } else { ch->flags |= M_CHAN_S; } } arg++; break; } case 'T': case 't': { if (remove && ch) { ch->flags -= (ch->flags & M_CHAN_T); } else { ch->flags |= M_CHAN_T; } arg++; break; } case 'I': case 'i': { if (remove && ch) { if (!cp->IrcMode) { ch->flags -= (ch->flags & M_CHAN_I); } else { ch->flags -= (ch->flags & M_CHAN_P); } } else { if (!cp->IrcMode) { ch->flags |= M_CHAN_I; } else { ch->flags |= M_CHAN_P; } } arg++; break; } case 'L': case 'l': { if (!cp->IrcMode) { if (remove && ch) { ch->flags -= (ch->flags & M_CHAN_L); } else { ch->flags |= M_CHAN_L; } } else { sprintf(buffer, ":%s 472 %s %c :is unknown mode char to me\n" , cp->host , (cp->nickname ? cp->nickname : cp->name) , *arg); appendstring(cp, buffer); } arg++; break; } case 'M': case 'm': { if (remove && ch) { ch->flags -= (ch->flags & M_CHAN_M); } else { ch->flags |= M_CHAN_M; } arg++; break; } case 'O': case 'o': { arg++; while (*arg) { CONNECTION *p_found = 0; int status_really_changed = 0; char *fromname = cp->name; char *fromnickname = (cp->type == CT_HOST ? cp->name : cp->nickname); int user_found = 0; while (*arg == ' ') arg++; if (*arg == ':') arg++; c = arg; while (*c != ' ') { if (*c != '\0') { c++; } else break; } if (*c != '\0') { *c++ = '\0'; } if (cp->type != CT_HOST && channel < 0 ) continue; clear_locks(); if (cp->type == CT_HOST) cp->locked = 1; for (p = connections; p; p = p->next) { if (p->type != CT_USER) continue; if (!(!strcasecmp(p->name, arg) || (cp->type == CT_USER && !strcasecmp(p->nickname, arg)))) continue; user_found = 1; if (channel == -1) { if (!p_found || !p->operator) p_found = p; if (!status_really_changed) { status_really_changed = (p->operator == 0); } } else { if (p->channel == channel) { if (!p_found || !p->channelop) p_found = p; if (!status_really_changed) status_really_changed = (p->channelop == 0); p->channelop = 1; } for (cl = p->chan_list; cl; cl = cl->next) { if (cl->channel == p->channel) { if (!p_found || !p->channelop) p_found = p; if (!status_really_changed) status_really_changed = (cl->channelop == 0); cl->channelop = 1; } } } } if (p_found) { send_opermsg(fromnickname, p_found->host, fromname, (WORD)channel, 0); } else { if (cp->type == CT_USER) { if (cp->IrcMode) { if (user_found) sprintf(buffer, ":%s 441 %s %s #%d :They aren't on that channel\n" , cp->host , cp->nickname , arg , channel); else sprintf(buffer, ":%s 401 %s %s :No such nick\n" , cp->host , cp->nickname , arg); appendstring(cp, buffer); } else { if (user_found) sprintf(buffer, "*** User not in channel: %s.\n" , arg); else sprintf(buffer, "*** No such user: %s.\n" , arg); appendstring(cp, buffer); } } } cp->locked = 1; arg = c; } break; } case 'N': case 'B': case 'b': case 'V': case 'v': case 'K': case 'k': case 'W': case 'w': { if (cp->IrcMode) { sprintf(buffer, ":%s 472 %s :Unknown MODE flag (%c).\n" , cp->host , (cp->nickname ? cp->nickname : cp->name) , *arg); appendstring(cp, buffer); } arg++; break; } case 'n': default: { arg++; break; } } } if (ch && (ch->flags != oldflags)) { clear_locks(); // send_opermsg may have locked it.. cp->locked = 1; if (cp->type == CT_USER && !cp->IrcMode) { appendstring(cp, "*** Flags: "); // appendstring(cp, get_mode_flags(ch->flags)); appendstring(cp, "\n"); } //send_mode(cp, ch, oldflags); } } } //else { if (!ch || ((ch->flags & M_CHAN_S || ch->flags & M_CHAN_I) && !(cp->operator == 2 || cl))) { sprintf(buffer, ":%s 403 %s #%d :No such channel\n" , cp->host , (cp->nickname ? cp->nickname : cp->name) , channel); appendstring(cp, buffer); } else { sprintf(buffer, ":%s 482 %s #%d :You're not channel operator\n" , cp->host , (cp->nickname ? cp->nickname : cp->name) , channel); appendstring(cp, buffer); } } if (cp->type == CT_USER) { appendprompt(cp, 0); } } /* Private MSG verschicken. */ void IrcPrivmsgCommand(CONNECTION *cp) { #ifdef DEBUG_MODUS lastfunc = "l1irc(IrcPrivmsgCommand)"; #endif /* DEBUG_MODUS */ msg_command(cp); } /* Channel schliessen. */ void IrcPartCommand(CONNECTION *cp) { #ifdef DEBUG_MODUS lastfunc = "l1irc(IrcPartCommand)"; #endif /* DEBUG_MODUS */ leave_command(cp); } /* Help Kommando */ void IrcHelpCommand(CONNECTION *cp) { #ifdef DEBUG_MODUS lastfunc = "l1irc(IrcHelpCommand)"; #endif /* DEBUG_MODUS */ help_command(cp); } /* Quit Kommando */ void IrcQuitCommand(CONNECTION *cp) { #ifdef DEBUG_MODUS lastfunc = "l1irc(IrcQuitCommand)"; #endif /* DEBUG_MODUS */ bye_command(cp); } void IrcPingCommand(CONNECTION *cp) { char *arg; char buffer[2048]; #ifdef DEBUG_MODUS lastfunc = "l1irc(IrcPingCommand)"; #endif /* DEBUG_MODUS */ arg = getarg(0, 0); arg[cp->width] = 0; sprintf(buffer, ":%s PONG %s :%s\n", myhostname, myhostname, arg); appendstring(cp, buffer); } void IrcPongCommand(CONNECTION *cp) { char buffer[1024]; char *line; time_t response_time = 0L; #ifdef DEBUG_MODUS lastfunc = "l1irc(IrcPongCommand)"; #endif /* DEBUG_MODUS */ line = getarg(0, 0); if (*line == ':') line++; if (isalpha(*line)) { sprintf(buffer, "PING :%ld\n", currtime); appendstring(cp, buffer); return; } sscanf(line, "%ld", &response_time); if (response_time < 1L) { sprintf(buffer, ":%s 375 %s bad answer, sorry\n" , myhostname , (*cp->nickname ? cp->nickname : cp->name)); appendstring(cp, buffer); } else { ts2(); sprintf(buffer, ":%s 375 %s *** rtt %s <-> %s is %s\n" , myhostname , (*cp->nickname ? cp->nickname : cp->name) , myhostname , (*cp->name ? cp->name : "you") , ts4(currtime - response_time)); appendstring(cp, buffer); } appendprompt(cp, 0); } /* Alle User auf den aktuellen Channel bereitstellen. */ void IrcNamesCommand(CONNECTION *cp) { CONNECTION *p; CHANNEL *ch; CLIST *cl2; char buffer[BUFSIZ]; #ifdef DEBUG_MODUS lastfunc = "l1irc(IrcNamesCommand)"; #endif /* DEBUG_MODUS */ /* IRC-Meldung vorbereiten. */ sprintf(buffer,":%s 353 %s = #%d :" ,myhostname ,cp->nickname ,cp->channel); /* Und abschicken. */ appendstring(cp,buffer); for (ch = channels; ch; ch = ch->next) { /* Aktueller Channel? */ if (ch->chan != cp->channel) /* Nein, zum naechsten. */ continue; for (p = connections; p; p = p->next) { /* Nur angemeldete User. */ if (p->type == CT_USER) { /* if (ch->chan != cp->channel) break;*/ /* User im gesuchten Channel. */ if (p->channel != ch->chan) { /* Nein, dann suchen wir in der Channel-List. */ for (cl2 = p->chan_list; cl2; cl2 = cl2->next) { /* User im gesuchten Channel. */ if (cl2->channel == ch->chan) /* Eintrag gefunden. */ break; } /* Kein Eintrag gefunden? */ if (!cl2) /* Dann zum naechsten. */ continue; } /* Username - IRC-Meldung vorbereiten. */ sprintf(buffer, "%s%s " ,(p->channelop ? "@" : "") , (*p->nickname ? p->nickname : p->name)); /* Und abschicken. */ appendstring(cp,buffer); } } } /* LISTENDE - IRC-Meldung vorbereiten. */ sprintf(buffer, "\n:%s 366 %s #%d\n" ,myhostname ,cp->nickname ,cp->channel); /* Und abschicken. */ appendstring(cp, buffer); } /* Auflistung aller User im angegebenen Kanal. */ void IrcWhoCommand(CONNECTION *cp) { CONNECTION *p; CHANNEL *ch; CLIST *cl2; char buffer[BUFSIZ]; char *chan; WORD Channel; #ifdef DEBUG_MODUS lastfunc = "l1irc(IrcWhoCommand)"; #endif /* DEBUG_MODUS */ /* Gesuchten Channel holen. */ chan = getarg(NULL, GET_NXTLC); /* 1. Zeichen eine "#"? */ if (*chan == '#') /* "#" entfernen. */ chan++; Channel = atoi(chan); for (ch = channels; ch; ch = ch->next) { for (p = connections; p; p = p->next) { /* Nur angemeldete User. */ if (p->type == CT_USER) { /* Unser Channel? */ if (ch->chan != Channel) /* Zum naechsten. */ break; /* Hat unser User den gesuchten Channel? */ if (p->channel != ch->chan) { /* Nein, dann schauen wir noch in die Channel-Liste. */ for (cl2 = p->chan_list; cl2; cl2 = cl2->next) { /* Hat unser User den gesuchten Channel? */ if (cl2->channel == ch->chan) /* Channel gefunden. */ break; } /* Eintrag gefunden. */ if (!cl2) /* Nein, weitersuchen. */ continue; } /* IRC-Meldung vorbereiten. */ sprintf(buffer,":%s 352 %s %d %s%s %s %s %s %s%s%s :%d %s\n" ,myhostname ,cp->nickname ,p->channel ,"" ,p->name ,p->host ,p->host ,p->nickname ,(p->away ? "G" : "H") ,"" ,(p->operator ? "@" : "") ,0 ,(p->pers ? p->pers : "")); /* Und abschicken. */ appendstring(cp, buffer); } } } /* LISTENDE - IRC-Meldung vorbereiten. */ sprintf(buffer, ":%s 315 %s #%s\n" ,myhostname ,cp->nickname ,chan); /* Und abschicken. */ appendstring(cp,buffer); } void IrcLinksCommand(CONNECTION *cp) { DESTINATION *d; char buffer[2048]; char *dest = 0; #ifdef DEBUG_MODUS lastfunc = "l1irc(IrcLinksCommand)"; #endif /* DEBUG_MODUS */ if (cp->type == CT_USER) dest = getarg(0, 0); else dest = ""; if (*dest == '\0') { for (d = destinations; d; d = d->next) { if (d->rtt) { if (d->name[0] == FALSE) continue; sprintf(buffer, ":%s 364 %s %s %s :%ld %s\n" , cp->host , (cp->nickname ? cp->nickname : cp->name) , d->name , (d->link->name ? d->link->name : myhostname) , d->rtt , d->rev); appendstring(cp, buffer); } } } sprintf(buffer, ":%s 364 %s %s %s :0 %s\n" , cp->host , (cp->nickname ? cp->nickname : cp->name) , cp->host , cp->host , "pp-3.14c"); appendstring(cp, buffer); sprintf(buffer, ":%s 365 %s * :End of /LINKS list.\n" , cp->host , (cp->nickname ? cp->nickname : cp->name)); appendstring(cp, buffer); appendprompt(cp, 0); } /* Auflisten aller aktuellen Channels, Kanal, Useranzahl und Topic. */ void IrcListCommand(CONNECTION *cp) { CHANNEL *ch; CONNECTION *p; CLIST *cl; char buffer[BUFSIZ]; int n; #ifdef DEBUG_MODUS lastfunc = "l1irc(IrcListCommand)"; #endif /* DEBUG_MODUS */ for (ch = channels; ch; ch = ch->next) { /* Userzaehler auf 0 setzen. */ n = 0; for (p = connections; p; p = p->next) { /* Nur angemeldete User. */ if (p->type == CT_USER) { if (p->channel == ch->chan) /* Userzaehler um eins hoeher. */ n++; else { for (cl = p->chan_list; cl; cl = cl->next) /* Hat unser User den gesuchten Channel? */ if (cl->channel == ch->chan) /* Channel gefunden. */ break; /* Eintrag gefunden? */ if (cl) /* Userzaehler um eins hoeher. */ n++; } } } /* IRC-Meldung vorbereiten. */ sprintf(buffer, ":%s 322 %s #%d %d :%s\n" ,cp->host ,(*cp->nickname ? cp->nickname : cp->name) ,ch->chan ,n ,(ch->topic ? ch->topic : "")); /* Und abschicken. */ appendstring(cp, buffer); } /* LISTENDE - IRC-Meldung vorbereiten. */ sprintf(buffer, ":%s 323 %s\n" ,cp->host ,(*cp->nickname ? cp->nickname : cp->name)); /* Und abschicken. */ appendstring(cp,buffer); } /* Informationen eines Users. */ void IrcWhoisCommand(CONNECTION *cp) { char buffer[BUFSIZ]; char *username; char *revision; CONNECTION *p, *c; CHANNEL *ch; DESTINATION *d; #ifdef DEBUG_MODUS lastfunc = "l1irc(IrcWhoisCommand)"; #endif /* DEBUG_MODUS */ /* Username holen. */ username = getarg(0, 1); for (p = connections; p; p = p->next) { /* User angemeldet. */ if (p->type == CT_USER) { /* Gesuchter Username? */ if ( (strcmp(p->name, username) == FALSE) ||(strcmp(p->nickname, username) == FALSE)) { /* IRC-Meldung vorbereiten. */ sprintf(buffer, ":%s 311 %s %s %s%s %s * :%s%s\n" ,myhostname ,cp->nickname ,p->nickname ,"" ,p->name ,p->host ,(p->pers ? p->pers : "") ,(p->pers == "~" ? " [NonAuth]" : "")); /* Und abschicken. */ appendstring(cp,buffer); /* User als Sysop angemeldet. */ if (p->operator) { /* IRC-Meldung vorbereiten. */ sprintf(buffer, ":%s 313 %s %s :is an IRC operator\n" ,myhostname ,cp->nickname ,p->nickname); /* Und abschicken. */ appendstring(cp,buffer); } for (c = connections; c; c = c->next) { /* Nur angemeldete User. */ if (c->type != CT_USER) /* Ein unangemeldeter oder HOST, zum naechsten. */ continue; /* Vergleiche Username. */ if (strcmp(p->name, c->name)) /* Nicht unser gesuchter Username, zum naechten. */ continue; /* Aktuellen Channel suchen. */ for (ch = channels; ch; ch = ch->next) if (ch->chan == c->channel) /* gefunden. */ break; /* IRC-Meldung vorbereiten. */ sprintf(buffer, ":%s 319 %s %s :%s %d \n" ,myhostname ,cp->nickname ,p->nickname ,(c->channelop ? "@" : "") ,c->channel); /* Und abschicken. */ appendstring(cp, buffer); } /* User eigner Knoten. */ if (!strcasecmp(p->host, myhostname)) /* Markieren wir die Revision, */ revision = strchr(REV, ':')+2; /* Pruefe alle Destinationen. */ for (d = destinations; d; d = d->next) /* Vergleiche Hostname. */ if (!strcasecmp(d->name, p->host)) /* gefunden. */ break; /* Revision, IRC-Meldung vorbereiten. */ sprintf(buffer, ":%s 312 %s %s %s :%s\n" ,myhostname ,cp->nickname ,p->nickname ,p->host ,(d ? d->rev : revision)); /* Und abschicken. */ appendstring(cp,buffer); /* Online, IRC-Meldung vorbereiten. */ sprintf(buffer, ":%s 317 %s %s %ld %ld :seconds idle, signon time\n" ,myhostname ,cp->nickname ,p->nickname ,(currtime - p->mtime), p->time); /* Und abschicken. */ appendstring(cp,buffer); } } } /* LISTENDE - IRC-Meldung vorbereiten. */ sprintf(buffer, ":%s 318 %s %s\n" ,myhostname ,cp->nickname ,username); /* Und abschicken. */ appendstring(cp,buffer); } /* Username aufloesen. */ void IrcUserCommand(CONNECTION *cp) { char *user, *pers; #ifdef DEBUG_MODUS lastfunc = "l1irc(IrcUserCommand)"; #endif /* DEBUG_MODUS */ /* User erstmal sperren .*/ cp->locked = 1; /* Kanal wird spaeter gesetzt. */ cp->channel = EOF; /* Ist es ein Host, ist der hier verkehrt. */ if (cp->type == CT_HOST) /* Und weg damit. */ return; /* Username holfen. */ user = getarg(0, 0); /* Personal Text einlesen & speichern. */ personalmanager(SET, cp, (pers = getarg(NULL, GET_ALL))); /* Personal Text setzen, max. zeichen 256!. */ setstring(&(cp->pers), pers, 256); /* Username sichern. */ strncpy(cp->name, user, NAMESIZE + 1); /* Verbose, defaultwert setzen. */ cp->verbose = 0; } /******************************************************************************/ /* */ /* Gibt Informationen ueber die Anzahl von Verbindungen, Global und Lokal. */ /* */ /******************************************************************************/ static void IrcLusersCommand(CONNECTION *cp) { char buffer[2048]; DESTINATION *d; CHANNEL *ch; CONNECTION *p; int n_users = 0; /* Useranzahl. */ int n_dest, /* Destination/Routen. */ n_channels, /* Kanalanzahl. */ n_clients, /* IRC-Client. */ n_servers, /* IRC-Server. */ n_operators, /* Operatoranzahl. */ n_typeunknown; /* Unbekannt. */ #ifdef DEBUG_MODUS lastfunc = "l1irc(IrcLusersCommand)"; #endif /* DEBUG_MODUS */ for (n_dest = 0, d = destinations; d; d = d->next) /* Dest/Routen zaehlen. */ { if (d->rtt && d->link) /* Dest/Route gefunden. */ n_dest++; /* um eins erhoehen. */ } for (n_channels = 0, ch = channels; ch; ch = ch->next) /* Kanaele zaehlen. */ { if (!(ch->flags & M_CHAN_I)) /* keine unsichtbaren kanaele zaehlen. */ n_channels++; /* um eins erhoehen. */ } for (n_clients = n_servers = n_typeunknown = n_operators = 0, p = connections; p; p = p->next) { switch (p->type) { case CT_HOST: n_servers++; break; case CT_USER: n_users++; if (!p->via) n_clients++; if (p->operator) n_operators++; break; case CT_UNKNOWN: default: n_typeunknown++; } } sprintf(buffer, ":%s 251 %s :Hier sind %d User auf %d Server\n", myhostname, cp->nickname, n_users, (n_dest) ? n_dest+1 : 1) ; appendstring(cp, buffer); if (n_operators) { sprintf(buffer, ":%s 252 %s %d Sysop%s online\n", myhostname, cp->nickname, n_operators, (n_operators != 1) ? "s" : ""); appendstring(cp, buffer); } if (n_typeunknown) { sprintf(buffer, ":%s 253 %s %d :Ungueltige Verbindung%s\n", myhostname, cp->nickname, n_typeunknown, (n_typeunknown != 1) ? "en" : ""); appendstring(cp, buffer); } sprintf(buffer, ":%s 254 %s %d :Kanael%s\n", myhostname, cp->nickname, n_channels, (n_channels != 1 ? "e" : "")); appendstring(cp, buffer); sprintf(buffer, ":%s 255 %s :Ich habe %d client%s auf %d Server\n", myhostname, cp->nickname, n_clients, (n_clients != 1) ? "s" : "", n_servers); appendstring(cp, buffer); } /******************************************************************************/ /* */ /* Zusaetzlich Text an IRC-Client senden. */ /* */ /******************************************************************************/ static void IrcMotdCommand(CONNECTION *cp) { FILE *fp; char motdfile[MAXPATH + 1]; char buffer[80 + 1]; char buffer2[128]; #ifdef DEBUG_MODUS lastfunc = "l1irc(IrcMotdCommand)"; #endif /* DEBUG_MODUS */ strcpy(motdfile, confpath); strcat(motdfile, IRC_TXT); if ((fp = xfopen(motdfile, "r")) == NULL) /* Fehler beim oeffnen. */ return; /* Abbrechen. */ sprintf(buffer2, ":%s 372 %s :" , myhostname , cp->nickname); while (fgets(buffer, 80, fp)) /* Maximal 80 Zeichen einlesen. */ { appendstring(cp, buffer2); /* Code-String. */ appendstring(cp, buffer); /* Datei einlesen. */ } sprintf(buffer, "\n:%s 376 %s :\n" , myhostname , cp->nickname); appendstring(cp, buffer); fclose(fp); /* Datei schliessen. */ } /******************************************************************************/ /* */ /* IRC-Client anmelden. */ /* */ /******************************************************************************/ static void IrcLogin(CONNECTION *cp) { char buffer[2048]; #ifdef DEBUG_MODUS lastfunc = "l1irc(IrcLogin)"; #endif /* DEBUG_MODUS */ cp->charset_in = cp->charset_out = ISO_STRIPED; sprintf(buffer, ":%s 001 %s :%s @ %s PingPong-Release %5.5s (TNN) - Type /HELP for help.\n" , myhostname , cp->nickname , convtype , myhostname , strchr(REV, ':')+2); appendstring(cp, buffer); sprintf(buffer, ":%s 004 %s %s :\n" , myhostname , cp->nickname , myhostname); appendstring(cp, buffer); IrcLusersCommand(cp); /* Anzahl User, Server, Kanaele etc. ausgeben. */ IrcMotdCommand(cp); /* Zusaetzlichen Text ausgeben (irc.txt). */ cp->width = 80; /* Zeilengrenze setzen .*/ } /******************************************************************************/ /* */ /* Nickname aufloesen. */ /* */ /******************************************************************************/ void IrcNickCommand(CONNECTION *cp) { char *arg; char buffer[2048]; #ifdef DEBUG_MODUS lastfunc = "l1irc(IrcNickCommand)"; #endif /* DEBUG_MODUS */ arg = getarg(0, 0); /* Nickname einlesen. */ if (cp->type == CT_HOST) /* Host ? */ return; /* Und weg damit. */ if (cp->away != NULL) /* Wenn ein Away-Text gesetzt ist, */ { cp->away = NULL; /* zuruecksetzen. */ #ifndef CONVNICK send_awaymsg(cp->name, /* Neuen Away-Text an andere Host's weiterleiten. */ cp->hosthostname, currtime, cp->away); #else send_awaymsg(cp->name, /* Neuen Away-Text an andere Host's weiterleiten. */ cp->nickname, cp->host, currtime, cp->away); #endif /* CONVNICK */ return; } if (*arg == ':') /* Gibt es ":" im string? */ arg++; /* ":" loeschen. */ if (!*arg) /* String leer? */ { sprintf(buffer, ":%s 431 * :Kein Nickname angegeben!\n" , myhostname); appendstring(cp, buffer); return; } #ifdef CONV_CHECK_USER { CONNECTION *pP; if ((pP = CheckUserCVS(arg)) != NULL) /* Pruefung auf Doppel-Login. */ { /* Kein Login moeglich. */ sprintf(buffer, ":%s 433 %s %s :Nickname already in use\n" , myhostname , (*cp->nickname ? cp->nickname : "*") , arg); appendstring(cp, buffer); return; } } #endif /* CONV_CHECK_USER */ if (*cp->nickname) /* Schon eingeloggt. */ { sprintf(buffer, ":%s!%s@%s NICK :%s\n" /* Meldung abschicken. */ , cp->nickname , cp->name , myhostname , arg); appendstring(cp, buffer); /* Meldung abschicken. */ strncpy(cp->OldNickname, cp->nickname, NAMESIZE);/* Alten Nick eintragen. */ cp->nickname[NAMESIZE] = 0; strncpy(cp->nickname, arg, NAMESIZE); /* Neuen Nick eintragen. */ cp->nickname[NAMESIZE] = 0; return; } strncpy(cp->nickname, arg, NAMESIZE); /* Nick eintragen. */ cp->nickname[NAMESIZE] = 0; if (!*cp->name) /* Noch kein Username bekannt? */ { strncpy(cp->name, arg, NAMESIZE + 1);/* Nehmen wir den Nickn als Username.*/ cp->name[NAMESIZE + 1] = 0; } sprintf(buffer, ":%s!%s@%s NICK :%s\r" /* IRC-Meldung vorbereiten. */ , cp->nickname , cp->name , myhostname , arg); appendstring(cp, buffer); /* Und abschicken. */ strncpy(cp->host, myhostname, NAMESIZE); /* Hostname eintragen. */ cp->host[sizeof(cp->host)-1] = 0; cp->type = CT_USER; /* Als User markieren. */ IrcLogin(cp); /* IRC-Logintext. */ } /******************************************************************************/ /* */ /* Nickname an andere IRC-Client's weiterleiten. */ /* */ /******************************************************************************/ void SendIrcNick(CONNECTION *p) { CONNECTION *p2; CLIST *cl, *cl2; char buffer[2048]; #ifdef DEBUG_MODUS lastfunc = "l1irc(SendIrcNick)"; #endif /* DEBUG_MODUS */ for (p2 = connections; p2; p2 = p2->next) { if (p2->locked) /* Sperre eingeschaltet. */ continue; /* zum naechsten Eintrag. */ if (p2->type == CT_USER) /* Type User. */ { if (p2 == p) /* mich selber nicht weitersagen. */ continue; /* zum naechsten eintrag. */ if (p2->channel != p->channel) /* Kanal unterschiedlich. */ { for (cl2 = p2->chan_list; cl2; cl2 = cl2->next) { if (cl2->channel == p->channel) break; else { for (cl = p->chan_list; cl; cl = cl->next) { if (cl->channel == cl2->channel) break; } } } } if (p2->IrcMode == FALSE) /* Kein IRC-Client */ continue; /* zum naechsten Eintrag. */ /* Keine Aenderung, */ if ( (!strncasecmp(p->OldNickname, p->nickname, NAMESIZE)) ||(!strncasecmp(p->name, p->nickname, NAMESIZE))) continue; /* zum naechsten Eintrag. */ /* Aktuellen Nick weitersagen. */ sprintf(buffer, ":%s!%s@%s NICK %s\n" , (p->OldNickname[0] == FALSE ? p->name : p->OldNickname) , p->name , p->host , p->nickname); appenddirect(p2, buffer); break; } } } /******************************************************************************/ /* */ /* Informationen vom User ausgeben. . */ /* */ /******************************************************************************/ void IrcUserHostCommand(CONNECTION *cp) { CONNECTION *p; char buffer[2048]; char buffer2[2048]; int found = 0; char *user; #ifdef DEBUG_MODUS lastfunc = "l1irc(IrcUserHostCommand)"; #endif /* DEBUG_MODUS */ user = getarg(0, 0); /* User einlesen. */ if (!*user) /* Kein User angegeben. */ { /* IRC-Meldung vorbereiten */ sprintf(buffer, ":%s 461 %s USERHOST :Not enough parameters\n" , myhostname , cp->nickname); appendstring(cp, buffer); /* und abschicken. */ return; } sprintf(buffer2, ":%s 302 %s :" /* IRC-Meldung vorbereiten */ , myhostname , cp->nickname); while (*user) { p = 0; if ( (!strcasecmp(cp->nickname, user)) /* Uservergleich mit Nick/Name. */ ||(!strcasecmp(cp->name, user))) p = cp; /* Eintrag gefunden. */ else /* Kein Eintrag gefunden. */ { for (p = connections; p; p = p->next) /* durchsuche convers-TBL. */ { if ( (!strcasecmp(p->nickname, user))/* Uservergleich mit Nick/Name. */ ||(!strcasecmp(p->name, user))) break; /* Eintrag gefunden. */ } } if (!p) /* Kein User gefunden. */ { sprintf(buffer, ":%s 401 %s %s :No such nick\n" , myhostname , (*cp->nickname ? cp->nickname : cp->name) , user); appendstring(cp,buffer); } else /* User gefunden. */ { sprintf(buffer, "%s%s%s=%c%s%s@%s" , (found) ? " " : "" , (*p->nickname ? p->nickname : p->name) , (p->operator ? "*" : "") , (p->away ? '-' : '+') , "" , p->name , p->host); if (strlen(buffer) + strlen(buffer2) > 510) /* Buf-laenge ueberschritten*/ break; /* Abbrechen. */ strcat(buffer2, buffer); /* Informationen anhaengen. */ if (!found) /* Gibt noch keinen Eintrag. */ found++; /* min. 1 Eintrag. */ } user = getarg(0, 0); /* Naechsten User einlesen. */ } if (found) /* Eintrag gefunden. */ { appendstring(cp, buffer2); appendstring(cp, "\n"); } } /******************************************************************************/ /* */ /* Beendet die Verbindung eines Server's vom Netzwerk. */ /* */ /******************************************************************************/ void IrcSquitCommand(CONNECTION *cp) { char buffer[2048]; char *arg; #ifdef DEBUG_MODUS lastfunc = "l1irc(IrcSquitCommand)"; #endif /* DEBUG_MODUS */ arg = getarg(0, 1); /* Server einlesen. */ if (!*arg) /* kein Server angegeben. */ { sprintf(buffer, ":%s 461 %s SQUIT :Not enough parameters\n" , myhostname , cp->nickname); appendstring(cp, buffer); return; } if (cp->operator != 2) /* Kein Sysop, keine Aenderung. */ { sprintf(buffer, ":%s 481 %s :Permission Denied- You're not an IRC operator\n" , myhostname , cp->name); appendstring(cp, buffer); return; } sprintf(buffer, "/link reset %s", arg); /* Reset-Befehl vorbereiten. */ getarg(buffer, 0); links_command(cp); /* Server killen. */ } /******************************************************************************/ /* */ /* Username an IRC-Server weiterleiten. */ /* */ /******************************************************************************/ void IrcLinkUser(char *user) { char *scall; #ifdef DEBUG_MODUS lastfunc = "l1irc(IrcLinkUser)"; #endif /* DEBUG_MODUS */ if (tcppoi->Interface != KISS_IRC) /* Kein IRC-Interface. */ { user[0] = 0; /* Rufzeichen loeschen. */ tcppoi->disflg |= 0x80; /* Verbindung schliessen. */ return; } if ((scall = strchr(user, ' ')) != FALSE) /* Zum Rufzeichen springen. */ { scall++; /* Leerzeichen entfernen. */ strncpy(user, scall, L2CALEN); /* Rufzeichen sichern. */ user[6] = 0; /* Sicher ist sicher. */ } } /******************************************************************************/ /* */ /* Nickname an IRC-Server weiterleiten. */ /* */ /******************************************************************************/ void IrcLinkNick(char *header) { READRX *SRx; register int i; #ifdef DEBUG_MODUS lastfunc = "l1irc(IrcLinkNick)"; #endif /* DEBUG_MODUS */ if (header[0] == FALSE) /* Kein Nick angegeben. */ return; /* Abbrechen. */ if ((SRx = (READRX *)allocb(ALLOC_L1TCPIP)) == NULL) /* RX-Seg. besorgen */ return; /* Kein Segment frei, abbruch. */ if ((SRx->Data = SetBuffer()) == NULL) /* Buffer besorgen. */ { dealoc((MBHEAD *)ulink((LEHEAD *)SRx)); /* RX-Segment entsorgen. */ return; /* Buffer ist voll, abbruch. */ } SRx->Sock = tcppoi->sock; /* Socket setzen. */ SRx->Interface = tcppoi->Interface; /* Interface setzen. */ SRx->Mode = tcppoi->mode; /* Stack-Mode setzen. */ for (i = 0; i < (signed)strlen(header); ++i) /* Nickname eintragen. */ putchr(header[i], SRx->Data); relink((LEHEAD *) SRx, (LEHEAD *)rxflRX.tail); /* RX-Liste umhaengen. */ } #endif /* L1IRC */ /* End of src/l1irc.c */