static char *parse_args (char *argv[], int argc, char **envp) { int ac; int add_servers = 0; char *channel = NULL; char *ptr; *nickname = 0; *password = 0; if ((ptr = getenv("NAPNICK"))) strmcpy(nickname, ptr, NICKNAME_LEN); if ((ptr = getenv("NAPPASS"))) strmcpy(password, ptr, NICKNAME_LEN); if ((ptr = getenv("NAP_HOST")) || (ptr = getenv("NAPHOST"))) malloc_strcpy(&LocalHostName, ptr); for ( ac = 1; ac < argc; ac++ ) { if (argv[ac][0] == '-') { switch (argv[ac][1]) { case 'r': /* Load list of servers from this file */ { char *what = empty_string; if (argv[ac][2]) what = &argv[ac][2]; else if (argv[ac+1] && argv[ac+1][0] != '-') { what = argv[ac+1]; ac++; } else fprintf(stderr, "Missing argumenT to -r\n"); if (*what) { add_servers = 1; malloc_strcpy(&ircservers_file, what); } break; } case 'a': /* add server, not replace */ { add_servers = 1; if (argv[ac][2]) fprintf(stderr, "Ignoring junk after -a\n"); break; } case 'H': { char *what = empty_string; if (argv[ac][2]) what = &(argv[ac][2]); else if (argv[ac+1] && argv[ac+1][0] != '-') { what = argv[ac+1]; ac++; } else { fprintf(stderr, "Specify a hostname\n"); exit(1); } malloc_strcpy(&LocalHostName, what); break; } case 'S': { if (argv[ac][2]) { char *what; what = &argv[ac][2]; starting_server = my_atol(what); } else { ac++; starting_server = my_atol(argv[ac]); } break; } case 'n': { char *what = empty_string; if (argv[ac][2]) what = &(argv[ac][2]); else if (argv[ac+1] && argv[ac+1][0] != '-') { what = argv[ac+1]; ac++; } else { fprintf(stderr,"Missing argument for -n\n"); exit(1); } strmcpy(nickname, what, NICKNAME_LEN); break; } case 'p': { char *pass = NULL; if ((pass = getpass("Enter Password :"******"%s %s\n", nap_version, internal_version); exit(1); #if defined(WINNT) || defined(EMX) case 's': setup_autoexec(); exit(1); #endif default: fprintf(stderr, "Unknown flag: %s\n",argv[ac]); case 'h': fprintf(stderr, "%s", switch_help); #if defined(WINNT) || defined(EMX) fprintf(stderr, "%s", switch_help_w); #endif exit(1); } /* End of switch */ } else { if (!strchr(argv[ac], '.')) strmcpy(nickname, argv[ac], NICKNAME_LEN); else build_server_list(argv[ac]); } } if ((ptr = getenv("NAPLIB"))) irc_lib = m_opendup("/", ptr, "/", NULL); else { char *s; if ((s = expand_twiddle(NAPLIB))) irc_lib = s; else malloc_strcpy(&irc_lib, NAPLIB); } if ((ptr = getenv("NAPPATH"))) malloc_strcpy(&irc_path, ptr); else { #ifdef NAPPATH malloc_strcpy(&irc_path, NAPPATH); #else #ifdef WINNT malloc_strcpy(&irc_path, ".:~/TekNap:"); #else malloc_strcpy(&irc_path, ".:~/.TekNap:"); #endif irc_path = m_opendup(irc_lib, "/", "script", NULL); #endif } if (LocalHostName) { struct hostent *hp; printf("Your hostname appears to be [%s]\n", LocalHostName); memset((void *)&LocalHostAddr, 0, sizeof(LocalHostAddr)); if ((hp = gethostbyname(LocalHostName))) memcpy((void *)&LocalHostAddr.sin_addr, hp->h_addr, sizeof(struct in_addr)); } if (!check_nickname(nickname)) { fprintf(stderr, "\n Invalid Nickname\n"); exit(1); } set_string_var(LOAD_PATH_VAR, irc_path); new_free(&irc_path); if ((ptr = getenv("HOME"))) malloc_strcpy(&my_path, ptr); if (!my_path || !*my_path) #ifdef WINNT { malloc_strcpy(&my_path, "//c/TekNap/"); bsd_setenv("HOME", "//c/TekNap", 1); } if (access("//c/TekNap", F_OK) != 0) { fprintf(stderr, "Directory doesn't exist, creating //c/TekNap\n"); mkdir("//c/TekNap", S_IWUSR|S_IRUSR|S_IXUSR); } #else malloc_strcpy(&my_path, "/"); #endif #if defined(WINNT) || defined(__EMX__) convert_unix(my_path); #endif if (!bircrc_file) malloc_sprintf(&bircrc_file, "%s%s", my_path, IRCRC_NAME); if ((ptr = getenv("NAPPORT"))) nap_port = my_atol(ptr); if ((ptr = getenv("NAPSERVER"))) build_server_list(ptr); #ifdef DEFAULT_SERVER { if (!read_server_list()) { ptr = LOCAL_COPY(DEFAULT_SERVER); build_server_list(ptr); } } #endif return (channel); }
NickList *check_auto(char *channel, NickList *nicklist, ChannelList *chan) { ShitList *shitptr = NULL; UserList *userptr = NULL; ChannelList *chan_ptr = NULL; char *ban; if (!channel || !*channel || !nicklist) return NULL; if (!chan) { ChannelList *chan2; chan2 = get_server_channels(from_server); chan_ptr = (ChannelList *) find_in_list((List **)&chan2, channel, 0); } else chan_ptr = chan; if (!chan_ptr) return NULL; if (!chan_ptr->chop) return nicklist; userptr = nicklist->userlist; shitptr = nicklist->shitlist; if (userptr && !check_channel_match(userptr->channels, channel)) userptr = NULL; if (shitptr && (!check_channel_match(shitptr->channels, channel) || isme(nicklist->nick))) shitptr = NULL; if (get_cset_int_var(chan_ptr->csets, SHITLIST_CSET) && shitptr != NULL && userptr == NULL) { char *theshit; time_t current = now; theshit = get_string_var(SHITLIST_REASON_VAR); switch(shitptr->level) { case 0: return nicklist; break; case 1:/* never give opz */ if (nicklist->sent_deop < 4 && nick_isop(nicklist)) { add_mode(chan_ptr, "o", 0, nicklist->nick, NULL, get_int_var(NUM_OPMODES_VAR)); nicklist->sent_deop++; nicklist->sent_deop_time = current; } break; case 2: /* Auto Kick offender */ add_mode(chan_ptr, NULL, 0, nicklist->nick, shitptr->reason?shitptr->reason:theshit, 0); break; case 3: /* kick ban the offender */ case 4: /* perm ban on offender */ if (nicklist->sent_deop < 4 || (nicklist->sent_deop < 4 && shitptr->level == 4)) { send_to_server("MODE %s -o+b %s %s", channel, nicklist->nick, shitptr->filter); nicklist->sent_deop++; nicklist->sent_deop_time = current; if (get_int_var(AUTO_UNBAN_VAR) && shitptr->level != 4) add_timer(0, empty_string, get_int_var(AUTO_UNBAN_VAR) * 1000, 1, timer_unban, m_sprintf("%d %s %s", from_server, channel, shitptr->filter), NULL, -1, "auto-unban"); } if (get_cset_int_var(chan_ptr->csets, KICK_IF_BANNED_CSET)) send_to_server("KICK %s %s :%s", channel, nicklist->nick, (shitptr->reason && *shitptr->reason) ? shitptr->reason : theshit); default: break; } return nicklist; } if (userptr && get_cset_int_var(chan_ptr->csets, USERLIST_CSET)) { char *buffer = NULL; time_t current = now; int done = 0; char *p = NULL; if (get_cset_int_var(chan_ptr->csets, AOP_CSET)) { if ((userptr->flags & ADD_OPS)) { done++; if (!userptr->password && !nicklist->sent_reop && !nick_isop(nicklist)) { nicklist->sent_reop++; nicklist->sent_reop_time = current; if (!(userptr->flags & ADD_IOPS)) { malloc_sprintf(&buffer, "%s %s %s %s %d", channel, nicklist->nick, nicklist->host, "o", from_server); add_timer(0, empty_string, 10 * 1000, 1, delay_opz, buffer, NULL, -1, "delay-ops"); } else send_to_server("MODE %s +o %s", chan_ptr->channel, nicklist->nick); } } else if ((userptr->flags & ADD_VOICE)) { done++; if (!nicklist->sent_voice && !nick_isvoice(nicklist)) { nicklist->sent_voice++; nicklist->sent_voice_time = current; if (!(userptr->flags & ADD_IOPS)) { malloc_sprintf(&buffer, "%s %s %s %s %d", channel, nicklist->nick, nicklist->host, "v", from_server); add_timer(0, empty_string, 10 * 1000, 1, delay_opz, buffer, NULL, -1, "delay-ops"); } else send_to_server("MODE %s +v %s", chan_ptr->channel, nicklist->nick); } } } if ((userptr->flags & USER_FLAG_OPS) && (p = get_string_var(USER_FLAG_OPS_VAR))) { done++; run_user_flag("USER_FLAG_OPS", p, nicklist, NULL); } if (done) return nicklist; } if (get_cset_int_var(chan_ptr->csets, KICK_IF_BANNED_CSET) && check_channel_match(get_string_var(PROTECT_CHANNELS_VAR), chan_ptr->channel)) { char *ipban = NULL; char *u = NULL; if (!nicklist->host) return nicklist; ban = m_3dup(nicklist->nick, "!", nicklist->host); if (nicklist->ip && nicklist->host) { char *user = alloca(strlen(nicklist->host)+1); strcpy(user, nicklist->host); if ((u = strchr(user, '@'))) *u = 0; ipban = m_opendup(nicklist->nick, "!", user, "@", nicklist->ip, NULL); } if (!isme(nicklist->nick) && (!eban_is_on_channel(ban, chan_ptr) && (ban_is_on_channel(ban, chan_ptr) || (ipban && ban_is_on_channel(ipban, chan_ptr)))) ) { new_free(&ban); new_free(&ipban); if (nick_isop(nicklist) && !get_cset_int_var(chan_ptr->csets, KICK_OPS_CSET)) return nicklist; my_send_to_server(from_server, "KICK %s %s :Banned", chan_ptr->channel, nicklist->nick); } new_free(&ban); new_free(&ipban); } return nicklist; }