* Passing function pointer to fcall @ 2011-11-27 0:06 wp1068189-ssc 2011-11-27 4:05 ` Anthony Green 0 siblings, 1 reply; 6+ messages in thread From: wp1068189-ssc @ 2011-11-27 0:06 UTC (permalink / raw) To: libffi-discuss Please take a look at this piece of code: #include <stdio.h> #include <ffi.h> #include <stdlib.h> int msg(void (*a) (char *)) { return 23; // but this doesn't work :-( a("Hi, there !\n"); } int main(int argc, char ** argv) { ffi_cif cif; ffi_abi abi; ffi_status status; int nargs = 1; ffi_type *rtype = &ffi_type_uint32; ffi_type **atypes; void **avalues; void *result; atypes = malloc(sizeof(ffi_type)); atypes[0] = &ffi_type_pointer; avalues = malloc(sizeof(ffi_type_pointer)); // I want to call msg with a pointer to printf *(void**)avalues[0] = printf; status = ffi_prep_cif(&cif, FFI_DEFAULT_ABI, nargs, rtype, atypes); result = (ffi_type *) malloc(sizeof(rtype->size)); if(status != FFI_OK) printf("ffi_prep_cif failed (%i)\n",status); ffi_call(&cif,FFI_FN(msg),result,avalues); return(*(int *)result); } As you might imagine, I'd like to call a function "msg" and send it a pointer to printf, but that does not work. I guess it has to do with the pointer me is constructing. But I have absolutely no idea what I'm doing wrong. Can anyone help, please ? ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: Passing function pointer to fcall 2011-11-27 0:06 Passing function pointer to fcall wp1068189-ssc @ 2011-11-27 4:05 ` Anthony Green 2011-11-27 7:33 ` wp1068189-ssc 0 siblings, 1 reply; 6+ messages in thread From: Anthony Green @ 2011-11-27 4:05 UTC (permalink / raw) To: libffi-discuss On 11/26/2011 7:05 PM, wp1068189-ssc wrote: > Please take a look at this piece of code: > > #include<stdio.h> > #include<ffi.h> > #include<stdlib.h> > > int msg(void (*a) (char *)) { > return 23; > // but this doesn't work :-( > a("Hi, there !\n"); > } > > int main(int argc, char ** argv) > { > > > ffi_cif cif; > ffi_abi abi; > ffi_status status; > int nargs = 1; > ffi_type *rtype =&ffi_type_uint32; > ffi_type **atypes; > void **avalues; > void *result; > > atypes = malloc(sizeof(ffi_type)); > atypes[0] =&ffi_type_pointer; > > avalues = malloc(sizeof(ffi_type_pointer)); > // I want to call msg with a pointer to printf > *(void**)avalues[0] = printf; > > status = ffi_prep_cif(&cif, FFI_DEFAULT_ABI, nargs, rtype, atypes); > > result = (ffi_type *) malloc(sizeof(rtype->size)); > > if(status != FFI_OK) > printf("ffi_prep_cif failed (%i)\n",status); > > ffi_call(&cif,FFI_FN(msg),result,avalues); > > return(*(int *)result); > } > > As you might imagine, I'd like to call a function "msg" and send it a pointer to > printf, > but that does not work. > I guess it has to do with the pointer me is constructing. > > But I have absolutely no idea what I'm doing wrong. > > Can anyone help, please ? Let's get the obvious one of out the way... you are returning from msg() before calling the function. I'm going to assume that's a typo or something. What platform are you working on? Also, you should declare "a" in msg() to have the same prototype as printf. Also, there's an oddity in the libffi API, and that is that "result" needs to be the largest native integral type on your system. So, use a long for result instead of mallocing the exact return type size. You can pass it into ffi_call as &result and simply cast it to an int at the end. Anthony Green ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: Passing function pointer to fcall 2011-11-27 4:05 ` Anthony Green @ 2011-11-27 7:33 ` wp1068189-ssc 2011-11-27 14:12 ` Stefan Sonnenberg-Carstens 0 siblings, 1 reply; 6+ messages in thread From: wp1068189-ssc @ 2011-11-27 7:33 UTC (permalink / raw) To: Anthony Green, libffi-discuss Hi, I was not a type, it was by intention. The code looked originally so: #include<stdio.h> #include<ffi.h> #include<stdlib.h> int msg(void (*a) (char *)) { a("Hi, there !\n"); return 23; } int main(int argc, char ** argv) { ffi_cif cif; ffi_abi abi; ffi_status status; int nargs = 1; ffi_type *rtype =&ffi_type_uint32; ffi_type **atypes; void **avalues; void *result; atypes = malloc(sizeof(ffi_type)); atypes[0] =&ffi_type_pointer; avalues = malloc(sizeof(ffi_type_pointer)); // I want to call msg with a pointer to printf *(void**)avalues[0] = printf; status = ffi_prep_cif(&cif, FFI_DEFAULT_ABI, nargs, rtype, atypes); result = (ffi_type *) malloc(sizeof(rtype->size)); if(status != FFI_OK) printf("ffi_prep_cif failed (%i)\n",status); ffi_call(&cif,FFI_FN(msg),result,avalues); return(*(int *)result); } I'm on Windows XP SP2, with mingw: gcc -v COLLECT_GCC=C:\MinGW\bin\gcc.exe COLLECT_LTO_WRAPPER=c:/mingw/bin/../libexec/gcc/mingw32/4.6.1/lto-wrapper.exe Ziel: mingw32 Konfiguriert mit: ../gcc-4.6.1/configure --enable-languages=c,c++,fortran,objc,obj-c++ --disable-sjlj-exceptions --with- dwarf2 --enable-shared --enable-libgomp --disable-win32-registry --enable-libstdcxx-debug --enable-version-specific-runt ime-libs --build=mingw32 --prefix=/mingw Thread-Modell: win32 gcc-Version 4.6.1 (GCC) libffi is 3.0.10 build and installed with ./configure && make && make install The example above is compiled this way: gcc dyn_callback.c libffi-5.dll -I /lib/libffi-3.0.10/include/ -o dyn_callback On your suggestion I changed the code a bit, so that result get alloc'd this way: result = (ffi_type *) malloc(long); Simple: if I execute the program, nothing happens. If I comment out the line a("Hi, there !\n"); I get back 23 by $? after execution. If it is there, I get 5. I'm stuck. Anthony Green <green@moxielogic.com> hat am 27. November 2011 um 05:05 geschrieben: > On 11/26/2011 7:05 PM, wp1068189-ssc wrote: > > Please take a look at this piece of code: > > > > #include<stdio.h> > > #include<ffi.h> > > #include<stdlib.h> > > > > int msg(void (*a) (char *)) { > > return 23; > > // but this doesn't work :-( > > a("Hi, there !\n"); > > } > > > > int main(int argc, char ** argv) > > { > > > > > > ffi_cif cif; > > ffi_abi abi; > > ffi_status status; > > int nargs = 1; > > ffi_type *rtype =&ffi_type_uint32; > > ffi_type **atypes; > > void **avalues; > > void *result; > > > > atypes = malloc(sizeof(ffi_type)); > > atypes[0] =&ffi_type_pointer; > > > > avalues = malloc(sizeof(ffi_type_pointer)); > > // I want to call msg with a pointer to printf > > *(void**)avalues[0] = printf; > > > > status = ffi_prep_cif(&cif, FFI_DEFAULT_ABI, nargs, rtype, atypes); > > > > result = (ffi_type *) malloc(sizeof(rtype->size)); > > > > if(status != FFI_OK) > > printf("ffi_prep_cif failed (%i)\n",status); > > > > ffi_call(&cif,FFI_FN(msg),result,avalues); > > > > return(*(int *)result); > > } > > > > As you might imagine, I'd like to call a function "msg" and send it a > > pointer to > > printf, > > but that does not work. > > I guess it has to do with the pointer me is constructing. > > > > But I have absolutely no idea what I'm doing wrong. > > > > Can anyone help, please ? > > > Let's get the obvious one of out the way... you are returning from msg() > before calling the function. > > I'm going to assume that's a typo or something. > > What platform are you working on? Also, you should declare "a" in msg() > to have the same prototype as printf. > > Also, there's an oddity in the libffi API, and that is that "result" > needs to be the largest native integral type on your system. So, use a > long for result instead of mallocing the exact return type size. You > can pass it into ffi_call as &result and simply cast it to an int at the > end. > > Anthony Green > > ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: Passing function pointer to fcall 2011-11-27 7:33 ` wp1068189-ssc @ 2011-11-27 14:12 ` Stefan Sonnenberg-Carstens 2011-12-07 12:01 ` Anthony Green 0 siblings, 1 reply; 6+ messages in thread From: Stefan Sonnenberg-Carstens @ 2011-11-27 14:12 UTC (permalink / raw) To: wp1068189-ssc; +Cc: Anthony Green, libffi-discuss So, I extended the program some more: #include <stdio.h> #include <ffi.h> #include <stdlib.h> #include <windows.h> int add(int a,int b, char *fmt,void *fn) { // int (*func)(char *,int) = (int (*)(char *,int))GetProcAddress(GetModuleHandle("msvcrt.dll"),fn); int (*func)(char *,int) = (int (*)(char *,int))fn; return func(fmt,a+b); } int main(void) { ffi_cif cif; ffi_abi abi; ffi_status status; int nargs = 4; ffi_type *rtype = &ffi_type_sint32; ffi_type *atypes[4]; void *avalues[4]; int result; int a,b; a = 3; b = 4; char *fmt = "The answer is %i\n"; char *fn = "printf"; atypes[0] = &ffi_type_sint32; atypes[1] = &ffi_type_sint32; atypes[2] = &ffi_type_pointer; atypes[3] = &ffi_type_pointer; avalues[0] = malloc(atypes[0]->size); avalues[1] = malloc(atypes[1]->size); *(int *) avalues[0] = a; *(int *) avalues[1] = b; avalues[2] = (char *) &fmt; avalues[3] = &printf; printf("direct call: %i",add(3,4,"erg: %i\n",&printf)); status = ffi_prep_cif(&cif, FFI_DEFAULT_ABI, nargs, rtype, atypes); if(status != FFI_OK) printf("ffi_prep_cif failed (%i)\n",status); // crash occurs somewhere near here ... ffi_call(&cif,FFI_FN(add),&result,avalues); printf("%i\n",result); return 0 ; } As you can see, I call my add function twice, once directly and once via ffi_call. Both times I pass a reference to printf. As the direct method works, I guess the principal code is OK. Now, when I run the program it shows: $ dyn_callback.exe erg: 7 direct call: 7 Then it crashes and creates this callstack: dyn_callback.exe caused an Access Violation at location 614c25ff Reading from location 614c25ff. Registers: eax=614c25ff ebx=0040138c ecx=00000000 edx=00000003 esi=45206472 edi=6085db86 eip=614c25ff esp=0022fe34 ebp=0022fe60 iopl=0 nv up ei pl nz na pe nc cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000202 Call stack: AddrPC AddrReturn AddrFrame AddrStack Params 614C25FF 004013AF 0022FE30 0022FE34 00403064 00000007 77C35C94 77C12580 614C25FF 004013AF 6B746957 0022FE60 0022FE34 00000003 00000004 00403064 614C25FF 004013AF dyn_callback.exe:004013AF add dyn_callback.c:10 ... int (*func)(char *,int) = (int (*)(char *,int))fn; return func(fmt,a+b); > } int main(void) ... 6B746957 6B7465AF 0022FE78 0022FE34 6B746298 0022FEB4 00000010 00000001 6B746957 libffi-6.dll:6B746957 ffi_call_win32 6B7465AF 004014FB 0022FEC8 0022FE34 0022FF20 0040138C 0022FEFC 0022FF00 6B7465AF libffi-6.dll:6B7465AFC:\MinGW\msys\1.0\local\bin\libffi-6.dll: No symbol found ffi_call 004014FB 004010B9 0022FF58 0022FE34 00000001 005B2C98 005B2ED0 00405004 004014FB dyn_callback.exe:004014FB main dyn_callback.c:53 ... ffi_call(&cif,FFI_FN(add),&result,avalues); > printf("%i\n",result); return 0 ; ... 004010B9 00401284 0022FFA0 0022FE34 00000001 A47CBD08 7C90DCBA 7C817064 004010B9 dyn_callback.exe:004010B9 __mingw_CRTStartup crt1.c:244 00401284 7C817067 0022FFC0 0022FE34 6085DB86 45206472 7FFDA000 C0000005 00401284 dyn_callback.exe:00401284 WinMainCRTStartup crt1.c:274 7C817067 00000000 0022FFF0 0022FE34 0040126C 00000000 00000000 00000000 7C817067 kernel32.dll:7C817067 C:\WINDOWS\system32\kernel32.dll: No symbols RegisterWaitForInputIdle DEBUG_EVENT: dwDebugEventCode = EXIT_PROCESS_DEBUG_EVENT dwProcessId = CCC dwThreadId = A30 dwExitCode = C0000005 I installed libffi 3.0.11 beforhand, but sadly it produces no debugging symbols. ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: Passing function pointer to fcall 2011-11-27 14:12 ` Stefan Sonnenberg-Carstens @ 2011-12-07 12:01 ` Anthony Green 2011-12-07 13:19 ` wp1068189-ssc 0 siblings, 1 reply; 6+ messages in thread From: Anthony Green @ 2011-12-07 12:01 UTC (permalink / raw) To: stefan.sonnenberg; +Cc: libffi-discuss Stefan, The problem below is "avalues[3] = &printf". You need to add one more level of indirection.. so... void *p = printf; and avalues[3] = &p; AG On 11/27/2011 9:12 AM, Stefan Sonnenberg-Carstens wrote: > So, I extended the program some more: > > #include<stdio.h> > #include<ffi.h> > #include<stdlib.h> > #include<windows.h> > > int add(int a,int b, char *fmt,void *fn) { > // int (*func)(char *,int) = (int (*)(char > *,int))GetProcAddress(GetModuleHandle("msvcrt.dll"),fn); > int (*func)(char *,int) = (int (*)(char *,int))fn; > return func(fmt,a+b); > } > > int main(void) > { > > ffi_cif cif; > ffi_abi abi; > ffi_status status; > int nargs = 4; > ffi_type *rtype =&ffi_type_sint32; > ffi_type *atypes[4]; > void *avalues[4]; > int result; > > int a,b; > a = 3; > b = 4; > > char *fmt = "The answer is %i\n"; > char *fn = "printf"; > > atypes[0] =&ffi_type_sint32; > atypes[1] =&ffi_type_sint32; > atypes[2] =&ffi_type_pointer; > atypes[3] =&ffi_type_pointer; > > avalues[0] = malloc(atypes[0]->size); > avalues[1] = malloc(atypes[1]->size); > > *(int *) avalues[0] = a; > *(int *) avalues[1] = b; > avalues[2] = (char *)&fmt; > avalues[3] =&printf; > > printf("direct call: %i",add(3,4,"erg: %i\n",&printf)); > > status = ffi_prep_cif(&cif, FFI_DEFAULT_ABI, nargs, rtype, atypes); > > if(status != FFI_OK) > printf("ffi_prep_cif failed (%i)\n",status); > > // crash occurs somewhere near here ... > ffi_call(&cif,FFI_FN(add),&result,avalues); > > printf("%i\n",result); > > return 0 ; > > } > > > As you can see, I call my add function twice, once directly > and once via ffi_call. > Both times I pass a reference to printf. > As the direct method works, I guess the principal code is OK. > > Now, when I run the program it shows: > > $ dyn_callback.exe > erg: 7 > direct call: 7 > > Then it crashes and creates this callstack: > > dyn_callback.exe caused an Access Violation at location 614c25ff Reading > from location 614c25ff. > > Registers: > eax=614c25ff ebx=0040138c ecx=00000000 edx=00000003 esi=45206472 edi=6085db86 > eip=614c25ff esp=0022fe34 ebp=0022fe60 iopl=0 nv up ei pl nz na pe nc > cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000202 > > Call stack: > AddrPC AddrReturn AddrFrame AddrStack Params > 614C25FF 004013AF 0022FE30 0022FE34 00403064 00000007 77C35C94 > 77C12580 > 614C25FF > 004013AF 6B746957 0022FE60 0022FE34 00000003 00000004 00403064 > 614C25FF > 004013AF dyn_callback.exe:004013AF add dyn_callback.c:10 > > ... > int (*func)(char *,int) = (int (*)(char *,int))fn; > return func(fmt,a+b); >> } > int main(void) > ... > > 6B746957 6B7465AF 0022FE78 0022FE34 6B746298 0022FEB4 00000010 > 00000001 > 6B746957 libffi-6.dll:6B746957 ffi_call_win32 > 6B7465AF 004014FB 0022FEC8 0022FE34 0022FF20 0040138C 0022FEFC > 0022FF00 > 6B7465AF libffi-6.dll:6B7465AFC:\MinGW\msys\1.0\local\bin\libffi-6.dll: > No symbol found > ffi_call > 004014FB 004010B9 0022FF58 0022FE34 00000001 005B2C98 005B2ED0 > 00405004 > 004014FB dyn_callback.exe:004014FB main dyn_callback.c:53 > > ... > ffi_call(&cif,FFI_FN(add),&result,avalues); > >> printf("%i\n",result); > return 0 ; > ... > > 004010B9 00401284 0022FFA0 0022FE34 00000001 A47CBD08 7C90DCBA > 7C817064 > 004010B9 dyn_callback.exe:004010B9 __mingw_CRTStartup crt1.c:244 > > 00401284 7C817067 0022FFC0 0022FE34 6085DB86 45206472 7FFDA000 > C0000005 > 00401284 dyn_callback.exe:00401284 WinMainCRTStartup crt1.c:274 > > 7C817067 00000000 0022FFF0 0022FE34 0040126C 00000000 00000000 > 00000000 > 7C817067 kernel32.dll:7C817067 > C:\WINDOWS\system32\kernel32.dll: No symbols > RegisterWaitForInputIdle > DEBUG_EVENT: > dwDebugEventCode = EXIT_PROCESS_DEBUG_EVENT > dwProcessId = CCC > dwThreadId = A30 > dwExitCode = C0000005 > > I installed libffi 3.0.11 beforhand, but sadly it produces no debugging > symbols. > ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: Passing function pointer to fcall 2011-12-07 12:01 ` Anthony Green @ 2011-12-07 13:19 ` wp1068189-ssc 0 siblings, 0 replies; 6+ messages in thread From: wp1068189-ssc @ 2011-12-07 13:19 UTC (permalink / raw) To: Anthony Green; +Cc: libffi-discuss I did figure this out already. Anyway thanks alot. Just a few days away newLisp 10.3.8 will be released - and then bring support for libffi on Windows, Linux and Mac OS. Anthony Green <green@moxielogic.com> hat am 7. Dezember 2011 um 13:01 geschrieben: > Stefan, > > The problem below is "avalues[3] = &printf". You need to add one > more level of indirection.. so... > > void *p = printf; > and > avalues[3] = &p; > > AG > > > On 11/27/2011 9:12 AM, Stefan Sonnenberg-Carstens wrote: > > So, I extended the program some more: > > > > #include<stdio.h> > > #include<ffi.h> > > #include<stdlib.h> > > #include<windows.h> > > > > int add(int a,int b, char *fmt,void *fn) { > > // int (*func)(char *,int) = (int (*)(char > > *,int))GetProcAddress(GetModuleHandle("msvcrt.dll"),fn); > > int (*func)(char *,int) = (int (*)(char *,int))fn; > > return func(fmt,a+b); > > } > > > > int main(void) > > { > > > > ffi_cif cif; > > ffi_abi abi; > > ffi_status status; > > int nargs = 4; > > ffi_type *rtype =&ffi_type_sint32; > > ffi_type *atypes[4]; > > void *avalues[4]; > > int result; > > > > int a,b; > > a = 3; > > b = 4; > > > > char *fmt = "The answer is %i\n"; > > char *fn = "printf"; > > > > atypes[0] =&ffi_type_sint32; > > atypes[1] =&ffi_type_sint32; > > atypes[2] =&ffi_type_pointer; > > atypes[3] =&ffi_type_pointer; > > > > avalues[0] = malloc(atypes[0]->size); > > avalues[1] = malloc(atypes[1]->size); > > > > *(int *) avalues[0] = a; > > *(int *) avalues[1] = b; > > avalues[2] = (char *)&fmt; > > avalues[3] =&printf; > > > > printf("direct call: %i",add(3,4,"erg: %i\n",&printf)); > > > > status = ffi_prep_cif(&cif, FFI_DEFAULT_ABI, nargs, rtype, atypes); > > > > if(status != FFI_OK) > > printf("ffi_prep_cif failed (%i)\n",status); > > > > // crash occurs somewhere near here ... > > ffi_call(&cif,FFI_FN(add),&result,avalues); > > > > printf("%i\n",result); > > > > return 0 ; > > > > } > > > > > > As you can see, I call my add function twice, once directly > > and once via ffi_call. > > Both times I pass a reference to printf. > > As the direct method works, I guess the principal code is OK. > > > > Now, when I run the program it shows: > > > > $ dyn_callback.exe > > erg: 7 > > direct call: 7 > > > > Then it crashes and creates this callstack: > > > > dyn_callback.exe caused an Access Violation at location 614c25ff Reading > > from location 614c25ff. > > > > Registers: > > eax=614c25ff ebx=0040138c ecx=00000000 edx=00000003 esi=45206472 > > edi=6085db86 > > eip=614c25ff esp=0022fe34 ebp=0022fe60 iopl=0 nv up ei pl nz na pe > > nc > > cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 > > efl=00000202 > > > > Call stack: > > AddrPC AddrReturn AddrFrame AddrStack Params > > 614C25FF 004013AF 0022FE30 0022FE34 00403064 00000007 77C35C94 > > 77C12580 > > 614C25FF > > 004013AF 6B746957 0022FE60 0022FE34 00000003 00000004 00403064 > > 614C25FF > > 004013AF dyn_callback.exe:004013AF add dyn_callback.c:10 > > > > ... > > int (*func)(char *,int) = (int (*)(char *,int))fn; > > return func(fmt,a+b); > >> } > > int main(void) > > ... > > > > 6B746957 6B7465AF 0022FE78 0022FE34 6B746298 0022FEB4 00000010 > > 00000001 > > 6B746957 libffi-6.dll:6B746957 ffi_call_win32 > > 6B7465AF 004014FB 0022FEC8 0022FE34 0022FF20 0040138C 0022FEFC > > 0022FF00 > > 6B7465AF libffi-6.dll:6B7465AFC:\MinGW\msys\1.0\local\bin\libffi-6.dll: > > No symbol found > > ffi_call > > 004014FB 004010B9 0022FF58 0022FE34 00000001 005B2C98 005B2ED0 > > 00405004 > > 004014FB dyn_callback.exe:004014FB main dyn_callback.c:53 > > > > ... > > ffi_call(&cif,FFI_FN(add),&result,avalues); > > > >> printf("%i\n",result); > > return 0 ; > > ... > > > > 004010B9 00401284 0022FFA0 0022FE34 00000001 A47CBD08 7C90DCBA > > 7C817064 > > 004010B9 dyn_callback.exe:004010B9 __mingw_CRTStartup crt1.c:244 > > > > 00401284 7C817067 0022FFC0 0022FE34 6085DB86 45206472 7FFDA000 > > C0000005 > > 00401284 dyn_callback.exe:00401284 WinMainCRTStartup crt1.c:274 > > > > 7C817067 00000000 0022FFF0 0022FE34 0040126C 00000000 00000000 > > 00000000 > > 7C817067 kernel32.dll:7C817067 > > C:\WINDOWS\system32\kernel32.dll: No symbols > > RegisterWaitForInputIdle > > DEBUG_EVENT: > > dwDebugEventCode = EXIT_PROCESS_DEBUG_EVENT > > dwProcessId = CCC > > dwThreadId = A30 > > dwExitCode = C0000005 > > > > I installed libffi 3.0.11 beforhand, but sadly it produces no debugging > > symbols. > > > > ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2011-12-07 13:19 UTC | newest] Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2011-11-27 0:06 Passing function pointer to fcall wp1068189-ssc 2011-11-27 4:05 ` Anthony Green 2011-11-27 7:33 ` wp1068189-ssc 2011-11-27 14:12 ` Stefan Sonnenberg-Carstens 2011-12-07 12:01 ` Anthony Green 2011-12-07 13:19 ` wp1068189-ssc
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).