int main(int argc, char *argv[]) {
	CURL *curl;
	int counter = 0;
	if (argc < 2) return 1;

	curl = curl_easy_init();
	TidyDoc tdoc = tidyCreate();
	TidyBuffer output = {0};
	tidyOptSetBool(tdoc, TidyXmlOut, yes);
	tidyOptSetBool(tdoc, TidyShowWarnings, no);
	tidyOptSetInt(tdoc, TidyWrapLen, 0);

	for(int i=0; i < 20; i++) {
//		tidyBufFree(&output);
		tidyBufClear(&output);
	//	tidyParseFile(tdoc, argv[1]);
		tidyParseString(tdoc, getpage(curl,i).c_str());
		tidySaveBuffer(tdoc, &output); 
	//	tidySaveFile(tdoc, "tidy_test.xml");

	//	doc.LoadFile(argv[1]);
	//	doc.LoadFile("tidy_test.xml");
		parseTidyBuf(output, counter);
	}

	curl_easy_cleanup(curl);

	return 0;
}
Example #2
0
static int cmd_test(int argc, char **argv)
{
    int page;
    char fill = 'a';

    if (argc < 2) {
        printf("usage: %s <page>\n", argv[0]);
        return 1;
    }

    page = getpage(argv[1]);
    if (page < 0) {
        return 1;
    }

    for (unsigned i = 0; i < sizeof(page_mem); i++) {
        page_mem[i] = (uint8_t)fill++;
        if (fill > 'z') {
            fill = 'a';
        }
    }

    if (flashpage_write_and_verify(page, page_mem) != FLASHPAGE_OK) {
        printf("error verifying the content of page %i\n", page);
        return 1;
    }

    printf("wrote local page buffer to flash page %i at addr %p\n",
           page, flashpage_addr(page));
    return 0;
}
Example #3
0
static DirEntry *
getentry (DirPage0 *page0,
	  unsigned short num)
{
     DirPage1 *page = getpage (page0, num / ENTRIESPERPAGE);

     assert (page->header.pg_tag == htons(AFSDIRMAGIC));
     return &page->entry[num % ENTRIESPERPAGE];
}
Example #4
0
int
sdbm_exists(register DBM *db, datum key)
{
	if (db == NULL || bad(key))
		return errno = EINVAL, -1;

	if (getpage(db, exhash(key)))
		return exipair(db->pagbuf, key);

	return ioerr(db), -1;
}
Example #5
0
datum
sdbm_fetch(register DBM *db, datum key)
{
	if (db == NULL || bad(key))
		return errno = EINVAL, nullitem;

	if (getpage(db, exhash(key)))
		return getpair(db->pagbuf, key);

	return ioerr(db), nullitem;
}
Example #6
0
int area_resize(aspace_t *aspace, int area_id, off_t size)
{
    area_t *area;
    pagegroup_t *pg;
    int ppo;
    phys_page_t *pp,*pp0;
    uint32 at,p;
    
    if(!(area = rsrc_find_area(area_id))) return ERR_RESOURCE;
    
    pg = area->pgroup;
    pp = area->pgroup->pages;
    
//	kprintf("area_resize(%x,%d,%d)",aspace,area_id,size);
	    
    if(size <= pg->size*0x1000) return 0;

    size = size/0x1000 - pg->size; /* pages to add */

//    kprintf("area_resize: %x %x %x + %x",area,pg,pp,size);

    at = locate_span(aspace, area->virt_addr + pg->size, size);
    if(at != (area->virt_addr + pg->size)) {
        kprintf("oops: cannot grow area (%x != %x)",at,area->virt_addr+pg->size);
        return ERR_MEMORY;
    }
    
    while(pp->next) pp = pp->next;
    ppo = pg->size % 6;
    
    pg->size += size;
    area->length += size;
    area->maxlength += size;
    
    while(size){
        if(!ppo){
            pp0 = (phys_page_t *) kmalloc(phys_page_t);
            pp0->next = NULL;
            pp->next = pp0;
            pp0->refcount = 0;
            pp = pp0;
        }
        p = getpage();
        aspace_map(aspace, p, at, 1, 7);
        pp->addr[ppo] = p;
        at++;
        ppo++;
        if(ppo == 6) ppo = 0;
        size--;
    }
    
    return 0;
}
Example #7
0
int
sdbm_store(register DBM *db, datum key, datum val, int flags)
{
	int need;
	register long hash;

	if (db == NULL || bad(key))
		return errno = EINVAL, -1;
	if (sdbm_rdonly(db))
		return errno = EPERM, -1;

	need = key.dsize + val.dsize;
/*
 * is the pair too big (or too small) for this database ??
 */
	if (need < 0 || need > PAIRMAX)
		return errno = EINVAL, -1;

	if (getpage(db, (hash = exhash(key)))) {
/*
 * if we need to replace, delete the key/data pair
 * first. If it is not there, ignore.
 */
		if (flags == DBM_REPLACE)
			(void) delpair(db->pagbuf, key);
#ifdef SEEDUPS
		else if (duppair(db->pagbuf, key))
			return 1;
#endif
/*
 * if we do not have enough room, we have to split.
 */
		if (!fitpair(db->pagbuf, need))
			if (!makroom(db, hash, need))
				return ioerr(db), -1;
/*
 * we have enough room or split is successful. insert the key,
 * and update the page file.
 */
		(void) putpair(db->pagbuf, key, val);

		if (lseek(db->pagf, OFF_PAG(db->pagbno), SEEK_SET) < 0
		    || write(db->pagf, db->pagbuf, PBLKSIZ) < 0)
			return ioerr(db), -1;
	/*
	 * success
	 */
		return 0;
	}

	return ioerr(db), -1;
}
Example #8
0
int
fdir_creat (fbuf *dir,
	    const char *name,
	    AFSFid fid)
{
    int ret;
    int i;
    unsigned npages;
    DirPage0 *page0;
    DirPage1 *page;
    int ind = 0;
    unsigned hash_value, next;

    assert (dir->len != 0);

    page0 = (DirPage0 *)fbuf_buf(dir);
    assert (page0);
    npages = ntohs(page0->header.pg_pgcount);

    if (npages < fbuf_len(dir) / AFSDIR_PAGESIZE)
	npages = fbuf_len(dir) / AFSDIR_PAGESIZE;

    if (find_entry (page0, name))
	return EEXIST;

    hash_value = hashentry (name);
    next = page0->dheader.hash[hash_value];

    for (i = 0; i < npages; ++i) {
	page = getpage (page0, i);
	ind = add_to_page (page0, page, i, name, fid, next);
	if (ind >= 0)
	    break;
    }
    if (i == npages) {
	ret = create_new_page (&page, dir);
	if (ret)
	    return ret;
	page0 = (DirPage0 *)fbuf_buf(dir);
	page0->header.pg_pgcount = htons(npages + 1);
	if (i < MAXPAGES)
	    page0->dheader.map[i] = ENTRIESPERPAGE - 1;
	ind = add_to_page (page0, page, i, name, fid, next);
	assert (ind >= 0);
    }
    ind += i * ENTRIESPERPAGE;
    
    page0->dheader.hash[hash_value] = htons(ind + 1);
    
    return 0;
}
Example #9
0
static int
is_page_empty (DirPage0 *page0, unsigned pageno)
{
    DirPage1 *page;
    int i;

    if (pageno < MAXPAGES)
	return page0->dheader.map[pageno] == ENTRIESPERPAGE - 1;
    page = getpage (page0, pageno);
    if (page->header.pg_bitmap[0] != 1)
	return 0;
    for (i = 1; i < sizeof(page->header.pg_bitmap); ++i)
	if (page->header.pg_bitmap[i] != 0)
	    return 0;
    return 1;
}
Example #10
0
static int cmd_erase(int argc, char **argv)
{
    int page;

    if (argc < 2) {
        printf("usage: %s <page>\n", argv[0]);
        return 1;
    }

    page = getpage(argv[1]);
    if (page < 0) {
        return 1;
    }
    flashpage_write(page, NULL);

    printf("successfully erased page %i (addr %p)\n",
           page, flashpage_addr(page));
    return 0;
}
Example #11
0
static int cmd_read(int argc, char **argv)
{
    int page;

    if (argc < 2) {
        printf("usage: %s <page>\n", argv[0]);
        return 1;
    }

    page = getpage(argv[1]);
    if (page < 0) {
        return 1;
    }

    flashpage_read(page, page_mem);
    printf("Read flash page %i into local page buffer\n", page);
    dump_local();

    return 0;
}
Example #12
0
/*
 * int_stree_new_intleaf
 *
 * Allocates memory for a new INTLEAF structure.
 *
 * Parameters:  strid  -  The id of the string containing the new suffix
 *                        to be added to the tree.
 *              pos    -  The position of the new suffix in the string.
 *
 * Returns:  The structure or NULL.
 */
