0

如果删除 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);
}
4

2 回答 2

1

在功能模式下,您将无法打开任何文件。解决它的最佳方法是扩展 history() API 以使其可以传递文件描述符而不是路径;然后,您将首先打开历史文件,然后调用 cap_enter(),然后使用在第一步中打开的文件描述符写入历史。

一种解决方法是打开历史文件,然后调用 cap_enter(),然后“手动”保存历史,使用循环获取历史条目(H_FIRST 或 H_NEXT)并保存到文件中。

于 2014-05-11T15:22:51.683 回答
1

事实证明,有 H_SAVE_FP 将文件保存到打开的文件指针。

然后代码如下所示:

FILE* fp = fopen("historyfile", "w");
...
cap_enter();
...
history(inhistory, &ev, H_SAVE_FP, fp);
于 2014-05-15T17:33:10.407 回答