/** * \return 0 if there is an error, value of protocol elsewhere */ unsigned char get_proto_version_from_packet(const unsigned char *dgram, size_t dgram_size) { nufw_to_nuauth_message_header_t *header; if (dgram_size < sizeof(nufw_to_nuauth_message_header_t)) { return 0; } /* Check protocol version */ header = (nufw_to_nuauth_message_header_t *) dgram; /* Is protocol supported */ if (check_protocol_version(NUFW_PROTO, header->protocol_version) == NU_EXIT_OK) { return header->protocol_version; } else { return 0; } }
static gboolean handle_rx_packet (GstPluginLoader * l, guint pack_type, guint32 tag, guint8 * payload, guint payload_len) { gboolean res = TRUE; switch (pack_type) { case PACKET_EXIT: gst_poll_fd_ctl_read (l->fdset, &l->fd_r, FALSE); if (l->is_child) { /* Respond */ put_packet (l, PACKET_EXIT, 0, NULL, 0); } l->rx_done = TRUE; return TRUE; case PACKET_LOAD_PLUGIN:{ if (!l->is_child) return TRUE; /* Payload is the filename to load */ res = do_plugin_load (l, (gchar *) payload, tag); break; } case PACKET_PLUGIN_DETAILS:{ gchar *tmp = (gchar *) payload; PendingPluginEntry *entry = NULL; GList *cur; GST_DEBUG_OBJECT (l->registry, "Received plugin details from child w/ tag %u. %d bytes info", tag, payload_len); /* Assume that tagged details come back in the order * we requested, and delete anything before (but not * including) this one */ cur = l->pending_plugins; while (cur) { PendingPluginEntry *e = (PendingPluginEntry *) (cur->data); if (e->tag > tag) break; if (e->tag == tag) { entry = e; break; } else { cur = g_list_delete_link (cur, cur); g_free (e->filename); g_slice_free (PendingPluginEntry, e); } } l->pending_plugins = cur; if (cur == NULL) l->pending_plugins_tail = NULL; if (payload_len > 0) { GstPlugin *newplugin = NULL; if (!_priv_gst_registry_chunks_load_plugin (l->registry, &tmp, tmp + payload_len, &newplugin)) { /* Got garbage from the child, so fail and trigger replay of plugins */ GST_ERROR_OBJECT (l->registry, "Problems loading plugin details with tag %u from scanner", tag); return FALSE; } newplugin->flags &= ~GST_PLUGIN_FLAG_CACHED; GST_LOG_OBJECT (l->registry, "marking plugin %p as registered as %s", newplugin, newplugin->filename); newplugin->registered = TRUE; /* We got a set of plugin details - remember it for later */ l->got_plugin_details = TRUE; } else if (entry != NULL) { /* Create a blacklist entry for this file to prevent scanning every time */ plugin_loader_create_blacklist_plugin (l, entry); l->got_plugin_details = TRUE; } if (entry != NULL) { g_free (entry->filename); g_slice_free (PendingPluginEntry, entry); } /* Remove the plugin entry we just loaded */ cur = l->pending_plugins; if (cur != NULL) cur = g_list_delete_link (cur, cur); l->pending_plugins = cur; if (cur == NULL) l->pending_plugins_tail = NULL; break; } case PACKET_SYNC: if (l->is_child) { /* Respond with our reply - also a sync */ put_packet (l, PACKET_SYNC, tag, NULL, 0); GST_LOG ("Got SYNC in child - replying"); } else l->rx_got_sync = TRUE; break; case PACKET_VERSION: if (l->is_child) { /* Respond with our reply - a version packet, with the version */ const gint version_len = sizeof (guint32) + GST_MAGIC_BINARY_VERSION_LEN; guint8 version_info[sizeof (guint32) + GST_MAGIC_BINARY_VERSION_LEN]; memset (version_info, 0, version_len); GST_WRITE_UINT32_BE (version_info, loader_protocol_version); memcpy (version_info + sizeof (guint32), GST_MAGIC_BINARY_VERSION_STR, strlen (GST_MAGIC_BINARY_VERSION_STR)); put_packet (l, PACKET_VERSION, tag, version_info, version_len); GST_LOG ("Got VERSION in child - replying %u", loader_protocol_version); } else { res = check_protocol_version (l, payload, payload_len); } break; default: return FALSE; /* Invalid packet -> something is wrong */ } return res; }