Exemple #1
0
int main(int argc, char * *argv, char * const *envp)
{
    int rval = 0;
    char exec_path[PATH_MAX+1];
    char resolved_path[PATH_MAX+1];
    uint32_t exec_path_size = sizeof(exec_path);
    CFStringRef argv0_string;
    CFURLRef argv0_url;
    char *argv0 = NULL;
    char *root = NULL;

    if (bind_CoreFoundation()) {
        fprintf(stderr, "CoreFoundation not found or functions missing\n");
        return -1;
    }

    if (_NSGetExecutablePath(exec_path, &exec_path_size) != 0) {
        fprintf(stderr, "_NSGetExecutablePath failed to find current executable\n");
        return -1;
    }
    exec_path[exec_path_size] = '\0';

    realpath(exec_path, resolved_path);
    root = dirname(dirname(dirname(resolved_path)));

    argv0_url = py2app_CFURLCreateFromFileSystemRepresentation(
        NULL,
        (uint8_t *)root,
        strlen(root),
        true
        );

    if (!argv0_url) {
        fprintf(stderr, "Could not cast '%s' to CFURL!\n", root);
        return -1;
    }

    py2app_main_bundle = py2app_CFBundleCreate(NULL, argv0_url);

    if (!py2app_main_bundle) {
        fprintf(stderr, "Not bundled, exiting\n");
        return -1;
    }

    py2app_pool = py2app_CFArrayCreateMutable(NULL, 0, py2app_kCFTypeArrayCallBacks);
    if (!py2app_pool) {
        fprintf(stderr, "Couldn't create global pool\n");
        return -1;
    }
    rval = py2app_main(argc, argv, envp);
    py2app_CFRelease(py2app_pool);
    py2app_CFRelease(py2app_main_bundle);
    py2app_CFRelease(argv0_url);
    // py2app_CFRelease(argv0_string);
    // free(argv0);
    return rval;
}
Exemple #2
0
static CFStringRef tildeExpand(CFStringRef path) {
    CFURLRef pathURL;
    char buf[PATH_MAX];
    CFURLRef fullPathURL;
    struct passwd *pwnam;
    char tmp;
    char *dir = NULL;


    py2app_CFStringGetCString(path, buf, sizeof(buf), kCFStringEncodingUTF8);

    int i;
    if (buf[0] != '~') {
        return py2app_CFStringCreateWithCString(
            NULL, buf, kCFStringEncodingUTF8);
    }
    /* user in path */
    i = 1;
    while (buf[i] != '\0' && buf[i] != '/') {
        i++;
    }
    if (i == 1) {
        dir = getenv("HOME");
    } else {
        tmp = buf[i];
        buf[i] = '\0';
        pwnam = getpwnam((const char *)&buf[1]);
        if (pwnam) dir = pwnam->pw_dir;
        buf[i] = tmp;
    }
    if (!dir) {
        return py2app_CFStringCreateWithCString(NULL, buf, kCFStringEncodingUTF8);
    }
    pathURL = py2app_CFURLCreateFromFileSystemRepresentation(
        NULL, (const UInt8*)dir, strlen(dir), false);
    fullPathURL = py2app_CFURLCreateFromFileSystemRepresentationRelativeToBase(
        NULL, (const UInt8*)&buf[i + 1], strlen(&buf[i + 1]), false, pathURL);
    py2app_CFRelease(pathURL);
    path = pathFromURL(fullPathURL);
    py2app_CFRelease(fullPathURL);
    return path;
}