#define MEMCHECK(var) \ do { if (!var) { \ ret = ENOMEM; \ goto done; \ } } while 0; struct userdata { gchar *givenname; gchar *surname; gchar *fullname; gchar *username; void *pvt; }; /* Opaque function */ gchar *construct_username(TALLOC_CTX *mem_ctx, gchar *givenname, gchar *surname); errno_t func(TALLOC_CTX *mem_ctx, gchar *first, gchar *last, struct userdata **_data) { errno_t ret; gchar *res = NULL; struct userdata *data = NULL; TALLOC_CTX *tmp_ctx = talloc_new(NULL); MEMCHECK(tmp_ctx); data = talloc_zero(tmp_ctx, struct userdata); MEMCHECK(data); data->surname = talloc_strdup(data, last); MEMCHECK(last_name); data->givenname = talloc_strdup(tmp_ctx, first); MEMCHECK(first_name); data->fullname = talloc_asprintf(data, "%s %s", data->givenname, data->surname); MEMCHECK(first_name); data->username = construct_username(data, data->givenname, data->surname); MEMCHECK(data->username); /* Everything succeeded */ ret = 0; /* This operation cannot fail */ *_data = talloc_steal(mem_ctx, data); done: talloc_free(tmp_ctx); return ret; }