LINUX.ORG.RU

Вывести содержание бинарного файла


0

1

Здравствуйте, необходимо вывести содержание бинарного файла mv

len = filesize("/bin/mv");
FILE * f;
f = fopen("/bin/mv", "r");
char* ptr = buf;
while((fread(ptr, 1, 1, f)) > 0)
{
    ptr++;
}
fclose(f);
return len;
хотя в консоли вот так cat /bin/mv выводит. Если работать с head, то «/usr/bin/head» работает(в консоли cat /usr/bin/head )

Вот весь код программы



#define FUSE_USE_VERSION 26

#include <fuse.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <fcntl.h>
#include <stdlib.h>

static const char *bar_path ="/bar";//papka
static const char *foo_path ="/foo";//papka
static const char *bin_path ="/bin";//papka
static const char *baz_path ="/baz";//papka
static const char *example_path ="/bar/example";//file
static const char *example_str = "Hello World\n";
static const char *readmetxt_path ="/bar/readme.txt";//file
static const char *readmetxt_str = "status name surname number \n";
static const char *testtxt_path ="/foo/test.txt";
static const char *testtxt_str = "1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n";//file
static const char *mv_path ="/foo/mv";//file

static char* tempFile = "";
static char* tempContent = ""; 


size_t filesize(const char *filename){
     struct stat st;
     size_t retval=0;
     if(stat(filename,&st) ){
	     printf("cannot stat %s\n",filename);
     }else{
	   retval=st.st_size;
     }
     return retval;
}

static int lab5_getattr(const char *path, struct stat *stbuf)
{
	int res = 0;

	memset(stbuf, 0, sizeof(struct stat));
	if (strcmp(path, "/") == 0) {
		stbuf->st_mode = S_IFDIR | 0717;//755
		stbuf->st_nlink = 2;
	} else if (strcmp(path, bin_path) == 0) {//papka
		stbuf->st_mode = S_IFDIR | 0511;
		stbuf->st_nlink = 2;
	} else if (strcmp(path, foo_path) == 0) {//papka
		stbuf->st_mode = S_IFDIR | 0233;
		stbuf->st_nlink = 2;
	}else if (strcmp(path, bar_path) == 0) {//papka
		stbuf->st_mode = S_IFDIR | 0511;
		stbuf->st_nlink = 2;
	} else if (strcmp(path, baz_path) == 0) {//papka
		stbuf->st_mode = S_IFDIR | 0777;
		stbuf->st_nlink = 2;
	}  else if (strcmp(path, "/bin") == 0) {//v papke papka а в папке папка а в папке еще папка)
		stbuf->st_mode = S_IFDIR | 0007;//144
		stbuf->st_nlink = 2;
	} else if (strcmp(path, "/baz") == 0) {//v papke papka
		stbuf->st_mode = S_IFDIR | 0577;
		stbuf->st_nlink = 2;
	} else if (strcmp(path, "/foo") == 0) {//v papke papka
		stbuf->st_mode = S_IFDIR | 0007;//144
		stbuf->st_nlink = 2;
	
	} else if (strcmp(path, "/bar") == 0) {//v papke papka
		stbuf->st_mode = S_IFDIR | 0007;//144
		stbuf->st_nlink = 2;
	} 
	else if (strcmp(path, example_path) == 0) {
		stbuf->st_mode = S_IFREG | 0222;// file in foo/baz
		stbuf->st_nlink = 1;
		stbuf->st_size = strlen(example_str);
	} else if (strcmp(path, readmetxt_path) == 0) {
		stbuf->st_mode = S_IFREG | 0444;//644
		stbuf->st_nlink = 1;
		stbuf->st_size = strlen(readmetxt_str);
	} else if (strcmp(path, testtxt_path) == 0) {
		stbuf->st_mode = S_IFREG | 0707;//0707
		stbuf->st_nlink = 1;
		stbuf->st_size = strlen(testtxt_str);
	} else if (strcmp(path, mv_path) == 0) {
		stbuf->st_mode = S_IFREG | 0777;//head
		stbuf->st_nlink = 1;
		//stbuf->st_size = strlen(mv_path);
		size_t size = filesize("bin/mv");
		stbuf->st_size = size;
	} else
		res = -ENOENT;

	return res;
}

