2014-05-10 11 views
0

다음 코드는 cap_enter 줄을 제거하면 예상대로 작동합니다. 그러나 내 프로그램이 기능 모드로 실행되는지 확인하고 싶습니다.명령 줄 프로그램에서 입력 된 기록 저장 (캐 패티 모드에서)

나는이 프로그램을 4000+ 큰 프로그램에서 최소한의 예제로 뽑아 냈다.

내가 프로그램을 실행하려면 ktrace를 사용하고 난 다음 줄 참조 출력이 kdump : 열 RET -1 errno는 94

52225 시험은 주위에 기능 모드

에서 허용되지 않음을 요점 나는 역사를 원했다.

기능 모드와 기록을 모두 사용할 수 있습니까?

#include <err.h> 
#include <errno.h> 
#include <histedit.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <sys/capsicum.h> 

static const char* promptstr = ""; 

static const char * prompt(EditLine *e __unused) { 
    return promptstr; 
} 
- 
int 
main(int argc __unused, char **argv) 
{ 

    History *inhistory; 
    EditLine *el; 
    HistEvent ev; 

    inhistory = history_init(); 
    el = el_init(argv[0], stdin, stdout, stderr); 
    el_set(el, EL_PROMPT, &prompt); 
    el_set(el, EL_EDITOR, "emacs"); 
    el_set(el, EL_SIGNAL, 1); 
    el_set(el, EL_HIST, history, inhistory); 
    el_source(el, NULL); 
    history(inhistory, &ev, H_SETSIZE, 50); 
    if (inhistory == 0) 
     err(1, "Could not initalize history"); 

    if (cap_enter() < 0) 
     err(1, "unable to enter capability mode"); 

    for (;;) { 
     const char* havestr; 
     int inputsz; 

     havestr = el_gets(el, &inputsz); 
     if (havestr == NULL) 
      exit(0); 
     if (inputsz > 0) 
      history(inhistory, &ev, H_ENTER, havestr); 
     if (*havestr == '.') 
      break; 
    } 

    history(inhistory, &ev, H_SAVE, "/tmp/myhistory"); 

    history_end(inhistory); 
    return(0); 
} 

답변

1

기능 모드에서는 파일을 열 수 없습니다. 이를 해결하는 가장 좋은 방법은 경로 대신 파일 설명자를 전달할 수 있도록하기 위해 history() API를 확장하는 것입니다. 먼저 히스토리 파일을 연 다음 cap_enter()를 호출 한 다음 첫 번째 단계에서 열린 파일 디스크립터를 사용하여 히스토리를 작성한다.

히스토리 파일을 열고 cap_enter()를 호출 한 다음 루프 획득 기록 항목 (H_FIRST 또는 H_NEXT)을 사용하여 기록을 "손으로"저장하고 파일에 저장하는 것이 좋습니다.

1

열린 파일 포인터에 파일을 저장하는 H_SAVE_FP가 있습니다.

코드는 다음과 같이 보인다 :

FILE* fp = fopen("historyfile", "w"); 
... 
cap_enter(); 
... 
history(inhistory, &ev, H_SAVE_FP, fp);