int probe_main (probe_ctx *ctx, void *mutex) { SEXP_t *path, *filename, *behaviors, *filepath, *probe_in; OVAL_FTS *ofts; OVAL_FTSENT *ofts_ent; oval_schema_version_t over; if (mutex == NULL) { return (PROBE_EINIT); } _A(mutex == &__filehash_probe_mutex); probe_in = probe_ctx_getobject(ctx); path = probe_obj_getent (probe_in, "path", 1); filename = probe_obj_getent (probe_in, "filename", 1); behaviors = probe_obj_getent (probe_in, "behaviors", 1); filepath = probe_obj_getent (probe_in, "filepath", 1); over = probe_obj_get_platform_schema_version(probe_in); /* we want either path+filename or filepath */ if ( (path == NULL || filename == NULL) && filepath==NULL ) { SEXP_free (behaviors); SEXP_free (path); SEXP_free (filename); SEXP_free (filepath); return (PROBE_ENOELM); } probe_filebehaviors_canonicalize(&behaviors); switch (pthread_mutex_lock (&__filehash_probe_mutex)) { case 0: break; default: dI("Can't lock mutex(%p): %u, %s.", &__filehash_probe_mutex, errno, strerror (errno)); SEXP_free (behaviors); SEXP_free (path); SEXP_free (filename); SEXP_free (filepath); return (PROBE_EFATAL); } if ((ofts = oval_fts_open(path, filename, filepath, behaviors)) != NULL) { while ((ofts_ent = oval_fts_read(ofts)) != NULL) { filehash_cb(ofts_ent->path, ofts_ent->file, ctx, over); oval_ftsent_free(ofts_ent); } oval_fts_close(ofts); } SEXP_free (behaviors); SEXP_free (path); SEXP_free (filename); SEXP_free (filepath); switch (pthread_mutex_unlock (&__filehash_probe_mutex)) { case 0: break; default: dI("Can't unlock mutex(%p): %u, %s.", &__filehash_probe_mutex, errno, strerror (errno)); return (PROBE_EFATAL); } return 0; }
int probe_main (SEXP_t *probe_in, SEXP_t *probe_out, void *mutex, SEXP_t *filters) { SEXP_t *path, *filename, *behaviors, *filepath; OVAL_FTS *ofts; OVAL_FTSENT *ofts_ent; (void)filters; if (probe_in == NULL || probe_out == NULL) { return (PROBE_EINVAL); } if (mutex == NULL) { return (PROBE_EINIT); } _A(mutex == &__filemd5_probe_mutex); path = probe_obj_getent (probe_in, "path", 1); filename = probe_obj_getent (probe_in, "filename", 1); behaviors = probe_obj_getent (probe_in, "behaviors", 1); filepath = probe_obj_getent (probe_in, "filepath", 1); /* we want either path+filename or filepath */ if ( (path == NULL || filename == NULL) && filepath==NULL ) { SEXP_free (behaviors); SEXP_free (path); SEXP_free (filename); SEXP_free (filepath); return (PROBE_ENOELM); } probe_filebehaviors_canonicalize(&behaviors); switch (pthread_mutex_lock (&__filemd5_probe_mutex)) { case 0: break; default: dI("Can't lock mutex(%p): %u, %s.\n", &__filemd5_probe_mutex, errno, strerror (errno)); SEXP_free (behaviors); SEXP_free (path); SEXP_free (filename); SEXP_free (filepath); return (PROBE_EFATAL); } if ((ofts = oval_fts_open(path, filename, filepath, behaviors)) != NULL) { while ((ofts_ent = oval_fts_read(ofts)) != NULL) { filehash_cb(ofts_ent->path, ofts_ent->file, probe_out, filters); oval_ftsent_free(ofts_ent); } oval_fts_close(ofts); } SEXP_free (behaviors); SEXP_free (path); SEXP_free (filename); SEXP_free (filepath); switch (pthread_mutex_unlock (&__filemd5_probe_mutex)) { case 0: break; default: dI("Can't unlock mutex(%p): %u, %s.\n", &__filemd5_probe_mutex, errno, strerror (errno)); return (PROBE_EFATAL); } return 0; }