STREE_INTLEAF int_stree_new_intleaf(SUFFIX_TREE tree, int strid, int pos)
{
  static int pagecount = 0;
  static STREE_INTLEAF page = NULL;
  STREE_INTLEAF intleaf;

  if (page == NULL && (page = (STREE_INTLEAF) getpage(INTLEAF)) == NULL)
    return NULL;

  intleaf = &page[pagecount];
  intleaf->strid = strid;
  intleaf->pos = pos;

  if (++pagecount == INTLEAFS_PER_PAGE) {
    page = NULL;
    pagecount = 0;
  }

  return intleaf;
}
Example #13
0
/*
 * int_stree_new_node
 *
 * Allocates memory for a new NODE structure.
 *
 * Parameters:  edgestr     -  The edge label on the edge to the node.
 *              edgelen     -  The edge label's length.
 *
 * Returns:  The structure or NULL.
 */
STREE_NODE int_stree_new_node(SUFFIX_TREE tree, char *edgestr, int edgelen)
{
  static int pagecount = 0;
  static STREE_NODE page = NULL;
  STREE_NODE node;

  if (page == NULL && (page = (STREE_NODE) getpage(NODE)) == NULL)
    return NULL;

  node = &page[pagecount];
  node->edgestr = edgestr;
  node->edgelen = edgelen;

  if (++pagecount == NODES_PER_PAGE) {
    page = NULL;
    pagecount = 0;
  }

  return node;
}
Example #14
0
static int cmd_dump(int argc, char **argv)
{
    int page;
    void *addr;

    if (argc < 2) {
        printf("usage: %s <page>\n", argv[0]);
        return 1;
    }

    page = getpage(argv[1]);
    if (page < 0) {
        return 1;
    }
    addr = flashpage_addr(page);

    printf("Flash page %i at address %p\n", page, addr);
    memdump(addr, FLASHPAGE_SIZE);

    return 0;
}
Example #15
0
/*
 * int_stree_new_leaf
 *
 * Allocates memory for a new LEAF structure.
 *
 * Parameters:  strid       -  The id of the string containing the new suffix
 *                             to be added to the tree.
 *              pos         -  The position of the new suffix in the string.
 *              edgestr     -  The edge label on the edge to the leaf.
 *              rawedgestr  -  The raw edge label on the edge to the leaf.
 *              edgelen     -  The edge label's length.
 *
 * Returns:  The structure or NULL.
 */
