static char* binpath_unix() { char* binpath = NULL; if (arcan_isfile( "./arcan_frameserver") ) binpath = strdup("./arcan_frameserver" ); else if (arcan_isfile( "/usr/local/bin/arcan_frameserver")) binpath = strdup("/usr/local/bin/arcan_frameserver"); else if (arcan_isfile( "/usr/bin/arcan_frameserver" )) binpath = strdup("/usr/bin/arcan_frameserver"); else ; return binpath; }
static char* libpath_unix() { char* libpath = NULL; if (arcan_isfile( getenv("ARCAN_HIJACK") ) ) libpath = strdup( getenv("ARCAN_HIJACK") ); else if (arcan_isfile( "./libarcan_hijack.so")) libpath = realpath( "./", NULL ); else if (arcan_isfile( "/usr/local/lib/libarcan_hijack.so") ) libpath = strdup( "/usr/local/lib/"); else if (arcan_isfile( "/usr/lib/libarcan_hijack.so") ) libpath = strdup( "/usr/lib/"); return libpath; }
char* arcan_find_resource(const char* label, enum arcan_namespaces space, enum resource_type ares) { if (label == NULL || verify_traverse(label) == NULL) return NULL; size_t label_len = strlen(label); for (int i = 1, j = 0; i <= RESOURCE_SYS_ENDM; i <<= 1, j++){ if ((space & i) == 0 || !namespaces.paths[j]) continue; char scratch[ namespaces.lenv[j] + label_len + 2 ]; snprintf(scratch, sizeof(scratch), label[0] == '/' ? "%s%s" : "%s/%s", namespaces.paths[j], label ); if ( ((ares & ARES_FILE) && arcan_isfile(scratch)) || ((ares & ARES_FOLDER) && arcan_isdir(scratch)) ) return strdup(scratch); } return NULL; }
bool arcan_verify_namespaces(bool report) { bool working = true; if (report) arcan_warning("--- Verifying Namespaces: ---\n"); /* 1. check namespace mapping for holes */ for (int i = 0; i < sizeof( namespaces.paths) / sizeof(namespaces.paths[0]); i++){ if (namespaces.paths[i] == NULL){ if (i != (int)log2(RESOURCE_SYS_LIBS)){ working = false; if (report) arcan_warning("%s -- broken\n", lbls[i]); continue; } } if (report) arcan_warning("%s -- OK (%s)\n", lbls[i], namespaces.paths[i]); } if (report) arcan_warning("--- Namespace Verification Completed ---\n"); /* 2. missing; check permissions for each mounted space, i.e. we should be able * to write to state, we should be able to write to appl temporary etc. also * check disk space for possible warning conditions (these should likely also * be emitted as system events) */ if (working){ char* toktmp = strdup(FRAMESERVER_MODESTRING); /* modestring is static, atypestr can only be reduced in bytes used */ if (!atypestr) atypestr = strdup(FRAMESERVER_MODESTRING); char* tokctx, (* tok) = strtok_r(toktmp, " ", &tokctx); if (tok && atypestr){ char* base = arcan_expand_resource("", RESOURCE_SYS_BINS); size_t baselen = strlen(base); /* fix for specialized "do we have default arcan_frameserver? then compact to * afsrv_ for archetype prefix" mode */ size_t sfxlen = sizeof("arcan_frameserver") - 1; if (baselen >= sfxlen){ if (strcmp(&base[baselen - sfxlen], "arcan_frameserver") == 0){ const char* sfx = "afsrv"; memcpy(&base[baselen - sfxlen], sfx, sizeof("afsrv")); } } /* could / should do a more rigorous test of the corresponding afsrv, e.g. * executable, permission and linked shmif version */ atypestr[0] = '\0'; bool first = true; do{ char* fn; char exp[2 + baselen + strlen(tok)]; snprintf(exp, sizeof(exp), "%s_%s", base, tok); if (arcan_isfile(exp)){ if (!first){ strcat(atypestr, " "); } strcat(atypestr, tok); first = false; } } while ((tok = strtok_r(NULL, " ", &tokctx))); free(base); } free(toktmp); } return working; }