Paul Sokolovsky | 809eaa2 | 2014-01-29 00:37:09 +0200 | [diff] [blame] | 1 | import ffi |
| 2 | |
| 3 | libc = ffi.open("libc.so.6") |
| 4 | print("libc:", libc) |
| 5 | print() |
| 6 | |
| 7 | # Declare few functions |
Paul Sokolovsky | ecfd8e1 | 2016-06-17 19:21:37 +0300 | [diff] [blame] | 8 | perror = libc.func("v", "perror", "s") |
Paul Sokolovsky | 809eaa2 | 2014-01-29 00:37:09 +0200 | [diff] [blame] | 9 | time = libc.func("i", "time", "p") |
Paul Sokolovsky | ecfd8e1 | 2016-06-17 19:21:37 +0300 | [diff] [blame] | 10 | open = libc.func("i", "open", "si") |
Paul Sokolovsky | 809eaa2 | 2014-01-29 00:37:09 +0200 | [diff] [blame] | 11 | qsort = libc.func("v", "qsort", "piip") |
| 12 | # And one variable |
| 13 | errno = libc.var("i", "errno") |
| 14 | |
| 15 | print("time:", time) |
| 16 | print("UNIX time is:", time(None)) |
| 17 | print() |
| 18 | |
| 19 | perror("ffi before error") |
| 20 | open("somethingnonexistent__", 0) |
Paul Sokolovsky | 7053621 | 2016-06-17 19:24:58 +0300 | [diff] [blame^] | 21 | print("errno object:", errno) |
| 22 | print("errno value:", errno.get()) |
Paul Sokolovsky | 809eaa2 | 2014-01-29 00:37:09 +0200 | [diff] [blame] | 23 | perror("ffi after error") |
| 24 | print() |
| 25 | |
| 26 | def cmp(pa, pb): |
| 27 | a = ffi.as_bytearray(pa, 1) |
| 28 | b = ffi.as_bytearray(pb, 1) |
| 29 | print("cmp:", a, b) |
| 30 | return a[0] - b[0] |
| 31 | |
| 32 | cmp_c = ffi.callback("i", cmp, "pp") |
| 33 | print("callback:", cmp_c) |
| 34 | |
Paul Sokolovsky | 7053621 | 2016-06-17 19:24:58 +0300 | [diff] [blame^] | 35 | s = bytearray(b"foobar") |
Paul Sokolovsky | 809eaa2 | 2014-01-29 00:37:09 +0200 | [diff] [blame] | 36 | print("org string:", s) |
| 37 | qsort(s, len(s), 1, cmp_c) |
Paul Sokolovsky | 7053621 | 2016-06-17 19:24:58 +0300 | [diff] [blame^] | 38 | print("qsort'ed string:", s) |