Return-Path: Delivered-To: apmail-apr-dev-archive@www.apache.org Received: (qmail 13457 invoked from network); 16 Apr 2009 10:17:44 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.3) by minotaur.apache.org with SMTP; 16 Apr 2009 10:17:44 -0000 Received: (qmail 83027 invoked by uid 500); 16 Apr 2009 10:17:43 -0000 Delivered-To: apmail-apr-dev-archive@apr.apache.org Received: (qmail 82923 invoked by uid 500); 16 Apr 2009 10:17:43 -0000 Mailing-List: contact dev-help@apr.apache.org; run by ezmlm Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Id: Delivered-To: mailing list dev@apr.apache.org Received: (qmail 82905 invoked by uid 99); 16 Apr 2009 10:17:43 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 16 Apr 2009 10:17:43 +0000 X-ASF-Spam-Status: No, hits=0.2 required=10.0 tests=ASF_LIST_OPS,HTML_MESSAGE,SPF_PASS X-Spam-Check-By: apache.org Received-SPF: pass (athena.apache.org: domain of sameer.kasi200x@gmail.com designates 209.85.198.232 as permitted sender) Received: from [209.85.198.232] (HELO rv-out-0506.google.com) (209.85.198.232) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 16 Apr 2009 10:17:36 +0000 Received: by rv-out-0506.google.com with SMTP id l9so318164rvb.43 for ; Thu, 16 Apr 2009 03:17:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:received:from:date:message-id :subject:to:cc:content-type; bh=CuoEYwRhUdYSYlH7GX9Xm/xf+QVQX+6vsNHUcE02Z9w=; b=Xbyk2Lvb7eOWZ/yIJQKvsRV1ydb10bxO7lQa0c+7nuoxP5yjLxyQuzY9jPxZ01Wwis BF73VditrS6/uDSYo2dnveAh3CSy0r1BSOyYXncdZnjyAXVUfaXrZJb6WwllS7kcciA9 jzNRroTX3/r28A0qp4ekX7zS4QTaFI0BxGGL4= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:from:date:message-id:subject:to:cc:content-type; b=U66F5prVZNfLbaqRfcjLBI5MEc/Yps6BS0aIz7wVw8NsK9PeUYJzqaTmEOQ73hOuSW C8pOZquaOcgF1HdHr/yHLsw2OCMzb+RSjDatWZilO+mwguLwnLGzBuaMDcBAeLho6HNn XaMVNyokINaAz6Qh7EaATszem/fRL81d+t6kY= MIME-Version: 1.0 Received: by 10.141.204.17 with SMTP id g17mr733271rvq.269.1239877036078; Thu, 16 Apr 2009 03:17:16 -0700 (PDT) From: SAMEER KUMAR Date: Thu, 16 Apr 2009 15:47:01 +0530 Message-ID: <4faa72de0904160317n6bb8ea28rdc9005a0cf6c3fff@mail.gmail.com> Subject: How to pass a variable (socket) from a program to a child process (which will execute a new program) To: dev@apr.apache.org, dev-help@apr.apache.org Cc: Prof Priyanka Sharma , "(CE A 031) Fenil Khatiwala" , "(CE A 034) Amit Makwana" , jimmyroshaniya137@gmail.com, pranavtank@gmail.com Content-Type: multipart/alternative; boundary=000e0cd1ac044cf7320467a95e1b X-Virus-Checked: Checked by ClamAV on apache.org --000e0cd1ac044cf7320467a95e1b Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit How to pass a variable (socket) from a program to a child process (which will execute a new program) While using apr_proc_create, how can I pass a variable to the new process (which is executing a new binray file) The code I am using is as below... *file name: echo_listner.c* * #include "apr.h" #include "apr_network_io.h" #include"apr_thread_proc.h" #include #include #define MAXLINE 100 #define MAXN 100 void new_conn(apr_socket_t **new_sock); int i=0; int port=4754; apr_status_t serve(apr_pool_t *pool) { apr_status_t rv = APR_SUCCESS; apr_sockaddr_t *saddr; apr_pool_t *subpool; apr_socket_t *lskt; apr_socket_t *cskt; //Resources for new process for new connection apr_proc_t new_proc; apr_procattr_t *attr; apr_pool_t *attr_pool, *new_proc_pool; apr_thread_start_t func=new_conn(apr_socket_t **); for (;;i++) { rv = apr_socket_create(&lskt, APR_INET, SOCK_STREAM, APR_PROTO_TCP, pool); if (rv) return rv; rv = apr_sockaddr_info_get(&saddr, "127.0.0.1", APR_UNSPEC, port, 0, pool); port++; if (rv) return rv; rv = apr_socket_bind(lskt, saddr); if (rv) return rv; rv = apr_socket_listen(lskt, 5); if (rv) return rv; apr_pool_create(&subpool, pool); apr_pool_clear(subpool); rv = apr_socket_accept(&cskt, lskt, subpool); if(rv) return rv; printf("\nServer's instance no %d will be created\n", i); apr_pool_create(&attr_pool, NULL); apr_pool_create(&new_proc_pool,subpool); rv= apr_procattr_create (&attr,attr_pool); if(rv) return rv; //printf("\nNew pattr created\n"); rv = apr_procattr_cmdtype_set(attr,APR_PROGRAM) ; if(rv) return rv; //printf("\nCommand type assigned to execute binary program\n"); rv = apr_procattr_detach_set(attr, APR_PROC_DETACH_DAEMONIZE); //printf("\nDetatch done succeffully\n"); if(rv) return rv; rv = apr_socket_inherit_set(cskt); if(rv) return rv; //printf("\nSocket can be now inherited by child\n"); rv = apr_proc_create (&new_proc,"new_conn",NULL,NULL, attr,new_proc_pool); if(rv) return rv; printf("\nNew process was created\n"); rv = apr_socket_close(lskt); if(rv) return rv; continue; } return rv; } int main(int argc, const char * const argv[]) { apr_pool_t *pool; apr_status_t rv; int type=0; apr_initialize(); atexit(apr_terminate); apr_pool_create(&pool, NULL); rv = serve(pool); if (rv) { char buffer[256] = { 0 }; fprintf(stdout, "error: %s\n", apr_strerror(rv, buffer, sizeof(buffer))); printf("\n There is an error"); return EXIT_FAILURE; } return EXIT_SUCCESS; }* *file: new_conn.c* * #include "apr.h" #include "apr_network_io.h" #include #include #define MAXLINE 100 #define MAXN 100 extern apr_socket_t *cskt; int main(int argc, char *argv[]) { int ntowrite; ssize_t nread; char line[MAXLINE], result[MAXN]; apr_status_t rv; apr_size_t len = 100; char c; printf("\n in new proc I have reached here successfully\n"); for (;;) { rv = apr_socket_recv(cskt, &c, &len); if (APR_STATUS_IS_EOF(rv)) break; else if (rv) break; else if (! len) break; rv = apr_socket_send(cskt, &c, &len); if (APR_STATUS_IS_EOF(rv)) break; else if (rv) break; else if (! len) break; } } *I want to pass cskt from the echo_listner to the new_conn which will be executed in new process created in echo_listner. I have made cskt inheritable. How can I pass it to new process? If i pass it straightway, it will show error/warning related to type conversion. Regards, Sameer Kumar B.Tech, Computer Engineering Institute of Technology, Nirma University, Ahmedabad, Gujarat email: sameer.kasi200x@gmail.com 05bce032@nirmauni.ac.in Phone: +919375220396 --000e0cd1ac044cf7320467a95e1b Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable How to pass a variable (socket) from a program to a child process (which wi= ll execute a new program)