STREE_LEAF int_stree_new_leaf(SUFFIX_TREE tree, int strid, int edgepos)
{
  static int pagecount = 0;
  static STREE_LEAF page = NULL;
  STREE_LEAF leaf;

  if (page == NULL && (page = (STREE_LEAF) getpage(LEAF)) == NULL)
    return NULL;

  leaf = &page[pagecount];
  leaf->isaleaf = 1;
  leaf->ch = stree_mapch(tree, tree->strings[strid][edgepos]);
  leaf->strid = strid;
  leaf->pos = edgepos;

  if (++pagecount == LEAFS_PER_PAGE) {
    page = NULL;
    pagecount = 0;
  }

  return leaf;
}
Example #16
0
int
sdbm_delete(register DBM *db, datum key)
{
	if (db == NULL || bad(key))
		return errno = EINVAL, -1;
	if (sdbm_rdonly(db))
		return errno = EPERM, -1;

	if (getpage(db, exhash(key))) {
		if (!delpair(db->pagbuf, key))
			return -1;
/*
 * update the page file
 */
		if (lseek(db->pagf, OFF_PAG(db->pagbno), SEEK_SET) < 0
		    || write(db->pagf, db->pagbuf, PBLKSIZ) < 0)
			return ioerr(db), -1;

		return 0;
	}

	return ioerr(db), -1;
}
Example #17
0
static int cmd_write(int argc, char **argv)
{
    int page;

    if (argc < 2) {
        printf("usage: %s <page>\n", argv[0]);
        return 1;
    }

    page = getpage(argv[1]);
    if (page < 0) {
        return 1;
    }

    if (flashpage_write_and_verify(page, page_mem) != FLASHPAGE_OK) {
        printf("error: verification for page %i failed\n", page);
        return 1;
    }

    printf("wrote local page buffer to flash page %i at addr %p\n",
           page, flashpage_addr(page));
    return 0;
}
Example #18
0
const uint8_t Burningseries::getlinks(std::vector<Global::episodepair> &episodes)
{
	Global::debug("burningseries.cpp");
	std::vector<Global::episodepair> pages;
	uint8_t ret;
	const std::map<const Config::HostingProviders, const Config::providerpair>
		&providermap = _cfg.get_providermap();

	ret = get_episode_pages(pages);
	if (ret != 0)
	{
		return ret;
	}

	for (const Global::episodepair &epair : pages)
	{
		std::map<const Config::HostingProviders, const Config::providerpair>::const_iterator itm;
		for (itm = providermap.begin(); itm != providermap.end(); ++itm)
		{
			if (itm->second.first == epair.second)
			{	// Look up provider of found link in providermap
				const Config::HostingProviders provider = itm->first;
				std::string content = getpage(epair.first);
				std::regex reHosterPage(
					"(<a href| src)=[\"\'](https?://bs.to/out/.*)[\"\']( target=|></iframe>)");
				std::regex reTitle(std::string("<h2 id=\"titleGerman\">(.*)") +
					"[[:space:]]+<small id=\"titleEnglish\" lang=\"en\">(.*)</small>");
				std::smatch match;
				std::string hosterurl;
				std::string title;

				if (std::regex_search(content, match, reHosterPage))
				{
					hosterurl = match[2].str();
					if (_cfg.get_resolve())
					{
						resolve_redirect(hosterurl);
					}

					for (const Config::HostingProviders &provider_ssl : _cfg.get_providers_ssl())
					{ // Make sure we use SSL where supported
						if (provider_ssl == provider)
						{
							if (hosterurl.find("https") == std::string::npos)
							{ // Replace "http" with "https"
								hosterurl = "https" + hosterurl.substr(4, std::string::npos);
							}
						}
					}
				}
				else
				{
					std::cerr << "Error extracting stream" << std::endl;
				}

				if (std::regex_search(content, match, reTitle))
				{
					if (match[1].str() != "")		// German
						title = match[1].str();
					else if (match[2].str() != "")	// English
						title = match[2].str();
				}
				episodes.push_back(Global::episodepair(hosterurl, title));
			}
		}
	}

	return 0;
}
Example #19
0
/* userland calls */
int area_create(aspace_t *aspace, off_t size, off_t virt, void **addr, uint32 flags)
{
    int ppo,i,p=0,at;
    area_t *area;
    pagegroup_t *pg;
    phys_page_t *pp;
    size = (size & 0x0FFF) ? (size / 0x1000 + 1) : (size / 0x1000);
    
    if(size < 1) size = 1;

    if(flags & AREA_PHYSMAP) {
        p = ((uint32) *addr) / 0x1000;
    } 
    
    /* find a virtaddr */
    if(!(at = locate_span(aspace, virt/0x1000, size))){
        return ERR_MEMORY;
    }
    
    /* create a fresh pagegroup and enough phys_page_t's */    
    pg = (pagegroup_t *) kmalloc(pagegroup_t);
    pg->flags = flags;
    pg->refcount = 1;
    pg->size = size;
    pg->pages = NULL;
	list_init(&pg->areas);
    for(i=0;i<size;i+=6){
        pp = (phys_page_t *) kmalloc(phys_page_t);
        pp->refcount = 0;
        pp->next = pg->pages;
        pg->pages = pp;
    };
    
    /* create an area to ref the pagegroup */
    area = (area_t *) kmalloc(area_t);
    area->pgroup = pg;
    area->virt_addr = at;
    area->length = size;
    area->maxlength = size;
    
    /* link this area into the new pagegroup */
	list_add_tail(&pg->areas, area);
    
    /* link this area into the aspace's arealist */
	list_add_tail(&aspace->areas, area);	

    /* check for valid ptr */
    *addr = (void *) (at * 0x1000);
        
    /* allocate pages, fill phys_page_t's, and map 'em */
    for(ppo=0,pp=pg->pages,i=0;i<size;i++){
        if(!(flags & AREA_PHYSMAP)) {
            p = getpage();
        }
        aspace_map(aspace, p, at, 1, 7);
        pp->addr[ppo] = p;
        ppo++;
        if(ppo == 6) {
            ppo = 0;
            pp = pp->next;
        }
        if(flags & AREA_PHYSMAP) p++;
        at++;
    }
    
    /*
	 * zero extra space in last phys_page_t.
	 * careful, ppo == 0 and pp == NULL if size == 6.
	 */
    while((ppo < 6) && (pp != NULL)){
        pp->addr[ppo] = 0;
        ppo++;
    }
    
    /* bind the resource and return the id */
    rsrc_bind(&(area->rsrc), RSRC_AREA, current->rsrc.owner);
    return area->rsrc.id;
}
Example #20
0
int timod_getmsg(unsigned int fd, char *ctl_buf, int ctl_maxlen, s32 *ctl_len,
			char *data_buf, int data_maxlen, s32 *data_len, int *flags_p)
{
	int error;
	int oldflags;
	struct file *filp;
	struct inode *ino;
	struct sol_socket_struct *sock;
	struct T_unitdata_ind udi;
	mm_segment_t old_fs = get_fs();
	long args[6];
	char *tmpbuf;
	int tmplen;
	int (*sys_socketcall)(int, unsigned long *) =
		(int (*)(int, unsigned long *))SYS(socketcall);
	int (*sys_recvfrom)(int, void *, size_t, unsigned, struct sockaddr *, int *);
	
	SOLD("entry");
	SOLDD(("%u %p %d %p %p %d %p %d\n", fd, ctl_buf, ctl_maxlen, ctl_len, data_buf, data_maxlen, data_len, *flags_p));
	filp = current->files->fd[fd];
	ino = filp->f_dentry->d_inode;
	sock = (struct sol_socket_struct *)filp->private_data;
	SOLDD(("%p %p\n", sock->pfirst, sock->pfirst ? sock->pfirst->next : NULL));
	if ( ctl_maxlen > 0 && !sock->pfirst && ino->u.socket_i.type == SOCK_STREAM
		&& sock->state == TS_IDLE) {
		SOLD("calling LISTEN");
		args[0] = fd;
		args[1] = -1;
		set_fs(KERNEL_DS);
		sys_socketcall(SYS_LISTEN, args);
		set_fs(old_fs);
		SOLD("LISTEN done");
	}
	if (!(filp->f_flags & O_NONBLOCK)) {
		poll_table wait_table, *wait;

		poll_initwait(&wait_table);
		wait = &wait_table;
		for(;;) {
			SOLD("loop");
			set_current_state(TASK_INTERRUPTIBLE);
			/* ! ( l<0 || ( l>=0 && ( ! pfirst || (flags == HIPRI && pri != HIPRI) ) ) ) */ 
			/* ( ! l<0 && ! ( l>=0 && ( ! pfirst || (flags == HIPRI && pri != HIPRI) ) ) ) */ 
			/* ( l>=0 && ( ! l>=0 || ! ( ! pfirst || (flags == HIPRI && pri != HIPRI) ) ) ) */ 
			/* ( l>=0 && ( l<0 || ( pfirst && ! (flags == HIPRI && pri != HIPRI) ) ) ) */ 
			/* ( l>=0 && ( l<0 || ( pfirst && (flags != HIPRI || pri == HIPRI) ) ) ) */ 
			/* ( l>=0 && ( pfirst && (flags != HIPRI || pri == HIPRI) ) ) */ 
			if (ctl_maxlen >= 0 && sock->pfirst && (*flags_p != MSG_HIPRI || sock->pfirst->pri == MSG_HIPRI))
				break;
			SOLD("cond 1 passed");
			if (
			#if 1
				*flags_p != MSG_HIPRI &&
			#endif
				((filp->f_op->poll(filp, wait) & POLLIN) ||
				(filp->f_op->poll(filp, NULL) & POLLIN) ||
				signal_pending(current))
			) {
				break;
			}
			if( *flags_p == MSG_HIPRI ) {
				SOLD("avoiding lockup");
				break ;
			}
			if(wait_table.error) {
				SOLD("wait-table error");
				poll_freewait(&wait_table);
				return wait_table.error;
			}
			SOLD("scheduling");
			schedule();
		}
		SOLD("loop done");
		current->state = TASK_RUNNING;
		poll_freewait(&wait_table);
		if (signal_pending(current)) {
			SOLD("signal pending");
			return -EINTR;
		}
	}
	if (ctl_maxlen >= 0 && sock->pfirst) {
		struct T_primsg *it = sock->pfirst;
		int l = min_t(int, ctl_maxlen, it->length);
		SCHECK_MAGIC((char*)((u64)(((char *)&it->type)+sock->offset+it->length+7)&~7),MKCTL_MAGIC);
		SOLD("purting ctl data");
		if(copy_to_user(ctl_buf,
			(char*)&it->type + sock->offset, l))
			return -EFAULT;
		SOLD("pur it");
		if(put_user(l, ctl_len))
			return -EFAULT;
		SOLD("set ctl_len");
		*flags_p = it->pri;
		it->length -= l;
		if (it->length) {
			SOLD("more ctl");
			sock->offset += l;
			return MORECTL;
		} else {
			SOLD("removing message");
			sock->pfirst = it->next;
			if (!sock->pfirst)
				sock->plast = NULL;
			SOLDD(("getmsg kfree %016lx->%016lx\n", it, sock->pfirst));
			mykfree(it);
			sock->offset = 0;
			SOLD("ctl done");
			return 0;
		}
	}
	*flags_p = 0;
	if (ctl_maxlen >= 0) {
		SOLD("ACCEPT perhaps?");
		if (ino->u.socket_i.type == SOCK_STREAM && sock->state == TS_IDLE) {
			struct T_conn_ind ind;
			char *buf = getpage();
			int len = BUF_SIZE;

			SOLD("trying ACCEPT");
			if (put_user(ctl_maxlen - sizeof(ind), ctl_len))
				return -EFAULT;
			args[0] = fd;
			args[1] = (long)buf;
			args[2] = (long)&len;
			oldflags = filp->f_flags;
			filp->f_flags |= O_NONBLOCK;
			SOLD("calling ACCEPT");
			set_fs(KERNEL_DS);
			error = sys_socketcall(SYS_ACCEPT, args);
			set_fs(old_fs);
			filp->f_flags = oldflags;
			if (error < 0) {
				SOLD("some error");
				putpage(buf);
				return error;
			}
			if (error) {
				SOLD("connect");
				putpage(buf);
				if (sizeof(ind) > ctl_maxlen) {
					SOLD("generating CONN_IND");
					ind.PRIM_type = T_CONN_IND;
					ind.SRC_length = len;
					ind.SRC_offset = sizeof(ind);
					ind.OPT_length = ind.OPT_offset = 0;
					ind.SEQ_number = error;
					if(copy_to_user(ctl_buf, &ind, sizeof(ind))||
					   put_user(sizeof(ind)+ind.SRC_length,ctl_len))
						return -EFAULT;
					SOLD("CONN_IND created");
				}
				if (data_maxlen >= 0)
					put_user(0, data_len);
				SOLD("CONN_IND done");
				return 0;
			}
			if (len>ctl_maxlen) {
				SOLD("data don't fit");
				putpage(buf);
				return -EFAULT;		/* XXX - is this ok ? */
			}
			if(copy_to_user(ctl_buf,buf,len) || put_user(len,ctl_len)){
				SOLD("can't copy data");
				putpage(buf);
				return -EFAULT;
			}
			SOLD("ACCEPT done");
			putpage(buf);
		}
	}
	SOLD("checking data req");
	if (data_maxlen <= 0) {
		if (data_maxlen == 0)
			put_user(0, data_len);
		if (ctl_maxlen >= 0)
			put_user(0, ctl_len);
		return -EAGAIN;
	}
	SOLD("wants data");
	if (ctl_maxlen > sizeof(udi) && sock->state == TS_IDLE) {
		SOLD("udi fits");
		tmpbuf = ctl_buf + sizeof(udi);
		tmplen = ctl_maxlen - sizeof(udi);
	} else {
		SOLD("udi does not fit");
		tmpbuf = NULL;
		tmplen = 0;
	}
	if (put_user(tmplen, ctl_len))
		return -EFAULT;
	SOLD("set ctl_len");
	oldflags = filp->f_flags;
	filp->f_flags |= O_NONBLOCK;
	SOLD("calling recvfrom");
	sys_recvfrom = (int (*)(int, void *, size_t, unsigned, struct sockaddr *, int *))SYS(recvfrom);
	error = sys_recvfrom(fd, data_buf, data_maxlen, 0, (struct sockaddr*)tmpbuf, ctl_len);
	filp->f_flags = oldflags;
	if (error < 0)
		return error;
	SOLD("error >= 0" ) ;
	if (error && ctl_maxlen > sizeof(udi) && sock->state == TS_IDLE) {
		SOLD("generating udi");
		udi.PRIM_type = T_UNITDATA_IND;
		get_user(udi.SRC_length, ctl_len);
		udi.SRC_offset = sizeof(udi);
		udi.OPT_length = udi.OPT_offset = 0;
		copy_to_user(ctl_buf, &udi, sizeof(udi));
		put_user(sizeof(udi)+udi.SRC_length, ctl_len);
		SOLD("udi done");
	} else
		put_user(0, ctl_len);
	put_user(error, data_len);
	SOLD("done");
	return 0;
}
Example #21
0
int timod_putmsg(unsigned int fd, char *ctl_buf, int ctl_len,
			char *data_buf, int data_len, int flags)
{
	int ret, error, terror;
	char *buf;
	struct file *filp;
	struct inode *ino;
	struct sol_socket_struct *sock;
	mm_segment_t old_fs = get_fs();
	long args[6];
	int (*sys_socketcall)(int, unsigned long *) =
		(int (*)(int, unsigned long *))SYS(socketcall);
	int (*sys_sendto)(int, void *, size_t, unsigned, struct sockaddr *, int) =
		(int (*)(int, void *, size_t, unsigned, struct sockaddr *, int))SYS(sendto);
	filp = current->files->fd[fd];
	ino = filp->f_dentry->d_inode;
	sock = (struct sol_socket_struct *)filp->private_data;
	SOLD("entry");
	if (get_user(ret, (int *)A(ctl_buf)))
		return -EFAULT;
	switch (ret) {
	case T_BIND_REQ:
	{
		struct T_bind_req req;
		
		SOLDD(("bind %016lx(%016lx)\n", sock, filp));
		SOLD("T_BIND_REQ");
		if (sock->state != TS_UNBND) {
			timod_error(fd, T_BIND_REQ, TOUTSTATE, 0);
			return 0;
		}
		SOLD("state ok");
		if (copy_from_user(&req, ctl_buf, sizeof(req))) {
			timod_error(fd, T_BIND_REQ, TSYSERR, EFAULT);
			return 0;
		}
		SOLD("got ctl req");
		if (req.ADDR_offset && req.ADDR_length) {
			if (req.ADDR_length > BUF_SIZE) {
				timod_error(fd, T_BIND_REQ, TSYSERR, EFAULT);
				return 0;
			}
			SOLD("req size ok");
			buf = getpage();
			if (copy_from_user(buf, ctl_buf + req.ADDR_offset, req.ADDR_length)) {
				timod_error(fd, T_BIND_REQ, TSYSERR, EFAULT);
				putpage(buf);
				return 0;
			}
			SOLD("got ctl data");
			args[0] = fd;
			args[1] = (long)buf;
			args[2] = req.ADDR_length;
			SOLD("calling BIND");
			set_fs(KERNEL_DS);
			error = sys_socketcall(SYS_BIND, args);
			set_fs(old_fs);
			putpage(buf);
			SOLD("BIND returned");
		} else 
			error = 0;
		if (!error) {
			struct T_primsg *it;
			if (req.CONIND_number) {
	  			args[0] = fd;
  				args[1] = req.CONIND_number;
  				SOLD("calling LISTEN");
  				set_fs(KERNEL_DS);
	  			error = sys_socketcall(SYS_LISTEN, args);
  				set_fs(old_fs);
  				SOLD("LISTEN done");
  			}
			it = timod_mkctl(sizeof(struct T_bind_ack)+sizeof(struct sockaddr));
			if (it) {
				struct T_bind_ack *ack;

				ack = (struct T_bind_ack *)&it->type;
				ack->PRIM_type = T_BIND_ACK;
				ack->ADDR_offset = sizeof(*ack);
				ack->ADDR_length = sizeof(struct sockaddr);
				ack->CONIND_number = req.CONIND_number;
				args[0] = fd;
				args[1] = (long)(ack+sizeof(*ack));
				args[2] = (long)&ack->ADDR_length;
				set_fs(KERNEL_DS);
				sys_socketcall(SYS_GETSOCKNAME,args);
				set_fs(old_fs);
				sock->state = TS_IDLE;
				timod_ok(fd, T_BIND_REQ);
				timod_queue_end(fd, it);
				SOLD("BIND done");
				return 0;
			}
		}
		SOLD("some error");
		switch (error) {
			case -EINVAL:
				terror = TOUTSTATE;
				error = 0;
				break;
			case -EACCES:
				terror = TACCES;
				error = 0;
				break;
			case -EADDRNOTAVAIL:
			case -EADDRINUSE:
				terror = TNOADDR;
				error = 0;
				break;
			default:
				terror = TSYSERR;
				break;
		}
		timod_error(fd, T_BIND_REQ, terror, -error);
		SOLD("BIND done");
		return 0;
	}
	case T_CONN_REQ:
	{
		struct T_conn_req req;
		unsigned short oldflags;
		struct T_primsg *it;
		SOLD("T_CONN_REQ");
		if (sock->state != TS_UNBND && sock->state != TS_IDLE) {
			timod_error(fd, T_CONN_REQ, TOUTSTATE, 0);
			return 0;
		}
		SOLD("state ok");
		if (copy_from_user(&req, ctl_buf, sizeof(req))) {
			timod_error(fd, T_CONN_REQ, TSYSERR, EFAULT);
			return 0;
		}
		SOLD("got ctl req");
		if (ctl_len > BUF_SIZE) {
			timod_error(fd, T_CONN_REQ, TSYSERR, EFAULT);
			return 0;
		}
		SOLD("req size ok");
		buf = getpage();
		if (copy_from_user(buf, ctl_buf, ctl_len)) {
			timod_error(fd, T_CONN_REQ, TSYSERR, EFAULT);
			putpage(buf);
			return 0;
		}
#ifdef DEBUG_SOLARIS		
		{
			char * ptr = buf;
			int len = ctl_len;
			printk("returned data (%d bytes): ",len);
			while( len-- ) {
				if (!(len & 7))
					printk(" ");
				printk("%02x",(unsigned char)*ptr++);
			}
			printk("\n");
		}
#endif
		SOLD("got ctl data");
		args[0] = fd;
		args[1] = (long)buf+req.DEST_offset;
		args[2] = req.DEST_length;
		oldflags = filp->f_flags;
		filp->f_flags &= ~O_NONBLOCK;
		SOLD("calling CONNECT");
		set_fs(KERNEL_DS);
		error = sys_socketcall(SYS_CONNECT, args);
		set_fs(old_fs);
		filp->f_flags = oldflags;
		SOLD("CONNECT done");
		if (!error) {
			struct T_conn_con *con;
			SOLD("no error");
			it = timod_mkctl(ctl_len);
			if (!it) {
				putpage(buf);
				return -ENOMEM;
			}
			con = (struct T_conn_con *)&it->type;
#ifdef DEBUG_SOLARIS			
			{
				char * ptr = buf;
				int len = ctl_len;
				printk("returned data (%d bytes): ",len);
				while( len-- ) {
					if (!(len & 7))
						printk(" ");
					printk("%02x",(unsigned char)*ptr++);
				}
				printk("\n");
			}
#endif
			memcpy(con, buf, ctl_len);
			SOLD("copied ctl_buf");
			con->PRIM_type = T_CONN_CON;
			sock->state = TS_DATA_XFER;
		} else {
			struct T_discon_ind *dis;
			SOLD("some error");
			it = timod_mkctl(sizeof(*dis));
			if (!it) {
				putpage(buf);
				return -ENOMEM;
			}
			SOLD("got primsg");
			dis = (struct T_discon_ind *)&it->type;
			dis->PRIM_type = T_DISCON_IND;
			dis->DISCON_reason = -error;	/* FIXME: convert this as in iABI_errors() */
			dis->SEQ_number = 0;
		}
		putpage(buf);
		timod_ok(fd, T_CONN_REQ);
		it->pri = 0;
		timod_queue_end(fd, it);
		SOLD("CONNECT done");
		return 0;
	}
	case T_OPTMGMT_REQ:
	{
		struct T_optmgmt_req req;
		SOLD("OPTMGMT_REQ");
		if (copy_from_user(&req, ctl_buf, sizeof(req)))
			return -EFAULT;
		SOLD("got req");
		return timod_optmgmt(fd, req.MGMT_flags,
				req.OPT_offset > 0 ? ctl_buf + req.OPT_offset : NULL,
				req.OPT_length, 1);
	}
	case T_UNITDATA_REQ:
	{
		struct T_unitdata_req req;
		
		int err;
		SOLD("T_UNITDATA_REQ");
		if (sock->state != TS_IDLE && sock->state != TS_DATA_XFER) {
			timod_error(fd, T_CONN_REQ, TOUTSTATE, 0);
			return 0;
		}
		SOLD("state ok");
		if (copy_from_user(&req, ctl_buf, sizeof(req))) {
			timod_error(fd, T_CONN_REQ, TSYSERR, EFAULT);
			return 0;
		}
		SOLD("got ctl req");
#ifdef DEBUG_SOLARIS		
		{
			char * ptr = ctl_buf+req.DEST_offset;
			int len = req.DEST_length;
			printk("socket address (%d bytes): ",len);
			while( len-- ) {
				char c;
				if (get_user(c,ptr))
					printk("??");
				else
					printk("%02x",(unsigned char)c);
				ptr++;
			}
			printk("\n");
		}
#endif		
		err = sys_sendto(fd, data_buf, data_len, 0, req.DEST_length > 0 ? (struct sockaddr*)(ctl_buf+req.DEST_offset) : NULL, req.DEST_length);
		if (err == data_len)
			return 0;
		if(err >= 0) {
			printk("timod: sendto failed to send all the data\n");
			return 0;
		}
		timod_error(fd, T_CONN_REQ, TSYSERR, -err);
		return 0;
	}
	default:
		printk(KERN_INFO "timod_putmsg: unsupported command %u.\n", ret);
		break;
	}
	return -EINVAL;
}
Example #22
0
static int timod_optmgmt(unsigned int fd, int flag, char *opt_buf, int opt_len, int do_ret)
{
	int error, failed;
	int ret_space, ret_len;
	long args[5];
	char *ret_pos,*ret_buf;
	int (*sys_socketcall)(int, unsigned long *) =
		(int (*)(int, unsigned long *))SYS(socketcall);
	mm_segment_t old_fs = get_fs();

	SOLD("entry");
	SOLDD(("fd %u flg %u buf %p len %u doret %u",fd,flag,opt_buf,opt_len,do_ret));
	if (!do_ret && (!opt_buf || opt_len <= 0))
		return 0;
	SOLD("getting page");
	ret_pos = ret_buf = getpage();
	ret_space = BUF_SIZE;
	ret_len = 0;
	
	error = failed = 0;
	SOLD("looping");
	while(opt_len >= sizeof(struct opthdr)) {
		struct opthdr *opt;
		int orig_opt_len; 
		SOLD("loop start");
		opt = (struct opthdr *)ret_pos; 
		if (ret_space < sizeof(struct opthdr)) {
			failed = TSYSERR;
			break;
		}
		SOLD("getting opthdr");
		if (copy_from_user(opt, opt_buf, sizeof(struct opthdr)) ||
			opt->len > opt_len) {
			failed = TBADOPT;
			break;
		}
		SOLD("got opthdr");
		if (flag == T_NEGOTIATE) {
			char *buf;
			
			SOLD("handling T_NEGOTIATE");
			buf = ret_pos + sizeof(struct opthdr);
			if (ret_space < opt->len + sizeof(struct opthdr) ||
				copy_from_user(buf, opt_buf+sizeof(struct opthdr), opt->len)) {
				failed = TSYSERR;
				break;
			}
			SOLD("got optdata");
			args[0] = fd;
			args[1] = opt->level;
			args[2] = opt->name;
			args[3] = (long)buf;
			args[4] = opt->len;
			SOLD("calling SETSOCKOPT");
			set_fs(KERNEL_DS);
			error = sys_socketcall(SYS_SETSOCKOPT, args);
			set_fs(old_fs);
			if (error) {
				failed = TBADOPT;
				break;
			}
			SOLD("SETSOCKOPT ok");
		}
		orig_opt_len = opt->len;
		opt->len = ret_space - sizeof(struct opthdr);
		if (opt->len < 0) {
			failed = TSYSERR;
			break;
		}
		args[0] = fd;
		args[1] = opt->level;
		args[2] = opt->name;
		args[3] = (long)(ret_pos+sizeof(struct opthdr));
		args[4] = (long)&opt->len;
		SOLD("calling GETSOCKOPT");
		set_fs(KERNEL_DS);
		error = sys_socketcall(SYS_GETSOCKOPT, args);
		set_fs(old_fs);;
		if (error) {
			failed = TBADOPT;
			break;
		}
		SOLD("GETSOCKOPT ok");
		ret_space -= sizeof(struct opthdr) + opt->len;
		ret_len += sizeof(struct opthdr) + opt->len;
		ret_pos += sizeof(struct opthdr) + opt->len;
		opt_len -= sizeof(struct opthdr) + orig_opt_len;
		opt_buf += sizeof(struct opthdr) + orig_opt_len;
		SOLD("loop end");
	}
	SOLD("loop done");
	if (do_ret) {
		SOLD("generating ret msg");
		if (failed)
			timod_error(fd, T_OPTMGMT_REQ, failed, -error);
		else {
			struct T_primsg *it;
			it = timod_mkctl(sizeof(struct T_optmgmt_ack) + ret_len);
			if (it) {
				struct T_optmgmt_ack *ack =
					(struct T_optmgmt_ack *)&it->type;
				SOLD("got primsg");
				ack->PRIM_type = T_OPTMGMT_ACK;
				ack->OPT_length = ret_len;
				ack->OPT_offset = sizeof(struct T_optmgmt_ack);
				ack->MGMT_flags = (failed ? T_FAILURE : flag);
				memcpy(((char*)ack)+sizeof(struct T_optmgmt_ack),
					ret_buf, ret_len);
				timod_queue(fd, it);
			}
		}
	}
	SOLDD(("put_page %p\n", ret_buf));
	putpage(ret_buf);
	SOLD("done");	
	return 0;
}
Example #23
0
int
fdir_remove (fbuf *dir,
	     const char *name,
	     AFSFid *fid)
{
    int i;
    unsigned len = dir->len;
    DirPage0 *page0;
    DirPage1 *page;
    unsigned hash_value;
    DirEntry *entry = NULL;
    DirEntry *prev_entry;
    unsigned pageno;
    int found;
    unsigned npages;


    page0 = (DirPage0 *)fbuf_buf(dir);
    npages = ntohs(page0->header.pg_pgcount);
    if (npages < len / AFSDIR_PAGESIZE)
	npages = len / AFSDIR_PAGESIZE;

    hash_value = hashentry (name);
    i = ntohs(page0->dheader.hash[hash_value]);
    found = i == 0;
    prev_entry = NULL;
    while (!found) {
	entry = getentry (page0, i - 1);

	if (strcmp (entry->name, name) == 0) {
	    found = TRUE;
	} else {
	    i = ntohs(entry->next);
	    if (i == 0)
		found = TRUE;
	    prev_entry = entry;
	}
    }
    if (i == 0)
	return ENOENT;
    else {
	if (fid) {
	    fid->Vnode = ntohl(entry->fid.Vnode);
	    fid->Unique = ntohl(entry->fid.Unique);
	}

	if (prev_entry == NULL)
	    page0->dheader.hash[hash_value] = entry->next;
	else
	    prev_entry->next = entry->next;

	pageno = (i - 1) / ENTRIESPERPAGE;
	page = getpage (page0, pageno);
	remove_from_page (page0, page, pageno, (i - 1) % ENTRIESPERPAGE);
	if (pageno == npages - 1
	    && is_page_empty (page0, pageno)) {
	    do {
		len -= AFSDIR_PAGESIZE;
		--pageno;
		--npages;
	    } while(is_page_empty(page0, pageno));
	    page0->header.pg_pgcount = htons(npages);
	    fbuf_truncate (dir, len);
	}
	return 0;
    }
}
Example #24
0
int
fdir_readdir (fbuf *the_fbuf,
	      fdir_readdir_func func,
	      void *arg,
	      VenusFid dir, 
	      uint32_t *offset)
{
     DirPage0 *page0;
     unsigned i, j;
     VenusFid fid;
     unsigned len = fbuf_len(the_fbuf);
     unsigned npages;
     unsigned first_slot;
     int ret;

     page0 = (DirPage0 *)fbuf_buf(the_fbuf);

     assert (page0);

     npages = ntohs(page0->header.pg_pgcount);

     if (npages < len / AFSDIR_PAGESIZE)
	 npages = len / AFSDIR_PAGESIZE;

     if (offset && *offset) {
	 i = *offset / ENTRIESPERPAGE;
	 first_slot = *offset % ENTRIESPERPAGE;

	 assert(i > 0 || first_slot >= 12);
     } else {
	 i = 0;
	 first_slot = 12;
     }

     for (; i < npages; ++i) {
	 DirPage1 *page = getpage (page0, i);

	 for (j = first_slot; j < ENTRIESPERPAGE - 1; ++j) {
	     if (first_slotp (page, j)) {
		 DirEntry *entry = &page->entry[j];

		 if (entry->flag != AFSDIR_FIRST)
		     continue;

		 fid.Cell       = dir.Cell;
		 fid.fid.Volume = dir.fid.Volume;
		 fid.fid.Vnode  = ntohl (entry->fid.Vnode);
		 fid.fid.Unique = ntohl (entry->fid.Unique);

		 ret = (*func)(&fid, entry->name, arg);
		 if (ret) {
		     if (ret > 0)
			 j++; /* look at next entry next time */
		     
		     goto done;
		 }
		 j += additional_entries (entry->name);
	     }
	 }
	 first_slot = 0;
     }

 done:
     if (offset)
	 *offset = i * ENTRIESPERPAGE + j;

     return 0;
}
Example #25
0
const uint8_t Burningseries::get_episode_pages(std::vector<Global::episodepair> &pages)
{
	std::string provider_re = "(";
	std::vector<Config::HostingProviders>::const_iterator it;
	const std::vector<Config::HostingProviders> &providers = _cfg.get_providers();
	const std::map<const Config::HostingProviders, const Config::providerpair>
		&providermap = _cfg.get_providermap();
	const std::array<uint16_t, 2> &seasonrange = _cfg.get_season_range();
	std::array<uint16_t, 2> episoderange = _cfg.get_episode_range();
	std::string url = _cfg.get_url();
	std::string content;
	const uint8_t &use_current_episode = _cfg.get_use_current_episode();

	for (it = providers.begin(); it != providers.end(); ++it)
	{ // Build regular expression for all supported streaming providers
		if (it != providers.begin())
		{ // Add | unless it is the first match
			provider_re += "|";
		}
		provider_re += providermap.at(*it).first;
	}
	provider_re += ")";

	for (uint16_t season = seasonrange[0]; season <= seasonrange[1]; ++season)
	{
		if (season != 0)
		{ // A season range was selected
			// NOTE: If season is higher than available seasons, season 1 is returned
			std::regex reSeries("(https://bs.to/serie/[^/]*/).*");
			std::smatch match;
		
			// Generate URL for each season
			if (std::regex_search(url, match, reSeries))
			{
				url = match[1].str() + std::to_string(season);
			}
			else
			{
				url = url + "/" + std::to_string(season);
			}
			content = getpage(url);
		}
		else
		{ // If no season range was selected, use supplied URL
			content = getpage(url);
		}

		if (use_current_episode != 0b00)
		{ // replace 'c's with episode numbers
			std::regex reEpisode("https://bs.to/serie/[^/]*/[[:digit:]]+/([[:digit:]]+)-.*");
			std::smatch match;

			if (std::regex_search(url, match, reEpisode))
			{
				if ((use_current_episode & 0b01) != 0)
				{ // Start from current episode
					episoderange[0] = std::stoi(match[1].str());
				}
				if ((use_current_episode & 0b10) != 0)
				{ // End with current episode
					episoderange[1] = std::stoi(match[1].str());
				}
			}
			else
			{
				std::cerr << "Error: Could not extract current episode." << std::endl;
				return 3;
			}
		}

		std::regex reEpisodePage("href=\"(serie/.*/[[:digit:]]+/([[:digit:]]+)-.*/(" +
			provider_re + "))\">(" + provider_re + ")?</a>");
		std::sregex_iterator it_re(content.begin(), content.end(), reEpisodePage);
		std::sregex_iterator it_re_end;

		if (it_re == it_re_end)
		{ // No matches
			std::cerr << "Error: No episodes found" << std::endl;
			return 3;
		}
		uint16_t episode = 1;
		while (it_re != it_re_end)
		{ // 1 == link, 2 == episode, 3 == provider
			uint16_t found_episode = std::stoi((*it_re)[2]);
			if (episode == 1 && episoderange[0] > 1)
			{ // Set episode to the right starting value if episode range is specified
				episode = episoderange[0];
			}

			if (found_episode >= episoderange[0] &&
				found_episode <= episoderange[1] &&
				found_episode >= episode)
			{
				if (found_episode > episode)
				{ // If found episode is > expected episode, we are missing 1 ore more episode(s)
					std::cerr << "Error: Could not get URL for episode " << episode;
					if ((episode + 1) != found_episode)
					{ // If more than 1 episode is missing
						std::cerr << "-" << (found_episode - 1);
					}
					std::cerr << "." << std::endl;
				}

				// Put URL and provider to episode pages into &pages
				pages.push_back(Global::episodepair("https://bs.to/" + (*it_re)[1].str(),
					(*it_re)[3].str()));

				episode = found_episode + 1;
			}
			else if (found_episode > episoderange[1])
			{
				break;
			}
			++it_re;
		} // Iterating through matches
	}

	return 0;
}
Example #26
0
int main(int argc,char* argv[]) 
{ 
   
	//wget() for validating URL --without proxy--
	if(!system("wget --spider argv[1]"))
    printf("Valid URL\n");
    else
    printf("Invalid URL\n");
    
  struct hash h[HASH_size]; 
  
		  for(int i=0;i<HASH_size;i++)
			{
			h[i].head1=NULL;
			h[i].tail1=NULL;
			h[i].countlinks=0;
			}
	
	int links=0;
	int *totallinks=&links;
	
 for(int k=0;k<174;k++)
	{ 
	int counter=k;
	 if(counter==0)
	getpage(argv[1]);
	else
	{
	struct node *t=head;
		while(counter!=1)
		{
		t=t->next;
		counter--;
		}
		getpage(t->u.str);
	}
	//to get the size of file in which wget gets the html code

	struct stat st; //variable which will count length of file.

	printf(" file exits if 0 and do not exists if not equal to 0::%d\n", stat("/home/prince/study/crawler/files/temp.txt",&st));

	long int file_size=st.st_size;

	printf(" size of file is %ld\n",file_size);

	//allocating size to filevalistr
	char *filevalistr=(char *)malloc(sizeof(char)*(file_size+1));

	//copying html file data into filevalistr
	int i=0;

	FILE *fptr=fopen("/home/prince/study/crawler/files/temp.txt","r");

	if(fptr == NULL)
	{
	printf("file not found\n");
	exit(1);
	}

	char ch;
	ch=getc(fptr);

	while(ch != EOF)
	{
		filevalistr[i++]=ch;
		ch=getc(fptr);
	}

	//filevalistr[i++]='\0';
	fclose(fptr);
	
 	char p[50]={0};
   // printf("hey p is%s\n",p);
    int fileno=k;
    createpathforfile(p,fileno);
    fptr=fopen(p,"w");
    fprintf(fptr,"%s",filevalistr);
	//finalsize mein finalstring k andar jitni rows store hai unka size hai
	int finalsize;
	int *ptr=&finalsize;


	//printf("filevali str is \n %s\n",filevalistr);
	char **finalstorestr=extracturls(filevalistr,ptr);

	//printfinalstore(finalsize,finalstorestr);
	
	int key;
	
	for(int i=0;i<finalsize;i++)
	{
	key=hash(finalstorestr[i]);
	inserthash(h,key,finalstorestr[i],3,totallinks);
	}
	
}
printlist();
printf("total no of links are %d\n",*totallinks);

}