Ejemplo n.º 1
0
Archivo: libffs2.c Proyecto: gdhh/ffs
int ffs_iterate_entries(ffs_t * self, int (*func) (ffs_entry_t *))
{
	int rc = __ffs_iterate_entries(self, func);
	if (rc < 0) {
		err_t *err = err_get();
		assert(err != NULL);

		__error.errnum = err_code(err);
		snprintf(__error.errstr, sizeof __error.errstr,
			 "%s: %s : %s(%d) : (code=%d) %.*s\n",
			 program_invocation_short_name,
			 err_type_name(err), err_file(err), err_line(err),
			 err_code(err), err_size(err), (char *)err_data(err));

		rc = -1;
	}

	return rc;
}
Ejemplo n.º 2
0
int command_trunc(args_t * args)
{
	assert(args != NULL);

	char name[strlen(args->name) + 2];
	strcpy(name, args->name);
	if (strrchr(name, '$') == NULL)
		strcat(name, "$");

	off_t __poffset;
	ffs_t * __ffs;

	char full_name[page_size];
	regex_t rx;

	/* ========================= */

	int trunc_entry(ffs_entry_t * entry)
	{
                if (__ffs_entry_name(__ffs, entry, full_name,
				     sizeof full_name) < 0)
			return -1;

		if (regexec(&rx, full_name, 0, NULL, 0) == REG_NOMATCH)
			return 0;

		if (entry->flags & FFS_FLAGS_PROTECTED &&
		    args->force != f_FORCE) {
			printf("%llx: %s: protected, skipping truncate\n",
			       (long long)__poffset, full_name);
			return 0;
		}

		uint32_t size = entry->size * __ffs->hdr->block_size;
		if (args->size != NULL)
			if (parse_size(args->size, &size) < 0)
				return -1;

		if (__ffs_entry_truncate(__ffs, full_name, size) < 0)
			return -1;

		if (args->verbose == f_VERBOSE)
			printf("%llx: %s: truncate size '%x'\n", (long long)__poffset,
			       full_name, size);

		return 0;
	}

	int trunc(args_t * args, off_t poffset)
	{
		__poffset = poffset;

		const char * target = args->target;
		int debug = args->debug;

		RAII(FILE*, file, fopen_generic(target, "r+", debug), fclose);
		if (file == NULL)
			return -1;
		RAII(ffs_t*, ffs, __ffs_fopen(file, poffset), __ffs_fclose);
		if (ffs == NULL)
			return -1;

		__ffs = ffs;

		int rc = __ffs_iterate_entries(ffs, trunc_entry);
		if (rc == 1)
			return -1;

		return rc;
	}