2009-10-12 2 views
4

실현하고자하는 것을 설명해 드리겠습니다.메모리에서 파일을 untar하는 방법 (C 프로그래밍)?

암호화 된 tar 파일이 있습니다. 나는 그것을 메모리에서 해독 할 수는 있지만 해독 된 데이터를 하드 디스크에 실제 파일로 다시 쓸 수는 없다. 해독 된 데이터는 메모리에 char * 버퍼로 구성됩니다. 어떻게 메모리에서 압축을 풀 수 있습니까?

libtar 라이브러리에서 답변을 찾을 수 없습니다. 나는 또한 execlp("tar", "tar", "-xvO", (void*)0)으로 untar하려고 시도했다. 하지만 생각했던 것처럼 작동하지 않았습니다.

누구나 최고의 솔루션을 제공 할 수 있습니까? 감사!

+0

쉬운 방법은 아마도 특별한 사용자 ID를 변경 임시 파일을 작성, 다시 그것을 읽고, 그것을 삭제 한 다음 일반 사용자로 다시 변경하는 것? – gnud

+0

간단한 질문 : 태그에서 이것을 모두 말하기 때문에 제목에 "C 프로그래밍"이라고 말하면 어떨까요? –

+0

gnud, 나는 모든 대상 컴퓨터에서 특별한 사용자를 만들 수 없다고 생각합니다. Campos,이 질문은 "c"와 "tar"로 태그되었습니다, 미안 해요, 제가 여기 초보자 인 것처럼, 나는 당신의 요점을 얻지 못합니다. 내가 틀렸다면 나는 바로 잡을 것이다. – solotim

답변

6

예를 들어, 메모리 내 타르에서 파일 내용을 읽는 방법을 설명했습니다. is_file_in_tar() 기능은 length과는 tar에 저장되어있는 경우 name D 파일의 위치를 ​​오링 start를 반환

#include <stdio.h> 
#include <fcntl.h> 
#include <string.h> 
#include <sys/mman.h> 

struct tar { 
    char name[100]; char _unused[24]; 
    char size[12]; char _padding[376]; 
} *tar; 

int is_file_in_tar(struct tar *tar, char *name, char **start, int *length){ 
    for(; tar->name[0]; tar+=1+(*length+511)/512){ 
    sscanf(tar->size, "%o", length); 
    if(!strcmp(tar->name,name)){ *start = (char*)(tar+1); return 1; } 
    } 
    return 0; 
} 

int main(){ 
    int fd=open("libtar-1.2.11.tar", O_RDONLY); 
    tar=mmap(NULL, 808960, PROT_READ, MAP_PRIVATE, fd, 0); 

    char *start; int length; char name[]="libtar-1.2.11/TODO"; 
    if(is_file_in_tar(tar,name,&start,&length)) printf("%.*s",length,start); 
} 
+0

이것은 너무 좋습니다. 그래서 나는 포인터로 직접 tar에있는 데이터에 접근 할 수있다. 그러나 파일이 tar.gz 인 경우 어떻게해야합니까? – solotim

+1

zlib를 사용하면 gzip으로 압축 된 파일을 투명하게 열 수 있습니다. gzip으로 압축되지 않은 파일에서도 동일하게 작동합니다. –

8

나는 libtar이 답이라고 생각합니다.

libtar를 사용하여 개폐, 읽기 및 쓰기를위한 고유 한 기능을 지정할 수 있습니다. 맨 페이지에서 :

int tar_open(TAR **t, char *pathname, tartype_t *type, int oflags, 
      int mode, int options); 

tar_open() 기능은 pathname 인수에 의해 명명 된 파일 이름에 해당하는 tar 아카이브 파일을 엽니 다. oflags 인수는 이어야합니다 (O_RDONLY 또는 O_WRONLY).

type 인수는 주어진 파일 유형에 대한 액세스 방법을 지정합니다. tartype_t 구조체에는 파일을 닫고, 읽고, 쓰는 함수에 대한 포인터 인 각각 openfunc(), closefunc(), readfunc()writefunc()이라는 멤버가 있습니다. 형식이 NULL 인 경우 파일 형식의 기본값은 일반 파일이며 기본값은 open(), close(), read()write()입니다.

+0

as tar_open function char * pathname : int tar_open (TAR ** t, char * 경로명, tartype_t * 유형, int oflags, int 모드, int 옵션); 경로 이름은 실제 파일이어야합니다. 맞습니까? – solotim

+1

편집을 참조하십시오. 메모리에서 작동하는 고유 한 파일 액세스 기능을 사용할 수 있습니다. – gnud

+0

openfunc가 fildes를 반환해야합니다. 버퍼에서 fildes를 가져 오는 방법을 알 수 없습니다. fileno (fmemopen (...))를 사용하려고 시도했지만 -1을 반환합니다. 나는 좌절했다. – solotim

0

일반적인 untar 작업을 사용하여 메모리 내 tmpfs에 압축을 풉니 다.

+0

tmpfs는 다른 프로세스에서 액세스 할 수 있으므로 안전하지 않습니다. 권리? – solotim

+0

사용자 권한에 따라 다릅니다. 따라서 임시 파일을 작성하는 데 '특별한'사용자를 사용하도록 제안합니다. – gnud

+0

root가 데이터를 읽으 려한다면 어느 쪽이든 엉망입니다. – gnud

2

tar 유틸리티를 stdout으로 리디렉션 할 수 있습니다. (tar --to-stdout). 출력을 읽으려면 forkpty() 또는 popen()을 사용하여 실행해야합니다.

+0

"tar -xvO"를 사용하려고했는데 stdin에서 읽고 stdout에 씁니다. 내 프로그램에서 필자는 tardata-> stdin, untarreddata <-stdout의 두 가지 파이프를 사용해야한다. 어려운 점은 tardata를 stdin 파이프에 넣으면 원시 tardata에 '\ 0'이 있기 때문에 tar 명령은 stdin에서 완전한 tar를 인식 할 수 없다는 것입니다. 이거 좀 생각해? 덕분에 – solotim

1

이 코드와 그것을 위해 일했습니다. 시도 해봐!

FILE*fp; 
if(fp = popen("/bin/tar -xv -C /target/dir", "w")) 
{ 
    fwrite(tar_buffer,1,tar_size,fp); 
    pclose(fp); 
    printf("Untar End %d Save file\n", tar_size); 

} 
관련 문제