]>
Commit | Line | Data |
---|---|---|
987a37e7 JS |
1 | # S390-specific system calls |
2 | ||
d27e6fd5 | 3 | %(arch == "s390" %? |
987a37e7 JS |
4 | |
5 | # getresgid __________________________________________________ | |
6 | # long sys32_getresgid16(u16 __user *rgid, u16 __user *egid, u16 __user *sgid) | |
7 | # | |
8 | probe nd_syscall.getresgid16 = kprobe.function("sys32_getresgid16") ? | |
9 | { | |
10 | name = "getresgid" | |
987a37e7 | 11 | asmlinkage() |
eb73b74a MC |
12 | rgid_uaddr = pointer_arg(1) |
13 | egid_uaddr = pointer_arg(2) | |
14 | sgid_uaddr = pointer_arg(3) | |
15 | argstr = sprintf("%p, %p, %p", rgid_uaddr, egid_uaddr, sgid_uaddr) | |
987a37e7 JS |
16 | } |
17 | probe nd_syscall.getresgid16.return = kprobe.function("sys32_getresgid16").return ? | |
18 | { | |
19 | name = "getresgid" | |
20 | retstr = returnstr(1) | |
21 | } | |
22 | ||
23 | # getresuid __________________________________________________ | |
24 | # long sys32_getresuid16(u16 __user *ruid, u16 __user *euid, u16 __user *suid) | |
25 | # | |
26 | probe nd_syscall.getresuid16 = kprobe.function("sys32_getresuid16") ? | |
27 | { | |
28 | name = "getresuid" | |
987a37e7 | 29 | asmlinkage() |
eb73b74a MC |
30 | ruid_uaddr = pointer_arg(1) |
31 | euid_uaddr = pointer_arg(2) | |
32 | suid_uaddr = pointer_arg(3) | |
33 | argstr = sprintf("%p, %p, %p", ruid_uaddr, euid_uaddr, suid_uaddr) | |
987a37e7 JS |
34 | } |
35 | probe nd_syscall.getresuid16.return = kprobe.function("sys32_getresuid16").return ? | |
36 | { | |
37 | name = "getresuid" | |
38 | retstr = returnstr(1) | |
39 | } | |
40 | ||
dbca0eed | 41 | %( systemtap_v < "2.7" %? |
dc7bb409 DS |
42 | # sys32_ipc() is just a syscall multiplexer (similar to |
43 | # sys_socketcall()). So, we don't really need to probe it, since we'll | |
44 | # be probing what sys32_ipc() will call (semget, msgsnd, msgrcv, | |
45 | # shmat, etc.). | |
46 | ||
987a37e7 JS |
47 | # ipc _________________________________________________ |
48 | # long sys32_ipc(u32 call, int first, int second, int third, u32 ptr) | |
49 | # | |
50 | probe nd_syscall.ipc = kprobe.function("sys32_ipc") ? | |
51 | { | |
52 | name = "ipc" | |
53 | // argstr = sprintf("%d, %d, %d, %d, %p", $call, $first, $second, $third, $ptr) | |
54 | asmlinkage() | |
55 | argstr = sprintf("%d, %d, %d, %d, %p", uint_arg(1), int_arg(2), int_arg(3), int_arg(4), uint_arg(5)) | |
56 | } | |
dc7bb409 | 57 | probe nd_syscall.ipc.return = kprobe.function("sys32_ipc").return ? |
987a37e7 JS |
58 | { |
59 | name = "ipc" | |
60 | retstr = returnstr(1) | |
61 | } | |
dc7bb409 | 62 | %) |
987a37e7 | 63 | |
701af3b7 DS |
64 | # In kernels < 2.6.33, mmap()/mmap2() was handled by arch-specific |
65 | # code. In kernels >= 2.6.33, the arch-specific code just calls | |
66 | # generic sys_mmap_pgoff(). | |
67 | %( kernel_v < "2.6.33" %? | |
987a37e7 JS |
68 | # mmap _________________________________________________ |
69 | # long old_mmap(struct mmap_arg_struct __user *arg) | |
70 | # long old32_mmap(struct mmap_arg_struct_emu31 __user *arg) | |
71 | # | |
6ebb905e | 72 | probe nd_syscall.mmap = __nd_syscall.mmap ?, __nd_syscall.mmap32 ? |
987a37e7 JS |
73 | { |
74 | name = "mmap" | |
c88409ef MC |
75 | argstr = sprintf("%p, %u, %s, %s, %d, %d", start, len, |
76 | _mprotect_prot_str(prot), _mmap_flags(flags), | |
77 | fd, offset) | |
93fb14d6 DS |
78 | } |
79 | probe __nd_syscall.mmap = kprobe.function("old_mmap") ?, | |
80 | kprobe.function("SyS_s390_old_mmap") ? | |
81 | { | |
93fb14d6 | 82 | asmlinkage() |
c88409ef MC |
83 | __args = &@cast(pointer_arg(1), "ulong", "kernel<linux/types.h>") |
84 | start = user_ulong(&(__args)[0]) | |
85 | len = user_ulong(&(__args)[1]) | |
86 | prot = user_ulong(&(__args)[2]) | |
87 | flags = user_ulong(&(__args)[3]) | |
88 | fd = user_long(&(__args)[4]) | |
89 | offset = user_ulong(&(__args)[5]) | |
93fb14d6 | 90 | } |
6ebb905e | 91 | probe __nd_syscall.mmap32 = kprobe.function("old32_mmap") |
93fb14d6 | 92 | { |
987a37e7 | 93 | asmlinkage() |
c88409ef MC |
94 | __args = &@cast(pointer_arg(1), "unsigned int", "kernel<linux/types.h>") |
95 | start = user_uint32(&(__args)[0]) | |
96 | len = user_uint32(&(__args)[1]) | |
97 | prot = user_uint32(&(__args)[2]) | |
98 | flags = user_uint32(&(__args)[3]) | |
99 | fd = user_int(&(__args)[4]) | |
100 | offset = user_uint32(&(__args)[5]) | |
987a37e7 JS |
101 | } |
102 | probe nd_syscall.mmap.return = kprobe.function("old_mmap").return ?, | |
103 | kprobe.function("old32_mmap").return ?, | |
104 | kprobe.function("SyS_s390_old_mmap").return ? | |
105 | { | |
106 | name = "mmap" | |
107 | retstr = returnstr(2) | |
108 | } | |
109 | ||
110 | # mmap2 _________________________________________________ | |
111 | # | |
112 | # long sys_mmap2(struct mmap_arg_struct __user *arg) | |
113 | # long sys32_mmap2(struct mmap_arg_struct_emu31 __user *arg) | |
114 | # | |
6ebb905e | 115 | probe nd_syscall.mmap2 = __nd_syscall.mmap2 ?, __nd_syscall.mmap2_32 ? |
987a37e7 JS |
116 | { |
117 | name = "mmap2" | |
c88409ef MC |
118 | argstr = sprintf("%p, %u, %s, %s, %d, %d", start, length, |
119 | _mprotect_prot_str(prot), _mmap_flags(flags), | |
120 | fd, pgoffset) | |
93fb14d6 | 121 | } |
6ebb905e | 122 | probe __nd_syscall.mmap2 = kprobe.function("sys_mmap2") |
93fb14d6 | 123 | { |
93fb14d6 | 124 | asmlinkage() |
c88409ef MC |
125 | __args = &@cast(pointer_arg(1), "ulong", "kernel<linux/types.h>") |
126 | start = user_ulong(&(__args)[0]) | |
127 | length = user_ulong(&(__args)[1]) | |
128 | prot = user_ulong(&(__args)[2]) | |
129 | flags = user_ulong(&(__args)[3]) | |
130 | fd = user_long(&(__args)[4]) | |
131 | pgoffset = user_ulong(&(__args)[5]) | |
93fb14d6 | 132 | } |
6ebb905e | 133 | probe __nd_syscall.mmap2_32 = kprobe.function("sys32_mmap2") |
93fb14d6 | 134 | { |
987a37e7 | 135 | asmlinkage() |
c88409ef MC |
136 | __args = &@cast(pointer_arg(1), "unsigned int", "kernel<linux/types.h>") |
137 | start = user_uint32(&(__args)[0]) | |
138 | length = user_uint32(&(__args)[1]) | |
139 | prot = user_uint32(&(__args)[2]) | |
140 | flags = user_uint32(&(__args)[3]) | |
141 | fd = user_int(&(__args)[4]) | |
142 | pgoffset = user_uint32(&(__args)[5]) | |
987a37e7 JS |
143 | } |
144 | ||
145 | probe nd_syscall.mmap2.return = kprobe.function("sys_mmap2").return ?, | |
669853f7 | 146 | kprobe.function("sys32_mmap2").return ? |
987a37e7 JS |
147 | { |
148 | name = "mmap2" | |
149 | retstr = returnstr(2) | |
150 | } | |
701af3b7 | 151 | %) |
987a37e7 | 152 | |
2499f5ea | 153 | %( CONFIG_GENERIC_SIGALTSTACK == "n" || kernel_v < "3.8" %? |
09228299 DS |
154 | # sigaltstack ________________________________________________ |
155 | # asmlinkage long | |
156 | # sys_sigaltstack(const stack_t __user * uss, stack_t __user *uoss) | |
157 | # | |
158 | # NOTE: args vary between archs. | |
159 | probe nd_syscall.sigaltstack = kprobe.function("sys_sigaltstack") | |
160 | { | |
161 | name = "sigaltstack" | |
09228299 DS |
162 | asmlinkage() |
163 | uss_uaddr = pointer_arg(1) | |
164 | uoss_uaddr = pointer_arg(2) | |
2e139074 | 165 | %(systemtap_v < "2.3" %? |
704c2b5d | 166 | regs = %{ /* pure */ _stp_current_pt_regs() %} |
09228299 | 167 | %) |
258cf69f | 168 | argstr = sprintf("%s, %p", _stp_sigaltstack_u(uss_uaddr), uoss_uaddr) |
09228299 DS |
169 | } |
170 | probe nd_syscall.sigaltstack.return = kprobe.function("sys_sigaltstack").return | |
171 | { | |
172 | name = "sigaltstack" | |
173 | retstr = returnstr(1) | |
174 | } | |
09228299 DS |
175 | |
176 | # sys32_sigaltstack ________________________________________________ | |
177 | # asmlinkage long | |
178 | # sys32_sigaltstack(const stack_t32 __user *uss, stack_t32 __user *uoss) | |
179 | # | |
180 | # NOTE: args vary between archs. | |
181 | probe nd_syscall.sys32_sigaltstack = kprobe.function("sys32_sigaltstack") ? | |
182 | { | |
258cf69f DS |
183 | name = "sigaltstack" |
184 | asmlinkage() | |
185 | uss_uaddr = pointer_arg(1) | |
186 | uoss_uaddr = pointer_arg(2) | |
187 | argstr = sprintf("%s, %p", _stp_compat_sigaltstack_u(uss_uaddr), | |
188 | uoss_uaddr) | |
09228299 | 189 | } |
258cf69f DS |
190 | probe nd_syscall.sys32_sigaltstack.return = |
191 | kprobe.function("sys32_sigaltstack").return ? | |
09228299 | 192 | { |
258cf69f | 193 | name = "sigaltstack" |
09228299 DS |
194 | retstr = returnstr(1) |
195 | } | |
258cf69f | 196 | %) |
09228299 | 197 | |
987a37e7 JS |
198 | # sysctl _____________________________________________________ |
199 | # | |
200 | # long sys32_sysctl(struct __sysctl_args32 __user *args) | |
201 | # | |
202 | probe nd_syscall.sysctl32 = kprobe.function("sys32_sysctl") ? | |
203 | { | |
204 | name = "sysctl" | |
205 | // argstr = sprintf("%p", $args) | |
206 | asmlinkage() | |
207 | argstr = sprintf("%p", pointer_arg(1)) | |
208 | } | |
209 | probe nd_syscall.sysctl32.return = kprobe.function("sys32_sysctl").return ? | |
210 | { | |
211 | name = "sysctl" | |
212 | retstr = returnstr(1) | |
213 | } | |
214 | ||
ccde050d DS |
215 | # ftruncate64 _________________________________________________ |
216 | # | |
217 | # COMPAT_SYSCALL_DEFINE3(s390_ftruncate64, unsigned int, fd, u32, high, | |
218 | # u32, low) | |
219 | # | |
220 | probe nd_syscall.compat_ftruncate64 = kprobe.function("sys32_ftruncate64") ? | |
221 | { | |
222 | asmlinkage() | |
223 | name = "ftruncate" | |
224 | fd = int_arg(1) | |
225 | length = ((uint_arg(2) << 32) | uint_arg(3)) | |
226 | argstr = sprintf("%d, %d", fd, length) | |
227 | } | |
228 | probe nd_syscall.compat_ftruncate64.return = | |
229 | kprobe.function("sys32_ftruncate64").return ? | |
230 | { | |
231 | name = "ftruncate" | |
232 | retstr = returnstr(1) | |
233 | } | |
234 | ||
235 | # truncate64 __________________________________________________ | |
236 | # | |
237 | # COMPAT_SYSCALL_DEFINE3(s390_truncate64, const char __user *, path, | |
238 | # u32, high, u32, low) | |
239 | # | |
240 | probe nd_syscall.compat_truncate64 = kprobe.function("sys32_truncate64") ? | |
241 | { | |
242 | asmlinkage() | |
243 | name = "truncate" | |
244 | path_uaddr = pointer_arg(1) | |
245 | path = user_string_quoted(path_uaddr) | |
246 | length = ((uint_arg(2) << 32) | uint_arg(3)) | |
247 | argstr = sprintf("%s, %d", user_string_quoted(path_uaddr), length) | |
248 | } | |
249 | probe nd_syscall.compat_truncate64.return = | |
250 | kprobe.function("sys32_truncate64").return ? | |
251 | { | |
252 | name = "truncate" | |
253 | retstr = returnstr(1) | |
254 | } | |
255 | ||
dd074705 MC |
256 | # readahead __________________________________________________ |
257 | # | |
258 | # asmlinkage ssize_t | |
259 | # compat_ssize_t sys32_readahead(int fd, u32 offhi, u32 offlo, s32 count) | |
260 | # | |
261 | probe nd_syscall.compat_readahead = kprobe.function("sys32_readahead") ? | |
262 | { | |
263 | name = "readahead" | |
264 | asmlinkage() | |
265 | fd = int_arg(1) | |
266 | offset = ((uint_arg(2) << 32) | uint_arg(3)) | |
267 | count = ulong_arg(4) | |
268 | argstr = sprintf("%d, %d, %u", fd, offset, count) | |
269 | } | |
270 | probe nd_syscall.compat_readahead.return = kprobe.function("sys32_readahead").return ? | |
271 | { | |
272 | name = "readahead" | |
273 | retstr = returnstr(1) | |
274 | } | |
275 | ||
0da3de11 DS |
276 | # fadvise64 _______________________________________________________ |
277 | # | |
278 | # The following kernel commit: | |
279 | # | |
280 | # commit 5383d2c8b3ee61a762043818d7c07bbc0049b031 | |
281 | # Author: Heiko Carstens <heiko.carstens@de.ibm.com> | |
282 | # Date: Wed Feb 26 14:40:43 2014 +0100 | |
283 | # | |
284 | # s390/compat: convert to COMPAT_SYSCALL_DEFINEx part 7 | |
285 | # | |
286 | # changed sys32_fadvise64 from: | |
287 | # | |
288 | # asmlinkage long | |
289 | # sys32_fadvise64(int fd, loff_t offset, size_t len, int advise) | |
290 | # | |
291 | # to: | |
292 | # | |
293 | # COMPAT_SYSCALL_DEFINE5(s390_fadvise64, int, fd, u32, high, u32, low, | |
294 | # compat_size_t, len, int, advise | |
295 | probe nd_syscall.compat_fadvise64 = kprobe.function("sys32_fadvise64") ? | |
296 | { | |
297 | asmlinkage() | |
298 | name = "fadvise64" | |
299 | fd = int_arg(1) | |
300 | %( kernel_v < "3.15" %? | |
301 | # We have to use raw access here since the long long value is | |
302 | # stored in 1 register, not 2 - which longlong_arg() expects. | |
303 | offset = u_register("r3") | |
304 | len = int_arg(3) | |
305 | advice = int_arg(4) | |
306 | %: | |
307 | offset = ((uint_arg(2) << 32) | uint_arg(3)) | |
308 | len = int_arg(4) | |
309 | advice = int_arg(5) | |
310 | %) | |
311 | argstr = sprintf("%d, %d, %d, %s", fd, offset, len, | |
312 | _fadvice_advice_str(advice)) | |
313 | } | |
314 | probe nd_syscall.compat_fadvise64.return = | |
315 | kprobe.function("sys32_fadvise64").return ? | |
316 | { | |
317 | name = "fadvise64" | |
318 | retstr = returnstr(1) | |
319 | } | |
320 | ||
321 | ||
322 | # fadvise64_64 __________________________________________________ | |
323 | # | |
324 | # COMPAT_SYSCALL_DEFINE1(s390_fadvise64_64, | |
325 | # struct fadvise64_64_args __user *, args) | |
326 | # struct fadvise64_64_args { | |
327 | # int fd; | |
328 | # long long offset; | |
329 | # long long len; | |
330 | # int advice; | |
331 | #}; | |
332 | ||
333 | probe nd_syscall.compat_fadvise64_64 = kprobe.function("sys32_fadvise64_64") ? | |
334 | { | |
335 | name = "fadvise64" | |
336 | __args = &@cast(pointer_arg(1), "unsigned int", "kernel<linux/types.h>") | |
337 | fd = user_int(&(__args)[0]) | |
338 | offset = user_int64(&(__args)[2]) | |
339 | len = user_uint64(&(__args)[4]) | |
340 | advice = user_int(&(__args)[6]) | |
341 | argstr = sprintf("%d, %d, %d, %s", fd, offset, len, | |
342 | _fadvice_advice_str(advice)) | |
343 | } | |
344 | probe nd_syscall.compat_fadvise64_64.return = | |
345 | kprobe.function("sys32_fadvise64_64").return ? | |
346 | { | |
347 | name = "fadvise64" | |
348 | retstr = returnstr(1) | |
349 | } | |
350 | ||
ad37e6fe DS |
351 | # fallocate __________________________________________________ |
352 | # | |
353 | # SYSCALL_DEFINE4(fallocate, int, fd, int, mode, loff_t, offset, loff_t, len) | |
354 | # asmlinkage long sys32_fallocate(int fd, int mode, unsigned offset_lo, | |
355 | # unsigned offset_hi, unsigned len_lo, | |
356 | # unsigned len_hi) | |
357 | # | |
358 | # We've got a problem here on RHEL6 (2.6.32-504.el6.s390x) and RHEL7 | |
359 | # (3.10.0-229.el7.s390x). If we probe the real syscall (sys_fallocate) | |
360 | # and call longlong_arg(N), systemtap knows this is a compat task and | |
361 | # tries to get the long long from 2 different registers. However, by | |
362 | # the time we get to sys_fallocate(), the 64-bit value has been put | |
363 | # into one register. | |
364 | # | |
365 | # Normally we'd probe the "compat" version of the function to get the | |
366 | # raw values. However, on those kernels, the compat wrapper for | |
367 | # fallocate (sys_fallocate_wrapper) is in assembly language, which | |
368 | # stap can't find. | |
369 | # | |
370 | # So, we'll probe the "real" syscall here, and grab the "raw" register | |
371 | # values. | |
372 | probe nd_syscall.compat_fallocate = kprobe.function("sys_fallocate") ? | |
373 | { | |
374 | asmlinkage() | |
375 | name = "fallocate" | |
376 | ||
377 | fd = int_arg(1) | |
378 | mode = int_arg(2) | |
379 | # This logic is stolen from _stp_arg (in | |
380 | # tapset/s390/registers.stp). | |
eb73b74a | 381 | mode_str = _stp_fallocate_mode_str(mode) |
ad37e6fe DS |
382 | offset = u_register("r4") |
383 | len = u_register("r5") | |
5d9828b7 | 384 | argstr = sprintf("%d, %s, %#x, %u", fd, mode_str, offset, len) |
ad37e6fe DS |
385 | } |
386 | probe nd_syscall.compat_fallocate.return = | |
387 | kprobe.function("sys_fallocate").return ? | |
388 | { | |
389 | name = "fallocate" | |
390 | retstr = returnstr(1) | |
391 | } | |
392 | ||
bf952a76 DS |
393 | %( kernel_v < "3.7" %? |
394 | # execve _____________________________________________________ | |
395 | # | |
396 | # In kernels < 3.7, sys_execve() was in arch-specific code (and had | |
397 | # varying arguments). It was just a wrapper around generic | |
398 | # do_execve(), but the wrapper could error out before calling | |
399 | # do_execve(). So, we'll have to handle it in arch-specific tapset | |
400 | # code to catch all calls. | |
401 | # | |
402 | # asmlinkage long sys_execve(struct pt_regs regs) | |
403 | # SYSCALL_DEFINE3(execve, char __user *, name, char __user * __user *, argv, | |
404 | # char __user * __user *, envp) | |
405 | probe nd_syscall.execve = kprobe.function("sys_execve") | |
406 | { | |
407 | name = "execve" | |
408 | %( kernel_v < "2.6.32" %? | |
409 | __regs = &@cast(ulong_arg(1), "pt_regs", "kernel<asm/ptrace.h>") | |
410 | filename = user_string_quoted(__regs->orig_gpr2) | |
411 | args = __get_argv(__regs->gprs[3], 0) | |
8ae749be | 412 | env_str = __count_envp(__regs->gprs[4]) |
bf952a76 DS |
413 | %: |
414 | filename = user_string_quoted(pointer_arg(1)) | |
415 | args = __get_argv(pointer_arg(2), 0) | |
8ae749be | 416 | env_str = __count_envp(pointer_arg(3)) |
bf952a76 DS |
417 | %) |
418 | argstr = sprintf("%s, %s, %s", filename, args, env_str) | |
419 | } | |
420 | probe nd_syscall.execve.return = kprobe.function("sys_execve").return | |
421 | { | |
422 | name = "execve" | |
423 | retstr = returnstr(1) | |
424 | } | |
425 | ||
426 | # execve _____________________________________________________ | |
427 | # | |
428 | # asmlinkage long sys32_execve(struct pt_regs regs) | |
429 | # asmlinkage long sys32_execve(char __user *name, compat_uptr_t __user *argv, | |
430 | # compat_uptr_t __user *envp) | |
431 | probe nd_syscall.compat_execve = kprobe.function("sys32_execve") ? | |
432 | { | |
433 | asmlinkage() | |
434 | name = "execve" | |
435 | %( kernel_v < "2.6.32" %? | |
436 | __regs = &@cast(ulong_arg(1), "pt_regs", "kernel<asm/ptrace.h>") | |
437 | filename = user_string_quoted(__regs->orig_gpr2 & 0x7fffffff) | |
438 | args = __get_compat_argv(__regs->gprs[3] & 0x7fffffff, 0) | |
8ae749be | 439 | env_str = __count_compat_envp(__regs->gprs[4] & 0x7fffffff) |
bf952a76 DS |
440 | %: |
441 | filename = user_string_quoted(pointer_arg(1)) | |
442 | args = __get_compat_argv(pointer_arg(2), 0) | |
8ae749be | 443 | env_str = __count_compat_envp(pointer_arg(3)) |
bf952a76 DS |
444 | %) |
445 | argstr = sprintf("%s, %s, %s", filename, args, env_str) | |
446 | } | |
447 | probe nd_syscall.compat_execve.return = | |
448 | kprobe.function("sys32_execve").return ? | |
449 | { | |
450 | name = "execve" | |
451 | retstr = returnstr(1) | |
452 | } | |
453 | %) | |
d82aac45 MC |
454 | |
455 | # lookup_dcookie _____________________________________________ | |
456 | # rhel7: COMPAT_SYSCALL_DEFINE4(lookup_dcookie, u32, w0, u32, w1, char __user *, | |
457 | # buf, compat_size_t, len) | |
458 | # rhel[56]: kprobe.function("sys32_lookup_dcookie_wrapper") | |
459 | # | |
460 | probe nd_syscall.compat_lookup_dcookie = | |
461 | kprobe.function("compat_sys_lookup_dcookie") ?, | |
462 | kprobe.function("sys32_lookup_dcookie_wrapper") ? | |
463 | { | |
464 | name = "lookup_dcookie" | |
465 | asmlinkage() | |
466 | cookie = ((uint_arg(1) << 32) | uint_arg(2)) | |
467 | buffer_uaddr = pointer_arg(3) | |
468 | len = ulong_arg(4) | |
469 | argstr = sprintf("%#lx, %p, %#x", cookie, buffer_uaddr, len) | |
470 | } | |
471 | probe nd_syscall.compat_lookup_dcookie.return = | |
472 | kprobe.function("compat_sys_lookup_dcookie").return ?, | |
473 | kprobe.function("sys32_lookup_dcookie_wrapper").return ? | |
474 | { | |
475 | name = "lookup_dcookie" | |
476 | retstr = returnstr(1) | |
477 | } | |
478 | ||
987a37e7 | 479 | %) |