gpt4 book ai didi

c - 如何使用 cups API 添加 System V 过滤器?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:07:17 25 4
gpt4 key购买 nike

我需要以编程方式将打印机添加到安装了 System V 过滤器的杯子中。现在我正在使用以下代码创建添加打印机的请求:

pstRequest = ippNew();

pstRequest->request.op.operation_id = CUPS_ADD_PRINTER;
pstRequest->request.any.request_id = 1;

ippAddString(pstRequest, IPP_TAG_OPERATION, IPP_TAG_CHARSET, "attributes-charset", NULL, "us-ascii");
ippAddString(pstRequest, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE, "attributes-natural-language", NULL, "en");

ippAddString(pstRequest, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name", NULL, cupsUser());
ippAddString(pstRequest, IPP_TAG_OPERATION, IPP_TAG_URI, "device-uri", NULL, szUri);
ippAddString(pstRequest, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, szPrinterUri);
ippAddInteger(pstRequest, IPP_TAG_PRINTER, IPP_TAG_ENUM, "printer-state", IPP_PRINTER_IDLE);
ippAddBoolean(pstRequest, IPP_TAG_PRINTER, "printer-is-accepting-jobs", true);

为了对话:

szUri        = "serial:/dev/pts/12?baud=2400+bits=7+parity=none+flow=none";
szPrinterUri = "ipp://localhost/printers/myptr";

这似乎正确地将打印机添加到 cups 系统,因为我可以使用以下命令向它发送打印:

lp -d myptr test.print

我的第一个想法是将我想用作过滤器的文件复制到 /etc/cups/interfaces 目录中,并将其命名为 myptr。我这样做了,给了它正确的用户、组和权限,但它似乎没有用。我什至尝试在脚本的前面添加一个 sleep 60,但它从未出现在 ps 中。

我试过使用 lpadmin 添加打印机,如下所示,它工作正常:

lpadmin -h localhost -p myptr2 -v "serial:/dev/pts/12?baud=2400+bits=7+parity=none+flow=none" -i /tmp/my.serial.filter

之后我必须调用 cupsacceptcupsenable,但是打印机可以正常工作并且它通过我的过滤器发送打印件。 lpadmin 正确地将 my.serial.filter 文件从 /tmp 复制到 /etc/cups/interfaces 和名称它 myptr2,就像我在我的程序中所做的那样,而且,在我的一生中,我无法在任何让我认为我缺少步。尽管如此,我使用 lpadmin 添加的 myptr2 打印机可以正常工作,而我使用 API 添加的 myptr 打印机可以正常工作,而 打印, 通过过滤器打印。

在我进行的各种 Google 搜索中,我通读了 CUPS ImplementationHTTP and IPP APIs Documentation ,我最接近的是,在前者中,有一条关于 CUPS-Add-Modify-Printer Operation 的评论。上面写着:

The CUPS-Add-Modify-Printer request can optionally be followed by a PPD file or System V interface script to be used for the printer. The "ppd-name" attribute overrides any file that is attached to the end of the request with a local CUPS PPD file.

这促使我尝试使用

ippAddString(pstRequest, IPP_TAG_PRINTER, IPP_TAG_NAME, "ppd-name", NULL, szFilter);

将 szFilter 设置为 "/tmp/my.serial.filter""/etc/cups/interfaces/myptr"(当然是在单独的测试中),但无济于事。

谁能告诉我哪里可能出错了?

最佳答案

好吧,我从 cups 源存储库中获得了 lpadmin 的源代码,答案比我试图做的要容易得多。显然,我在最初的帖子中没有包含足够多的资源。在上面的代码片段之后,我调用了以下内容:

pstHttpServer = httpConnectEncrypt("localhost", ippPort(), cupsEncryption());
pstResponse = cupsDoFileRequest(pstHttpServer, pstRequest, "/admin/", NULL);
ippDelete(pstResponse);
httpClose(pstHttpServer);

(当然有适用的错误检查)

我的问题的答案在 NULL 指针中,我将其作为第四个参数传递给 cupsDoFileRequest。如上所述,“CUPS-Add-Modify-Printer 请求后面可以有选择地跟一个 PPD 文件或 System V 接口(interface)脚本。”我没有将两者联系在一起,但那句话指的是 cupsDoFileRequest 的第四个参数,如果我放置过滤器的路径,"/tmp/my.serial.filter ",请求成功并且 my.serial.filter 被正确复制到 /etc/cups/interfaces 作为 myptr,之后我对 myptr 的所有打印都按预期通过过滤器。

因此,最终的解决方案是将上面的pstResponse行改成如下:

pstResponse   = cupsDoFileRequest(pstHttpServer, pstRequest, "/admin/", "/tmp/my.serial.filter");

关于c - 如何使用 cups API 添加 System V 过滤器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11567507/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com