/* Wait for login on virtual machine console. * $Id: waitlogin.c,v 1.1 2007/05/17 10:54:29 rjones Exp $ * * Usage: waitlogin /dev/pts/NN * Get the device by doing virsh dumpxml name | grep console */ #include #include #include #include #include #include static sig_atomic_t sigalrm_counter = 0; static void sigalrm (int sig) { sigalrm_counter ++; } int main (int argc, char *argv[]) { FILE *fp; char buffer[256]; int len; struct sigaction sa; if (argc != 2) { fprintf (stderr, "%s /dev/pts/NN\n", argv[0]); exit (1); } fp = fopen (argv[1], "r+"); if (fp == NULL) { perror (argv[1]); exit (1); } memset (&sa, 0, sizeof sa); sa.sa_handler = sigalrm; sigaction (SIGALRM, &sa, NULL); while (1) { sigalrm_counter = 0; alarm (10); len = fread (buffer, 1, sizeof buffer - 1, fp); if (len == 0) { /* Error. If it's an alarm timeout, send a return keypress. */ if (sigalrm_counter > 0) { fputc ('\n', fp); } else if (feof (fp)) { fprintf (stderr, "Device %s closed unexpectedly.\n", argv[1]); exit (1); } else { perror (argv[1]); exit (1); } } else { buffer[len] = '\0'; /* Line read. See if it contains 'login: '. */ if (strstr (buffer, "login: ") != NULL) break; } } exit (0); }