Exemple #1
0
static rc_t KNSManagerLoadLib( struct KNSManager *self )
{
    KDyld *dl;
    /* make a dynamic-library loader */
    rc_t rc = KDyldMake ( &dl );
    if ( rc == 0 )
    {
        /* load the curl-library */
        rc = KDyldLoadLib( dl, &lib_curl_handle, LPFX "curl" SHLX );
        if ( rc == 0 )
        {
            KSymAddr *sym;

            /* resolve symbols */

            /* curl_easy_init() */
            rc = KDylibSymbol( lib_curl_handle, &sym, "curl_easy_init" );
            if ( rc == 0 )
            {
                KSymAddrAsFunc( sym, ( fptr_t* ) &(self->curl_easy_init_fkt) );
                KSymAddrRelease( sym );
            }

            /* curl_easy_cleanup() */
            if ( rc == 0 )
            {
                rc = KDylibSymbol( lib_curl_handle, &sym, "curl_easy_cleanup" );
                KSymAddrAsFunc( sym, ( fptr_t* ) &(self->curl_easy_cleanup_fkt) );
                KSymAddrRelease( sym );
            }

            /* curl_easy_setopt() */
            if ( rc == 0 )
            {
                rc = KDylibSymbol( lib_curl_handle, &sym, "curl_easy_setopt" );
                KSymAddrAsFunc( sym, ( fptr_t* ) &(self->curl_easy_setopt_fkt) );
                KSymAddrRelease( sym );
            }

            /* curl_easy_perform() */
            if ( rc == 0 )
            {
                rc = KDylibSymbol( lib_curl_handle, &sym, "curl_easy_perform" );
                KSymAddrAsFunc( sym, ( fptr_t* ) &(self->curl_easy_perform_fkt) );
                KSymAddrRelease( sym );
            }

            /* curl_easy_getinfo() */
            if ( rc == 0 )
            {
                rc = KDylibSymbol( lib_curl_handle, &sym, "curl_easy_getinfo" );
                KSymAddrAsFunc( sym, ( fptr_t* ) &(self->curl_easy_getinfo_fkt) );
                KSymAddrRelease( sym );
            }

            /* curl_slist_append() */
            if ( rc == 0 )
            {
                rc = KDylibSymbol( lib_curl_handle, &sym, "curl_slist_append" );
                KSymAddrAsFunc( sym, ( fptr_t* ) &(self->curl_slist_append_fkt) );
                KSymAddrRelease( sym );
            }

            /* curl_version() */
            if ( rc == 0 )
            {
                rc = KDylibSymbol( lib_curl_handle, &sym, "curl_version" );
                KSymAddrAsFunc( sym, ( fptr_t* ) &(self->curl_version_fkt) );
                KSymAddrRelease( sym );
            }

            /* curl_slist_free_all() */
            if ( rc == 0 )
            {
                rc = KDylibSymbol( lib_curl_handle, &sym, "curl_slist_free_all" );
                KSymAddrAsFunc( sym, ( fptr_t* ) &(self->curl_slist_free_all_fkt) );
                KSymAddrRelease( sym );
            }

            /* bail on error */
            if ( rc != 0 )
            {
                KDylibRelease ( lib_curl_handle );
                lib_curl_handle = NULL;
                self->curl_easy_init_fkt = NULL;
                self->curl_easy_cleanup_fkt = NULL;
                self->curl_easy_setopt_fkt = NULL;
                self->curl_easy_perform_fkt = NULL;
                self->curl_slist_append_fkt = NULL;
                self->curl_version_fkt = NULL;
                self->curl_easy_getinfo_fkt = NULL;
            }
        }
        KDyldRelease ( dl );
    }

    return rc;

}
Exemple #2
0
static rc_t ReportBinary(const ReportFuncs *f, uint32_t indent, const char* argv0) {
    rc_t rc = 0;
    KDyld *dyld = NULL;
    assert(argv0);
    rc = KDyldMake(&dyld);
    if (rc != 0) {
        reportError(indent + 1, rc, "KDyldMake");
    }
    else {
        const KDirectory* dir = NULL;
        rc = KDyldHomeDirectory(dyld, &dir, (fptr_t) ReportFinalize);
        if (rc != 0) {
            reportError(indent + 1, rc, "KDyldHomeDirectory");
        }
        else {
            char binary[PATH_MAX + 1];
            const char* name = strpbrk(argv0, "/\\");
            const char* last_name = name;
            if (last_name)
            {   ++last_name; }
            while (name) {
                name = strpbrk(last_name, "/\\");
                if (name) {
                    last_name = name;
                    if (last_name)
                    {   ++last_name; }
                }
            }
            name = last_name ? last_name : argv0;
            rc = KDirectoryResolvePath(dir, true, binary, sizeof binary, "%s", name);
            if (rc != 0) {
                reportErrorStr(indent + 1, rc, "KDirectoryResolvePath",
                    "origin", "KDyldHomeDirectory");
            }
            else {
                bool found = false;
                const char tag[] = "Binary";
                const char* sType = NULL;
                uint8_t digest[16];
                uint32_t type = KDirectoryPathType(dir, "%s", binary);
                switch (type & ~kptAlias) {
                    case kptFile:
                        sType = type & kptAlias ? "alias" : "file";
                        found = true;
                        break;
                    case kptNotFound:
                        sType = "not found";
                        break;
                    default:
                        sType = "unknown";
                        break;
                }
                if (found)
                {   rc = md5(name, digest, dir); }
                if (type & kptAlias) {
                    if (found && rc == 0)  {
                        reportOpen(indent, tag, 3, "path", 's', binary,
                            "type", 's', sType, "md5", 'M', digest);
                    }
                    else {
                        reportOpen(indent, tag, 2, "path", 's', binary,
                            "type", 's', sType);
                    }
                    if (rc == 0 && type & kptAlias)
                    {   rc = ReportAlias(f, indent + 1, name, dir); }
                    reportClose(indent, tag);
                }
                else {
                    if (found && rc == 0)  {
                        report(indent, tag, 3, "path", 's', binary,
                            "type", 's', sType, "md5", 'M', digest);
                    }
                    else {
                        report(indent, tag, 2, "path", 's', binary,
                            "type", 's', sType);
                    }
                }
            }
        }
        RELEASE(KDirectory, dir);
    }
    RELEASE(KDyld, dyld);
    return rc;
}
Exemple #3
0
rc_t CC KMain ( int argc, char *argv [] )
{
    Args * args;
    rc_t rc;

    rc = ArgsMakeAndHandle (&args, argc, argv, 1, MyOptions, sizeof MyOptions / sizeof (OptDef));
    if (rc)
        LOGERR (klogInt, rc, "failed to parse arguments");

    else
    {
        do
        {
            KDyld *dl;
            uint32_t num_libs;

            rc = ArgsParamCount (args, &num_libs);
            if (rc)
            {
                LOGERR ( klogInt, rc, "Failure to count parameters" );
                break;
            }

            if (num_libs == 0)
            {
                rc = MiniUsage(args);
                break;
            }

            /* create loader */
            rc = KDyldMake (&dl);
            if (rc)
            {
                LOGERR ( klogInt, rc, "failed to create dynamic loader" );
                break;
            }
            else
            {
                do
                {
                    KDlset *libs;
                    const char * path;
                    uint32_t ix;
                    uint32_t num_paths;

                    rc = ArgsOptionCount (args, OPTION_LOAD, &num_paths);
                    if (rc)
                    {
                        LOGERR (klogInt, rc, "failed to count paths");
                        break;
                    }

                    for (ix = 0; ix < num_paths; ix++)
                    {

                        rc = ArgsOptionValue (args, OPTION_LOAD, ix, (const void **)&path);
                        if (rc)
                        {
                            LOGERR (klogInt, rc, "failed to access a path option");
                            break;
                        }
                        testld_update_libpath (dl, path);
                    }
                    if (rc)
                        break;

                    /* append contents of LD_LIBRARY_PATH */
                    path = getenv ( "LD_LIBRARY_PATH" );

                    if (path)
                        testld_update_libpath (dl, path);

                    /* create libset */
                    rc = KDyldMakeSet (dl, & libs);
                    if (rc)
                    {
                        LOGERR (klogInt, rc, "failed to create dl library set");
                        break;
                    }
                    else
                    {
                        /* test it */
                        for (ix = 0; ix < num_libs; ++ ix )
                        {
                            rc = ArgsParamValue (args, ix, (const void **)&path);
                            if (rc)
                                break;

                            testld_load_library (dl, libs, path);
                        }

                        KDlsetRelease ( libs );
                    }
                } while (0);

                KDyldRelease ( dl );
            }

        } while (0);

        ArgsWhack (args);
    }
    return rc;
}