@@ -48,9 +48,12 @@ static void create_thread(int, struct sockaddr_in *);
4848static void * service_thread (struct workorder * );
4949static void run_interpreter (FILE * , FILE * );
5050static int run_command (char * , PyObject * );
51+ static void ps (void );
5152
5253static char * progname = "pysvr" ;
5354
55+ static PyThreadState * gtstate ;
56+
5457main (int argc , char * * argv )
5558{
5659 int port = PORT ;
@@ -98,7 +101,7 @@ usage()
98101static void
99102main_thread (int port )
100103{
101- int sock , conn , size ;
104+ int sock , conn , size , i ;
102105 struct sockaddr_in addr , clientaddr ;
103106
104107 sock = socket (PF_INET , SOCK_STREAM , 0 );
@@ -108,7 +111,7 @@ main_thread(int port)
108111 exit (1 );
109112 }
110113
111- memset (& addr , '\0' , sizeof addr );
114+ memset (( char * ) & addr , '\0' , sizeof addr );
112115 addr .sin_family = AF_INET ;
113116 addr .sin_port = htons (port );
114117 addr .sin_addr .s_addr = 0L ;
@@ -126,8 +129,9 @@ main_thread(int port)
126129
127130 fprintf (stderr , "Listening on port %d...\n" , port );
128131
129- for (;; ) {
132+ for (i = 0 ; ; i ++ ) {
130133 size = sizeof clientaddr ;
134+ memset ((char * ) & clientaddr , '\0' , size );
131135 conn = accept (sock , (struct sockaddr * ) & clientaddr , & size );
132136 if (conn < 0 ) {
133137 oprogname ();
@@ -136,6 +140,7 @@ main_thread(int port)
136140 }
137141
138142 size = sizeof addr ;
143+ memset ((char * ) & addr , '\0' , size );
139144 if (getsockname (conn , (struct sockaddr * )& addr , & size ) < 0 ) {
140145 oprogname ();
141146 perror ("can't get socket name of connection" );
@@ -150,8 +155,21 @@ main_thread(int port)
150155 close (conn );
151156 continue ;
152157 }
158+ if (i == 4 ) {
159+ close (conn );
160+ break ;
161+ }
153162 create_thread (conn , & clientaddr );
154163 }
164+
165+ close (sock );
166+
167+ if (gtstate ) {
168+ PyEval_AcquireThread (gtstate );
169+ gtstate = NULL ;
170+ Py_Finalize ();
171+ }
172+ exit (0 );
155173}
156174
157175static void
@@ -192,8 +210,11 @@ static PyObject *the_builtins;
192210static void
193211init_python ()
194212{
195- PyEval_InitThreads (); /* Create and acquire the interpreter lock */
196- PyEval_ReleaseLock (); /* Release the lock */
213+ if (gtstate )
214+ return ;
215+ Py_Initialize (); /* Initialize the interpreter */
216+ PyEval_InitThreads (); /* Create (and acquire) the interpreter lock */
217+ gtstate = PyEval_SaveThread (); /* Release the thread state */
197218}
198219
199220static void *
@@ -203,6 +224,8 @@ service_thread(struct workorder *work)
203224
204225 fprintf (stderr , "Start thread for connection %d.\n" , work -> conn );
205226
227+ ps ();
228+
206229 input = fdopen (work -> conn , "r" );
207230 if (input == NULL ) {
208231 oprogname ();
@@ -264,6 +287,10 @@ run_interpreter(FILE *input, FILE *output)
264287 new_stdin = PyFile_FromFile (input , "<socket-in>" , "r" , NULL );
265288 new_stdout = PyFile_FromFile (output , "<socket-out>" , "w" , NULL );
266289
290+ PySys_SetObject ("stdin" , new_stdin );
291+ PySys_SetObject ("stdout" , new_stdout );
292+ PySys_SetObject ("stderr" , new_stdout );
293+
267294 for (n = 1 ; !PyErr_Occurred (); n ++ ) {
268295 Py_BEGIN_ALLOW_THREADS
269296 fprintf (output , "%d > ", n );
@@ -286,10 +313,6 @@ run_interpreter(FILE *input, FILE *output)
286313 if (p [0 ] == '#' || p [0 ] == '\0' )
287314 continue ;
288315
289- PySys_SetObject ("stdin" , new_stdin );
290- PySys_SetObject ("stdout" , new_stdout );
291- PySys_SetObject ("stderr" , new_stdout );
292-
293316 end = run_command (buffer , globals );
294317 if (end < 0 )
295318 PyErr_Print ();
@@ -327,3 +350,11 @@ run_command(char *buffer, PyObject *globals)
327350 Py_DECREF (v );
328351 return 0 ;
329352}
353+
354+ static void
355+ ps ()
356+ {
357+ char buffer [100 ];
358+ sprintf (buffer , "ps -l -p %d </dev/null | tail +2l\n" , getpid ());
359+ system (buffer );
360+ }
0 commit comments