Thread overview | ||||||
---|---|---|---|---|---|---|
|
August 03, 2004 C -> D conversion segfault | ||||
---|---|---|---|---|
| ||||
I'm attempting to write some D bindings, however I'm having trouble porting some code. The output (correct output) from the C version is this: showEnv: No Fault showEnv: XMLRPC-Fault: test (3) Where as the output from the D Version is: showEnv: No Fault Segmentation fault In various other places, things like this have been happening, where this xmlrpc_env struct becomes corrupted, and causes these segfaults. I'm not sure what I'm doing wrong... or perhaps it's not my bug? I'm running DMD 0.97 on Linux TIA John Here's the code: -----C Version--------- typedef signed int xmlrpc_int32; typedef struct _xmlrpc_env { int fault_occurred; xmlrpc_int32 fault_code; char* fault_string; } xmlrpc_env; extern void xmlrpc_env_init (xmlrpc_env* env); extern void xmlrpc_env_set_fault (xmlrpc_env *env, int code, char *string); void showEnv(xmlrpc_env* env) { printf("showEnv: "); if (env->fault_occurred) printf("XMLRPC-Fault: %s (%d)\n", env->fault_string, env->fault_code); else printf("No Fault\n"); } int main(void) { xmlrpc_env env; xmlrpc_env_init(&env); showEnv(&env); xmlrpc_env_set_fault(&env, 3, "test"); showEnv(&env); return 0; } --------End C Version------------- --------D Version--------------- typedef int xmlrpc_int32; struct xmlrpc_env { int fault_occurred; xmlrpc_int32 fault_code; char* fault_string; } extern(C) void xmlrpc_env_init (xmlrpc_env* env); extern(C) void xmlrpc_env_set_fault (xmlrpc_env *env, int code, char *string); void showEnv(xmlrpc_env* env) { printf("showEnv: \0"); if (env.fault_occurred) printf("XMLRPC-Fault: %.*s (%d)\n\0", env.fault_string, env.fault_code); else printf("No Fault\n\0"); } void main() { xmlrpc_env env; xmlrpc_env_init(&env); showEnv(&env); xmlrpc_env_set_fault(&env, 3, "test\0"); showEnv(&env); } ------------End D Version |
August 03, 2004 Re: C -> D conversion segfault | ||||
---|---|---|---|---|
| ||||
Posted in reply to teqDruid | In article <pan.2004.08.03.21.10.08.997592@teqdruid.com>, teqDruid says... Just a thought, but maybe: # printf("XMLRPC-Fault: %.*s (%d)\n\0", env.fault_string, env.fault_code); should be # printf("XMLRPC-Fault: %s (%d)\n\0", env.fault_string, env.fault_code); because env.fault_string is a (char*), not a (char[]). (Fingers crossed) Jill |
August 03, 2004 Re: C -> D conversion segfault | ||||
---|---|---|---|---|
| ||||
Posted in reply to Arcane Jill | Yeah... that did it. Actually, I had hoped that this was a good test case for the other problems I've been having... but I guess not. I don't think this'll be the end of this, but thanks... for now.
John
On Tue, 03 Aug 2004 21:22:10 +0000, Arcane Jill wrote:
> In article <pan.2004.08.03.21.10.08.997592@teqdruid.com>, teqDruid says...
>
> Just a thought, but maybe:
>
> # printf("XMLRPC-Fault: %.*s (%d)\n\0", env.fault_string, env.fault_code);
>
> should be
>
> # printf("XMLRPC-Fault: %s (%d)\n\0", env.fault_string, env.fault_code);
>
> because env.fault_string is a (char*), not a (char[]).
>
> (Fingers crossed)
> Jill
|
August 03, 2004 Re: C -> D conversion segfault | ||||
---|---|---|---|---|
| ||||
Posted in reply to teqDruid | I was hoping that the previous post was a shorted test case of something like this. Here, print_state_name_callback is a callback that the C library calls. The pointer to an xmlrpc_env struct is... not right. I'm not sure what's wrong with it, but the output (from the die_if_fault_occurred function) is: env.fault_occurred: 1886680168 Segmentation fault I can post xmlrpcd.xmlrpcd and xmlrpcd.client if necessary, but they're rather long. They're ports of xmlrpc.h and xmlrpc-client.h. The D program below is a slightly modified port of: http://xmlrpc-c.sourceforge.net/examples/asynch_client.c The C version works fine. Any advice? TIA John import xmlrpcd.xmlrpcd; import xmlrpcd.client; void die_if_fault_occurred (xmlrpc_env* env) { printf("env.fault_occurred: %d\n\0", env.fault_occurred); if (env.fault_occurred) { printf("XML-RPC Fault:\0"); printf("%s (%d)\n\0", env.fault_string, env.fault_code); throw new Exception("XML-RPC Fault"); } } static void print_state_name_callback (char *server_url, char *method_name, xmlrpc_value *param_array, void *user_data, xmlrpc_env* env, xmlrpc_value* result) { int state_number; char *state_name; /* Check to see if a fault occurred. */ die_if_fault_occurred(env); /* Get our state name. */ xmlrpc_parse_value(env, result, "s", &state_name); die_if_fault_occurred(env); printf("State: %s\n", state_name); } void main() { xmlrpc_value *result; char *state_name; int i; /* Start up our XML-RPC client library. */ xmlrpc_client_init(XMLRPC_CLIENT_NO_FLAGS, "Name", "Version"); /* Make a whole bunch of asynch calls. */ for (i = 40; i < 45; i++) { xmlrpc_client_call_asynch("http://localhost:8080/RPC2", "mirror.Random", &print_state_name_callback, null, "()"); } /* Wait for all calls to complete. */ xmlrpc_client_event_loop_finish_asynch(); /* shutdown our XML-RPC client library. */ xmlrpc_client_cleanup(); } On Tue, 03 Aug 2004 17:10:09 -0400, teqDruid wrote: > In various other places, things like this have been happening, where this xmlrpc_env struct becomes corrupted, and causes these segfaults. I'm not sure what I'm doing wrong... or perhaps it's not my bug? > > I'm running DMD 0.97 on Linux |
Copyright © 1999-2021 by the D Language Foundation