1 /* Copyright 2004 Renzo Davoli
2 * Reseased under the GPLv2 */
7 #include <sys/select.h>
9 #include <sys/socket.h>
12 #define SWITCH_MAGIC 0xfeedface
15 enum request_type
{ REQ_NEW_CONTROL
};
19 enum request_type type
;
20 struct sockaddr_un sock
;
23 static unsigned char bufin
[BUFSIZE
];
25 static int send_fd(char *name
, int fddata
, struct sockaddr_un
*datasock
, int intno
, int group
)
28 struct request_v3 req
;
31 struct sockaddr_un sock
;
33 if((fdctl
= socket(AF_UNIX
, SOCK_STREAM
, 0)) < 0){
38 sock
.sun_family
= AF_UNIX
;
39 snprintf(sock
.sun_path
, sizeof(sock
.sun_path
), "%s", name
);
40 if(connect(fdctl
, (struct sockaddr
*) &sock
, sizeof(sock
))){
45 req
.magic
=SWITCH_MAGIC
;
47 req
.type
=REQ_NEW_CONTROL
+((group
> 0)?((geteuid()<<8) + group
) << 8:0);
49 req
.sock
.sun_family
=AF_UNIX
;
50 memset(req
.sock
.sun_path
, 0, sizeof(req
.sock
.sun_path
));
51 sprintf(&req
.sock
.sun_path
[1], "%5d-%2d", pid
, intno
);
53 if(bind(fddata
, (struct sockaddr
*) &req
.sock
, sizeof(req
.sock
)) < 0){
58 if (send(fdctl
,&req
,sizeof(req
),0) < 0) {
63 if (recv(fdctl
,datasock
,sizeof(struct sockaddr_un
),0)<0) {
71 static struct pollfd pollv
[]={{0,POLLIN
|POLLHUP
,0},{0,POLLIN
|POLLHUP
,0}};
73 main(int argc
,char *argv
[])
76 struct sockaddr_un dataout
,datain
;
77 int datainsize
,result
,nx
;
79 /*printf("argc = %d\n",argc);
81 printf("argv %d -%s-\n",i,argv[i]);*/
82 if (argc
!= 3 && argv
[0][0] != '-') {
83 fprintf(stderr
,"vdetap must be activated by libvdetap e.g.\n"
84 " sh%% export LD_PRELOAD=/usr/local/lib/libvdetap.so\n"
85 " csh%% setenv LD_PRELOAD /usr/local/lib/libvdetap.so\n");
90 for (i
=3;i
<FD_SETSIZE
;i
++)
93 if((fddata
= socket(AF_UNIX
, SOCK_DGRAM
, 0)) < 0){
97 send_fd(argv
[2],fddata
,&dataout
,0,0);
101 result
=poll(pollv
,2,-1);
102 if (pollv
[0].revents
& POLLHUP
|| pollv
[1].revents
& POLLHUP
)
104 if (pollv
[0].revents
& POLLIN
) {
105 nx
=read(fd
,bufin
,sizeof(bufin
));
106 /*fprintf(stderr,"RX from pgm %d\n",nx);*/
107 //send(connected_fd,bufin,nx,0);
108 sendto(fddata
,bufin
,nx
,0,(struct sockaddr
*) &dataout
, sizeof(struct sockaddr_un
));
110 if (pollv
[1].revents
& POLLIN
) {
111 datainsize
=sizeof(datain
);
112 nx
=recvfrom(fddata
,bufin
,BUFSIZE
,0,(struct sockaddr
*) &datain
, &datainsize
);
113 /*fprintf(stderr,"TX to pgm %d\n",nx);*/