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; }
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; }
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; }
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; }