/** * \brief Free the port structure * \param port a #GPPort * * Closes the port and frees the memory. * * \return a gphoto2 error code **/ int gp_port_free (GPPort *port) { GP_LOG_D ("Freeing port..."); C_PARAMS (port); if (port->pc) { if (port->pc->ops) { /* We don't care for return values */ gp_port_close (port); gp_port_exit (port); free (port->pc->ops); port->pc->ops = NULL; } if (port->pc->lh) { #if !defined(VALGRIND) lt_dlclose (port->pc->lh); lt_dlexit (); #endif port->pc->lh = NULL; } free (port->pc->info.name); free (port->pc->info.path); free (port->pc->info.library_filename); free (port->pc); port->pc = NULL; } free (port); return GP_OK; }
/** * \brief Free the port structure * \param port a #GPPort * * Closes the port and frees the memory. * * \return a gphoto2 error code **/ int gp_port_free (GPPort *port) { gp_log (GP_LOG_DEBUG, "gphoto2-port", _("Freeing port...")); CHECK_NULL (port); if (port->pc) { if (port->pc->ops) { /* We don't care for return values */ gp_port_close (port); gp_port_exit (port); free (port->pc->ops); port->pc->ops = NULL; } if (port->pc->lh) { lt_dlclose (port->pc->lh); lt_dlexit (); port->pc->lh = NULL; } if (port->pc->info.name) free (port->pc->info.name); if (port->pc->info.path) free (port->pc->info.path); if (port->pc->info.library_filename) free (port->pc->info.library_filename); free (port->pc); port->pc = NULL; } free (port); return GP_OK; }
/** * \brief Configure a port * * Makes a port functional by passing in the necessary path * information (from the serial:/dev/ttyS0 or similar variables). * After calling this function, you can access the port using for * example gp_port_open(). * * \param port a GPPort * \param info the GPPortInfo to set * * \return a gphoto2 error code **/ int gp_port_set_info (GPPort *port, GPPortInfo info) { GPPortLibraryOperations ops_func; CHECK_NULL (port); if (port->pc->info.name) free (port->pc->info.name); port->pc->info.name = strdup (info->name); if (port->pc->info.path) free (port->pc->info.path); port->pc->info.path = strdup (info->path); port->pc->info.type = info->type; if (port->pc->info.library_filename) free (port->pc->info.library_filename); port->pc->info.library_filename = strdup (info->library_filename); port->type = info->type; /* Clean up */ if (port->pc->ops) { gp_port_exit (port); free (port->pc->ops); port->pc->ops = NULL; } if (port->pc->lh) { lt_dlclose (port->pc->lh); lt_dlexit (); } lt_dlinit (); port->pc->lh = lt_dlopenext (info->library_filename); if (!port->pc->lh) { gp_log (GP_LOG_ERROR, "gphoto2-port", _("Could not load " "'%s' ('%s')."), info->library_filename, lt_dlerror ()); lt_dlexit (); return (GP_ERROR_LIBRARY); } /* Load the operations */ ops_func = lt_dlsym (port->pc->lh, "gp_port_library_operations"); if (!ops_func) { gp_log (GP_LOG_ERROR, "gphoto2-port", _("Could not find " "'gp_port_library_operations' in '%s' ('%s')"), info->library_filename, lt_dlerror ()); lt_dlclose (port->pc->lh); lt_dlexit (); port->pc->lh = NULL; return (GP_ERROR_LIBRARY); } port->pc->ops = ops_func (); gp_port_init (port); /* Initialize the settings to some default ones */ switch (info->type) { case GP_PORT_SERIAL: port->settings.serial.speed = 0; port->settings.serial.bits = 8; port->settings.serial.parity = 0; port->settings.serial.stopbits = 1; gp_port_set_timeout (port, 500); break; case GP_PORT_USB: strncpy (port->settings.usb.port, info->path, sizeof (port->settings.usb.port)); port->settings.usb.inep = -1; port->settings.usb.outep = -1; port->settings.usb.config = -1; port->settings.usb.interface = 0; port->settings.usb.altsetting = -1; gp_port_set_timeout (port, 5000); break; case GP_PORT_USB_DISK_DIRECT: snprintf(port->settings.usbdiskdirect.path, sizeof(port->settings.usbdiskdirect.path), "%s", strchr(info->path, ':') + 1); break; case GP_PORT_USB_SCSI: snprintf(port->settings.usbscsi.path, sizeof(port->settings.usbscsi.path), "%s", strchr(info->path, ':') + 1); break; default: /* Nothing in here */ break; } gp_port_set_settings (port, port->settings); return (GP_OK); }
/** * \brief Configure a port * * Makes a port functional by passing in the necessary path * information (from the serial:/dev/ttyS0 or similar variables). * After calling this function, you can access the port using for * example gp_port_open(). * * \param port a GPPort * \param info the GPPortInfo to set * * \return a gphoto2 error code **/ int gp_port_set_info (GPPort *port, GPPortInfo info) { int ret; GPPortLibraryOperations ops_func; C_PARAMS (port); free (port->pc->info.name); C_MEM (port->pc->info.name = strdup (info->name)); free (port->pc->info.path); C_MEM (port->pc->info.path = strdup (info->path)); port->pc->info.type = info->type; free (port->pc->info.library_filename); C_MEM (port->pc->info.library_filename = strdup (info->library_filename)); port->type = info->type; /* Clean up */ if (port->pc->ops) { gp_port_exit (port); free (port->pc->ops); port->pc->ops = NULL; } if (port->pc->lh) { #if !defined(VALGRIND) lt_dlclose (port->pc->lh); lt_dlexit (); #endif } lt_dlinit (); port->pc->lh = lt_dlopenext (info->library_filename); if (!port->pc->lh) { GP_LOG_E ("Could not load '%s' ('%s').", info->library_filename, lt_dlerror ()); lt_dlexit (); return (GP_ERROR_LIBRARY); } /* Load the operations */ ops_func = lt_dlsym (port->pc->lh, "gp_port_library_operations"); if (!ops_func) { GP_LOG_E ("Could not find 'gp_port_library_operations' in '%s' ('%s')", info->library_filename, lt_dlerror ()); lt_dlclose (port->pc->lh); lt_dlexit (); port->pc->lh = NULL; return (GP_ERROR_LIBRARY); } port->pc->ops = ops_func (); gp_port_init (port); /* Initialize the settings to some default ones */ switch (info->type) { case GP_PORT_SERIAL: port->settings.serial.speed = 0; port->settings.serial.bits = 8; port->settings.serial.parity = 0; port->settings.serial.stopbits = 1; gp_port_set_timeout (port, 500); break; case GP_PORT_USB: if (sizeof (port->settings.usb.port) <= strlen(info->path)) { GP_LOG_E ("Path is too long for static buffer '%s'.", info->path); return GP_ERROR_LIBRARY; } strncpy (port->settings.usb.port, info->path, sizeof (port->settings.usb.port)); port->settings.usb.inep = -1; port->settings.usb.outep = -1; port->settings.usb.config = -1; port->settings.usb.interface = 0; port->settings.usb.altsetting = -1; gp_port_set_timeout (port, 5000); break; case GP_PORT_USB_DISK_DIRECT: snprintf(port->settings.usbdiskdirect.path, sizeof(port->settings.usbdiskdirect.path), "%s", strchr(info->path, ':') + 1); break; case GP_PORT_USB_SCSI: snprintf(port->settings.usbscsi.path, sizeof(port->settings.usbscsi.path), "%s", strchr(info->path, ':') + 1); break; default: /* Nothing in here */ break; } ret = gp_port_set_settings (port, port->settings); if (ret != GP_ERROR_NOT_SUPPORTED) CHECK_RESULT (ret); return GP_OK; }