Exemple #1
0
bool_t savemeta(const plugin_t *p, const char *filename, const char *meta)
{
	restable_t rt;
	uint32_t i;

	/* Открываем файл-пачку */
	if (rt_open(&rt, filename, NULL, meta) == FALSE)
		return FALSE;
	/* Если плагин не указан, пытаемся определить */
	if (p == NULL)
		p = detect_plugin(&rt);
	/* Если определить не удалось - завершаем работу */
	if (p == NULL)
	{
		rt_free(&rt);
		return FALSE;
	}
	/* Если плагин не поддерживает выгрузку метаинформации, то завершаем работу */
	if (p->meta == FALSE)
	{
		fprintf(stderr, "savemeta: This plugin does not support metadata.\n");
		rt_free(&rt);
		return FALSE;
	}
	/* Читаем каталог ресурсов из файла-пачки */
	if (p->read_dir(&rt) == FALSE)
	{
		rt_free(&rt);
		return FALSE;
	}
	/* Из имён ресурсов заполняем имена файлов */
	for(i = 0; i < rt.number; i++)
	{
		if (rt.entries[i].filename != NULL)
			continue;
		if (p->fill_filename(&(rt.entries[i])) == FALSE)
		{
			rt_free(&rt);
			return FALSE;
		}
	}
	if (p->save_meta(&rt) == FALSE)
	{
		fprintf(stderr, "savemeta: Can't save metadata.\n");
		rt_free(&rt);
		return FALSE;
	}
	rt_free(&rt);
	return TRUE;
}
Exemple #2
0
bool_t print(const plugin_t *p, const char *filename)
{
	restable_t rt;
	uint32_t i;

	/* Открываем файл-пачку */
	if (rt_open(&rt, filename, NULL, NULL) == FALSE)
		return FALSE;
	/* Если плагин не указан, пытаемся определить */
	if (p == NULL)
		p = detect_plugin(&rt);
	/* Если определить не удалось - завершаем работу */
	if (p == NULL)
	{
		rt_free(&rt);
		return FALSE;
	}
	/* Читаем каталог ресурсов из файла-пачки */
	if (p->read_dir(&rt) == FALSE)
	{
		rt_free(&rt);
		return FALSE;
	}
	/* Из имён ресурсов заполняем имена файлов */
	for(i = 0; i < rt.number; i++)
	{
		if (rt.entries[i].filename != NULL)
			continue;
		if (p->fill_filename(&(rt.entries[i])) == FALSE)
		{
			rt_free(&rt);
			return FALSE;
		}
	}
        /* Поиск дубликатов ресурсов и ошибок перекрытия ресурсов */
        if (rt_fix(&rt) == FALSE)
        {
                fprintf(stderr, "unpack: rt_fix failed.\n");
                rt_free(&rt);
                return FALSE;
        }
	/* Выводим на стандартный вывод информацию о ресурсах */
	rt_print_dir(&rt, stdout);
	rt_free(&rt);
	return TRUE;
}
Exemple #3
0
static int modify_vnet_link(int cmd, const char* if_name, const char* peer_name, int ns_pid)
{
    int llen; 
    int fd = 0;
    unsigned int seq;
    struct sockaddr_nl loc_addr;
    rt_link_request_t r;
    int ret = 0;

    printf("modifyLink: begin. \n");
	
    memset(&r, 0, sizeof(r));	

    r.ifi.ifi_family = PF_UNSPEC; 
    r.ifi.ifi_index = 0;
    r.ifi.ifi_flags = 0;
	
    if (cmd == RTM_NEWLINK) 
    {	
        rt_link_init(&r.n, RTM_NEWLINK, NLM_F_REQUEST | NLM_F_REPLACE  | NLM_F_CREATE);

        /*unsigned char mac[6] = { 0xa, 1, 2, 3, 4, 5};
        rt_addAttr_data(&r.n, IFA_ADDRESS, mac, 6);*/

        llen = strlen(if_name) + 1;
        rt_addAttr_data(&r.n, IFLA_IFNAME, if_name, llen);

        char* if_kind = "veth";
		
        struct rtattr *rta_linkinfo = rt_addAttr_hdr(&r.n, IFLA_LINKINFO);
        rt_addAttr_data(&r.n, IFLA_INFO_KIND, if_kind, strlen(if_kind) + 1);
	
        struct rtattr *rta_datainfo = rt_addAttr_hdr(&r.n, IFLA_INFO_DATA);

        struct ifinfomsg ifi_p;
        ifi_p.ifi_family = PF_UNSPEC; 
	ifi_p.ifi_index = 0;
	ifi_p.ifi_flags = 0;
		
	struct rtattr *rta_peerinfo = rt_addAttr_data(&r.n, VETH_INFO_PEER, (void*)&ifi_p, sizeof(struct ifinfomsg));
		
	llen = strlen(peer_name) + 1;
	rt_addAttr_data(&r.n, IFLA_IFNAME, peer_name, llen);

        if (ns_pid > 0)
        {
	    unsigned int pid = ns_pid;
	    rt_addAttr_data(&r.n, IFLA_NET_NS_PID, (void*)&pid, sizeof(unsigned int));
        }
	
        /*unsigned char mac2[6] = { 0xa, 1, 2, 3, 4, 6};
	rt_addAttr_data(&r.n, IFA_ADDRESS, mac2, 6);*/

	rt_compAttr_hdr(&r.n, rta_peerinfo);
	rt_compAttr_hdr(&r.n, rta_datainfo);
	rt_compAttr_hdr(&r.n, rta_linkinfo);		
    } 
    else if (cmd == RTM_DELLINK) 
    {
        rt_link_init(&r.n, RTM_DELLINK, NLM_F_REQUEST);
	llen = strlen(if_name) + 1;
	rt_addAttr_data(&r.n, IFLA_IFNAME, if_name, llen);
    }

    /*--------*/
    /* Now open a netlink socket */
    if ((fd = rt_open(&loc_addr)) < 0) 
    {
        ret = -1;
        goto end;
    }

    seq = time(NULL);

    /* Send the attribute message and wait for ACK */	
    if (rt_send(fd, &seq, &r.n, &loc_addr) < 0) 
    {
        ret = -1;
        goto end;
    }

    /*---------*/
    printf("modifyLink: happy end. \n"); 
	
end:
    if (fd > 0) 
    {
        close(fd);
    }

    return ret;
}
Exemple #4
0
bool_t unpack(const plugin_t *p, const char *filename, const char *path, const char *meta)
{
	restable_t rt;
	uint32_t i;

	/* Открываем файл-пачку */
	if (rt_open(&rt, filename, path, meta) == FALSE)
		return FALSE;
	/* Если плагин не указан, пытаемся определить */
	if (p == NULL)
		p = detect_plugin(&rt);
	/* Если определить не удалось - завершаем работу */
	if (p == NULL)
	{
		rt_free(&rt);
		return FALSE;
	}
	/* Читаем каталог ресурсов из файла-пачки */
	if (p->read_dir(&rt) == FALSE)
	{
		rt_free(&rt);
		return FALSE;
	}
	/* Из имён ресурсов заполняем имена файлов */
	for(i = 0; i < rt.number; i++)
	{
		if (rt.entries[i].filename != NULL)
			continue;
		if (p->fill_filename(&(rt.entries[i])) == FALSE)
		{
			rt_free(&rt);
			return FALSE;
		}
	}
        /* Поиск дубликатов ресурсов и ошибок перекрытия ресурсов */
	if (rt_fix(&rt) == FALSE)
	{
		fprintf(stderr, "unpack: rt_fix failed.\n");
		rt_free(&rt);
		return FALSE;
	}
	/* Создаём каталоги, необходимые для извлечения файлов */
	if (p->subdirs == TRUE)
	{
		if (rt_make_dirs(&rt) == FALSE)
		{
			rt_free(&rt);
			return FALSE;
		}
	}
	else
	{
		if (mkpath(rt.basepath, 0777) == FALSE)
		{
			rt_free(&rt);
			return FALSE;
		}
	}
	/* Выгружаем мета-информацию, если выгрузка поддерживается плагином */
	if (p->meta == TRUE)
		if (p->save_meta(&rt) == FALSE)
		{
			rt_free(&rt);
			return FALSE;
		}
	/* Читаем ресурсы и сохраняем как файлы */
	for(i = 0; i < rt.number; i++)
	{
		fprintf(stderr, "Unpacked %u/%u\r", i, rt.number);
		if (p->extract_resource(&rt, i) == FALSE)
		{
			fprintf(stderr, "unpack: Can't extract resource #%u.\n", i);
			rt_free(&rt);
			return FALSE;
		}
		if (p->time == TRUE)
			if (rt_set_timestamp(&rt, i) == FALSE)
			{
				fprintf(stderr, "unpack: Can't set time of resource #%u.\n", i);
				rt_free(&rt);
				return FALSE;
			}
	}
	fprintf(stderr, "Unpacking finished.	\n");
	rt_free(&rt);
	return TRUE;
}