static int lab5_readdir(const char *path, void *buf, fuse_fill_dir_t filler,
			 off_t offset, struct fuse_file_info *fi)
{
	(void) offset;
	(void) fi;

	if (strcmp(path, "/") == 0) {	
		filler(buf, ".", NULL, 0);
		filler(buf, "..", NULL, 0);
		filler(buf, bin_path + 1, NULL, 0);
        	filler(buf, bar_path + 1, NULL, 0);
		filler(buf, baz_path + 1, NULL, 0);
		filler(buf, foo_path + 1, NULL, 0);
		
	}else if (strcmp(path, bar_path) == 0) {
		filler(buf, ".", NULL, 0);
		filler(buf, "..", NULL, 0);
		filler(buf, "/readme.txt" + 1, NULL, 0);
		filler(buf, "/example" + 1, NULL, 0);
	}else if (strcmp(path, foo_path) == 0) {
		filler(buf, ".", NULL, 0);
		filler(buf, "..", NULL, 0);
		filler(buf, "/mv" + 1, NULL, 0);
		filler(buf, "/test.txt" + 1, NULL, 0);
	}
	else
		return -ENOENT;

	return 0;
}

static int lab5_open(const char *path, struct fuse_file_info *fi)
{
	if ((strcmp(path, example_path) != 0)&&(strcmp(path, readmetxt_path) != 0)&&(strcmp(path, testtxt_path) != 0)&&(strcmp(path, mv_path) != 0))
		return -ENOENT;

	if ((fi->flags & 3) != O_RDONLY)
		return -EACCES;

	return 0;
}

static int lab5_read(const char *path, char *buf, size_t size, off_t offset,
		      struct fuse_file_info *fi)
{
	size_t len;
	(void) fi;
	if(strcmp(path, example_path) == 0)
	{	
		return -EACCES;
	}
	else if(strcmp(path, readmetxt_path) == 0)
	{	
		len = strlen(readmetxt_str);
		if (offset < len) {
			if (offset + size > len)
				size = len - offset;
			memcpy(buf, readmetxt_str + offset, size);
		} else
			size = 0;
		return size;
	}
	else if(strcmp(path, testtxt_path) == 0)
	{	
		len = strlen(testtxt_str);
		if (offset < len) {
			if (offset + size > len)
				size = len - offset;
			memcpy(buf, testtxt_str + offset, size);
		} else
			size = 0;
		return size;
	}
	else if(strcmp(path, mv_path) == 0)
	{
		len = filesize("/bin/mv");
		FILE * f;
		f = fopen("/bin/mv", "r");
		char* ptr = buf;
		while((fread(ptr, 1, 1, f)) > 0)
		{
			ptr++;
		}
		fclose(f);
		return len;
	}
	else
		return -ENOENT;
}


char* memcpu(char* source, char* buf)
{
    int size = strlen(source) + strlen(buf) + 1;   
    char* result = (char*)malloc(sizeof(char)*size);
    result[size - 1] = 0; // ставим отделяющий символ
    int i = 0;
    for(; i < strlen(source); i++) // переносим существующее значение
    {
        result[i] = source[i];
    }
    for(; i < size; i++) // добавляем значение буфера
    {
        result[i] = buf[i - strlen(source)];
    }
    return result; // возвращаем указатель на область памяти . содежращую старые данные и данные , переданные в буфере.
}
static int  d_write(const char *path, const char *buf, size_t size, off_t offset,
              struct fuse_file_info *fi)
{  
    tempFile = path; 
    tempContent = memcpu(tempContent,buf + offset);
    return strlen(buf+offset);
}

static struct fuse_operations hello_oper = {
	.getattr	= lab5_getattr,
	.readdir	= lab5_readdir,
	.open		= lab5_open,
	.write          = d_write,  //пишем данные в открытый файл.
	.read		= lab5_read,
};

int main(int argc, char *argv[])
{
	return fuse_main(argc, argv, &hello_oper, NULL);
}



Последнее исправление: post-factum (всего исправлений: 1)

Make me unsee it!

банарного
//v papke papka
содежращую
memcpu
lab5_read

Дедал, ты?

border-radius
()

бАнарный файл - это от слова бан?;-)

AIv ★★★★★
()
Последнее исправление: AIv (всего исправлений: 1)

//v papke papka а в папке папка а в папке еще папка)

рррр

kelyar ★★★★★
()
Последнее исправление: kelyar (всего исправлений: 1)

Вот чтение /bin/mv совершенно без извратов с красивым выводом hex-дампа на консоль (сравни это со своей портянкой и прими разупорину):

