static int
process_cont(const char        *fpath,
	     const struct stat *sb,
	     int               typeflag)
{
    char contname[PATH_MAX];
    char *slash;

    if ((typeflag & FTW_NS) == FTW_NS)  // Stat failed: shouldn't happen
	return(0);
    if ((typeflag & FTW_DNR) == FTW_DNR)// Can not read: shouldn't happen
	return(0);
    if ((typeflag & FTW_D) == FTW_D)    // Directory
	return 0;
    slash = strrchr(fpath, '/');
    if (slash == NULL)          // Can not find /: shouldn't happen
	assert(0);
    if (*(slash+1) == '\0')     // mount point
	return 0;

    if (strcmp(slash+1, NKN_CONTAINER_NAME))
	return 0;

    contname[0] = '\0';
    strncat(contname, fpath, PATH_MAX);
    return read_container(contname);
}
/*
 * Program: cont_read
 *
 */
int
main(int  argc,
     char *argv[])
{
    char *progname;
    int	 ch, ret = 0;
    struct  stat sb;

    progname = argv[0];
    if (argc < 2)
	cont_usage(progname);

    while ((ch = getopt(argc, argv, "1acCdEhlLmMpstvR5:")) != -1) {
	switch (ch) {
	    case '1':
		print_one_entry_per++;
		break;
	    case '5':
		print_md5_chksum++;
		md5_nbytes = atoi(optarg);
		if (md5_nbytes >= 0 && md5_nbytes <= 1024*1024*2) {
		    if ( (md5_nbytes % 512) != 0) {
			printf("Number of bytes for md5 hash has to be multiple"
				" of 512 and less than  or equal to 2MB.\n");
		    cont_usage(progname);
		    }
		}
		break;
	    case 'a':
		print_attrs++;
		print_temp++;
		break;
	    case 'd':
		print_dirname++;
		break;
	    case 'c':
		print_compact_output++;
		break;
	    case 'C':
		checksum_output++;
		break;
	    case 'E':
		syslog_errors++;
		break;
	    case 'h':
		print_header++;
		break;
	    case 'l':
		lowest_tier++;
		break;
	    case 'L':
		print_content_len++;
		break;
	    case 'm':
		print_for_cliweb++;
		break;
	    case 'M':
		ram_drive++;
		break;
	    case 'p':
		print_fullpath++;
		print_dirname = 0;
		break;
	    case 's':
		skip_deleted++;
		break;
	    case 't':
		print_temp++;
		break;
	    case 'v':
		print_attr_version++;
		break;
	    case 'R':
		recursive++;
		break;
	    default:
		cont_usage(progname);
		break;
	}
    }

    if (optind >= argc)
	cont_usage(progname);

    while (optind < argc) {

	if ((ret = stat(argv[optind], &sb)) != 0) {
	    fprintf(stderr, "Unable to find: %s\n", argv[optind]);
	    exit(1);
	}

	if (print_md5_chksum)
	    getrawpartfd(argv[optind]);
	if (recursive) {
	    if (!S_ISDIR(sb.st_mode)) {
		fprintf(stderr,"%s is not a directory\n", argv[optind]);
		cont_usage(progname);
	    }
	    ftw(argv[optind], process_cont, 10);
	} else {
	    if (!S_ISREG(sb.st_mode)) {
		fprintf(stderr,"%s is not a regular file\n", argv[optind]);
		cont_usage(progname);
	    }
	    read_container(argv[optind]);
	}
	optind++;
	if (print_md5_chksum)
	    if (g_rawpart_fd > 0)
		close(g_rawpart_fd);
    }


    return 0;
}	/* main */
Esempio n. 3
0
Container *container_cache_insert_container(ContainerCache *cc, ContainerId cid) {
	/* read container */
	Container *container = 0;
	TIMER_DECLARE(b, e);
	TIMER_BEGIN(b);

	if (cc->enable_data) {
		if (simulation_level >= SIMULATION_RECOVERY) {
			container = read_container_meta_only(cid);
		} else {
			container = read_container(cid);
		}
	} else {
		container = read_container_meta_only(cid);
	}

	TIMER_END(read_container_time, b, e);

	/* If this container is newly appended,
	 * maybe we can read nothing. */
	if (container == NULL) {
		return NULL;
	}

	/* insert */
	Container *evictor = lru_cache_insert(cc->lru_cache, container);

	/* evict */
	if (evictor) {
		int32_t chunknum = container_get_chunk_num(evictor);
		Fingerprint *fingers = container_get_all_fingers(evictor);
		int i = 0;
		/* evict all fingers of evictor from map */
		for (; i < chunknum; ++i) {
			GSequence* container_list = g_hash_table_lookup(cc->map,
					&fingers[i]);
			/* remove the specified container from list */
			GSequenceIter *iter = g_sequence_lookup(container_list, evictor,
					container_cmp_des, NULL);
			if (iter)
				g_sequence_remove(iter);
			else
				dprint("Error! The sequence does not contain the container.");
			if (g_sequence_get_length(container_list) == 0) {
				g_hash_table_remove(cc->map, &fingers[i]);
			}
		}
		free(fingers);
		if (fragment_stream)
			fprintf(fragment_stream, "%.4f\n",
					1.0 * evictor->used_size / CONTAINER_SIZE);
		container_free_full(evictor);
	}

	/* insert */
	int32_t num = container_get_chunk_num(container);
	Fingerprint *nfingers = container_get_all_fingers(container);
	int i = 0;
	for (; i < num; ++i) {
		GSequence* container_list = g_hash_table_lookup(cc->map, &nfingers[i]);
		if (container_list == 0) {
			container_list = g_sequence_new(NULL);
			Fingerprint *finger = (Fingerprint *) malloc(sizeof(Fingerprint));
			memcpy(finger, &nfingers[i], sizeof(Fingerprint));
			g_hash_table_insert(cc->map, finger, container_list);
		}
		g_sequence_insert_sorted(container_list, container, container_cmp_des,
				NULL);
	}
	free(nfingers);
	return container;
}