Exemplo n.º 1
0
Arquivo: prim.c Projeto: mdbarr/vcsi
VCSI_OBJECT obj_sort(VCSI_CONTEXT vc,
		    VCSI_OBJECT x) {
  
  VCSI_OBJECT tmp, res;
  INFOSTD_PHEAP iph;
  unsigned long len;

  check_arg_type(vc,x,CONS,"sort");
  len = get_length(x);

  if(!len)
    return x;
  
  iph = infostd_pheap_init(INFOSTD_HEAP_MIN, obj_compare_void,len+1);
  
  for(tmp=x;TYPEP(tmp,CONS);tmp=cdr(vc,tmp))
    infostd_pheap_push(iph,(void*)car(vc,tmp));
  
  res = NULL;

  while((tmp=(VCSI_OBJECT)infostd_pheap_pop(iph))!=(void*)ULONG_MAX)
    res = cons(vc,tmp,res);

  infostd_pheap_free(iph);

  return vcsi_list_reverse(vc,res);
}
Exemplo n.º 2
0
/*Check the number of arguments of the instruction*/
int	check_argvs(op_t *mnemo, t_instruction *instruction)
{
    int	i;
    int	max;

    max = 0;
    while (instruction && instruction->arg != NULL && instruction->arg[max++]);
    i = -1;
    while (++i < MAX_ARGS_NUMBER && instruction && instruction->arg)
    {
        if (mnemo->nbr_args > i)
            if (instruction->arg[i])
                check_arg_type(instruction->arg[i], mnemo->type[i],
                               instruction, mnemo->mnemonique);
            else
                print_error_message("Asm: Warning: Bad argument",
                                    *instruction->label->name, mnemo->mnemonique
                                    , instruction->line);
        else if (i < max - 1)
        {
            print_error_message("Asm: Trailing garbage",
                                *instruction->label->name, mnemo->mnemonique
                                , instruction->line);
            return (1);
        }
    }
    return (0);
}
Exemplo n.º 3
0
Arquivo: dynl.c Projeto: mdbarr/vcsi
VCSI_OBJECT module_loaded(VCSI_CONTEXT vc,
			  VCSI_OBJECT x) {
  
  check_arg_type(vc,x,STRING,"module-loaded?");
  
  if(infostd_hash_str_info(vc->dynl_hash,STR(x))!=ULONG_MAX)
    return vc->true;
  return vc->false;
}
Exemplo n.º 4
0
Arquivo: prim.c Projeto: mdbarr/vcsi
VCSI_OBJECT do_sleep(VCSI_CONTEXT vc,
		     VCSI_OBJECT x) {

  check_arg_type(vc,x,LNGNUM,"sleep");
  if(LNGN(x) < 0)
    error(vc,"argument to sleep out of range",x);

  sleep(LNGN(x));

  return vc->true;
}
Exemplo n.º 5
0
Arquivo: perl.c Projeto: mdbarr/vcsi
/* Evalute perl code */
VCSI_OBJECT perl_eval(VCSI_CONTEXT vc, 
		      VCSI_OBJECT x) {
  
  SV *val;
  check_arg_type(vc,x,STRING,"perl-eval");

  /*printf("Trying to eval:\n%s\n",STR(x));*/
  
  val = eval_pv(STR(x),TRUE);
  if(val)
    return perl_return(vc,val);
  return vc->false;
}
Exemplo n.º 6
0
cellpoint apply_proc(cellpoint arglst)
{
	int len;
	args_push(arglst);
	len = get_integer(list_len());
	if (len < 2){
		printf("Error: the procedure \"apply\" expects at least 2 arguments.\n");
		error_handler();
	}
	check_arg_type("apply", "first", car(arglst), PROCEDURE_T);

	args_push(a_false);
	args_push(combine_args(cdr(arglst)));
	args_push(car(arglst));
	return apply();
}
Exemplo n.º 7
0
Arquivo: prim.c Projeto: mdbarr/vcsi
VCSI_OBJECT get_localtime(VCSI_CONTEXT vc,
			  VCSI_OBJECT x) {

  char buf[100];
  struct tm* lt;
  time_t tt;

  check_arg_type(vc,x,LNGNUM,"localtime");
  
  tt = LNGN(x);
  lt = localtime(&tt);
  
  sprintf(buf,"%d/%d/%d %d:%2.2d:%2.2d",lt->tm_mon+1,lt->tm_mday,
	  lt->tm_year+1900,lt->tm_hour,lt->tm_min,lt->tm_sec);

  return make_string(vc,buf);
}
Exemplo n.º 8
0
Arquivo: perl.c Projeto: mdbarr/vcsi
/* read a perl scalar */
VCSI_OBJECT perl_sc_var(VCSI_CONTEXT vc,
			VCSI_OBJECT x) {

  SV* val;
  char* s;

  check_arg_type(vc,x,STRING,"perl-sc-var");

  s = STR(x);
  if(*s == '$')
    s++;

  val = get_sv(s,FALSE);
  
  if(val)
    return perl_return(vc,val);
  return vc->false;
}
Exemplo n.º 9
0
Arquivo: prim.c Projeto: mdbarr/vcsi
VCSI_OBJECT do_usleep(VCSI_CONTEXT vc,
		      VCSI_OBJECT x) {

#ifndef HAVE_USLEEP
  struct timeval tv;  
#endif

  check_arg_type(vc,x,LNGNUM,"usleep");
  if(LNGN(x) < 0)
    error(vc,"argument to usleep out of range",x);
#ifdef HAVE_USLEEP
  usleep(LNGN(x));
#else
  tv.tv_sec = 0;
  tv.tv_usec = LNGN(x);
  select(0,NULL,NULL,NULL,&tv);
#endif

  return vc->true;
}
Exemplo n.º 10
0
Arquivo: prim.c Projeto: mdbarr/vcsi
VCSI_OBJECT do_error(VCSI_CONTEXT vc,
		     VCSI_OBJECT args, 
		     VCSI_OBJECT env) {

  VCSI_OBJECT x, y, z;
  if(get_length(args) < 2)
    return error(vc,"invalid number of arguments to error",args);
  
  x = car(vc,args);
  y = cadr(vc,args);

  if(!TYPEP(x,STRING) && TYPEP(y,STRING)) {
    z = x;
    x = y;
    y = z;
  }

  check_arg_type(vc,x,STRING,"error");

  return error(vc,STR(x),y);
}
Exemplo n.º 11
0
Arquivo: prim.c Projeto: mdbarr/vcsi
VCSI_OBJECT get_localtime_list(VCSI_CONTEXT vc,
			       VCSI_OBJECT x) {

  struct tm* lt;
  time_t tt;

  check_arg_type(vc,x,LNGNUM,"localtime->list");
  
  tt = LNGN(x);
  lt = localtime(&tt);
  
  return make_list(vc,9,make_long(vc,lt->tm_sec),
		   make_long(vc,lt->tm_min),
		   make_long(vc,lt->tm_hour),
		   make_long(vc,lt->tm_mday),
		   make_long(vc,lt->tm_mon),
		   make_long(vc,lt->tm_year+1900),
		   make_long(vc,lt->tm_wday),
		   make_long(vc,lt->tm_yday),
		   make_long(vc,lt->tm_isdst));
}
Exemplo n.º 12
0
Arquivo: dynl.c Projeto: mdbarr/vcsi
VCSI_OBJECT dyn_load_opt(VCSI_CONTEXT vc, 
			 VCSI_OBJECT x,
			 int reload) {

  void* tmp;
  void (*func)();
  char* mname;
   
  check_arg_type(vc,x,STRING,"dynamic-load");

  tmp = dlopen(STR(x),RTLD_LAZY);
  if(!tmp) {
    infostd_dyn_str_strcpy(vc->tmpstr,VCSI_MOD_DIR);
    infostd_dyn_str_strcat(vc->tmpstr,STR(x));
    if(!strstr(vc->tmpstr->buff,".so"))
      infostd_dyn_str_strcat(vc->tmpstr,".so");
	
    tmp = dlopen(vc->tmpstr->buff,RTLD_LAZY);
	
    if(!tmp)
      return error(vc,"file does not exist",x);
  }
  
  mname = (char*)dlsym(tmp,"module_name");

  func = (void (*) ()) dlsym(tmp,"module_init");
  if(!func)
    return error(vc,"can't initialize module",x);
  
  if(mname) {
    if(infostd_hash_str_info(vc->dynl_hash,mname)==ULONG_MAX) {
      infostd_hash_str_add(vc->dynl_hash,mname,1);
      func(vc);
    } else if(reload) /* Re-run the function if in reload mode */
      func(vc);
  } else
    func(vc);
   
  return vc->true;
}
Exemplo n.º 13
0
int main(int ac, char **av)
{
    struct btrfs_root *root;
    struct btrfs_fs_info *info;
    struct btrfs_path path;
    struct btrfs_key key;
    struct btrfs_root_item ri;
    struct extent_buffer *leaf;
    struct btrfs_disk_key disk_key;
    struct btrfs_key found_key;
    char uuidbuf[BTRFS_UUID_UNPARSED_SIZE];
    int ret;
    int slot;
    int extent_only = 0;
    int device_only = 0;
    int uuid_tree_only = 0;
    int roots_only = 0;
    int root_backups = 0;
    u64 block_only = 0;
    struct btrfs_root *tree_root_scan;
    u64 tree_id = 0;

    radix_tree_init();

    while(1) {
        int c;
        static const struct option long_options[] = {
            { "help", no_argument, NULL, GETOPT_VAL_HELP},
            { NULL, 0, NULL, 0 }
        };

        c = getopt_long(ac, av, "deb:rRut:", long_options, NULL);
        if (c < 0)
            break;
        switch(c) {
        case 'e':
            extent_only = 1;
            break;
        case 'd':
            device_only = 1;
            break;
        case 'r':
            roots_only = 1;
            break;
        case 'u':
            uuid_tree_only = 1;
            break;
        case 'R':
            roots_only = 1;
            root_backups = 1;
            break;
        case 'b':
            block_only = arg_strtou64(optarg);
            break;
        case 't':
            tree_id = arg_strtou64(optarg);
            break;
        case GETOPT_VAL_HELP:
        default:
            print_usage(c != GETOPT_VAL_HELP);
        }
    }
    set_argv0(av);
    ac = ac - optind;
    if (check_argc_exact(ac, 1))
        print_usage(1);

    ret = check_arg_type(av[optind]);
    if (ret != BTRFS_ARG_BLKDEV && ret != BTRFS_ARG_REG) {
        fprintf(stderr, "'%s' is not a block device or regular file\n",
                av[optind]);
        exit(1);
    }

    info = open_ctree_fs_info(av[optind], 0, 0, OPEN_CTREE_PARTIAL);
    if (!info) {
        fprintf(stderr, "unable to open %s\n", av[optind]);
        exit(1);
    }

    root = info->fs_root;
    if (!root) {
        fprintf(stderr, "unable to open %s\n", av[optind]);
        exit(1);
    }

    if (block_only) {
        leaf = read_tree_block(root,
                               block_only,
                               root->leafsize, 0);

        if (extent_buffer_uptodate(leaf) &&
                btrfs_header_level(leaf) != 0) {
            free_extent_buffer(leaf);
            leaf = NULL;
        }

        if (!leaf) {
            leaf = read_tree_block(root,
                                   block_only,
                                   root->nodesize, 0);
        }
        if (!extent_buffer_uptodate(leaf)) {
            fprintf(stderr, "failed to read %llu\n",
                    (unsigned long long)block_only);
            goto close_root;
        }
        btrfs_print_tree(root, leaf, 0);
        free_extent_buffer(leaf);
        goto close_root;
    }

    if (!(extent_only || uuid_tree_only || tree_id)) {
        if (roots_only) {
            printf("root tree: %llu level %d\n",
                   (unsigned long long)info->tree_root->node->start,
                   btrfs_header_level(info->tree_root->node));
            printf("chunk tree: %llu level %d\n",
                   (unsigned long long)info->chunk_root->node->start,
                   btrfs_header_level(info->chunk_root->node));
        } else {
            if (info->tree_root->node) {
                printf("root tree\n");
                btrfs_print_tree(info->tree_root,
                                 info->tree_root->node, 1);
            }

            if (info->chunk_root->node) {
                printf("chunk tree\n");
                btrfs_print_tree(info->chunk_root,
                                 info->chunk_root->node, 1);
            }
        }
    }
    tree_root_scan = info->tree_root;

    btrfs_init_path(&path);
again:
    if (!extent_buffer_uptodate(tree_root_scan->node))
        goto no_node;

    /*
     * Tree's that are not pointed by the tree of tree roots
     */
    if (tree_id && tree_id == BTRFS_ROOT_TREE_OBJECTID) {
        if (!info->tree_root->node) {
            error("cannot print root tree, invalid pointer");
            goto no_node;
        }
        printf("root tree\n");
        btrfs_print_tree(info->tree_root, info->tree_root->node, 1);
        goto no_node;
    }

    if (tree_id && tree_id == BTRFS_CHUNK_TREE_OBJECTID) {
        if (!info->chunk_root->node) {
            error("cannot print chunk tree, invalid pointer");
            goto no_node;
        }
        printf("chunk tree\n");
        btrfs_print_tree(info->chunk_root, info->chunk_root->node, 1);
        goto no_node;
    }

    key.offset = 0;
    key.objectid = 0;
    btrfs_set_key_type(&key, BTRFS_ROOT_ITEM_KEY);
    ret = btrfs_search_slot(NULL, tree_root_scan, &key, &path, 0, 0);
    BUG_ON(ret < 0);
    while(1) {
        leaf = path.nodes[0];
        slot = path.slots[0];
        if (slot >= btrfs_header_nritems(leaf)) {
            ret = btrfs_next_leaf(tree_root_scan, &path);
            if (ret != 0)
                break;
            leaf = path.nodes[0];
            slot = path.slots[0];
        }
        btrfs_item_key(leaf, &disk_key, path.slots[0]);
        btrfs_disk_key_to_cpu(&found_key, &disk_key);
        if (btrfs_key_type(&found_key) == BTRFS_ROOT_ITEM_KEY) {
            unsigned long offset;
            struct extent_buffer *buf;
            int skip = extent_only | device_only | uuid_tree_only;

            offset = btrfs_item_ptr_offset(leaf, slot);
            read_extent_buffer(leaf, &ri, offset, sizeof(ri));
            buf = read_tree_block(tree_root_scan,
                                  btrfs_root_bytenr(&ri),
                                  btrfs_level_size(tree_root_scan,
                                                   btrfs_root_level(&ri)),
                                  0);
            if (!extent_buffer_uptodate(buf))
                goto next;
            if (tree_id && found_key.objectid != tree_id) {
                free_extent_buffer(buf);
                goto next;
            }

            switch(found_key.objectid) {
            case BTRFS_ROOT_TREE_OBJECTID:
                if (!skip)
                    printf("root");
                break;
            case BTRFS_EXTENT_TREE_OBJECTID:
                if (!device_only && !uuid_tree_only)
                    skip = 0;
                if (!skip)
                    printf("extent");
                break;
            case BTRFS_CHUNK_TREE_OBJECTID:
                if (!skip) {
                    printf("chunk");
                }
                break;
            case BTRFS_DEV_TREE_OBJECTID:
                if (!uuid_tree_only)
                    skip = 0;
                if (!skip)
                    printf("device");
                break;
            case BTRFS_FS_TREE_OBJECTID:
                if (!skip) {
                    printf("fs");
                }
                break;
            case BTRFS_ROOT_TREE_DIR_OBJECTID:
                skip = 0;
                printf("directory");
                break;
            case BTRFS_CSUM_TREE_OBJECTID:
                if (!skip) {
                    printf("checksum");
                }
                break;
            case BTRFS_ORPHAN_OBJECTID:
                if (!skip) {
                    printf("orphan");
                }
                break;
            case BTRFS_TREE_LOG_OBJECTID:
                if (!skip) {
                    printf("log");
                }
                break;
            case BTRFS_TREE_LOG_FIXUP_OBJECTID:
                if (!skip) {
                    printf("log fixup");
                }
                break;
            case BTRFS_TREE_RELOC_OBJECTID:
                if (!skip) {
                    printf("reloc");
                }
                break;
            case BTRFS_DATA_RELOC_TREE_OBJECTID:
                if (!skip) {
                    printf("data reloc");
                }
                break;
            case BTRFS_EXTENT_CSUM_OBJECTID:
                if (!skip) {
                    printf("extent checksum");
                }
                break;
            case BTRFS_QUOTA_TREE_OBJECTID:
                if (!skip) {
                    printf("quota");
                }
                break;
            case BTRFS_UUID_TREE_OBJECTID:
                if (!extent_only && !device_only)
                    skip = 0;
                if (!skip)
                    printf("uuid");
                break;
            case BTRFS_FREE_SPACE_TREE_OBJECTID:
                if (!skip)
                    printf("free space");
                break;
            case BTRFS_MULTIPLE_OBJECTIDS:
                if (!skip) {
                    printf("multiple");
                }
                break;
            default:
                if (!skip) {
                    printf("file");
                }
            }
            if (extent_only && !skip) {
                print_extents(tree_root_scan, buf);
            } else if (!skip) {
                printf(" tree ");
                btrfs_print_key(&disk_key);
                if (roots_only) {
                    printf(" %llu level %d\n",
                           (unsigned long long)buf->start,
                           btrfs_header_level(buf));
                } else {
                    printf(" \n");
                    btrfs_print_tree(tree_root_scan, buf, 1);
                }
            }
            free_extent_buffer(buf);
        }
next:
        path.slots[0]++;
    }
no_node:
    btrfs_release_path(&path);

    if (tree_root_scan == info->tree_root &&
            info->log_root_tree) {
        tree_root_scan = info->log_root_tree;
        goto again;
    }

    if (extent_only || device_only || uuid_tree_only)
        goto close_root;

    if (root_backups)
        print_old_roots(info->super_copy);

    printf("total bytes %llu\n",
           (unsigned long long)btrfs_super_total_bytes(info->super_copy));
    printf("bytes used %llu\n",
           (unsigned long long)btrfs_super_bytes_used(info->super_copy));
    uuidbuf[BTRFS_UUID_UNPARSED_SIZE - 1] = '\0';
    uuid_unparse(info->super_copy->fsid, uuidbuf);
    printf("uuid %s\n", uuidbuf);
    printf("%s\n", PACKAGE_STRING);
close_root:
    ret = close_ctree(root);
    btrfs_close_all_devices();
    return ret;
}