1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
|
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "../config.h"
#ifdef HAVE_UNISTD_H
# include <unistd.h>
#endif /* HAVE_UNISTD_H */
#ifdef HAVE_PWD_H
# include <pwd.h>
#endif /* HAVE_PWD_H */
#ifdef HAVE_SYS_TYPES_H
# include <sys/types.h>
#endif /* HAVE_SYS_TYPES_H */
#ifdef HAVE_SYS_SOCKET_H
# include <sys/socket.h>
#endif /* HAVE_SYS_SOCKET_H */
#ifdef HAVE_SYS_STAT_H
# include <sys/stat.h>
#endif /* HAVE_SYS_STAT_H */
#ifdef HAVE_SYS_UN_H
# include <sys/un.h>
#endif /* HAVE_SYS_UN_H */
#include <glib/gthread.h>
#include "../src/rccexternal.h"
#include "rcclibtranslate.h"
int main() {
int s, sd;
char addr[376];
const char *rcc_home_dir;
struct sockaddr_un mysock, clisock;
socklen_t socksize;
pid_t mypid;
unsigned char loopflag = 1;
rcc_external_info info;
ssize_t readed;
unsigned char cmd;
#ifdef HAVE_PWD_H
struct passwd *pw;
#endif /* HAVE_PWD_H */
mypid = getpid();
rcc_home_dir = getenv ("HOME");
#ifdef HAVE_PWD_H
if (!rcc_home_dir) {
setpwent ();
pw = getpwuid(getuid ());
endpwent ();
if ((pw)&&(pw->pw_dir)) rcc_home_dir = pw->pw_dir;
}
#endif /* HAVE_PWD_H */
if (strlen(rcc_home_dir)>256) return -1;
if (!rcc_home_dir) rcc_home_dir = "/";
rccLibTranslateInit(rcc_home_dir);
sprintf(addr,"%s/.rcc/comm/",rcc_home_dir);
mkdir(addr, 00600);
sprintf(addr,"%s/.rcc/comm/%lu.sock", rcc_home_dir, (unsigned long)mypid);
s = socket(PF_UNIX, SOCK_STREAM, 0);
if (!s) return -1;
memset(&mysock, 0, sizeof(mysock));
mysock.sun_family=AF_UNIX;
strncpy(mysock.sun_path,addr,sizeof(mysock.sun_path));
mysock.sun_path[sizeof(mysock.sun_path)-1]=0;
unlink(addr);
if (bind(s,(struct sockaddr*)&mysock,sizeof(mysock))==-1) return -1;
if (listen(s,1)<0) {
unlink(addr);
return -1;
}
while (loopflag) {
sd = accept(s,(struct sockaddr*)&clisock,&socksize);
if (sd < 0) continue;
readed = recv(sd,&cmd,1,0);
if (readed<=0) {
close(sd);
continue;
}
switch (cmd) {
case RCC_EXTERNAL_MODULE_CONTROL:
loopflag = 0;
break;
case RCC_EXTERNAL_MODULE_LIBRTRANSLATE:
info = (rcc_external_info)malloc(sizeof(rcc_external_info_s));
if (info) info->s = sd;
else break;
if (g_thread_create(rccLibTranslate, info, FALSE, NULL)) continue;
break;
}
close(sd);
}
close(s);
unlink(addr);
rccLibTranslateFree();
return 0;
}
|