#include <stdio.h>
#define CHUNK_SIZE 32
int main() {
	int i,rb;
	FILE *mv = fopen("/bin/mv","rb");
	if(!mv) {
		puts("Error opening the binary");
		return 1;
	}
	unsigned char chunk[CHUNK_SIZE];
	while(rb=fread(chunk,1,CHUNK_SIZE,mv)) {
		for(i=0;i<rb;i++) printf("%02X ", chunk[i]);
		printf("\n");
	}
	return 0;
}
border-radius
()
Ответ на: комментарий от TheKnight

Да, потому что в rb нам надо получить количество считанных байт. Если бы не надо было, то правильнее поменять местами CHUNK_SIZE и 1.

border-radius
()
Ответ на: комментарий от border-radius

Спасибо. P.S.: только я думал открыть учебник по C и написать решение самому, а тут на тебе - за меня уже все придумали...

TheKnight ★★★
()
Ответ на: комментарий от anonymous

В системе вполне может быть /bin/mv, но не быть hexdump. Пример привести или догадаешься?

ЗЫ. Правда, в таких системах вывод /bin/mv выведет весь бизибокс... ;)

border-radius
()
Ответ на: комментарий от anonymous

Те же посоны подсказывают, что для тех же прошивок роутёров busybox собирается без доброй половины фич, и уж тем более без hexdump.

border-radius
()
Ответ на: комментарий от border-radius

Но откуда взялись прошивки роутеров, если в топике тс про них нет упоминания, равно как в списке его тем присутствует вопрос конкретно про bash.

anonymous
()
Ответ на: комментарий от HUGO_GO

А что тебе мешает взять исходники собственно самого cat и попробовать адаптировать их к задаче твоей? Ну или в самом деле просто вызывать cat /bin/mv через вызов

system("cat /bin/mv")
Только не забудь сделать
#include <stdlib.h>
если еще не сделал

TheKnight ★★★
()
Ответ на: комментарий от HUGO_GO

Сам ты «оно». Программа выводит полный дамп в шестнадцатеричном формате. Если нужен аналог cat /bin/mv, всё ещё проще, но зачем так упарываться, если cat /bin/mv сам по себе бесполезен?

Ну, вот:

#include <stdio.h>
int main() {
	FILE *mv = fopen("/bin/mv","rb");
	if(!mv) {
		puts("Error opening the binary");
		return 1;
	}
	unsigned char c;
	while(fread(&c,1,1,mv)) putchar(c);
	printf("\n");
	return 0;
}

border-radius
()
Ответ на: комментарий от border-radius

Если забить на кросскомпилируемость (хотя, судя по /bin/mv, она и не нужна), можно сделать ещё элементарней:

#include <stdio.h>
main() {
	FILE *mv = fopen("/bin/mv","rb");
	if(mv) {
	unsigned char c;
	while(fread(&c,1,1,mv)) putchar(c);
	putchar('\n');
	} else perror("Error opening the binary");
}

border-radius
()

Why not use od or hd(hexdump)? or even sed|awk ?

qulinxao ★★☆
()
Ответ на: комментарий от HUGO_GO

добавь следующую функцию к себе в файл:

int cat(char *name) {
	FILE *mv = NULL;
	if(name){
		mv = fopen(name,"rb");
	}
	if(!mv) {
		puts("Error opening the binary");
		return 1;
	}
	unsigned char c;
	while(fread(&c,1,1,mv)) putchar(c);
	printf("\n");

}

отредактируешь по желанию, если посчитаешь нужным. Вызывать:

cat("/bin/mv")

Проверил - у меня работает.

TheKnight ★★★
()
Последнее исправление: TheKnight (всего исправлений: 1)
Ответ на: комментарий от TheKnight

Код :



#define FUSE_USE_VERSION 26
#define CHUNK_SIZE 32


#include <fuse.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <fcntl.h>
#include <stdlib.h>

static const char *bar_path ="/bar";//papka
static const char *foo_path ="/foo";//papka
static const char *bin_path ="/bin";//papka
static const char *baz_path ="/baz";//papka
static const char *example_path ="/bar/example";//file
static const char *example_str = "Hello World\n";
static const char *readmetxt_path ="/bar/readme.txt";//file
static const char *readmetxt_str = "status name surname number \n";
static const char *testtxt_path ="/foo/test.txt";
static const char *testtxt_str = "1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n";//file
static const char *mv_path ="/foo/mv";//file

