cb2256 | 1995-10-11 | Fredrik Hübinette (Hubbe) | | |
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | ||| This file a part of Pike, and is copyright by Fredrik Hubinette
||| Pike is distributed as GPL (General Public License)
|
cb2256 | 1995-10-11 | Fredrik Hübinette (Hubbe) | | ||| See the files COPYING and DISCLAIMER for more information.
\*/
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | #include "global.h"
|
c52c6a | 1997-01-14 | Niels Möller | | RCSID("$Id: main.c,v 1.14 1997/01/14 18:16:23 nisse Exp $");
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | #include "types.h"
#include "backend.h"
#include "module.h"
#include "object.h"
#include "lex.h"
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | #include "pike_types.h"
#include "builtin_functions.h"
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | #include "array.h"
#include "stralloc.h"
#include "interpret.h"
#include "error.h"
#include "macros.h"
#include "callback.h"
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | #include "signal_handler.h"
|
07513e | 1996-10-04 | Fredrik Hübinette (Hubbe) | | #include "threads.h"
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
#ifdef HAVE_LOCALE_H
#include <locale.h>
#endif
|
693018 | 1996-02-25 | Fredrik Hübinette (Hubbe) | |
|
6e37dc | 1996-06-21 | Fredrik Hübinette (Hubbe) | | #include "time_stuff.h"
|
693018 | 1996-02-25 | Fredrik Hübinette (Hubbe) | |
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | #ifdef HAVE_SYS_RESOURCE_H
#include <sys/resource.h>
#endif
char *master_file;
int d_flag=0;
int c_flag=0;
int t_flag=0;
int a_flag=0;
int l_flag=0;
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | int p_flag=0;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
81b84e | 1996-12-03 | Fredrik Hübinette (Hubbe) | | static struct callback_list post_master_callbacks;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
6e37dc | 1996-06-21 | Fredrik Hübinette (Hubbe) | | struct callback *add_post_master_callback(callback_func call,
|
8f4f88 | 1996-06-20 | Fredrik Hübinette (Hubbe) | | void *arg,
|
6e37dc | 1996-06-21 | Fredrik Hübinette (Hubbe) | | callback_func free_func)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
6e37dc | 1996-06-21 | Fredrik Hübinette (Hubbe) | | return add_to_callback(&post_master_callbacks, call, arg, free_func);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
void main(int argc, char **argv, char **env)
{
JMP_BUF back;
int e, num;
char *p;
struct array *a;
#ifdef HAVE_SETLOCALE
|
2cf1a1 | 1996-09-23 | Fredrik Hübinette (Hubbe) | | #ifdef LC_NUMERIC
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | setlocale(LC_NUMERIC, "C");
|
2cf1a1 | 1996-09-23 | Fredrik Hübinette (Hubbe) | | #endif
#ifdef LC_CTYPE
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | setlocale(LC_CTYPE, "");
|
2cf1a1 | 1996-09-23 | Fredrik Hübinette (Hubbe) | | #endif
#ifdef LC_TIME
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | setlocale(LC_TIME, "C");
|
2cf1a1 | 1996-09-23 | Fredrik Hübinette (Hubbe) | | #endif
#ifdef LC_COLLATE
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | setlocale(LC_COLLATE, "");
|
2cf1a1 | 1996-09-23 | Fredrik Hübinette (Hubbe) | | #endif
#ifdef LC_MESSAGES
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | setlocale(LC_MESSAGES, "");
|
2cf1a1 | 1996-09-23 | Fredrik Hübinette (Hubbe) | | #endif
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | #endif
init_backend();
master_file = 0;
#ifdef HAVE_GETENV
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | master_file = getenv("PIKE_MASTER");
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | #endif
if(!master_file) master_file = DEFAULT_MASTER;
for(e=1; e<argc; e++)
{
if(argv[e][0]=='-')
{
for(p=argv[e]+1; *p;)
{
switch(*p)
{
case 'D':
add_predefine(p+1);
p+=strlen(p);
break;
case 'm':
if(p[1])
{
master_file=p+1;
p+=strlen(p);
}else{
e++;
if(e >= argc)
{
fprintf(stderr,"Missing argument to -m\n");
exit(1);
}
master_file=argv[e];
p+=strlen(p);
}
break;
|
9f243b | 1996-08-12 | Fredrik Hübinette (Hubbe) | | case 's':
if(!p[1])
{
e++;
if(e >= argc)
{
fprintf(stderr,"Missing argument to -s\n");
exit(1);
}
p=argv[e];
}
stack_size=STRTOL(p+1,&p,0);
p+=strlen(p);
if(stack_size < 256)
{
fprintf(stderr,"Stack size must at least be 256.\n");
exit(1);
}
break;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | case 'd':
if(p[1]>='0' && p[1]<='9')
d_flag+=STRTOL(p+1,&p,10);
else
d_flag++,p++;
break;
case 'a':
if(p[1]>='0' && p[1]<='9')
a_flag+=STRTOL(p+1,&p,10);
else
a_flag++,p++;
break;
case 't':
if(p[1]>='0' && p[1]<='9')
t_flag+=STRTOL(p+1,&p,10);
else
t_flag++,p++;
break;
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | case 'p':
if(p[1]>='0' && p[1]<='9')
p_flag+=STRTOL(p+1,&p,10);
else
p_flag++,p++;
break;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | case 'l':
if(p[1]>='0' && p[1]<='9')
l_flag+=STRTOL(p+1,&p,10);
else
l_flag++,p++;
break;
default:
|
f633d8 | 1996-09-23 | Fredrik Hübinette (Hubbe) | | fprintf(stderr,"Unknown flag '%c'\n",*p);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | exit(1);
}
}
}else{
break;
}
}
|
2a5096 | 1995-08-23 | Fredrik Hübinette (Hubbe) | | #if !defined(RLIMIT_NOFILE) && defined(RLIMIT_OFILE)
#define RLIMIT_NOFILE RLIMIT_OFILE
|
e17dbc | 1995-08-11 | David Hedbor | | #endif
|
2a5096 | 1995-08-23 | Fredrik Hübinette (Hubbe) | |
#if defined(HAVE_SETRLIMIT) && defined(RLIMIT_NOFILE)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
struct rlimit lim;
|
f90e54 | 1995-08-17 | Fredrik Hübinette (Hubbe) | | long tmp;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | if(!getrlimit(RLIMIT_NOFILE, &lim))
{
|
5c8e89 | 1995-10-29 | Fredrik Hübinette (Hubbe) | | #ifdef RLIM_INFINITY
if(lim.rlim_max == RLIM_INFINITY)
lim.rlim_max=MAX_OPEN_FILEDESCRIPTORS;
#endif
|
f90e54 | 1995-08-17 | Fredrik Hübinette (Hubbe) | | tmp=MINIMUM(lim.rlim_max, MAX_OPEN_FILEDESCRIPTORS);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | lim.rlim_cur=tmp;
setrlimit(RLIMIT_NOFILE, &lim);
}
}
#endif
|
6e37dc | 1996-06-21 | Fredrik Hübinette (Hubbe) | | GETTIMEOFDAY(¤t_time);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
init_modules_efuns();
master();
|
ddea55 | 1996-07-01 | Fredrik Hübinette (Hubbe) | | call_callback(& post_master_callbacks, 0);
|
8f4f88 | 1996-06-20 | Fredrik Hübinette (Hubbe) | | free_callback(& post_master_callbacks);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | init_modules_programs();
|
99946c | 1996-02-17 | Fredrik Hübinette (Hubbe) | | a=allocate_array_no_init(argc-e,0);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | for(num=0;e<argc;e++)
|
99946c | 1996-02-17 | Fredrik Hübinette (Hubbe) | | {
ITEM(a)[num].u.string=make_shared_string(argv[e]);
ITEM(a)[num].type=T_STRING;
num++;
}
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | push_array(a);
for(num=0;env[num];num++);
|
99946c | 1996-02-17 | Fredrik Hübinette (Hubbe) | | a=allocate_array_no_init(num,0);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | for(num=0;env[num];num++)
|
99946c | 1996-02-17 | Fredrik Hübinette (Hubbe) | | {
ITEM(a)[num].u.string=make_shared_string(env[num]);
ITEM(a)[num].type=T_STRING;
}
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | push_array(a);
if(SETJMP(back))
{
|
dceabb | 1996-10-09 | Fredrik Hübinette (Hubbe) | | ONERROR tmp;
SET_ONERROR(tmp,exit_on_error,"Error in handle_error in master object!");
|
5aa04a | 1996-05-16 | Fredrik Hübinette (Hubbe) | | assign_svalue_no_free(sp, & throw_value);
sp++;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | APPLY_MASTER("handle_error", 1);
pop_stack();
|
dceabb | 1996-10-09 | Fredrik Hübinette (Hubbe) | | UNSET_ONERROR(tmp);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | exit(10);
}
apply(master(),"_main",2);
pop_stack();
UNSETJMP(back);
backend();
push_int(0);
f_exit(1);
}
void init_main_efuns()
{
|
af9321 | 1996-10-12 | Fredrik Hübinette (Hubbe) | | init_shared_string_table();
|
6e37dc | 1996-06-21 | Fredrik Hübinette (Hubbe) | | init_interpreter();
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | init_lex();
init_types();
init_builtin_efuns();
|
cb2256 | 1995-10-11 | Fredrik Hübinette (Hubbe) | | init_signals();
|
07513e | 1996-10-04 | Fredrik Hübinette (Hubbe) | | th_init();
|
ca74dd | 1996-10-08 | Fredrik Hübinette (Hubbe) | | init_dynamic_load();
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
void init_main_programs()
{
|
07513e | 1996-10-04 | Fredrik Hübinette (Hubbe) | | th_init_programs();
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
void exit_main()
{
void cleanup_added_efuns();
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | void cleanup_pike_types();
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | void cleanup_program();
|
6d1a5e | 1996-10-07 | Fredrik Hübinette (Hubbe) | | th_cleanup();
|
433204 | 1996-06-09 | Fredrik Hübinette (Hubbe) | | cleanup_objects();
|
c52c6a | 1997-01-14 | Niels Möller | | exit_dynamic_load();
|
cb2256 | 1995-10-11 | Fredrik Hübinette (Hubbe) | | exit_signals();
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | exit_lex();
cleanup_interpret();
cleanup_added_efuns();
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | cleanup_pike_types();
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | cleanup_program();
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | |
#ifdef GC2
do_gc();
#endif
|
84c9cc | 1996-11-22 | Fredrik Hübinette (Hubbe) | | cleanup_callbacks();
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | zap_all_arrays();
|
cbd60b | 1996-12-04 | Fredrik Hübinette (Hubbe) | | zap_all_mappings();
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | |
cleanup_shared_string_table();
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|