status_t Session::Save() { fClosing = true; char name[B_OS_NAME_LENGTH + 25]; if (!IsMainSession()) { snprintf(name, sizeof(name), "/etc/launch_cache/%ld:%Ld %s", fNodeRef.device, fNodeRef.node, Name()); } else snprintf(name, sizeof(name), "/etc/launch_cache/%s", Name()); int fd = open(name, O_CREAT | O_TRUNC | O_WRONLY, 0644); if (fd < B_OK) return errno; status_t status = B_OK; off_t fileSize = 0; // ToDo: order nodes by timestamp... (should improve launch speed) // ToDo: test which parts of a file have been read (and save that as well) // enlarge file, so that it can be written faster ftruncate(fd, 512 * 1024); struct hash_iterator iterator; struct node *node; hash_open(fNodeHash, &iterator); while ((node = (struct node *)hash_next(fNodeHash, &iterator)) != NULL) { snprintf(name, sizeof(name), "%ld:%Ld\n", node->ref.device, node->ref.node); ssize_t bytesWritten = write(fd, name, strlen(name)); if (bytesWritten < B_OK) { status = bytesWritten; break; } fileSize += bytesWritten; } hash_close(fNodeHash, &iterator, false); ftruncate(fd, fileSize); close(fd); return status; }
ifnet *if_path_to_ifnet(const char *path) { ifnet *i; struct hash_iterator iter; mutex_lock(&ifhash_lock); hash_open(ifhash, &iter); while((i = hash_next(ifhash, &iter)) != NULL) { if(!strcmp(path, i->path)) break; } hash_close(ifhash, &iter, false); mutex_unlock(&ifhash_lock); return i; }
static int pipefs_unmount(fs_cookie _fs) { struct pipefs *fs = _fs; struct pipefs_vnode *v; struct hash_iterator i; TRACE(("pipefs_unmount: entry fs = 0x%x\n", fs)); // delete all of the vnodes hash_open(fs->vnode_list_hash, &i); while((v = (struct pipefs_vnode *)hash_next(fs->vnode_list_hash, &i)) != NULL) { pipefs_delete_vnode(fs, v, true); } hash_close(fs->vnode_list_hash, &i, false); hash_uninit(fs->vnode_list_hash); mutex_destroy(&fs->hash_lock); kfree(fs); return 0; }
static status_t arp_control(const char *subsystem, uint32 function, void *buffer, size_t bufferSize) { struct arp_control control; if (bufferSize != sizeof(struct arp_control)) return B_BAD_VALUE; if (user_memcpy(&control, buffer, sizeof(struct arp_control)) < B_OK) return B_BAD_ADDRESS; MutexLocker locker(sCacheLock); switch (function) { case ARP_SET_ENTRY: { sockaddr_dl hardwareAddress; hardwareAddress.sdl_len = sizeof(sockaddr_dl); hardwareAddress.sdl_family = AF_LINK; hardwareAddress.sdl_index = 0; hardwareAddress.sdl_type = IFT_ETHER; hardwareAddress.sdl_e_type = ETHER_TYPE_IP; hardwareAddress.sdl_nlen = hardwareAddress.sdl_slen = 0; hardwareAddress.sdl_alen = ETHER_ADDRESS_LENGTH; memcpy(hardwareAddress.sdl_data, control.ethernet_address, ETHER_ADDRESS_LENGTH); return arp_update_entry(control.address, &hardwareAddress, control.flags & (ARP_FLAG_PUBLISH | ARP_FLAG_PERMANENT | ARP_FLAG_REJECT)); } case ARP_GET_ENTRY: { arp_entry *entry = arp_entry::Lookup(control.address); if (entry == NULL || !(entry->flags & ARP_FLAG_VALID)) return B_ENTRY_NOT_FOUND; if (entry->hardware_address.sdl_alen == ETHER_ADDRESS_LENGTH) { memcpy(control.ethernet_address, entry->hardware_address.sdl_data, ETHER_ADDRESS_LENGTH); } else memset(control.ethernet_address, 0, ETHER_ADDRESS_LENGTH); control.flags = entry->flags & ARP_PUBLIC_FLAG_MASK; return user_memcpy(buffer, &control, sizeof(struct arp_control)); } case ARP_GET_ENTRIES: { hash_iterator iterator; hash_open(sCache, &iterator); arp_entry *entry; uint32 i = 0; while ((entry = (arp_entry *)hash_next(sCache, &iterator)) != NULL && i < control.cookie) { i++; } hash_close(sCache, &iterator, false); if (entry == NULL) return B_ENTRY_NOT_FOUND; control.cookie++; control.address = entry->protocol_address; if (entry->hardware_address.sdl_alen == ETHER_ADDRESS_LENGTH) { memcpy(control.ethernet_address, entry->hardware_address.sdl_data, ETHER_ADDRESS_LENGTH); } else memset(control.ethernet_address, 0, ETHER_ADDRESS_LENGTH); control.flags = entry->flags & ARP_PUBLIC_FLAG_MASK; return user_memcpy(buffer, &control, sizeof(struct arp_control)); } case ARP_DELETE_ENTRY: { arp_entry *entry = arp_entry::Lookup(control.address); if (entry == NULL) return B_ENTRY_NOT_FOUND; if ((entry->flags & ARP_FLAG_LOCAL) != 0) return B_BAD_VALUE; entry->ScheduleRemoval(); return B_OK; } case ARP_FLUSH_ENTRIES: { hash_iterator iterator; hash_open(sCache, &iterator); arp_entry *entry; while ((entry = (arp_entry *)hash_next(sCache, &iterator)) != NULL) { // we never flush local ARP entries if ((entry->flags & ARP_FLAG_LOCAL) != 0) continue; entry->ScheduleRemoval(); } hash_close(sCache, &iterator, false); return B_OK; } case ARP_IGNORE_REPLIES: sIgnoreReplies = control.flags != 0; return B_OK; } return B_BAD_VALUE; }
int rsstool_write_xml (st_rsstool_t *rt) { #define XMLPRINTF(s) xmlTextWriterWriteString(writer,BAD_CAST s) st_rss_t rss; int i = 0; xmlTextWriterPtr writer; xmlBufferPtr buffer; st_hash_t *dl_url_h = NULL; st_hash_t *url_h = NULL; st_hash_t *title_h = NULL; int items = rsstool_get_item_count (rt); #define ENCODE(s) s //#define ENCODE(s) base64_enc(s,0) //#define ENCODE(s) str_escape_xml(s) memset (&rss, 0, sizeof (st_rss_t)); if (!(buffer = xmlBufferCreate ())) return -1; if (!(writer = xmlNewTextWriterMemory (buffer, 0))) return -1; xmlTextWriterStartDocument (writer, NULL, "UTF-8", NULL); xmlTextWriterWriteComment (writer, BAD_CAST " RSStool - read, parse, merge and write RSS and Atom feeds\n" "http://rsstool.berlios.de "); XMLPRINTF("\n"); xmlTextWriterWriteComment (writer, BAD_CAST "\n" "format:\n" "item[]\n" " dl_url \n" " dl_url_md5\n" " dl_url_crc32\n" " dl_date\n" " user author\n" " site\n" " url \n" " url_md5\n" " url_crc32\n" " date default: current time\n" " title used by searches for related items\n" " title_md5\n" " title_crc32\n" " desc description\n" " media_keywords default: keywords from title and description\n" " media_duration event length\n" " media_image thumbnail\n" " event_start default: date\n" " event_end default: event_start + media_duration\n" ); XMLPRINTF("\n"); xmlTextWriterStartElement (writer, BAD_CAST "rsstool"); // <rsstool> xmlTextWriterWriteAttribute (writer, BAD_CAST "version", BAD_CAST RSSTOOL_VERSION_S); for (i = 0; i < items && i < RSSMAXITEM; i++) // for (i = 0; i < items; i++) { dl_url_h = hash_open (HASH_MD5|HASH_CRC32); url_h = hash_open (HASH_MD5|HASH_CRC32); title_h = hash_open (HASH_MD5|HASH_CRC32); dl_url_h = hash_update (dl_url_h, (const unsigned char *) rt->item[i]->feed_url, strlen (rt->item[i]->feed_url)); url_h = hash_update (url_h, (const unsigned char *) rt->item[i]->url, strlen (rt->item[i]->url)); title_h = hash_update (title_h, (const unsigned char *) rt->item[i]->title, strlen (rt->item[i]->title)); XMLPRINTF("\n "); xmlTextWriterStartElement (writer, BAD_CAST "item"); // <item> XMLPRINTF("\n "); // xmlTextWriterWriteElement (writer, BAD_CAST "dl_url", BAD_CAST rt->item[i]->feed_url); xmlTextWriterWriteFormatElement (writer, BAD_CAST "dl_url", "%s", rt->item[i]->feed_url); XMLPRINTF("\n "); xmlTextWriterWriteFormatElement (writer, BAD_CAST "dl_url_md5", "%s", hash_get_s (dl_url_h, HASH_MD5)); XMLPRINTF("\n "); xmlTextWriterWriteFormatElement (writer, BAD_CAST "dl_url_crc32", "%u", hash_get_crc32 (dl_url_h)); XMLPRINTF("\n "); xmlTextWriterWriteFormatElement (writer, BAD_CAST "dl_date", "%ld", rsstool.start_time); XMLPRINTF("\n "); xmlTextWriterWriteFormatElement (writer, BAD_CAST "user", "%s", ENCODE (rt->item[i]->user)); XMLPRINTF("\n "); xmlTextWriterWriteFormatElement (writer, BAD_CAST "site", "%s", ENCODE (rt->item[i]->site)); XMLPRINTF("\n "); xmlTextWriterWriteFormatElement (writer, BAD_CAST "url", "%s", rt->item[i]->url); XMLPRINTF("\n "); xmlTextWriterWriteFormatElement (writer, BAD_CAST "url_md5", "%s", hash_get_s (url_h, HASH_MD5)); XMLPRINTF("\n "); xmlTextWriterWriteFormatElement (writer, BAD_CAST "url_crc32", "%u", hash_get_crc32 (url_h)); XMLPRINTF("\n "); xmlTextWriterWriteFormatElement (writer, BAD_CAST "date", "%ld", rt->item[i]->date); XMLPRINTF("\n "); xmlTextWriterWriteFormatElement (writer, BAD_CAST "title", "%s", ENCODE (rt->item[i]->title)); XMLPRINTF("\n "); xmlTextWriterWriteFormatElement (writer, BAD_CAST "title_md5", "%s", hash_get_s (title_h, HASH_MD5)); XMLPRINTF("\n "); xmlTextWriterWriteFormatElement (writer, BAD_CAST "title_crc32", "%u", hash_get_crc32 (title_h)); XMLPRINTF("\n "); xmlTextWriterWriteFormatElement (writer, BAD_CAST "desc", "%s", ENCODE (rt->item[i]->desc)); XMLPRINTF("\n "); xmlTextWriterWriteFormatElement (writer, BAD_CAST "media_keywords", "%s", ENCODE (rt->item[i]->media_keywords)); XMLPRINTF("\n "); xmlTextWriterWriteFormatElement (writer, BAD_CAST "media_duration", "%ld", rt->item[i]->media_duration); XMLPRINTF("\n "); xmlTextWriterWriteFormatElement (writer, BAD_CAST "media_image", "%s", rt->item[i]->media_image); XMLPRINTF("\n "); xmlTextWriterWriteFormatElement (writer, BAD_CAST "event_start", "%ld", rt->item[i]->event_start); XMLPRINTF("\n "); xmlTextWriterWriteFormatElement (writer, BAD_CAST "event_end", "%ld", rt->item[i]->event_end); XMLPRINTF("\n "); xmlTextWriterEndElement (writer); // </item> hash_close (dl_url_h); hash_close (url_h); hash_close (title_h); } XMLPRINTF("\n"); xmlTextWriterEndDocument (writer); // </rsstool> xmlFreeTextWriter (writer); fputs ((const char *) buffer->content, rt->output_file); xmlBufferFree (buffer); if (items >= RSSMAXITEM) { char buf[MAXBUFSIZE]; sprintf (buf, "can write only RSS feeds with up to %d items (was %d items)\n", RSSMAXITEM, items); rsstool_log (rt, buf); } return 0; }
int rsstool_write_xml (st_rsstool_t *rt) { st_rss_t rss; int i = 0; st_hash_t *dl_url_h = NULL; st_hash_t *url_h = NULL; st_hash_t *title_h = NULL; int items = rsstool_get_item_count (rt); //#define ENCODE(s) s #define ENCODE(s) base64_enc(s,0) //#define ENCODE(s) str_escape_xml(s) memset (&rss, 0, sizeof (st_rss_t)); fputs ("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n", rsstool.output_file); fputs ("<!--\n" "RSStool - read, parse, merge and write RSS and Atom feeds\n" "http://rsstool.berlios.de\n" "-->\n", rsstool.output_file); fputs ("<!--\n" "format:\n" "item[]\n" " dl_url \n" " dl_url_md5\n" " dl_url_crc32\n" " dl_date\n" " user (base64 encoded)\n" " site (base64 encoded)\n" " url \n" " url_md5\n" " url_crc32\n" " date\n" " title used by searches for related items (base64 encoded)\n" " title_md5\n" " title_crc32\n" " desc description (base64 encoded)\n" " media_keywords default: keywords from title and description\n" " media_duration\n" " media_thumbnail path (base64 encoded)\n" // " media_image path (base64 encoded)\n" // " event_start default: date\n" // " event_end default: event_start + media_duration\n" "-->\n", rsstool.output_file); fputs ("<rsstool version=\"" RSSTOOL_VERSION_S "\">\n", rsstool.output_file); for (i = 0; i < items && i < RSSMAXITEM; i++) // for (i = 0; i < items; i++) { dl_url_h = hash_open (HASH_MD5|HASH_CRC32); url_h = hash_open (HASH_MD5|HASH_CRC32); title_h = hash_open (HASH_MD5|HASH_CRC32); dl_url_h = hash_update (dl_url_h, (const unsigned char *) rt->item[i]->feed_url, strlen (rt->item[i]->feed_url)); url_h = hash_update (url_h, (const unsigned char *) rt->item[i]->url, strlen (rt->item[i]->url)); title_h = hash_update (title_h, (const unsigned char *) rt->item[i]->title, strlen (rt->item[i]->title)); fprintf (rsstool.output_file, " <item>\n" " <dl_url>%s</dl_url>\n" " <dl_url_md5>%s</dl_url_md5>\n" " <dl_url_crc32>%u</dl_url_crc32>\n" " <dl_date>%ld</dl_date>\n" " <user>%s</user>\n" " <site>%s</site>\n" " <url>%s</url>\n" " <url_md5>%s</url_md5>\n" " <url_crc32>%u</url_crc32>\n" " <date>%ld</date>\n" " <title>%s</title>\n" " <title_md5>%s</title_md5>\n" " <title_crc32>%u</title_crc32>\n" " <desc>%s</desc>\n" " <media_keywords>%s</media_keywords>\n" " <media_duration>%d</media_duration>\n" " <media_thumbnail>%s</media_thumbnail>\n" // " <media_image>%s</media_image>\n" // " <event_start>%u</event_start>\n" // " <event_end>%u</event_end>\n" " </item>\n", str_escape_xml (rt->item[i]->feed_url), hash_get_s (dl_url_h, HASH_MD5), hash_get_crc32 (dl_url_h), time (0), ENCODE (rt->item[i]->user), ENCODE (rt->item[i]->site), str_escape_xml (rt->item[i]->url), hash_get_s (url_h, HASH_MD5), hash_get_crc32 (url_h), rt->item[i]->date, ENCODE (rt->item[i]->title), hash_get_s (title_h, HASH_MD5), hash_get_crc32 (title_h), ENCODE (rt->item[i]->desc), ENCODE (rt->item[i]->media_keywords), rt->item[i]->media_duration, str_escape_xml (rt->item[i]->media_thumbnail) // str_escape_xml (rt->item[i]->media_image), // rt->item[i]->event_start, // rt->item[i]->event_end ); hash_close (dl_url_h); hash_close (url_h); hash_close (title_h); } fputs ("</rsstool>\n", rsstool.output_file); if (items >= RSSMAXITEM) { char buf[MAXBUFSIZE]; sprintf (buf, "can write only RSS feeds with up to %d items (was %d items)\n", RSSMAXITEM, items); rsstool_log (rt, buf); } return 0; }
/* * Manage a new provider -> read information and add symbols. */ static guint gdisp_insertProvider ( Kernel_T *kernel, gchar *url ) { TSP_provider_t *provider = NULL; Provider_T *newProvider = (Provider_T*)NULL; Symbol_T *symbolList = (Symbol_T*)NULL; GString *messageString = (GString*)NULL; gint symbolCpt = 0; gint requestStatus = 0; TSP_sample_symbol_info_t *symbolInfo = (TSP_sample_symbol_info_t*)NULL; const TSP_answer_sample_t *providerInfo = (const TSP_answer_sample_t*)NULL; /* * Check the original url is not known yet. */ if (gdisp_getProviderByOriginalUrl(kernel,url) != (Provider_T*)NULL) { return -1; } /* * Try to connect to the URL. */ provider = TSP_consumer_connect_url(url); if (provider != (TSP_provider_t*)NULL) { /* * Store all available information for this provider. */ /* * Allocate memory for this new provider. * Set up its status to 'FROM_SCRATCH'. */ newProvider = (Provider_T*)g_malloc0(sizeof(Provider_T)); assert(newProvider); newProvider->pStatus = GD_FROM_SCRATCH; /* * Now store the handle, get back the name. * Set up its status to 'SESSION_CLOSED'. * Insert it into the kernel provider list. */ newProvider->pOriginalUrl = g_string_new(url); newProvider->pHandle = provider; newProvider->pIdentity = kernel->providerId++ % GD_MAX_PROVIDER_NUMBER; newProvider->pUrl = g_string_new(TSP_consumer_get_connected_name(newProvider->pHandle)); assert(newProvider->pUrl); newProvider->pStatus = GD_SESSION_CLOSED; kernel->providerList = g_list_insert_sorted(kernel->providerList, (gpointer)newProvider, gdisp_sortProviderByUrl); assert(kernel->providerList); /* * Ask the provider for a new consumer session. * Set up its status to 'SESSION_OPENED'. */ requestStatus = TSP_consumer_request_open(newProvider->pHandle, (gint)NULL, (gchar**)NULL); if (TSP_STATUS_OK == requestStatus) { /* * Now the session is opened, get back all available information. * Keep the current status, since symbols are not requested here. */ if (kernel->retreiveAllSymbols == TRUE) { requestStatus = TSP_consumer_request_information(newProvider->pHandle); } else { requestStatus = TSP_consumer_request_filtered_information(newProvider->pHandle, TSP_FILTER_MINIMAL, MINIMAL_STRING); } if (TSP_STATUS_OK == requestStatus) { /* Do not free 'providerInfo' structure */ providerInfo = TSP_consumer_get_information(newProvider->pHandle); assert(providerInfo); newProvider->pVersionId = providerInfo->version_id; newProvider->pChannelId = providerInfo->channel_id; newProvider->pTimeOut = providerInfo->provider_timeout; newProvider->pGroupNumber = providerInfo->provider_group_number; newProvider->pBaseFrequency = providerInfo->base_frequency; newProvider->pMaxPeriod = providerInfo->max_period; newProvider->pMaxClientNumber = providerInfo->max_client_number; newProvider->pCurrentClientNumber = providerInfo->current_client_number; newProvider->pSymbolNumber = providerInfo->symbols.TSP_sample_symbol_info_list_t_len; /* * Shall I retreive all symbols ?? It depends on the action. */ if (kernel->retreiveAllSymbols == TRUE) { if (newProvider->pSymbolNumber > 0) { /* * Allocate symbol table. */ newProvider->pSymbolList = (Symbol_T*) g_malloc0(newProvider->pSymbolNumber * sizeof(Symbol_T)); assert(newProvider->pSymbolList); /* * Allocate symbol hash table for extra-boosted search. */ newProvider->pSymbolHashTable = hash_open('.','z'); assert(newProvider->pSymbolHashTable); } /* * Loop over all symbols. */ symbolInfo = providerInfo->symbols.TSP_sample_symbol_info_list_t_val; symbolList = newProvider->pSymbolList; for (symbolCpt=0; symbolCpt<newProvider->pSymbolNumber; symbolCpt++, symbolList++, symbolInfo++) { /* copy the whole structure... */ symbolList->sInfo = *symbolInfo; symbolList->sPgi = symbolInfo->provider_global_index; /* ... and do not forget to duplicate pointers */ symbolList->sInfo.name = gdisp_strDup(symbolInfo->name); /* Default is : at maximum frequency without offset */ symbolList->sInfo.period = 1; symbolList->sInfo.phase = 0; /* do not treat table */ if (symbolList->sInfo.dimension > 1) { symbolList->sInfo.provider_global_index = -1; symbolList->sPgi = -1; } /* initialize extrema */ symbolList->sMinimum = - G_MAXDOUBLE; symbolList->sMaximum = + G_MAXDOUBLE; /* insert symbol into hash table */ hash_append(newProvider->pSymbolHashTable, symbolList->sInfo.name, (void*)symbolList); } /* symbolCpt */ /* * Build PGI to symbol hash table. */ gdisp_buildProviderPgiHashTable(newProvider, &providerInfo->symbols); /* * Get symbol extended information. */ gdisp_getSymbolExtendedInformation(newProvider, TRUE /* forget any previous info */); } /* retreiveAllSymbols == TRUE */ /* * Session is now opened towards provider. */ newProvider->pStatus = GD_SESSION_OPENED; messageString = g_string_new((gchar*)NULL); g_string_sprintf(messageString, "Session opened on <%s>", newProvider->pUrl->str); (*kernel->outputFunc)(kernel,messageString,GD_MESSAGE); } /* requestStatus == TRUE (TSP_consumer_request_information) */ else { messageString = g_string_new((gchar*)NULL); g_string_sprintf(messageString,"Cannot get back information from"); (*kernel->outputFunc)(kernel,messageString,GD_ERROR); messageString = g_string_new((gchar*)NULL); g_string_sprintf(messageString, "<%s> provider. Session is closed.", newProvider->pUrl->str); (*kernel->outputFunc)(kernel,messageString,GD_ERROR); } } /* requestStatus == TRUE (TSP_consumer_request_open) */ else { messageString = g_string_new((gchar*)NULL); g_string_sprintf(messageString,"Cannot open a session towards"); (*kernel->outputFunc)(kernel,messageString,GD_ERROR); messageString = g_string_new((gchar*)NULL); g_string_sprintf(messageString, "<%s> provider. Aborting.", newProvider->pUrl->str); (*kernel->outputFunc)(kernel,messageString,GD_ERROR); } } /* End if available provider */ else { messageString = g_string_new((gchar*)NULL); g_string_sprintf(messageString, "No TSP provider found on host %s.", url); (*kernel->outputFunc)(kernel,messageString,GD_ERROR); } return (provider == NULL ? -1 : 0); }