static char* tempFile = "";
static char* tempContent = ""; 
size_t filesize(const char *filename);
static int d_getattr(const char *path, struct stat *stbuf);
static int d_readdir(const char *path, void *buf, fuse_fill_dir_t filler,
			 off_t offset, struct fuse_file_info *fi);
static int d_open(const char *path, struct fuse_file_info *fi);
static int d_read(const char *path, char *buf, size_t size, off_t offset,
		      struct fuse_file_info *fi);
char* memcpu(char* source, char* buf);
static int  d_write(const char *path, const char *buf, size_t size, off_t offset, struct fuse_file_info *fi);
char* memcpu(char* source, char* buf);
static int  d_write(const char *path, const char *buf, size_t size, off_t offset, struct fuse_file_info *fi);


size_t filesize(const char *filename){
     struct stat st;
     size_t retval=0;
     if(stat(filename,&st) ){
	     printf("cannot stat %s\n",filename);
     }else{
	   retval=st.st_size;
     }
     return retval;
}

static struct fuse_operations hello_oper = {
	.getattr	= d_getattr,
	.readdir	= d_readdir,
	.open		= d_open,
	.write          = d_write,  //пишем данные в открытый файл.
	.read		= d_read,
};


////////////////////////////////////////////////////////////////////////////////
int main(int argc, char *argv[])
{
	return fuse_main(argc, argv, &hello_oper, NULL);
}
////////////////////////////////////////////////////////////////////////////////



static int d_getattr(const char *path, struct stat *stbuf)
{
	int res = 0;

	memset(stbuf, 0, sizeof(struct stat));
	if (strcmp(path, "/") == 0) {
		stbuf->st_mode = S_IFDIR | 0717;//755
		stbuf->st_nlink = 2;
	} else if (strcmp(path, bin_path) == 0) {//papka
		stbuf->st_mode = S_IFDIR | 0022;
		stbuf->st_nlink = 2;
	} else if (strcmp(path, foo_path) == 0) {//papka
		stbuf->st_mode = S_IFDIR | 0711;
		stbuf->st_nlink = 2;
	}else if (strcmp(path, bar_path) == 0) {//papka
		stbuf->st_mode = S_IFDIR | 0511;
		stbuf->st_nlink = 2;
	} else if (strcmp(path, baz_path) == 0) {//papka
		stbuf->st_mode = S_IFDIR | 0144;
		stbuf->st_nlink = 2;
	}  else if (strcmp(path, "/bin") == 0) {
		stbuf->st_mode = S_IFDIR | 0022;//144
		stbuf->st_nlink = 2;
	} else if (strcmp(path, "/baz") == 0) {//v papke papka
		stbuf->st_mode = S_IFDIR | 0144;
		stbuf->st_nlink = 2;
	} else if (strcmp(path, "/foo") == 0) {//v papke papka
		stbuf->st_mode = S_IFDIR | 0711;//
		stbuf->st_nlink = 2;
	
	} else if (strcmp(path, "/bar") == 0) {//v papke papka
		stbuf->st_mode = S_IFDIR | 0511;//
		stbuf->st_nlink = 2;
	} 
	else if (strcmp(path, example_path) == 0) {
		stbuf->st_mode = S_IFREG | 0777;//baz
		stbuf->st_nlink = 1;
		stbuf->st_size = strlen(example_str);
	} else if (strcmp(path, readmetxt_path) == 0) {
		stbuf->st_mode = S_IFREG | 0644;//644
		stbuf->st_nlink = 1;
		stbuf->st_size = strlen(readmetxt_str);
	} else if (strcmp(path, testtxt_path) == 0) {
		stbuf->st_mode = S_IFREG | 0000;//0707
		stbuf->st_nlink = 1;
		stbuf->st_size = strlen(testtxt_str);
	} else if (strcmp(path, mv_path) == 0) {
		stbuf->st_mode = S_IFREG | 0717;//head
		stbuf->st_nlink = 1;
		size_t size = filesize("/bin/mv");//usr/bin/grep
		stbuf->st_size = size;
	} else
		res = -ENOENT;

	return res;
}

