static void textui_finish_init(void) { quitting = FALSE; screen_refresh_freeze(); gui_entry_init(); gui_printtext_init(); gui_readline_init(); gui_special_vars_init(); gui_textwidget_init(); mainwindows_init(); mainwindow_activity_init(); gui_windows_init(); statusbar_init(); fe_common_core_finish_init(); fe_common_irc_finish_init(); #ifdef HAVE_STATIC_PERL perl_init(); #endif signal_emit("irssi init finished", 0); if (display_firsttimer) { printtext_window(active_win, MSGLEVEL_CLIENTNOTICE, "%s", firsttimer_text); } screen_refresh_thaw(); }
/* * Arguments: * argstring - Arguments passed along with the ident line in input block. * version - version of garner. * handle - to store an pointer to internal state information. * Return Value: * Returns 0 on success, -1 on failure. * Pointer to internal state information in 'handle', if required. * Can directly write the errors on standard out and error. * They will be reflected to log file. Also errno can be used. * Description: * This routine would be called once by garner during initialization. * Version mismatch can be check during init itself. */ int fwstub_init(const char *argstring, u_int32_t version, void **handle) { struct _plugin_data *pdata ; /* standard event version validation */ if(version != STD_EVENT_VERSION) { printf( "Version %d doesnt match with standard event version %d\n", version, STD_EVENT_VERSION); return -1; } /* if handle is NULL, return */ if(!handle) { printf( "fwstub_init: plugin handle pointer NULL\n"); return -1; } #ifdef REGEX perl_init(); #endif printf( "Started perl interpreter successfully \n"); /* allocating plugin's private data structure */ pdata = (struct _plugin_data *) calloc(1, sizeof(struct _plugin_data)); if(plugin_data_init(pdata, argstring) < 0) { free(pdata); return -1; } pdata->handle = (void *) pdata ; /* initialize plugin global state */ g_lib_refcount++ ; printf("library_reference_count: %d\n",g_lib_refcount); if(g_lib_refcount == 1) { if ( fwstub_parse_conffile(pdata->conf_filepath) <0 ){ printf( "Not able to parse conf file \n"); fwstub_close(pdata); return -1; } parse_msgid_file(pdata->msgid_filepath); } if(ip_fw_map_init()>0){ printf("ip_fw_map initialized successfully \n"); } #ifdef ENABLE_FWSTUB_ALLOW_ALL default_fw = get_firewall_info_by_name("cyberoam"); #endif *handle = (void *) pdata ; return 0; }
static int perl_load_file (char *filename) { #ifdef WIN32 static HMODULE lib = NULL; if (!lib) { lib = LoadLibraryA (PERL_DLL); if (!lib) { if (GetLastError () == ERROR_BAD_EXE_FORMAT) /* http://forum.xchat.org/viewtopic.php?t=3277 */ thread_mbox ("Cannot use this " PERL_DLL "\n\n" "32-bit ActivePerl is required."); else { /* a lot of people install this old version */ lib = LoadLibraryA ("perl56.dll"); if (lib) { FreeLibrary (lib); lib = NULL; thread_mbox ("Cannot open " PERL_DLL "\n\n" "You must have either ActivePerl or Straberry Perl" PERL_REQUIRED_VERSION " installed in order to\n" "run perl scripts.\n\n" "I have found Perl 5.6, but that is too old."); } else { thread_mbox ("Cannot open " PERL_DLL "\n\n" "You must have either ActivePerl or Strawberry Perl " PERL_REQUIRED_VERSION " installed in order to\n" "run perl scripts.\n\n" "http://www.activestate.com/ActivePerl/\n" "http://strawberryperl.com/\n" "Make sure perl's bin directory is in your PATH."); } } /* failure */ return FALSE; } /* success */ FreeLibrary (lib); } #endif if (my_perl == NULL) { perl_init (); } return execute_perl (sv_2mortal (newSVpv ("Xchat::Embed::load", 0)), filename); }
static gboolean load_perl_plugin(PurplePlugin *plugin) { PurplePerlScript *gps = (PurplePerlScript *)plugin->info->extra_info; char *atmp[3] = { plugin->path, NULL, NULL }; if (gps == NULL || gps->load_sub == NULL) return FALSE; purple_debug(PURPLE_DEBUG_INFO, "perl", "Loading perl script\n"); if (my_perl == NULL) perl_init(); plugin->handle = gps; atmp[1] = gps->package; PERL_SET_CONTEXT(my_perl); execute_perl("Purple::PerlLoader::load_n_eval", 2, atmp); { dSP; PERL_SET_CONTEXT(my_perl); SPAGAIN; ENTER; SAVETMPS; PUSHMARK(sp); XPUSHs(sv_2mortal(purple_perl_bless_object(plugin, "Purple::Plugin"))); PUTBACK; perl_call_pv(gps->load_sub, G_EVAL | G_SCALAR); SPAGAIN; if (SvTRUE(ERRSV)) { STRLEN len; purple_debug(PURPLE_DEBUG_ERROR, "perl", "Perl function %s exited abnormally: %s\n", gps->load_sub, SvPV(ERRSV, len)); } PUTBACK; FREETMPS; LEAVE; } return TRUE; }
int main(int argc, char **argv, char **env) { int exitstatus; int i; char **fakeargv; GV* tmpgv; SV* tmpsv; int options_count; PERL_SYS_INIT3(&argc,&argv,&env); if (!PL_do_undump) { my_perl = perl_alloc(); if (!my_perl) exit(1); perl_construct( my_perl ); PL_perl_destruct_level = 0; } #ifdef USE_ITHREADS for( i = 0; i < 117; ++i ) { av_push( PL_regex_padav, newSViv(0) ); } PL_regex_pad = AvARRAY( PL_regex_padav ); #endif #ifdef CSH if (!PL_cshlen) PL_cshlen = strlen(PL_cshname); #endif #ifdef ALLOW_PERL_OPTIONS #define EXTRA_OPTIONS 3 #else #define EXTRA_OPTIONS 4 #endif /* ALLOW_PERL_OPTIONS */ New(666, fakeargv, argc + EXTRA_OPTIONS + 1, char *); fakeargv[0] = argv[0]; fakeargv[1] = "-e"; fakeargv[2] = ""; options_count = 3; if( 0 ) { fakeargv[options_count] = "-T"; ++options_count; } #ifndef ALLOW_PERL_OPTIONS fakeargv[options_count] = "--"; ++options_count; #endif /* ALLOW_PERL_OPTIONS */ for (i = 1; i < argc; i++) fakeargv[i + options_count - 1] = argv[i]; fakeargv[argc + options_count - 1] = 0; exitstatus = perl_parse(my_perl, xs_init, argc + options_count - 1, fakeargv, NULL); if (exitstatus) exit( exitstatus ); TAINT; if ((tmpgv = gv_fetchpv("0",TRUE, SVt_PV))) {/* hello.p */ tmpsv = GvSV(tmpgv); sv_setpv(tmpsv, argv[0]); SvSETMAGIC(tmpsv); } if ((tmpgv = gv_fetchpv("\030",TRUE, SVt_PV))) {/* $^X */ tmpsv = GvSV(tmpgv); #ifdef WIN32 sv_setpv(tmpsv,"perl.exe"); #else sv_setpv(tmpsv,"perl"); #endif SvSETMAGIC(tmpsv); } TAINT_NOT; /* PL_main_cv = PL_compcv; */ PL_compcv = 0; exitstatus = perl_init(); if (exitstatus) exit( exitstatus ); dl_init(aTHX); exitstatus = perl_run( my_perl ); perl_destruct( my_perl ); perl_free( my_perl ); PERL_SYS_TERM(); exit( exitstatus ); }
static void answer_mode(int type) { int rc, spd;char *cs; struct sockaddr_in sa; socklen_t ss=sizeof(sa); sts_t sts; if(cfgs(CFG_ROOTDIR)&&ccs[0])chdir(ccs); rnode=xcalloc(1,sizeof(ninfo_t)); is_ip=!isatty(0); xstrcpy(ip_id,"ipline",10); rnode->tty=xstrdup(is_ip?(bink?"binkp":"tcpip"):basename(ttyname(0))); rnode->options|=O_INB; if(!log_init(cfgs(CFG_LOG),rnode->tty)) { printf("can't open log %s!\n",ccs); exit(S_FAILURE); } signal(SIGINT,SIG_IGN); signal(SIGTERM,sigerr); signal(SIGSEGV,sigerr); signal(SIGFPE,sigerr); signal(SIGPIPE,SIG_IGN); IFPerl(perl_init(cfgs(CFG_PERLFILE),0)); log_callback=NULL;xsend_cb=NULL; ssock=cls_conn(CLS_LINE,cfgs(CFG_SERVER),NULL); if(ssock<0)write_log("can't connect to server: %s",strerror(errno)); else log_callback=vlogs; rc=aso_init(cfgs(CFG_ASOOUTBOUND),cfgs(CFG_BSOOUTBOUND),cfgs(CFG_QSTOUTBOUND),cfgal(CFG_ADDRESS)->addr.z); if(!rc) { write_log("No outbound defined"); stopit(S_FAILURE); } write_log("answering incoming call");vidle(); if(is_ip&&!getpeername(0,(struct sockaddr*)&sa,&ss)) { write_log("remote is %s",inet_ntoa(sa.sin_addr)); spd=TCP_SPEED; } else { cs=getenv("CONNECT");spd=cs?atoi(cs):0; xfree(connstr);connstr=xstrdup(cs); if(cs&&spd)write_log("*** CONNECT %s",cs); else { write_log("*** CONNECT Unknown"); spd=DEFAULT_SPEED; } } if((cs=getenv("CALLER_ID"))&&strcasecmp(cs,"none")&&strlen(cs)>3)write_log("caller-id: %s",cs); tty_setattr(0); tty_local(0); rc=session(0,type,NULL,spd); tty_local(1); if(!is_ip) { hangup(); stat_collect(); } tty_cooked(); if((S_OK==(rc&S_MASK))&&cfgi(CFG_HOLDONSUCCESS)) { log_done(); log_init(cfgs(CFG_MASTERLOG),NULL); aso_getstatus(&rnode->addrs->addr, &sts); sts.flags|=(Q_WAITA|Q_WAITR|Q_WAITX); sts.htime=MAX(t_set(cci*60),sts.htime); write_log("calls to %s delayed for %d min after successful incoming session", ftnaddrtoa(&rnode->addrs->addr),cci); aso_setstatus(&rnode->addrs->addr,&sts); log_done(); log_init(cfgs(CFG_LOG),rnode->tty); } title("Waiting..."); vidle();sline(""); aso_done(); stopit(rc); }
int main(int argc,char **argv,char **envp) { int c,daemon=-1,rc,sesstype=SESSION_EMSI,line=0,call_flags=0; char *hostname=NULL,*str=NULL; FTNADDR_T(fa); #ifndef HAVE_SETPROCTITLE setargspace(argc,argv,envp); #endif #ifdef HAVE_SETLOCALE setlocale(LC_ALL, ""); #endif while((c=getopt(argc, argv, "hI:da:ni:c:tbv"))!=EOF) { switch(c) { case 'c': daemon=12; str=optarg; while(str&&*str) { switch(toupper(*str)) { case 'N': call_flags=0; break; case 'I': call_flags|=1; break; case 'A': call_flags|=2; break; default: write_log("unknown call option: %c", *optarg); exit(S_FAILURE); } str++; } break; case 'i': hostname=optarg; break; case 'I': configname=optarg; break; case 'd': daemon=1; break; case 'a': daemon=0; sesstype=SESSION_AUTO; if(!strncasecmp(optarg,"**emsi",6)|| !strncasecmp(optarg,"auto",4))sesstype=SESSION_EMSI; #ifdef WITH_BINKP if(strncasecmp(optarg,"binkp",5)&& (*optarg!=0x80||!optarg[1]||optarg[2]))break; sesstype=SESSION_BINKP; case 'b': bink=1; #endif break; case 'n': daemon=2; break; case 't': daemon=3; break; case 'v': u_vers(progname); default: usage(argv[0]); } } if(!hostname&&daemon<0)usage(argv[0]); getsysinfo();ssock=lins_sock=uis_sock=-1; if(!readconfig(configname)) { write_log("there was some errors parsing '%s', aborting",configname); exit(S_FAILURE); } if(!log_init(cfgs(CFG_MASTERLOG),NULL)) { write_log("can't open master log '%s'",ccs); exit(S_FAILURE); } #ifdef NEED_DEBUG parse_log_levels(); if(facilities_levels['C']>=1)dumpconfig(); #endif psubsts=parsesubsts(cfgfasl(CFG_SUBST)); #ifdef NEED_DEBUG if(facilities_levels['C']>=1) { subst_t *s; dialine_t *l; for(s=psubsts;s;s=s->next) { write_log("subst for %s [%d]",ftnaddrtoa(&s->addr),s->nhids); for(l=s->hiddens;l;l=l->next) write_log(" * %s,%s,%s,%d,%d",l->phone,l->host,l->timegaps,l->flags,l->num); } } #endif log_done(); if(daemon==3)exit(S_OK); if(hostname||daemon==12) { if(!parseftnaddr(argv[optind],&fa,&DEFADDR,0)) { write_log("can't parse address '%s'",argv[optind]); exit(S_FAILURE); } optind++; } if(hostname) { is_ip=1; rnode=xcalloc(1,sizeof(ninfo_t)); xstrcpy(ip_id,"ipline",10); rnode->tty=bink?"binkp":"tcpip"; if(!log_init(cfgs(CFG_LOG),rnode->tty)) { write_log("can't open log %s",ccs); exit(S_FAILURE); } signal(SIGINT,sigerr); signal(SIGTERM,sigerr); signal(SIGSEGV,sigerr); signal(SIGPIPE,SIG_IGN); IFPerl(perl_init(cfgs(CFG_PERLFILE),0)); log_callback=NULL;xsend_cb=NULL; ssock=cls_conn(CLS_LINE,cfgs(CFG_SERVER),NULL); if(ssock<0)write_log("can't connect to server: %s",strerror(errno)); else log_callback=vlogs; rc=aso_init(cfgs(CFG_ASOOUTBOUND),cfgs(CFG_BSOOUTBOUND),cfgs(CFG_QSTOUTBOUND),cfgal(CFG_ADDRESS)->addr.z); if(!rc) { write_log("No outbound defined"); stopit(S_FAILURE); } rc=do_call(&fa,hostname,NULL); aso_done(); stopit(rc); } if(daemon==12) { if(optind<argc) { if(1!=sscanf(argv[optind],"%d",&line)) { write_log("can't parse line number '%s'!\n",argv[optind]); exit(S_FAILURE); } } else line = 0; log_callback=NULL;xsend_cb=NULL; ssock=cls_conn(CLS_LINE,cfgs(CFG_SERVER),NULL); if(ssock<0)write_log("can't connect to server: %s",strerror(errno)); else log_callback=vlogs; rc=aso_init(cfgs(CFG_ASOOUTBOUND),cfgs(CFG_BSOOUTBOUND),cfgs(CFG_QSTOUTBOUND),cfgal(CFG_ADDRESS)->addr.z); if(!rc) { write_log("No outbound defined"); cls_close(ssock); exit(S_FAILURE); } if(aso_locknode(&fa,LCK_c)) { signal(SIGINT,sigerr); signal(SIGTERM,sigerr); signal(SIGSEGV,sigerr); signal(SIGPIPE,SIG_IGN); IFPerl(perl_init(cfgs(CFG_PERLFILE),0)); rc=force_call(&fa,line,call_flags); aso_unlocknode(&fa,LCK_x); } else rc=S_FAILURE; if(rc&S_MASK)write_log("can't call to %s",ftnaddrtoa(&fa)); aso_done(); stopit(rc); } switch(daemon) { case 1: daemon_mode(); break; case 0: answer_mode(sesstype); break; case 2: compile_nodelists(); break; } return S_OK; }
int main (int argc, char *argv[]) #endif { char tmp[128]; #if defined(HAVE_FORK) char **saved_argv; mypid = getpid(); /* save argv as setproctitle() under some systems will change it */ saved_argv = mkargv (argc, argv); configpath = parseargs(argc, saved_argv); #else configpath = parseargs(argc, argv); #endif saved_envp = mkargv (-1, environ); #ifdef WIN32 if (service_flag==w32_installservice && !configpath) Log (0, "%s: invalid command line: config name must be specified", extract_filename(argv[0])); w32Init(); #ifdef BINKD9X { int win9x_rc; win9x_rc = win9x_process(argc, argv); if (win9x_rc != -1) return win9x_rc; } #endif #endif tzset(); if (poll_flag && server_flag) Log (0, "-p and -s cannot be used together"); #if defined(WIN32) && !defined(BINKD9X) if (service_flag!=w32_noservice) if (service(argc, argv, environ) && service_flag!=w32_run_as_service) { Log(0, "Windows NT service error"); } if (tray_flag) do_tray_flag(); else { atexit(UnloadBinkdIcon); LoadBinkdIcon(); } #endif /* No command line options: run both client and server */ if (!client_flag && !server_flag) client_flag = server_flag = 1; InitSem (&hostsem); InitSem (&resolvsem); InitSem (&lsem); InitSem (&blsem); InitSem (&varsem); InitSem (&config_sem); InitEventSem (&eothread); InitEventSem (&wakecmgr); #ifdef OS2 InitSem (&fhsem); #endif /* Init for ftnnode.c */ nodes_init (); if (configpath) { current_config = readcfg (configpath); if (!current_config) Log (0, "error in configuration, aborting"); if (dumpcfg_flag) { debug_readcfg (); exit(0); } InitLog(current_config->loglevel, current_config->conlog, current_config->logpath, current_config->nolog.first); } else if (verbose_flag) { #if defined(WIN32) && defined(BINKD9X) AllocTempConsole(); #endif printf ("Binkd " MYVER " (" __DATE__ " " __TIME__ "%s)\n", get_os_string ()); if (verbose_flag>1) { printf ("Compilation flags: " _DBNKD ".\n"); printf ("Facilities: " #ifndef srv_getaddrinfo "fsp1035 " #endif #ifndef HAVE_GETADDRINFO "rfc2553emu " #else "ipv6 " #endif "\n"); } exit (0); } else if (argc > 1) Log (0, "%s: invalid command line: config name must be specified", extract_filename(argv[0])); else usage (); print_args (tmp, sizeof (tmp), argv + 1); #ifdef WIN32 if (service_flag==w32_run_as_service) Log (4, "BEGIN service '%s', " MYNAME "/" MYVER "%s%s", service_name, get_os_string(), tmp); else Log (4, "BEGIN standalone, " MYNAME "/" MYVER "%s%s", get_os_string(), tmp); #else Log (4, "BEGIN, " MYNAME "/" MYVER "%s%s", get_os_string(), tmp); #endif if (sock_init ()) Log (0, "sock_init: %s", TCPERR ()); bsy_init (); rnd (); initsetproctitle (argc, argv, environ); #ifdef WIN32 SetFileApisToOEM(); #endif /* Set up break handler, set up exit list if needed */ if (!set_break_handlers ()) Log (0, "cannot install break handlers"); #if defined(SIGPIPE) signal(SIGPIPE, SIG_IGN); #endif #if defined(WITH_ZLIB) && defined(ZLIBDL) if (current_config->zlib_dll[0]) { if (!zlib_init(current_config->zlib_dll)) Log (2, "cannot load %s, GZ compression disabled", current_config->zlib_dll); else Log (6, "%s loaded successfully", current_config->zlib_dll); } else Log (current_config->zrules.first ? 3 : 5, "zlib-dll not defined, GZ compression disabled"); #endif #if defined(WITH_BZLIB2) && defined(ZLIBDL) if (current_config->bzlib2_dll[0]) { if (!bzlib2_init(current_config->bzlib2_dll)) Log (2, "cannot load %s, BZ2 compression disabled", current_config->bzlib2_dll); else Log (6, "%s loaded successfully", current_config->bzlib2_dll); } else Log (current_config->zrules.first #ifdef WITH_ZLIB && !zlib_loaded #endif ? 3 : 5, "bzlib2-dll not defined, BZ2 compression disabled"); #endif #ifdef WITH_PERL if (current_config->perl_script[0]) { if (!perl_init(current_config->perl_script, current_config)) { if (current_config->perl_strict) Log (0, "error parsing Perl script %s", current_config->perl_script); } else { perl_on_start(current_config); perl_config_loaded(current_config); } } #endif #ifdef HAVE_FORK signal (SIGCHLD, sighandler); #endif { /* Create polls and release polls list */ struct maskchain *psP; for (psP = psPolls.first; psP; psP = psP->next) poll_node (psP->mask, current_config); simplelist_free(&psPolls.linkpoint, destroy_maskchain); } if (no_flag) Log (0, "Exit on option '-n'"); if (inetd_flag) { FTN_ADDR ftn_addr, *pftn_addr; int tempfd; pftn_addr = NULL; if (remote_node) { if (parse_ftnaddress (remote_node, &ftn_addr, current_config->pDomains.first)) { char szFTNAddr[FTN_ADDR_SZ + 1]; exp_ftnaddress (&ftn_addr, current_config->pAddr, current_config->nAddr, current_config->pDomains.first); pftn_addr = &ftn_addr; ftnaddress_to_str (szFTNAddr, pftn_addr); Log (3, "Session with %s", szFTNAddr); } else Log (1, "`%s' cannot be parsed as a Fido-style address", remote_node); } if (!remote_addr) { char *p = getenv("SSH_CONNECTION"); if (p) { remote_addr = strdup(p); p = strchr(remote_addr, ' '); if (p) *p = '\0'; } } /* not using stdin/stdout itself to avoid possible collisions */ if (inetd_socket_in == -1) inetd_socket_in = dup(fileno(stdin)); if (inetd_socket_out == -1) inetd_socket_out = dup(fileno(stdout)); #ifdef UNIX tempfd = open("/dev/null", O_RDWR); #else tempfd = open("nul", O_RDWR); #endif if (tempfd != -1) { dup2(tempfd, fileno(stdin)); dup2(tempfd, fileno(stdout)); close(tempfd); } protocol (inetd_socket_in, inetd_socket_out, NULL, pftn_addr, remote_addr, current_config); soclose (inetd_socket_out); exit (0); } #ifdef BINKD_DAEMONIZE if (daemon_flag) { if (binkd_daemonize(1) < 0) Log (0, "Cannot daemonize"); else mypid = getpid(); } #endif #if defined(HAVE_FORK) signal (SIGHUP, sighandler); #endif if (client_flag && !server_flag) { clientmgr (0); exit (0); } pidsmgr = (int) getpid (); if (client_flag && (pidcmgr = branch (clientmgr, 0, 0)) < 0) { Log (0, "cannot branch out"); } if (*current_config->pid_file) { if ( unlink (current_config->pid_file) == 0 ) /* successfully unlinked, i.e. an old pid_file was found */ Log (1, "unexpected pid_file: %s: unlinked", current_config->pid_file); else { int current_log_level = 1; switch ( errno ) { case ENOENT : /* file not found or null pathname */ current_log_level = 8; /* it's ok */ break; default : break; } Log (current_log_level, "unlink_pid_file: %s: %s", current_config->pid_file, strerror (errno)); } create_sem_file (current_config->pid_file, 1); } servmgr (); return 0; }