X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=backend.c;h=dd38f66e287a4fb5c53332ac84aacb7a0f672922;hb=785b9ff290cbdb86e7d0b0280c33b43faf9c0518;hp=2bf9d41af58a1f92396ed7b0093122fa3d7faaa6;hpb=8233ff53ae7c6e120af4784bc61a036882d5c234;p=libsigrok.git diff --git a/backend.c b/backend.c index 2bf9d41a..dd38f66e 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,16 +19,56 @@ */ #include -#include -#include +#include "libsigrok.h" +#include "libsigrok-internal.h" -int sr_init(void) +/** + * Initialize libsigrok. + * + * @return SR_OK upon success, a (negative) error code otherwise. + */ +SR_API int sr_init(struct sr_context **ctx) { - return load_hwplugins(); + int ret = SR_ERR; + struct sr_context *context; + + /* + 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. + * + * @return SR_OK upon success, a (negative) error code otherwise. + */ +SR_API int sr_exit(struct sr_context *ctx) { - sr_device_close_all(); + sr_hw_cleanup_all(); + +#ifdef HAVE_LIBUSB_1_0 + libusb_exit(ctx->libusb_ctx); +#endif + + g_free(ctx); + + return SR_OK; }