1117N/A/*
1407N/A * Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved.
1117N/A *
1117N/A * Permission is hereby granted, free of charge, to any person obtaining a
1117N/A * copy of this software and associated documentation files (the "Software"),
1117N/A * to deal in the Software without restriction, including without limitation
1117N/A * the rights to use, copy, modify, merge, publish, distribute, sublicense,
1117N/A * and/or sell copies of the Software, and to permit persons to whom the
1117N/A * Software is furnished to do so, subject to the following conditions:
1117N/A *
1117N/A * The above copyright notice and this permission notice (including the next
1117N/A * paragraph) shall be included in all copies or substantial portions of the
1117N/A * Software.
1117N/A *
1117N/A * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1117N/A * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1117N/A * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
1117N/A * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
1117N/A * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
1117N/A * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
1117N/A * DEALINGS IN THE SOFTWARE.
1117N/A */
1117N/A
1407N/A#include "libvtsSUNWast.h"
1407N/A
1407N/Aast_info_t ast_info;
1117N/A
1407N/Aast_xw_t ast_xw;
1117N/A
1407N/Astatic gfxtest_info *tests_info;
1117N/A
1117N/A/* Declarations needed for get_tests() */
1117N/A
1407N/Astatic uint_t ast_mask_list[] = {
1117N/A GRAPHICS_TEST_OPEN,
1117N/A GRAPHICS_TEST_DMA,
1117N/A GRAPHICS_TEST_MEM,
1117N/A GRAPHICS_TEST_CHIP
1117N/A};
1117N/A
1407N/Astatic uint_t ast_mesg_list[] = {
1117N/A GRAPHICS_TEST_OPEN_MESG,
1117N/A GRAPHICS_TEST_DMA_MESG,
1117N/A GRAPHICS_TEST_MEM_MESG,
1117N/A GRAPHICS_TEST_CHIP_MESG
1117N/A};
1117N/A
1117N/Astatic gfxtest_function ast_test_list[] = {
1117N/A ast_test_open,
1117N/A ast_test_dma,
1117N/A ast_test_memory,
1117N/A ast_test_chip
1117N/A};
1117N/A
1117N/A
1117N/A/* *** PUBLIC *** */
1117N/A
1117N/A/* These library functions are public and are expected to exist */
1117N/A
1117N/Aint
1407N/Aget_tests(
1407N/A register gfxtest_info *const tests)
1117N/A{
1117N/A /*
1117N/A * Set the gfx_vts_debug_mask bits according to environment variables
1117N/A */
1117N/A gfx_vts_set_debug_mask();
1117N/A
1117N/A /*
1117N/A * Construct the list of tests to be performed
1117N/A */
1117N/A tests->count = sizeof (ast_test_list) / sizeof (gfxtest_function);
1117N/A tests->this_test_mask = (int *)malloc(sizeof (ast_mask_list));
1117N/A tests->this_test_mesg = (int *)malloc(sizeof (ast_mesg_list));
1117N/A tests->this_test_function =
1407N/A (gfxtest_function *)malloc(sizeof (ast_test_list));
1117N/A
1407N/A if ((tests->this_test_mask == NULL) ||
1407N/A (tests->this_test_mesg == NULL) ||
1117N/A (tests->this_test_function == NULL)) {
1407N/A gfx_vts_free_tests(tests);
1407N/A return (GRAPHICS_ERR_MALLOC_FAIL);
1117N/A }
1117N/A
1117N/A tests->connection_test_function = ast_test_open;
1117N/A
1117N/A memcpy(tests->this_test_mask, ast_mask_list, sizeof (ast_mask_list));
1117N/A memcpy(tests->this_test_mesg, ast_mesg_list, sizeof (ast_mesg_list));
1117N/A memcpy(tests->this_test_function, ast_test_list,
1407N/A sizeof (ast_test_list));
1117N/A
1117N/A tests_info = tests;
1117N/A return (0);
1117N/A
1117N/A} /* get_tests() */
1117N/A
1117N/A
1117N/Aint
1407N/Acleanup_tests(
1407N/A register gfxtest_info *const tests)
1117N/A{
1117N/A
1407N/A TraceMessage(VTS_DEBUG, "cleanup_tests", "call cleanup_tests\n");
1117N/A gfx_vts_free_tests(tests);
1117N/A
1407N/A return (0);
1117N/A} /* cleanup_tests() */
1117N/A
1117N/A
1407N/Avoid
1407N/Aast_block_signals(
1407N/A void)
1117N/A{
1407N/A sigset_t newprocmask;
1117N/A
1407N/A sigemptyset(&newprocmask);
1407N/A sigaddset(&newprocmask, SIGHUP);
1407N/A sigaddset(&newprocmask, SIGINT);
1407N/A sigaddset(&newprocmask, SIGTERM);
1407N/A sigaddset(&newprocmask, SIGALRM);
1117N/A
1407N/A sigprocmask(SIG_BLOCK, &newprocmask, &ast_xw.xw_procmask);
1407N/A}
1117N/A
1117N/A
1117N/Avoid
1407N/Aast_restore_signals(
1407N/A void)
1407N/A{
1407N/A sigprocmask(SIG_SETMASK, &ast_xw.xw_procmask, (sigset_t *)NULL);
1407N/A}
1407N/A
1407N/A
1407N/Aint
1407N/Aast_lock_display(
1407N/A void)
1407N/A{
1407N/A if (gfx_vts_debug_mask & GRAPHICS_VTS_SLOCK_OFF) {
1407N/A TraceMessage(VTS_DEBUG, "ast_lock_display",
1407N/A "ast_lock_display() DISABLED\n");
1407N/A return (0);
1407N/A }
1407N/A
1407N/A if (!ast_open_display()) {
1407N/A return (0);
1407N/A }
1407N/A
1407N/A ast_create_cursor();
1407N/A
1407N/A ast_create_window();
1407N/A
1407N/A XMapRaised(ast_xw.xw_display, ast_xw.xw_window);
1407N/A
1407N/A TraceMessage(VTS_DEBUG, "ast_lock_display",
1407N/A "XMapRaised(display, 0x%lx)\n",
1407N/A (ulong_t)ast_xw.xw_window);
1407N/A
1407N/A /* Disable server from handling any requests */
1407N/A ast_grab_server();
1407N/A
1407N/A /* Gain control of keyboard */
1407N/A ast_grab_keyboard();
1407N/A
1407N/A /* Gain control of pointer */
1407N/A ast_grab_pointer();
1407N/A
1407N/A ast_disable_screensaver();
1407N/A
1407N/A ast_disable_dpms();
1407N/A
1407N/A XSync(ast_xw.xw_display, False);
1407N/A
1407N/A return (1);
1407N/A
1407N/A} /* ast_lock_display() */
1407N/A
1407N/A
1407N/Aint
1407N/Aast_unlock_display(
1407N/A void)
1407N/A{
1407N/A if (ast_xw.xw_display == NULL)
1407N/A return (0);
1407N/A
1407N/A XUnmapWindow(ast_xw.xw_display, ast_xw.xw_window);
1407N/A
1407N/A TraceMessage(VTS_DEBUG, "ast_unlock_display",
1407N/A "XUnmapWindow(display, 0x%lx)\n",
1407N/A (ulong_t)ast_xw.xw_window);
1407N/A
1407N/A ast_restore_dpms();
1407N/A
1407N/A ast_restore_screensaver();
1407N/A
1407N/A ast_ungrab_pointer();
1407N/A
1407N/A ast_ungrab_keyboard();
1407N/A
1407N/A ast_ungrab_server();
1407N/A
1407N/A XSync(ast_xw.xw_display, False);
1407N/A
1407N/A ast_check_for_interrupt();
1407N/A
1407N/A return (1);
1407N/A}
1407N/A
1407N/A
1407N/Aint
1407N/Aast_open_display(
1407N/A void)
1407N/A{
1407N/A if (ast_xw.xw_dispname == NULL)
1407N/A ast_xw.xw_dispname = ":0.0";
1407N/A
1407N/A if (ast_xw.xw_display == NULL) {
1407N/A ast_xw.xw_display = XOpenDisplay(ast_xw.xw_dispname);
1407N/A
1407N/A if (ast_xw.xw_display == NULL) {
1407N/A TraceMessage(VTS_DEBUG, "ast_open_display",
1407N/A "XOpenDisplay(\"%s\") = NULL\n"
1407N/A "Assuming no window system.\n",
1407N/A ast_xw.xw_dispname);
1407N/A
1407N/A return (0);
1407N/A }
1407N/A
1407N/A TraceMessage(VTS_DEBUG, "ast_open_display",
1407N/A "XOpenDisplay(\"%s\") = 0x%p\n"
1407N/A "Assuming a window system.\n",
1407N/A ast_xw.xw_dispname, ast_xw.xw_display);
1407N/A }
1407N/A
1407N/A /* Tell server to report events as they occur */
1407N/A XSynchronize(ast_xw.xw_display, True);
1407N/A
1407N/A TraceMessage(VTS_DEBUG, "ast_open_display",
1407N/A "XSynchronize(display, True).\n");
1407N/A
1407N/A return (1);
1407N/A}
1407N/A
1407N/A
1407N/Aint
1407N/Aast_create_cursor(
1407N/A void)
1407N/A{
1407N/A register Window const root = RootWindow(ast_xw.xw_display,
1407N/A ast_xw.xw_screen);
1407N/A register Pixmap emptypixmap;
1407N/A XColor dummy_color = {0, 0, 0, 0, 0, 0};
1407N/A
1407N/A if (ast_xw.xw_cursor != 0)
1407N/A return (0);
1407N/A
1407N/A emptypixmap = XCreateBitmapFromData(ast_xw.xw_display, root, "", 1, 1);
1407N/A
1407N/A ast_xw.xw_cursor = XCreatePixmapCursor(ast_xw.xw_display,
1407N/A emptypixmap, emptypixmap, &dummy_color, &dummy_color, 0, 0);
1407N/A
1407N/A TraceMessage(VTS_DEBUG, "ast_create_cursor",
1407N/A "XCreatePixmapCursor(display, 0x%lx, 0x%lx, &dummy_color, "
1407N/A "&dummy_color, 0, 0) = 0x%lx\n",
1407N/A (ulong_t)emptypixmap, (ulong_t)emptypixmap,
1407N/A (ulong_t)ast_xw.xw_cursor);
1407N/A
1407N/A XFreePixmap(ast_xw.xw_display, emptypixmap);
1407N/A
1407N/A return (1);
1407N/A}
1407N/A
1407N/A
1407N/Aint
1407N/Aast_create_window(
1407N/A void)
1407N/A{
1407N/A register Window const root = RootWindow(ast_xw.xw_display,
1407N/A ast_xw.xw_screen);
1407N/A register int const width = DisplayWidth(ast_xw.xw_display,
1407N/A ast_xw.xw_screen);
1407N/A register int const height = DisplayHeight(ast_xw.xw_display,
1407N/A ast_xw.xw_screen);
1407N/A XSetWindowAttributes xswa;
1407N/A
1407N/A if (ast_xw.xw_window != NULL)
1407N/A return (0);
1407N/A
1407N/A memset(&xswa, 0, sizeof (xswa));
1407N/A xswa.cursor = ast_xw.xw_cursor;
1407N/A xswa.background_pixmap = None;
1407N/A xswa.override_redirect = True;
1407N/A xswa.backing_store = NotUseful;
1407N/A xswa.save_under = False;
1407N/A xswa.event_mask = KeyPressMask | KeyReleaseMask | ExposureMask;
1407N/A
1407N/A ast_xw.xw_window = XCreateWindow(ast_xw.xw_display,
1407N/A root, 0, 0, width, height,
1407N/A 0, CopyFromParent, InputOutput, CopyFromParent,
1407N/A CWBackPixmap | CWOverrideRedirect | CWBackingStore |
1407N/A CWSaveUnder | CWEventMask | CWCursor, &xswa);
1407N/A
1407N/A TraceMessage(VTS_DEBUG, "ast_create_window",
1407N/A "XCreateWindow(display, 0x%lx, %d, %d, %d, %d, "
1407N/A "%d, %d, %d, %d, 0x%lx, &xswa) = 0x%lx\n",
1407N/A (ulong_t)root, 0, 0, width, height,
1407N/A 0, CopyFromParent, InputOutput, CopyFromParent,
1407N/A (ulong_t)(CWBackPixmap | CWOverrideRedirect |
1407N/A CWBackingStore | CWSaveUnder | CWEventMask | CWCursor),
1407N/A (ulong_t)ast_xw.xw_window);
1407N/A
1407N/A XStoreName(ast_xw.xw_display, ast_xw.xw_window, "libvtsSUNWast");
1407N/A
1407N/A return (1);
1407N/A}
1407N/A
1407N/A
1407N/Aint
1407N/Aast_grab_server(
1407N/A void)
1407N/A{
1407N/A if (ast_xw.xw_grab_server == True)
1407N/A return (0);
1407N/A
1407N/A ast_xw.xw_grab_server = XGrabServer(ast_xw.xw_display);
1407N/A
1407N/A TraceMessage(VTS_DEBUG, "ast_grab_server",
1407N/A "XGrabServer(display)\n");
1407N/A
1407N/A return (1);
1407N/A}
1407N/A
1407N/A
1407N/Aint
1407N/Aast_ungrab_server(
1407N/A void)
1407N/A{
1407N/A if (ast_xw.xw_grab_server != True)
1407N/A return (0);
1407N/A
1407N/A ast_xw.xw_grab_server = !XUngrabServer(ast_xw.xw_display);
1407N/A
1407N/A TraceMessage(VTS_DEBUG, "ast_ungrab_server",
1407N/A "XUngrabServer(display)\n");
1407N/A
1407N/A return (1);
1407N/A}
1407N/A
1407N/A
1407N/Aint
1407N/Aast_grab_keyboard(
1407N/A void)
1407N/A{
1407N/A register int status;
1407N/A
1407N/A if (ast_xw.xw_grab_keyboard == True)
1407N/A return (0);
1407N/A
1407N/A status = XGrabKeyboard(ast_xw.xw_display, ast_xw.xw_window,
1407N/A False, GrabModeAsync, GrabModeAsync, CurrentTime);
1407N/A ast_xw.xw_grab_keyboard = status == GrabSuccess;
1407N/A
1407N/A TraceMessage(VTS_DEBUG, "ast_grab_keyboard",
1407N/A "XGrabKeyboard(display, 0x%lx, %d, %d, %d, %ld) = %d\n",
1407N/A (ulong_t)ast_xw.xw_window,
1407N/A False, GrabModeAsync, GrabModeAsync, CurrentTime,
1407N/A status);
1407N/A
1407N/A if (status != GrabSuccess) {
1407N/A TraceMessage(VTS_DEBUG, "ast_grab_keyboard",
1407N/A "Cannot gain control of keyboard\n");
1407N/A return (-1);
1407N/A
1407N/A } else {
1407N/A return (1);
1407N/A }
1407N/A}
1407N/A
1407N/A
1407N/Aint
1407N/Aast_ungrab_keyboard(
1407N/A void)
1407N/A{
1407N/A register int status;
1407N/A
1407N/A if (ast_xw.xw_grab_keyboard != True)
1407N/A return (0);
1407N/A
1407N/A status = XUngrabKeyboard(ast_xw.xw_display, CurrentTime);
1407N/A
1407N/A ast_xw.xw_grab_keyboard = False;
1407N/A TraceMessage(VTS_DEBUG, "ast_ungrab_keyboard",
1407N/A "XGrabKeyboard(display, %ld) = %d\n",
1407N/A CurrentTime, status);
1407N/A
1407N/A return (1);
1407N/A}
1407N/A
1407N/A
1407N/Aint
1407N/Aast_grab_pointer(
1407N/A void)
1407N/A{
1407N/A register int status;
1407N/A
1407N/A if (ast_xw.xw_grab_pointer == True)
1407N/A return (0);
1407N/A
1407N/A status = XGrabPointer(ast_xw.xw_display, ast_xw.xw_window,
1407N/A False, ResizeRedirectMask, GrabModeAsync, GrabModeAsync,
1407N/A None, ast_xw.xw_cursor, CurrentTime);
1407N/A
1407N/A ast_xw.xw_grab_pointer = status == GrabSuccess;
1407N/A
1407N/A TraceMessage(VTS_DEBUG, "ast_grab_pointer",
1407N/A "XGrabPointer(display, 0x%lx, %d, 0x%lx, %d, %d, "
1407N/A "%d, %d, %ld) = %d\n",
1407N/A (ulong_t)ast_xw.xw_window,
1407N/A False, ResizeRedirectMask,
1407N/A GrabModeAsync, GrabModeAsync,
1407N/A None, None, CurrentTime,
1407N/A status);
1407N/A
1407N/A if (status != GrabSuccess) {
1407N/A TraceMessage(VTS_DEBUG, "ast_grab_pointer",
1407N/A "Cannot gain control of pointer\n");
1407N/A return (-1);
1407N/A
1407N/A } else {
1407N/A return (1);
1407N/A }
1407N/A}
1407N/A
1407N/A
1407N/Aint
1407N/Aast_ungrab_pointer(
1407N/A void)
1407N/A{
1407N/A register int status;
1407N/A
1407N/A if (ast_xw.xw_grab_pointer != True)
1407N/A return (0);
1407N/A
1407N/A status = XUngrabPointer(ast_xw.xw_display, CurrentTime);
1407N/A
1407N/A ast_xw.xw_grab_pointer = False;
1407N/A
1407N/A TraceMessage(VTS_DEBUG, "ast_ungrab_pointer",
1407N/A "XGrabPointer(display, %ld) = %d\n",
1407N/A CurrentTime, status);
1407N/A
1407N/A return (1);
1407N/A}
1407N/A
1407N/A
1407N/Aint
1407N/Aast_disable_screensaver(
1407N/A void)
1407N/A{
1407N/A XGetScreenSaver(ast_xw.xw_display,
1407N/A &ast_xw.xw_ss_timeout,
1407N/A &ast_xw.xw_ss_interval,
1407N/A &ast_xw.xw_ss_prefer_blanking,
1407N/A &ast_xw.xw_ss_allow_exposures);
1407N/A
1407N/A ast_xw.xw_ss_saved = True;
1407N/A
1407N/A TraceMessage(VTS_DEBUG, "ast_disable_screensaver",
1407N/A "XGetScreenSaver(display) = %d, %d, %d, %d\n",
1407N/A ast_xw.xw_ss_timeout,
1407N/A ast_xw.xw_ss_interval,
1407N/A ast_xw.xw_ss_prefer_blanking,
1407N/A ast_xw.xw_ss_allow_exposures);
1407N/A
1407N/A /* Reset the screen saver to reset its time. */
1407N/A
1407N/A XResetScreenSaver(ast_xw.xw_display);
1407N/A
1407N/A ast_xw.xw_ss_disabled = True;
1407N/A
1407N/A XSetScreenSaver(ast_xw.xw_display,
1407N/A DisableScreenSaver,
1407N/A ast_xw.xw_ss_interval,
1407N/A ast_xw.xw_ss_prefer_blanking,
1407N/A ast_xw.xw_ss_allow_exposures);
1407N/A
1407N/A TraceMessage(VTS_DEBUG, "ast_disable_screensaver",
1407N/A "XSetScreenSaver(display, %d, %d, %d, %d)\n",
1407N/A DisableScreenSaver,
1407N/A ast_xw.xw_ss_interval,
1407N/A ast_xw.xw_ss_prefer_blanking,
1407N/A ast_xw.xw_ss_allow_exposures);
1407N/A
1407N/A return (1);
1407N/A}
1407N/A
1407N/A
1407N/Aint
1407N/Aast_restore_screensaver(
1407N/A void)
1407N/A{
1407N/A if (ast_xw.xw_ss_saved != True ||
1407N/A ast_xw.xw_ss_disabled != True) {
1407N/A ast_xw.xw_ss_disabled = False;
1407N/A ast_xw.xw_ss_saved = False;
1407N/A return (0);
1407N/A
1407N/A } else {
1407N/A XSetScreenSaver(ast_xw.xw_display,
1407N/A ast_xw.xw_ss_timeout,
1407N/A ast_xw.xw_ss_interval,
1407N/A ast_xw.xw_ss_prefer_blanking,
1407N/A ast_xw.xw_ss_allow_exposures);
1407N/A
1407N/A ast_xw.xw_ss_disabled = False;
1407N/A
1407N/A TraceMessage(VTS_DEBUG, "ast_restore_screensaver",
1407N/A "XSetScreenSaver(display, %d, %d, %d, %d)\n",
1407N/A ast_xw.xw_ss_timeout,
1407N/A ast_xw.xw_ss_interval,
1407N/A ast_xw.xw_ss_prefer_blanking,
1407N/A ast_xw.xw_ss_allow_exposures);
1407N/A
1407N/A ast_xw.xw_ss_saved = False;
1407N/A
1407N/A return (1);
1407N/A }
1407N/A}
1407N/A
1407N/A
1407N/Aint
1407N/Aast_disable_dpms(
1407N/A void)
1407N/A{
1407N/A /* Disable the X Display Power Management Signaling. */
1407N/A
1407N/A int status;
1407N/A int dpms_error = 0;
1407N/A int dpms_event = 0;
1407N/A
1407N/A status = DPMSQueryExtension(ast_xw.xw_display,
1407N/A &dpms_event, &dpms_error);
1407N/A
1407N/A TraceMessage(VTS_DEBUG, "ast_disable_dpms",
1407N/A "DPMSQueryExtension(display) = %d, %d, %d\n",
1407N/A status,
1407N/A dpms_event,
1407N/A dpms_error);
1407N/A
1407N/A if (status != True)
1407N/A return (-1);
1407N/A
1407N/A ast_xw.xw_dpms_saved = DPMSInfo(ast_xw.xw_display,
1407N/A &ast_xw.xw_dpms_power, &ast_xw.xw_dpms_state);
1407N/A
1407N/A TraceMessage(VTS_DEBUG, "ast_disable_dpms",
1407N/A "DPMSInfo(display) = %d, %d, %d\n",
1407N/A ast_xw.xw_dpms_saved,
1407N/A ast_xw.xw_dpms_power,
1407N/A ast_xw.xw_dpms_state);
1407N/A
1407N/A if (ast_xw.xw_dpms_saved != True ||
1407N/A ast_xw.xw_dpms_state != True)
1407N/A return (0);
1407N/A
1407N/A else {
1407N/A ast_xw.xw_dpms_disabled = True;
1407N/A
1407N/A DPMSDisable(ast_xw.xw_display);
1407N/A
1407N/A TraceMessage(VTS_DEBUG, "ast_disable_dpms",
1407N/A "DPMSDisable(display)\n");
1407N/A
1407N/A return (1);
1407N/A }
1407N/A}
1407N/A
1407N/A
1407N/Aint
1407N/Aast_restore_dpms(
1407N/A void)
1407N/A{
1407N/A /* Restore the X Display Power Management Signaling. */
1407N/A
1407N/A if (ast_xw.xw_dpms_saved != True ||
1407N/A ast_xw.xw_dpms_disabled != True) {
1407N/A ast_xw.xw_dpms_disabled = False;
1407N/A ast_xw.xw_dpms_saved = False;
1407N/A return (0);
1407N/A
1407N/A } else {
1407N/A DPMSEnable(ast_xw.xw_display);
1407N/A
1407N/A ast_xw.xw_dpms_disabled = False;
1407N/A
1407N/A TraceMessage(VTS_DEBUG, "ast_restore_dpms",
1407N/A "DPMSEnable(display)\n");
1407N/A
1407N/A ast_xw.xw_dpms_saved = False;
1407N/A return (1);
1407N/A }
1407N/A}
1407N/A
1407N/A
1407N/Aint
1407N/Aast_sleep(
1407N/A uint_t const seconds)
1407N/A{
1407N/A register int signo;
1407N/A struct sigaction oldhup;
1407N/A struct sigaction oldint;
1407N/A struct sigaction oldalrm;
1407N/A struct sigaction oldterm;
1407N/A struct sigaction newsigact;
1407N/A sigset_t oldprocmask;
1407N/A
1407N/A /*
1407N/A * Allow a SIGHUP, SIGINT, SIGALRM, or SIGTERM to interrupt our
1407N/A * sleep. These signals should already be masked from a
1407N/A * call to ast_block_signals.
1407N/A */
1407N/A
1407N/A /* Save the current signals. */
1407N/A
1407N/A sigaction(SIGHUP, NULL, &oldhup);
1407N/A sigaction(SIGINT, NULL, &oldint);
1407N/A sigaction(SIGALRM, NULL, &oldalrm);
1407N/A sigaction(SIGTERM, NULL, &oldterm);
1407N/A
1407N/A /* Setup up new signal action. */
1407N/A
1407N/A newsigact.sa_handler = ast_signal_routine;
1407N/A sigemptyset(&newsigact.sa_mask);
1407N/A newsigact.sa_flags = 0;
1407N/A
1407N/A signo = sigsetjmp(ast_xw.xw_sigjmpbuf, 1);
1407N/A if (!signo) {
1407N/A /* First time goes here. */
1407N/A
1407N/A /* Set signal routines. */
1407N/A
1407N/A if (oldhup.sa_handler != SIG_IGN)
1407N/A sigaction(SIGHUP, &newsigact, NULL);
1407N/A if (oldint.sa_handler != SIG_IGN)
1407N/A sigaction(SIGINT, &newsigact, NULL);
1407N/A if (oldalrm.sa_handler != SIG_IGN)
1407N/A sigaction(SIGALRM, &newsigact, NULL);
1407N/A if (oldterm.sa_handler != SIG_IGN)
1407N/A sigaction(SIGTERM, &newsigact, NULL);
1407N/A
1407N/A /* Unmask SIGHUP, SIGINT, SIGALRM, SIGTERM. */
1407N/A
1407N/A sigprocmask(SIG_SETMASK, &ast_xw.xw_procmask, &oldprocmask);
1407N/A
1407N/A sleep(seconds);
1407N/A
1407N/A /* Mask SIGHUP, SIGINT, SIGALRM, SIGTERM. */
1407N/A
1407N/A sigprocmask(SIG_SETMASK, &oldprocmask, NULL);
1407N/A
1407N/A /* Restore the signals. */
1407N/A
1407N/A if (oldhup.sa_handler != SIG_IGN)
1407N/A sigaction(SIGHUP, &oldhup, NULL);
1407N/A if (oldint.sa_handler != SIG_IGN)
1407N/A sigaction(SIGINT, &oldint, NULL);
1407N/A if (oldalrm.sa_handler != SIG_IGN)
1407N/A sigaction(SIGALRM, &oldalrm, NULL);
1407N/A if (oldterm.sa_handler != SIG_IGN)
1407N/A sigaction(SIGTERM, &oldterm, NULL);
1407N/A }
1407N/A
1407N/A else {
1407N/A /* We come here from the siglongjmp in ast_signal_routine. */
1407N/A
1407N/A /* Mask SIGHUP, SIGINT, SIGALRM, SIGTERM. */
1407N/A
1407N/A sigprocmask(SIG_SETMASK, &oldprocmask, NULL);
1407N/A
1407N/A /* Restore the signals. */
1407N/A
1407N/A if (oldhup.sa_handler != SIG_IGN)
1407N/A sigaction(SIGHUP, &oldhup, NULL);
1407N/A if (oldint.sa_handler != SIG_IGN)
1407N/A sigaction(SIGINT, &oldint, NULL);
1407N/A if (oldalrm.sa_handler != SIG_IGN)
1407N/A sigaction(SIGALRM, &oldalrm, NULL);
1407N/A if (oldterm.sa_handler != SIG_IGN)
1407N/A sigaction(SIGTERM, &oldterm, NULL);
1407N/A
1407N/A /* Cause us to get the signal, when we unmask the signals. */
1407N/A kill(getpid(), signo);
1407N/A return (signo);
1407N/A }
1407N/A
1407N/A signo = ast_check_for_interrupt();
1407N/A return (signo);
1407N/A}
1407N/A
1407N/A
1407N/Avoid
1407N/Aast_signal_routine(
1407N/A register int const signo)
1407N/A{
1407N/A siglongjmp(ast_xw.xw_sigjmpbuf, signo);
1407N/A}
1407N/A
1407N/A
1407N/Avoid
1407N/Agraphicstest_finish(
1407N/A register int const flag)
1117N/A{
1117N/A
1407N/A TraceMessage(VTS_DEBUG, "graphicstest_finish",
1407N/A "call graphicstest_finish\n");
1117N/A
1407N/A TraceMessage(VTS_DEBUG, "graphicstest_finish",
1407N/A "call reset_memory_state\n");
1117N/A
1117N/A cleanup_tests(tests_info);
1117N/A
1117N/A exit(0);
1117N/A
1117N/A} /* graphicstest_finish() */
1117N/A
1407N/A#define CTRL(x) ((x) & 0x1f)
1117N/A
1117N/A
1407N/Aint
1407N/Aast_check_for_interrupt(
1407N/A void)
1407N/A{
1407N/A register size_t inputlength;
1407N/A register size_t inputon;
1407N/A register int ch;
1407N/A struct sigaction oldint;
1407N/A struct sigaction oldquit;
1407N/A XEvent event;
1407N/A char inputstring[16];
1407N/A
1407N/A if (ast_xw.xw_display == NULL)
1407N/A return (0);
1407N/A
1407N/A while (XPending(ast_xw.xw_display)) {
1407N/A XNextEvent(ast_xw.xw_display, &event);
1407N/A if (event.type == KeyPress) {
1407N/A inputlength = XLookupString(&event.xkey, inputstring,
1407N/A sizeof (inputstring), NULL, NULL);
1407N/A for (inputon = 0; inputon < inputlength; inputon++) {
1407N/A ch = inputstring[inputon];
1407N/A
1407N/A if (ch == CTRL('c')) {
1407N/A sigaction(SIGINT, NULL, &oldint);
1407N/A if (oldint.sa_handler != SIG_IGN) {
1407N/A kill(getpid(), SIGINT);
1407N/A return (SIGINT);
1407N/A }
1407N/A
1407N/A } else if (ch == CTRL('\\')) {
1407N/A sigaction(SIGQUIT, NULL, &oldquit);
1407N/A if (oldquit.sa_handler != SIG_IGN) {
1407N/A kill(getpid(), SIGQUIT);
1407N/A return (SIGQUIT);
1407N/A }
1407N/A }
1407N/A }
1407N/A }
1407N/A }
1407N/A return (0);
1407N/A}
1407N/A
1117N/A/* End of libvtsSUNWast.c */