flavor_ptr default_flavor(void) { char *fname = getenv("FLAVOR"); flavor_ptr f, flavor; if (fname) { if ((flavor = flavor_byname(fname)) == NULL) { fprintf(stderr, "FLAVOR=%s: no such flavor -- valid flavors are:\n", fname); f = flavors; while (f->name) { fprintf(stderr, "\t%s\n", f->name); f++; } exit(1); } /* make sure corresponding rtapi lib is also present */ if (check_rtapi_lib(fname)) return flavor; else exit(1); } if (kernel_is_rtai()) { f = flavor_byid(RTAPI_RTAI_KERNEL_ID); if (check_rtapi_lib((char *)f->name)) return f; } if (kernel_is_xenomai()) { /* check for userspace first */ f = flavor_byid(RTAPI_XENOMAI_ID); if (check_rtapi_lib((char *)f->name)) return f; /* else look for xenomai_kernel */ f = flavor_byid(RTAPI_XENOMAI_KERNEL_ID); if (check_rtapi_lib((char *)f->name)) return f; } if (kernel_is_rtpreempt()) { f = flavor_byid(RTAPI_RT_PREEMPT_ID); if (check_rtapi_lib((char *)f->name)) return f; } return flavor_byid(RTAPI_POSIX_ID); }
// determine if we can run this flavor on the current kernel static int flavor_and_kernel_compatible(flavor_ptr f) { int retval = 1; if (f->id == RTAPI_POSIX_ID) return 1; // no prerequisites if (kernel_is_xenomai()) { if (f->id == RTAPI_RT_PREEMPT_ID) { fprintf(stderr, "MSGD:%d Warning: starting %s RTAPI on a Xenomai kernel\n", rtapi_instance, f->name); return 1; } if ((f->id != RTAPI_XENOMAI_ID) && (f->id != RTAPI_XENOMAI_KERNEL_ID)) { fprintf(stderr, "MSGD:%d ERROR: trying to start %s RTAPI on a Xenomai kernel\n", rtapi_instance, f->name); return 0; } } if (kernel_is_rtai() && (f->id != RTAPI_RTAI_KERNEL_ID)) { fprintf(stderr, "MSGD:%d ERROR: trying to start %s RTAPI on an RTAI kernel\n", rtapi_instance, f->name); return 0; } if (kernel_is_rtpreempt() && (f->id != RTAPI_RT_PREEMPT_ID)) { fprintf(stderr, "MSGD:%d ERROR: trying to start %s RTAPI on an RT PREEMPT kernel\n", rtapi_instance, f->name); return 0; } return retval; }