如果删除了cap_enter行,则以下代码与预期完全一致。但是,我想确保我的程序在功能模式下运行。
我已经将这个程序从4000多行更大的程序中提炼成一个最小的例子。
当我使用ktrace运行程序并且他们kdump输出时,我看到以下行:
52225测试RET打开-1 errno 94在功能模式下不允许
关于我想要历史的观点。
是否可以同时使用功能模式并保留历史记录?
#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);
}
答案 0 :(得分:1)
在功能模式下,您将无法打开任何文件。解决它的最好方法是扩展history()API,以便传递文件描述符而不是路径;然后,您将首先打开历史文件,然后调用cap_enter(),然后使用在第一步中打开的文件描述符来编写历史记录。
解决方法是打开历史文件,然后调用cap_enter(),然后“手动”保存历史记录,使用循环获取历史记录条目(H_FIRST或H_NEXT)并保存到文件中。
答案 1 :(得分:1)
事实证明有H_SAVE_FP将文件保存到打开的文件指针。
然后代码如下:
FILE* fp = fopen("historyfile", "w");
...
cap_enter();
...
history(inhistory, &ev, H_SAVE_FP, fp);