⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hv_store.c

📁 思科路由器仿真器,用来仿7200系列得,可以在电脑上模拟路由器
💻 C
字号:
/* * Cisco router simulation platform. * Copyright (c) 2007 Christophe Fillot (cf@utc.fr) * * Hypervisor store. */#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <string.h>#include <sys/types.h>#include <sys/stat.h>#include <sys/mman.h>#include <signal.h>#include <fcntl.h>#include <errno.h>#include <assert.h>#include <stdarg.h>#include <sys/ioctl.h>#include <sys/types.h>#include <sys/socket.h>#include <arpa/inet.h>#include <pthread.h>#include "utils.h"#include "base64.h"#include "registry.h"#include "hypervisor.h"struct store_object {   char *name;       /* Object name */   void *data;       /* Data pointer */   size_t len;       /* Data length */};/* Create an object of the given name */static struct store_object *so_create(char *name,void *data,size_t len){   struct store_object *so;   if (!(so = malloc(sizeof(*so))))      return NULL;   if (!(so->name = strdup(name)))      goto err_name;   so->data = data;   so->len  = len;   if (registry_add(so->name,OBJ_TYPE_STORE,so) == -1)      goto err_registry;   return so; err_registry:   free(so->name); err_name:   free(so);   return NULL;}/* Delete a store object */static void so_delete(struct store_object *so){   if (so != NULL) {      free(so->name);      free(so->data);      free(so);   }}/* Free resources used by a store object (registry callback) */static int so_reg_delete(void *data,void *arg){   so_delete((struct store_object *)data);   return(TRUE);}/* Delete a store object from the registry */static int so_delete_from_registry(char *name){   return(registry_delete_if_unused(name,OBJ_TYPE_STORE,so_reg_delete,NULL));}/* Write an object (data provided in base64 encoding) */static int cmd_write(hypervisor_conn_t *conn,int argc,char *argv[]){      struct store_object *so;   u_char *buffer;   ssize_t len;   /* Convert base64 input to standard text */   if (!(buffer = malloc(3 * strlen(argv[1]))))      goto err_alloc_base64;   if ((len = base64_decode(buffer,(u_char *)argv[1],0)) < 0)      goto err_decode_base64;   if (!(so = so_create(argv[0],buffer,len))) {      free(buffer);      hypervisor_send_reply(conn,HSC_ERR_CREATE,1,"unable to store object");      return(-1);   }   registry_unref(so->name,OBJ_TYPE_STORE);   hypervisor_send_reply(conn,HSC_INFO_OK,1,"OK");   return(0); err_decode_base64:   free(buffer); err_alloc_base64:   hypervisor_send_reply(conn,HSC_ERR_CREATE,1,"unable to decode base64");   return(-1);}/* Read an object and return data in base64 encoding */ static int cmd_read(hypervisor_conn_t *conn,int argc,char *argv[]){   struct store_object *so;   u_char *buffer;   if (!(so = hypervisor_find_object(conn,argv[0],OBJ_TYPE_STORE)))      return(-1);   /*     * Convert data to base64. base64 is about 1/3 larger than input,    * let's be on the safe side with twice longer.    */   if (!(buffer = malloc(so->len * 2)))      goto err_alloc_base64;   base64_encode(buffer,so->data,so->len);   registry_unref(so->name,OBJ_TYPE_STORE);   hypervisor_send_reply(conn,HSC_INFO_OK,1,"%s",buffer);   free(buffer);   return(0); err_alloc_base64:   registry_unref(so->name,OBJ_TYPE_STORE);   hypervisor_send_reply(conn,HSC_ERR_CREATE,1,                         "unable to encode data in base64",                         argv[0]);   return(-1);}/* Delete an object from the store */static int cmd_delete(hypervisor_conn_t *conn,int argc,char *argv[]){   if (so_delete_from_registry(argv[0]) < 0) {      hypervisor_send_reply(conn,HSC_ERR_DELETE,1,"unable to delete object %s",                            argv[0]);      return(-1);   } else {      hypervisor_send_reply(conn,HSC_INFO_OK,1,"object %s deleted",argv[0]);      return(0);   }}/* Delete all objects from the store */static int cmd_delete_all(hypervisor_conn_t *conn,int argc,char *argv[]){   registry_delete_type(OBJ_TYPE_STORE,so_reg_delete,NULL);   hypervisor_send_reply(conn,HSC_INFO_OK,1,"object store deleted");   return(0);}/* Show info about a store object */static void cmd_show_obj_list(registry_entry_t *entry,void *opt,int *err){   hypervisor_conn_t *conn = opt;   struct store_object *so = entry->data;   hypervisor_send_reply(conn,HSC_INFO_MSG,0,"%s (len=%ld)",                         entry->name,(long)so->len);}/* Object list */static int cmd_obj_list(hypervisor_conn_t *conn,int argc,char *argv[]){   int err = 0;   registry_foreach_type(OBJ_TYPE_STORE,cmd_show_obj_list,conn,&err);   hypervisor_send_reply(conn,HSC_INFO_OK,1,"OK");   return(0);}/* "store" commands */static hypervisor_cmd_t store_cmd_array[] = {   { "write", 2, 2, cmd_write, NULL },   { "read", 1, 1, cmd_read, NULL },   { "delete", 1, 1, cmd_delete, NULL },   { "delete_all", 0, 0, cmd_delete_all, NULL },   { "list", 0, 0, cmd_obj_list, NULL },   { NULL, -1, -1, NULL, NULL },};/* Hypervisor store initialization */int hypervisor_store_init(void){   hypervisor_module_t *module;   module = hypervisor_register_module("object_store",NULL);   assert(module != NULL);   hypervisor_register_cmd_array(module,store_cmd_array);   return(0);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -