transport.c 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*
  3. *
  4. * OBEX Server
  5. *
  6. * Copyright (C) 2007-2010 Marcel Holtmann <marcel@holtmann.org>
  7. *
  8. *
  9. */
  10. #ifdef HAVE_CONFIG_H
  11. #include <config.h>
  12. #endif
  13. #include <stdio.h>
  14. #include <errno.h>
  15. #include <string.h>
  16. #include <stdint.h>
  17. #include <stdlib.h>
  18. #include <glib.h>
  19. #include "obex.h"
  20. #include "server.h"
  21. #include "transport.h"
  22. #include "log.h"
  23. static GSList *drivers = NULL;
  24. static struct obex_transport_driver *obex_transport_driver_find(
  25. const char *name)
  26. {
  27. GSList *l;
  28. for (l = drivers; l; l = l->next) {
  29. struct obex_transport_driver *driver = l->data;
  30. if (g_strcmp0(name, driver->name) == 0)
  31. return driver;
  32. }
  33. return NULL;
  34. }
  35. GSList *obex_transport_driver_list(void)
  36. {
  37. return drivers;
  38. }
  39. int obex_transport_driver_register(struct obex_transport_driver *driver)
  40. {
  41. if (!driver) {
  42. error("Invalid driver");
  43. return -EINVAL;
  44. }
  45. if (obex_transport_driver_find(driver->name) != NULL) {
  46. error("Permission denied: transport %s already registered",
  47. driver->name);
  48. return -EPERM;
  49. }
  50. DBG("driver %p transport %s registered", driver, driver->name);
  51. drivers = g_slist_prepend(drivers, driver);
  52. return 0;
  53. }
  54. void obex_transport_driver_unregister(struct obex_transport_driver *driver)
  55. {
  56. if (!g_slist_find(drivers, driver)) {
  57. error("Unable to unregister: No such driver %p", driver);
  58. return;
  59. }
  60. DBG("driver %p transport %s unregistered", driver, driver->name);
  61. drivers = g_slist_remove(drivers, driver);
  62. }