While using apr_proc_create, how can I pas= s a variable to the new process (which is executing a new binray file)

The code I am using is as below...

file name: echo_listner.c<= /b>

#include "apr.h"
#include "apr_network_io.h= "
#include"apr_thread_proc.h"
#include <stdlib.h>= ;
#include <stdio.h>
#define MAXLINE 100
#define MAXN 100

= void new_conn(apr_socket_t **new_sock);
int i=3D0;
int port=3D4754;

apr_status_t serve(apr_pool_t *pool)
{
=A0=A0=A0 apr_status= _t rv =3D APR_SUCCESS;
=A0=A0=A0 apr_sockaddr_t *saddr;
=A0=A0=A0 apr_pool_t *subpool;
=A0= =A0=A0 apr_socket_t *lskt;
=A0=A0=A0 apr_socket_t *cskt;=A0=A0=A0
//Resources for new process for new connection
=A0=A0=A0 apr_proc_t=A0= =A0 new_proc;=A0=A0=A0 =A0
=A0=A0=A0 apr_procattr_t=A0 *attr;
=A0=A0=A0 apr_pool_t=A0 *attr_pool, *new_proc_pool;
=A0=A0=A0 apr_thread= _start_t func=3Dnew_conn(apr_socket_t **);

=A0=A0=A0 for (;;i++) {
=A0=A0=A0 rv =3D apr_socket_create(&lskt, APR_INET, SOCK_STREAM, = APR_PROTO_TCP,
=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0 pool);
=A0=A0=A0 if (rv)
=A0=A0=A0=A0=A0=A0 return rv;
=A0=A0=A0
=A0=A0= =A0 rv =3D apr_sockaddr_info_get(&saddr, "127.0.0.1", APR_UNS= PEC, port, 0,
=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 pool);
=A0=A0=A0 port++;=A0=A0=A0
= =A0=A0=A0 if (rv)
=A0=A0=A0=A0=A0=A0=A0 return rv;

=A0=A0=A0 rv =3D apr_socket_bind(lskt, saddr);
=A0=A0=A0 if (rv)
= =A0=A0=A0 =A0=A0=A0=A0=A0=A0=A0 return rv;
=A0=A0=A0 =A0=A0=A0

= =A0=A0=A0 rv =3D apr_socket_listen(lskt, 5);
=A0=A0=A0
=A0=A0=A0 if = (rv)
=A0=A0=A0=A0=A0=A0=A0 return rv;
=A0=A0=A0
=A0=A0=A0=A0=A0= =A0=A0 apr_pool_create(&subpool, pool);
=A0=A0=A0=A0=A0=A0=A0 apr_pool_clear(subpool);

=A0=A0=A0 rv =3D apr_= socket_accept(&cskt, lskt, subpool);
=A0=A0=A0 if(rv)
=A0=A0=A0 = =A0=A0=A0 return rv;

=A0=A0=A0
=A0=A0=A0 printf("\nServer&#= 39;s instance no %d will be created\n", i);

=A0=A0=A0 apr_pool_create(&attr_pool, NULL);=A0=A0=A0
=A0=A0=A0= apr_pool_create(&new_proc_pool,subpool);

=A0=A0=A0 rv=3D apr_pr= ocattr_create (&attr,attr_pool);
=A0=A0=A0 if(rv)
=A0=A0=A0 =A0= =A0=A0 return rv;
=A0=A0=A0 //printf("\nNew pattr created\n");= =A0=A0=A0 =A0=A0=A0 =A0=A0=A0
=A0=A0=A0
=A0=A0=A0 rv =3D apr_procattr_cmdtype_set(attr,APR_PROGRAM) ;=
=A0=A0=A0 if(rv)
=A0=A0=A0 =A0=A0=A0 return rv;
=A0=A0=A0 //print= f("\nCommand type assigned to execute binary program\n");=A0=A0= =A0 =A0=A0=A0
=A0=A0=A0
=A0=A0=A0 rv =3D apr_procattr_detach_set(at= tr, APR_PROC_DETACH_DAEMONIZE);
=A0=A0=A0 //printf("\nDetatch done succeffully\n");
=A0=A0=A0 = if(rv)
=A0=A0=A0 =A0=A0=A0 return rv;

=A0=A0=A0 rv =3D apr_socket= _inherit_set(cskt);
=A0=A0=A0 if(rv)
=A0=A0=A0 =A0=A0=A0 return rv;=A0=A0=A0 //printf("\nSocket can be now inherited by child\n");=


=A0=A0=A0 rv =3D apr_proc_create (&new_proc,"new_conn&q= uot;,NULL,NULL, attr,new_proc_pool);
=A0=A0=A0 if(rv)
=A0=A0=A0 = =A0=A0=A0 return rv;
=A0=A0=A0 printf("\nNew process was created\n&= quot;);=A0=A0=A0

=A0=A0=A0 rv =3D apr_socket_close(lskt);
=A0=A0=A0 if(rv)
=A0=A0=A0 =A0=A0=A0 return rv;=A0=A0=A0

=A0=A0= =A0 continue;=A0=A0=A0 =A0=A0=A0
=A0=A0=A0
=A0=A0 }

=A0=A0= =A0 return rv;
}
=A0=A0=A0
int main(int argc, const char * const = argv[])
{
=A0=A0=A0 apr_pool_t *pool;
=A0=A0=A0 apr_status_t rv; =A0=A0=A0 int type=3D0;

=A0=A0=A0 apr_initialize();
=A0=A0=A0 ate= xit(apr_terminate);

=A0=A0=A0 apr_pool_create(&pool, NULL);
<= br>=A0=A0=A0
=A0=A0=A0 rv =3D serve(pool);
=A0=A0=A0 if (rv) {
= =A0=A0=A0=A0=A0=A0=A0 char buffer[256] =3D { 0 };

=A0=A0=A0=A0=A0=A0= =A0 fprintf(stdout, "error: %s\n",
=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 apr_strerror(rv, buffer, size= of(buffer)));
=A0=A0=A0 printf("\n There is an error");
=A0=A0=A0=A0=A0=A0=A0 return EXIT_FAILURE;
=A0=A0=A0 }

=A0=A0=A0= return EXIT_SUCCESS;
}


file: new_conn.c

#include "apr.h"
#include "apr_network_io.h"<= br>#include <stdlib.h>
#include <stdio.h>
#define MAXLINE= 100
#define MAXN 100

extern apr_socket_t *cskt;

int main(= int argc, char *argv[])
{
=A0=A0=A0
=A0=A0=A0
=A0=A0=A0 int=A0=A0=A0 ntowrite;
=A0=A0= =A0 ssize_t=A0=A0=A0 nread;
=A0=A0=A0 char=A0=A0=A0 line[MAXLINE], resul= t[MAXN];
=A0=A0=A0 apr_status_t rv;
=A0=A0=A0 apr_size_t len =3D 100;=
=A0=A0=A0=A0=A0=A0=A0 char c;
=A0=A0=A0=A0=A0=A0=A0 printf("\n = in new proc I have reached here successfully\n");=A0=A0=A0
=A0=A0=A0
=A0=A0=A0 for (;;) {
=A0
=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= rv =3D apr_socket_recv(cskt, &c, &len);
=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0 if (APR_STATUS_IS_EOF(rv))
=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0 break;
=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 else if (rv)=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 break;
=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0 else if (! len)
=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 break;

=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 rv =3D apr_socket_send(cskt, &c, &len);
=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 if (APR_STATUS_IS_EOF(rv))
=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 break;
=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0 else if (rv)
=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 break;=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 else if (! len)
=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 break;
=A0=A0=A0=A0=A0=A0= =A0 }

}


I want to pass cskt from the echo_listner to = the new_conn which will be executed in new process created in echo_listner.= I have made cskt inheritable. How can I pass it to new process? If i pass = it straightway, it will show error/warning related to type conversion.

Regards,
Sameer Kumar
B.Tech, Computer Engineering<= br>Institute of Technology,
Nirma University,
Ahmedabad, Gujarat
e= mail: sameer.kasi200x@gmail.co= m
=A0 =A0 =A0 =A0 =A005bce032@nir= mauni.ac.in
Phone: +919375220396
--000e0cd1ac044cf7320467a95e1b--