Dear Mathew,
The answer for your this problem is probably in the call of
blink1_openById(devid);
Without looking into this call, I would suspect first from my experience
with NaviServer IoT projects a permission problem when accessing the
hardware interface.
For security reasons, NaviServer switches to a nonprivileged user ...
all the best -g
On 25.06.24 16:18, Matthew Burke wrote:
Hello!
I am writing a Tcl extension in C to wrap a driver for a USB LED
status light. The extension runs fine from tclsh but there are issues
running it from a Tcl page under NaviServer.
The extension implements one command via Tcl_CreateObjCommand. The
command proc implements a number of sub-commands broken into two
categories: device-independent functionality, e.g. count the number of
status lights that are plugged in, and device-dependent functionality,
e.g. attach to a status light, display a particular color, etc
The device-independent sub-commands work when run in a Tcl page. For
example, this page runs fine when served from NaviServer:
package require blink
set n [blink enumerate]
ns_return 200 text/html "
There are <strong>$n</strong> devices plugged in.
"
In order to have a device display a color, etc., you first have to run
the "open" command. And that's not working. So here's an example Tcl page:
package require blink
set d [blink open 0]
set q [ns_conn query]
set s [ns_parsequery $q]
set red [ns_set get $s red 255]
set green [ns_set get $s green 0]
set blue [ns_set get $s blue 0]
blink set $d $red $green $blue
ns_return 200 text/html "
<p>Query: [ns_conn query]</p>
<ul>
<li>Red: $red</li>
<li>Green: $green</li>
<li>Blue: $blue</li>
</ul>
"
When this page is served, I get an error in the line: set d [blink
open 0].
There is a C struct, Blinker, that contains data about the attached
device. My C code first allocates
memory for the struct
blinkPtr = (Blinker *)Tcl_Alloc(sizeof(Blinker));
and this seems to work -- blinkPtr is non-NULL after the assignment.
Then there is a function from the driver library that actually
attaches to the device:
blinkPtr->device = blink1_openById(devid);
It should return the memory address of an allocated structure that's
part of the USB library. But the function returns NULL. (Just to
reiterate, this works fine when run from tclsh and returns a non-NULL
value.)
I'm assuming there is some sort of memory protection or similar that I
need to take into account. Any suggestions on what to look at would be
greatly appreciated.
Thanks,
Matt
P.S. This is on macOS 14.3. I'm compiling the extension as follows:
clang -dynamiclib -DUSE_TCL_STUBS -I/usr/local/ns/include
-L/usr/local/ns/lib -ltclstub8.6 -o blink.dylib blink.c
-L/usr/local/lib -lBlink1
_______________________________________________
naviserver-devel mailing list
naviserver-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/naviserver-devel
_______________________________________________
naviserver-devel mailing list
naviserver-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/naviserver-devel