On Sun, Jul 7, 2019 at 4:46 PM Nick Couchman <nick.e.couch...@gmail.com> wrote:
> Getting back to this after a while... > > >> Right. You cannot have two parsers reading from the same socket, nor >> should >> protocol support be attempting to parse the Guacamole protocol manually. >> To >> handle argv, you need to provide an argv_handler to the guac_user struct. >> That handler will be called when argv is received. >> > > So, I've taken care of the issue of two parsers and am now correctly (I > think) using the argv handler to process received argv instructions. I see > the argv handler getting called, and it seems to process the correct > setting name, but the data (argument value) doesn't actually seem to be > there (empty or null). Not sure if I'm doing this incorrectly, but on the > client side I'm doing the following: > > $log.debug('Sending response for parameter ' + parameter + ': ' + > JSON.stringify(data[parameter])); > var stream = client.createArgumentValueStream("string", parameter); > var writer = new Guacamole.StringWriter(stream); > writer.sendText(data[parameter]); > writer.sendEnd(); > $log.debug('Finished sending response.'); > > on the server side, like I said, I see the call to the argv handler that > I've written, and it correctly choose the setting, but if I process the > argv->buffer, it's empty?? > Alright, scratch this - turns out my debugging was just wrong. Values are arriving properly, so apparently something wrong with handling them... > > My admittedly very messy repos are here: > > https://github.com/necouchman/guacamole-client/tree/jira/221 > https://github.com/necouchman/guacamole-server/tree/jira/221 > > > >> >> This probably means that the use of the FreeRDP authentication callback >> > will not work, unless >> > there's some other way to accomplish this. I could still try to block >> the >> > pthread until the input is received, but this might cause other >> problems on >> > the client side with an unresponsive connection? >> > >> >> If FreeRDP depends on this being synchronous, yes, the handler will need >> to >> block on some sort of pthread condition which is signalled when the >> credentials are set. Reading of the argv instruction should happen >> magically as long as argv_handler is properly set, as Guacamole protocol >> parsing is handled for you by guacd and libguac in a separate thread. >> >> If blocking will potentially result in the connection going silent, >> there's >> a function for that - guac_socket_require_keep_alive(): >> >> >> http://guacamole.apache.org/doc/libguac/socket_8h.html#a1d8c5111a8234c7785ae23f379f7db03 >> >> That will force the guac_socket to send a "nop" instruction roughly every >> 5 >> seconds if nothing else is sent during that period. >> > > I think I've managed to take care of this concern - I implemented a > pthread_cond_timedwait() for each of the parameters that get requested, and > then a pthread_cond_broadcast() within the argv handler to signal the > completion. It's a little hard to tell if it's working properly with the > issues I'm having with data not being sent, but during the prompt I see the > nop debug messages on the server side, and the connection never times out, > so I think it's waiting properly. > > Apparently I haven't quite gotten this nailed down, yet - something with handling the pthread condition isn't working right... -Nick >