}
int parse_pid(const char *s, pid_t* ret_pid) {
- unsigned long ul;
+ unsigned long ul = 0;
pid_t pid;
int r;
return make_stdio(null_fd);
}
-bool is_clean_exit(int code, int status) {
-
- if (code == CLD_EXITED)
- return status == 0;
-
- /* If a daemon does not implement handlers for some of the
- * signals that's not considered an unclean shutdown */
- if (code == CLD_KILLED)
- return
- status == SIGHUP ||
- status == SIGINT ||
- status == SIGTERM ||
- status == SIGPIPE;
-
- return false;
-}
-
-bool is_clean_exit_lsb(int code, int status) {
-
- if (is_clean_exit(code, status))
- return true;
-
- return
- code == CLD_EXITED &&
- (status == EXIT_NOTINSTALLED || status == EXIT_NOTCONFIGURED);
-}
-
bool is_device_path(const char *path) {
/* Returns true on paths that refer to a device, either in
if (!ansi_color)
const_color = "1;34"; /* Light Blue for Gentoo */
+#elif defined(TARGET_ALTLINUX)
+
+ if (!pretty_name) {
+ if ((r = read_one_line_file("/etc/altlinux-release", &pretty_name)) < 0) {
+
+ if (r != -ENOENT)
+ log_warning("Failed to read /etc/altlinux-release: %s", strerror(-r));
+ } else
+ truncate_nl(pretty_name);
+ }
+
+ if (!ansi_color)
+ const_color = "0;36"; /* Cyan for ALTLinux */
+
+
#elif defined(TARGET_DEBIAN)
if (!pretty_name) {
environ[j] = NULL;
}
+bool tty_is_vc(const char *tty) {
+ assert(tty);
+
+ if (startswith(tty, "/dev/"))
+ tty += 5;
+
+ return startswith(tty, "tty") &&
+ tty[3] >= '0' && tty[3] <= '9';
+}
+
const char *default_term_for_tty(const char *tty) {
+ char *active = NULL;
+ const char *term;
+
assert(tty);
if (startswith(tty, "/dev/"))
tty += 5;
- if (startswith(tty, "tty") &&
- tty[3] >= '0' && tty[3] <= '9')
- return "TERM=linux";
+ /* Resolve where /dev/console is pointing when determining
+ * TERM */
+ if (streq(tty, "console"))
+ if (read_one_line_file("/sys/class/tty/console/active", &active) >= 0) {
+ truncate_nl(active);
+ tty = active;
+ }
+
+ term = tty_is_vc(tty) ? "TERM=linux" : "TERM=vt100";
+ free(active);
+
+ return term;
+}
+
+bool running_in_vm(void) {
+
+#if defined(__i386__) || defined(__x86_64__)
- /* FIXME: Proper handling of /dev/console would be cool */
+ /* Both CPUID and DMI are x86 specific interfaces... */
- return "TERM=vt100";
+ const char *const dmi_vendors[] = {
+ "/sys/class/dmi/id/sys_vendor",
+ "/sys/class/dmi/id/board_vendor",
+ "/sys/class/dmi/id/bios_vendor"
+ };
+
+ uint32_t eax = 0x40000000;
+ union {
+ uint32_t sig32[3];
+ char text[13];
+ } sig;
+
+ unsigned i;
+
+ for (i = 0; i < ELEMENTSOF(dmi_vendors); i++) {
+ char *s;
+ bool b;
+
+ if (read_one_line_file(dmi_vendors[i], &s) < 0)
+ continue;
+
+ b = startswith(s, "QEMU") ||
+ /* http://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=1009458 */
+ startswith(s, "VMware") ||
+ startswith(s, "VMW") ||
+ startswith(s, "Microsoft Corporation") ||
+ startswith(s, "innotek GmbH") ||
+ startswith(s, "Xen");
+
+ free(s);
+
+ if (b)
+ return true;
+ }
+
+ /* http://lwn.net/Articles/301888/ */
+ zero(sig);
+
+
+#if defined (__i386__)
+#define REG_a "eax"
+#define REG_b "ebx"
+#elif defined (__amd64__)
+#define REG_a "rax"
+#define REG_b "rbx"
+#endif
+
+ __asm__ __volatile__ (
+ /* ebx/rbx is being used for PIC! */
+ " push %%"REG_b" \n\t"
+ " cpuid \n\t"
+ " mov %%ebx, %1 \n\t"
+ " pop %%"REG_b" \n\t"
+
+ : "=a" (eax), "=r" (sig.sig32[0]), "=c" (sig.sig32[1]), "=d" (sig.sig32[2])
+ : "0" (eax)
+ );
+
+ if (streq(sig.text, "XenVMMXenVMM") ||
+ streq(sig.text, "KVMKVMKVM") ||
+ /* http://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=1009458 */
+ streq(sig.text, "VMwareVMware") ||
+ /* http://msdn.microsoft.com/en-us/library/bb969719.aspx */
+ streq(sig.text, "Microsoft Hv"))
+ return true;
+#endif
+
+ return false;
}
static const char *const ioprio_class_table[] = {