Home
Support

Knowledge Base

BSPs and drivers
Community resources
Product documentation
Questions?
Contact us

How do I Monitor Files Being Opened?
 
________________________________________________________________________

Applicable Environment
________________________________________________________________________
  • Topic: How do I Monitor Files Being Opened?
  • SDP: 6.5.0, 7.1.0
  • Target: Any supported target
________________________________________________________________________

Solution
________________________________________________________________________

The following resource manager example is acting as a 'shim' layer before all the other 'real' resource managers. It attaches to the root directory ("/") and for every file opened this resource manager's io_open function will be called, display relative time the file open attempt was made and what file it was then promptly returns ENOENT so that any subsequent resource managers in the stack can perhaps properly server the file being opened.

#include <errno.h>
#include <stdio.h>
#include <stddef.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <time.h>
#include <sys/iofunc.h>
#include <sys/dispatch.h>

static resmgr_connect_funcs_t connect_funcs;
static resmgr_io_funcs_t io_funcs;
static iofunc_attr_t attr;

int io_open (resmgr_context_t *ctp, io_open_t *msg, RESMGR_HANDLE_T *handle, void *extra);

int main(int argc, char **argv)
{
    /* declare variables we'll be using */
    resmgr_attr_t resmgr_attr;
    dispatch_t *dpp;
    dispatch_context_t *ctp;
    int id;

    /* initialize dispatch interface */
    if((dpp = dispatch_create()) == NULL) {
        fprintf(stderr,    "%s: Unable to allocate dispatch handle.\n", argv[0]);
        return EXIT_FAILURE;
    }

    /* initialize resource manager attributes */
    memset(&resmgr_attr, 0, sizeof resmgr_attr);
    resmgr_attr.nparts_max = 1;
    resmgr_attr.msg_max_size = 2048;

    /* initialize functions for handling messages */

    iofunc_func_init(_RESMGR_CONNECT_NFUNCS, &connect_funcs,
    _RESMGR_IO_NFUNCS, &io_funcs);
    connect_funcs.open = io_open;

    /* initialize attribute structure used by the device */
    iofunc_attr_init(&attr, S_IFNAM | 0666, 0, 0);

    /* attach our device name */
    id = resmgr_attach(
        dpp, /* dispatch handle */
        &resmgr_attr, /* resource manager attrs */
        "/", /* device name */
        _FTYPE_ANY, /* open type */
        _RESMGR_FLAG_BEFORE|_RESMGR_FLAG_DIR, /* flags */
        &connect_funcs, /* connect routines */
        &io_funcs, /* I/O routines */
        &attr); /* handle */
        if(id == -1) {
        fprintf(stderr, "%s: Unable to attach name.\n", argv[0]);
        return EXIT_FAILURE;
    }

    /* allocate a context structure */
    ctp = dispatch_context_alloc(dpp);

    /* start the resource manager message loop */
    while(1) {
        if((ctp = dispatch_block(ctp)) == NULL) {
        fprintf(stderr, "block error\n");
        return EXIT_FAILURE;
        }
    dispatch_handler(ctp);
    }
}

int
io_open (resmgr_context_t *ctp, io_open_t *msg, RESMGR_HANDLE_T *handle, void *extra)
{
    time_t tod;
    tod = time(NULL);
    printf ("%10ld %-32s is being opened\n", tod, msg->connect.path);

    return(ENOENT);
}


________________________________________________________________________
NOTE: This entry has been validated against the SDP version listed above. Use caution when considering this advice for any other SDP version. For supported releases, please reach out to QNX Technical Support if you have any questions/concerns.
________________________________________________________________________




Related Attachments
 None Found





Please contact us with your questions or concerns.