/rusxmms/librcc

To get this branch, use:
bzr branch http://suren.me/webbzr/rusxmms/librcc

« back to all changes in this revision

Viewing changes to external/rccexternal.c

  • Committer: Suren A. Chilingaryan
  • Date: 2005-07-29 03:26:28 UTC
  • Revision ID: Arch-1:ds@dside.dyndns.org--darksoft-2004%librcc--main--0.1--patch-23
Translation
    - Language Translation using libtranslate is implemented
    - Autoengine sets current charset (option)

Show diffs side-by-side

added added

removed removed

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