/* * simple util for x server connection status * * cc checkx.c -lXm kishan@hackorama.com June 2002 */ #include #include #include #include #define OK 0 #define ERROR 1 #define FAIL 2 #define HANG 3 void checkit(char* disp, unsigned int time); void onalarm(); void usage(); void redirect(); int check_errors(); const unsigned int timeout = 60; const char err_file[MAXPATHLEN] = "/tmp/checkx.err"; int status = OK; int main(int argc, char* argv[]) { if( argc < 2 ) usage(); else if ( argc == 2 ) checkit(argv[1], timeout); else checkit(argv[1], atoi(argv[2])); return status; } void checkit(char* disp, unsigned int time) { Display *d; fprintf( stdout, "\n%s ", disp ); redirect(); signal(SIGALRM,onalarm); alarm(time); if( (d=XOpenDisplay(disp)) == NULL ){ if(check_errors() == 0) { fprintf(stdout, "ERROR\n\n"); status = ERROR; } else { fprintf(stdout, "FAIL\n\n"); status = FAIL; } }else{ fprintf(stdout, "OK\n\n"); } } void onalarm() { fprintf(stdout, "HANG\n\n"); status = HANG; exit(status); } /* return 0 if file is not empty */ int check_errors() { FILE *fd = NULL; char s[5]; fclose( stderr ); fd = fopen(err_file, "r"); if( fd != NULL ) { if ( fgets(s, sizeof(s), fd) != NULL ) { if( strlen(s) > 1 ) return 0; } } return 1; } void redirect() { freopen(err_file, "w+", stderr); } void usage() { fprintf(stdout, "\nUsage:\n\tcheckx display:x.x [time_out]\n\n" ); fprintf(stdout, "\tdefault time_out is %d seconds \n\n", timeout); fprintf(stdout, "Eg:\n\n"); fprintf(stdout, "\tcheckx tattoine:0.0\n"); fprintf(stdout, "\tcheckx naboo:0.0 30\n\n"); fprintf(stdout, "Returns:\n\n"); fprintf(stdout, "\t%d OK \t- can connect\n", OK); fprintf(stdout, "\t%d ERROR\t- server returned error \n", ERROR); fprintf(stdout, "\t%d FAIL \t- failed to connect\n", FAIL); fprintf(stdout, "\t%d HANG \t- connection is hanging \n", HANG); fprintf(stdout, "\n\tIn case of ERROR, the error message can be\n"); fprintf(stdout, "\tfound in the error log \"%s\".\n\n", err_file ); }