static int d_readdir(const char *path, void *buf, fuse_fill_dir_t filler,
			 off_t offset, struct fuse_file_info *fi)
{
	(void) offset;
	(void) fi;

	if (strcmp(path, "/") == 0) {	
		filler(buf, ".", NULL, 0);
		filler(buf, "..", NULL, 0);
		filler(buf, bin_path + 1, NULL, 0);
        	filler(buf, bar_path + 1, NULL, 0);
		filler(buf, baz_path + 1, NULL, 0);
		filler(buf, foo_path + 1, NULL, 0);
		
	}else if (strcmp(path, bar_path) == 0) {
		filler(buf, ".", NULL, 0);
		filler(buf, "..", NULL, 0);
		filler(buf, "/readme.txt" + 1, NULL, 0);
		filler(buf, "/example" + 1, NULL, 0);
	}else if (strcmp(path, foo_path) == 0) {
		filler(buf, ".", NULL, 0);
		filler(buf, "..", NULL, 0);
		filler(buf, "/mv" + 1, NULL, 0);
		filler(buf, "/test.txt" + 1, NULL, 0);
	}
	else
		return -ENOENT;

	return 0;
}

static int d_open(const char *path, struct fuse_file_info *fi)
{
	if ((strcmp(path, example_path) != 0)&&(strcmp(path, readmetxt_path) != 0)&&(strcmp(path, testtxt_path) != 0)&&(strcmp(path, mv_path) != 0))
		return -ENOENT;

	if ((fi->flags & 3) != O_RDONLY)
		return -EACCES;

	return 0;
}

static int d_read(const char *path, char *buf, size_t size, off_t offset,
		      struct fuse_file_info *fi)
{
	size_t len;
	(void) fi;
	if(strcmp(path, example_path) == 0)
	{	
		return -EACCES;
	}
	else if(strcmp(path, readmetxt_path) == 0)
	{	
		len = strlen(readmetxt_str);
		if (offset < len) {
			if (offset + size > len)
				size = len - offset;
			memcpy(buf, readmetxt_str + offset, size);
		} else
			size = 0;
		return size;
	}
	else if(strcmp(path, testtxt_path) == 0)
	{	
		len = strlen(testtxt_str);
		if (offset < len) {
			if (offset + size > len)
				size = len - offset;
			memcpy(buf, testtxt_str + offset, size);
		} else
			size = 0;
		return size;
	}
	else if(strcmp(path, mv_path) == 0)
	{
		
		int i,rb;
		FILE *mv = fopen("/bin/mv","rb");
		if(!mv) {
			puts("Error opening the binary");
			return 1;
		}
		unsigned char chunk[CHUNK_SIZE];
		while(rb=fread(chunk,1,CHUNK_SIZE,mv)) {
			for(i=0;i<rb;i++) printf("%02X ", chunk[i]);
			printf("\n");
		}
		return 123;	
	}
	else
		return -ENOENT;
}


char* memcpu(char* source, char* buf)
{
    int size = strlen(source) + strlen(buf) + 1;   
    char* result = (char*)malloc(sizeof(char)*size);
    result[size - 1] = 0; // ставим отделяющий символ
    int i = 0;
    for(; i < strlen(source); i++) // переносим существующее значение
    {
        result[i] = source[i];
    }
    for(; i < size; i++) // добавляем значение буфера
    {
        result[i] = buf[i - strlen(source)];
    }
    return result; // возвращаем указатель на область памяти . содежращую старые данные и данные , переданные в буфере.
}
static int  d_write(const char *path, const char *buf, size_t size, off_t offset,
              struct fuse_file_info *fi)
{  
    tempFile = path; 
    tempContent = memcpu(tempContent,buf + offset);
    return strlen(buf+offset);
}


HUGO_GO
() автор топика
Ответ на: комментарий от HUGO_GO

компилирую :

# fusermount -u /tmp/fuse

# make 1

# ./1 /tmp/fuse

# tree /tmp/fuse -s -p

# cat /tmp/fuse/foo/mv

и выводит иэроглифы... Подскажите, пожалуйста, что не так?

HUGO_GO
() автор топика
Ответ на: комментарий от border-radius

так когда я Ваш код запускал отдельным c-файлом, выводит много ’иероглифов’, а когда вся программа- одна неполная строчка

HUGO_GO
() автор топика
Ответ на: комментарий от HUGO_GO

Дружище, тебе половина лора уже решений дала. Если ты всё ещё не понимаешь, марш изучать основы.

//зы. От твоей портянки у меня до сих пор глаз дёргается

false ★★★★★
()
Ответ на: комментарий от false

И да, за то что ты пытаешься вывести сырые бинарные данные в терминал/эмулятор, он тебя по головке не погладит.

false ★★★★★
()
Ответ на: комментарий от HUGO_GO

Значит, проблема в программе либо в некорректной постановке задачи.

border-radius
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.