1 |
commit: 44333dfc32156bb41dc6839121a532950be2b993 |
2 |
Author: Alexander Bersenev <bay <AT> hackerdom <DOT> ru> |
3 |
AuthorDate: Mon Sep 5 22:10:00 2011 +0000 |
4 |
Commit: Александр Берсенев <bay <AT> hackerdom <DOT> ru> |
5 |
CommitDate: Mon Sep 5 22:10:00 2011 +0000 |
6 |
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/autodep.git;a=commit;h=44333dfc |
7 |
|
8 |
fixed a bug when hook library intercepts a call while not initialized |
9 |
|
10 |
--- |
11 |
src/autodep/logfs/logger_hooklib.py | 1 + |
12 |
.../package_utils/portage_misc_functions.py | 12 +++ |
13 |
src/hook_lib/file_hook.c | 84 +++++++++++--------- |
14 |
3 files changed, 60 insertions(+), 37 deletions(-) |
15 |
|
16 |
diff --git a/src/autodep/logfs/logger_hooklib.py b/src/autodep/logfs/logger_hooklib.py |
17 |
index c6af4e4..80f0cd4 100644 |
18 |
--- a/src/autodep/logfs/logger_hooklib.py |
19 |
+++ b/src/autodep/logfs/logger_hooklib.py |
20 |
@@ -7,6 +7,7 @@ class logger: |
21 |
socketname='' |
22 |
# we can't use just file_hook.so here |
23 |
# because program may change LD_LIBRARY_PATH |
24 |
+ #hooklibpath='/home/bay/gsoc/src/hook_lib/file_hook.so' |
25 |
hooklibpath='/usr/lib/file_hook.so' |
26 |
|
27 |
def __init__(self,socketname): |
28 |
|
29 |
diff --git a/src/autodep/package_utils/portage_misc_functions.py b/src/autodep/package_utils/portage_misc_functions.py |
30 |
index fd00be9..29fcfec 100644 |
31 |
--- a/src/autodep/package_utils/portage_misc_functions.py |
32 |
+++ b/src/autodep/package_utils/portage_misc_functions.py |
33 |
@@ -308,6 +308,18 @@ class portage_api: |
34 |
ret.append(pkg) |
35 |
return ret |
36 |
|
37 |
+ def get_system_packages_rdeps(self): |
38 |
+ """ |
39 |
+ returns runtime dependencies of packages from system set |
40 |
+ |
41 |
+ :returns: **list** of package names |
42 |
+ """ |
43 |
+ ret=set() |
44 |
+ |
45 |
+ for pkg in self.get_system_packages_list(): |
46 |
+ ret=ret.union(self.get_deps(pkg,["RDEPEND"])) |
47 |
+ return list(ret) |
48 |
+ |
49 |
def parse_emerge_args(self,args): |
50 |
""" |
51 |
call emerge arguments parser |
52 |
|
53 |
diff --git a/src/hook_lib/file_hook.c b/src/hook_lib/file_hook.c |
54 |
index 09cc2e8..9e9bddc 100644 |
55 |
--- a/src/hook_lib/file_hook.c |
56 |
+++ b/src/hook_lib/file_hook.c |
57 |
@@ -79,6 +79,8 @@ pid_t (*_fork)(); |
58 |
int (*_setenv)(const char *name, const char *value, int overwrite); |
59 |
int (*_close)(int fd); // we hooking this, because some programs closes our socket |
60 |
|
61 |
+int is_initialized=0; // when init not lauched yet we should no do any actions |
62 |
+ |
63 |
int log_socket=-1; |
64 |
|
65 |
char ld_preload_orig[MAXPATHLEN]; |
66 |
@@ -87,44 +89,10 @@ char log_socket_name[MAXSOCKETPATHLEN]; |
67 |
char ld_preload_env[MAXENVITEMSIZE]; // value: LD_PRELOAD=ld_preload_orig |
68 |
char log_socket_env[MAXENVITEMSIZE]; // value: LOG_SOCKET=log_socket_name |
69 |
|
70 |
-void __doconnect(){ |
71 |
- if(strlen(log_socket_name)>=MAXSOCKETPATHLEN) { |
72 |
- fprintf(stderr,"Unable to create a unix-socket %s: socket name is too long,exiting\n", log_socket_name); |
73 |
- exit(1); |
74 |
- } |
75 |
- |
76 |
- log_socket=socket(AF_UNIX, SOCK_SEQPACKET, 0); |
77 |
- if(log_socket==-1) { |
78 |
- fprintf(stderr,"Unable to create a unix-socket %s: %s\n", log_socket_name, strerror(errno)); |
79 |
- exit(1); |
80 |
- } |
81 |
- |
82 |
- struct sockaddr_un serveraddr; |
83 |
- memset(&serveraddr, 0, sizeof(serveraddr)); |
84 |
- serveraddr.sun_family = AF_UNIX; |
85 |
- strcpy(serveraddr.sun_path, log_socket_name); |
86 |
- |
87 |
- |
88 |
- int ret=connect(log_socket, (struct sockaddr *)&serveraddr, SUN_LEN(&serveraddr)); |
89 |
- if(ret==-1) { |
90 |
- fprintf(stderr,"Unable to connect a unix-socket %s: %s\n",log_socket_name, strerror(errno)); |
91 |
- fflush(stderr); |
92 |
- //execlp("/bin/bash","/bin/bash",NULL); |
93 |
- exit(1); |
94 |
- } |
95 |
-} |
96 |
+void __init_hooks() { |
97 |
+ if(is_initialized) |
98 |
+ return; |
99 |
|
100 |
-void __dodisconnect() { |
101 |
- close(log_socket); |
102 |
-} |
103 |
- |
104 |
-void __doreconnect() { |
105 |
- __doconnect(); |
106 |
- __dodisconnect(); |
107 |
-} |
108 |
- |
109 |
-// this fucnction executes when library is loaded |
110 |
-void _init() { |
111 |
char *log_socket_val=getenv("LOG_SOCKET"); |
112 |
|
113 |
if(log_socket_val==NULL) { |
114 |
@@ -207,8 +175,50 @@ void _init() { |
115 |
|
116 |
snprintf(ld_preload_env,MAXENVITEMSIZE,"LD_PRELOAD=%s",ld_preload_orig); |
117 |
snprintf(log_socket_env,MAXENVITEMSIZE,"LOG_SOCKET=%s",log_socket_name); |
118 |
+ |
119 |
+ is_initialized=1; |
120 |
+} |
121 |
|
122 |
+void __doconnect(){ |
123 |
+ if(! is_initialized) |
124 |
+ __init_hooks(); |
125 |
+ if(strlen(log_socket_name)>=MAXSOCKETPATHLEN) { |
126 |
+ fprintf(stderr,"Unable to create a unix-socket %s: socket name is too long,exiting\n", log_socket_name); |
127 |
+ exit(1); |
128 |
+ } |
129 |
+ |
130 |
+ log_socket=socket(AF_UNIX, SOCK_SEQPACKET, 0); |
131 |
+ if(log_socket==-1) { |
132 |
+ fprintf(stderr,"Unable to create a unix-socket %s: %s\n", log_socket_name, strerror(errno)); |
133 |
+ exit(1); |
134 |
+ } |
135 |
|
136 |
+ struct sockaddr_un serveraddr; |
137 |
+ memset(&serveraddr, 0, sizeof(serveraddr)); |
138 |
+ serveraddr.sun_family = AF_UNIX; |
139 |
+ strcpy(serveraddr.sun_path, log_socket_name); |
140 |
+ |
141 |
+ |
142 |
+ int ret=connect(log_socket, (struct sockaddr *)&serveraddr, SUN_LEN(&serveraddr)); |
143 |
+ if(ret==-1) { |
144 |
+ fprintf(stderr,"Unable to connect a unix-socket %s: %s\n",log_socket_name, strerror(errno)); |
145 |
+ fflush(stderr); |
146 |
+ exit(1); |
147 |
+ } |
148 |
+} |
149 |
+ |
150 |
+void __dodisconnect() { |
151 |
+ close(log_socket); |
152 |
+} |
153 |
+ |
154 |
+void __doreconnect() { |
155 |
+ __doconnect(); |
156 |
+ __dodisconnect(); |
157 |
+} |
158 |
+ |
159 |
+// this fucnction executes when library is loaded |
160 |
+void _init() { |
161 |
+ __init_hooks(); |
162 |
__doconnect(); |
163 |
} |