X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=backend.c;h=eba03aafb5388197cb743f9cd09240ba4a28f851;hb=c46762a285d7c844a771f5c1f0ad2447a00906b3;hp=17983cd7a51a9537fffb8f5e30c5f94229f2b66c;hpb=2bf4aca64ad435a09359662446762840ac55db1d;p=libsigrok.git diff --git a/backend.c b/backend.c index 17983cd7..eba03aaf 100644 --- a/backend.c +++ b/backend.c @@ -1,7 +1,8 @@ /* * This file is part of the sigrok project. * - * Copyright (C) 2010 Bert Vermeulen + * Copyright (C) 2010-2012 Bert Vermeulen + * Copyright (C) 2012 Peter Stuge * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -18,15 +19,77 @@ */ #include -#include +#include "libsigrok.h" +#include "libsigrok-internal.h" -int sr_init(void) +/** + * Initialize libsigrok. + * + * This function must be called before any other libsigrok function. + * + * @param ctx Pointer to a libsigrok context struct pointer. Must not be NULL. + * This will be a pointer to a newly allocated libsigrok context + * object upon success, and is undefined upon errors. + * + * @return SR_OK upon success, a (negative) error code otherwise. Upon errors + * the 'ctx' pointer is undefined and should not be used. Upon success, + * the context will be free'd by sr_exit() as part of the libsigrok + * shutdown. + */ +SR_API int sr_init(struct sr_context **ctx) { - return load_hwplugins(); + int ret = SR_ERR; + struct sr_context *context; + + if (!ctx) { + sr_err("%s(): libsigrok context was NULL.", __func__); + return SR_ERR; + } + + /* + 1 to handle when struct sr_context has no members. */ + context = g_try_malloc0(sizeof(struct sr_context) + 1); + + if (!context) { + ret = SR_ERR_MALLOC; + goto done; + } + +#ifdef HAVE_LIBUSB_1_0 + ret = libusb_init(&context->libusb_ctx); + if (LIBUSB_SUCCESS == ret) { + sr_err("libusb_init() returned %s.\n", libusb_error_name(ret)); + goto done; + } +#endif + + *ctx = context; + ret = SR_OK; + +done: + return ret; } -/* TODO: Should return int to be able to report back error codes. */ -void sr_exit(void) +/** + * Shutdown libsigrok. + * + * @param ctx Pointer to a libsigrok context struct. Must not be NULL. + * + * @return SR_OK upon success, a (negative) error code otherwise. + */ +SR_API int sr_exit(struct sr_context *ctx) { - sr_device_close_all(); + if (!ctx) { + sr_err("%s(): libsigrok context was NULL.", __func__); + return SR_ERR; + } + + sr_hw_cleanup_all(); + +#ifdef HAVE_LIBUSB_1_0 + libusb_exit(ctx->libusb_ctx); +#endif + + g_free(ctx); + + return SR_OK; }