pause01.c revision aa35472f8d18e308cbce3bf599c55de88cca94d5
1e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner/* 2fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman * Copyright (c) 2000 Silicon Graphics, Inc. All Rights Reserved. 3e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner * 4e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner * This program is free software; you can redistribute it and/or modify it 54ee451de366474b9c228b4e5fa573795a715216dChris Lattner * under the terms of version 2 of the GNU General Public License as 64ee451de366474b9c228b4e5fa573795a715216dChris Lattner * published by the Free Software Foundation. 7fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman * 8e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner * This program is distributed in the hope that it would be useful, but 9e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner * WITHOUT ANY WARRANTY; without even the implied warranty of 10c86b67742a3298c0a5a715b57a64f11107b8a3f2Gordon Henriksen * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 11c86b67742a3298c0a5a715b57a64f11107b8a3f2Gordon Henriksen * 12c86b67742a3298c0a5a715b57a64f11107b8a3f2Gordon Henriksen * Further, this software is distributed without any warranty that it is 13c86b67742a3298c0a5a715b57a64f11107b8a3f2Gordon Henriksen * free of the rightful claim of any third person regarding infringement 14c86b67742a3298c0a5a715b57a64f11107b8a3f2Gordon Henriksen * or the like. Any license provided herein, whether implied or 15c86b67742a3298c0a5a715b57a64f11107b8a3f2Gordon Henriksen * otherwise, applies only to this software file. Patent licenses, if 16e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner * any, provided herein do not apply to combinations of this program with 17c86b67742a3298c0a5a715b57a64f11107b8a3f2Gordon Henriksen * other software, or any other product whatsoever. 18c86b67742a3298c0a5a715b57a64f11107b8a3f2Gordon Henriksen * 19c86b67742a3298c0a5a715b57a64f11107b8a3f2Gordon Henriksen * You should have received a copy of the GNU General Public License along 20e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner * with this program; if not, write the Free Software Foundation, Inc., 59 21e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner * Temple Place - Suite 330, Boston MA 02111-1307, USA. 22e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner * 23e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner * Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy, 24dd0ecf67316d68940fda2733faacf73b8bd22ec6Chris Lattner * Mountain View, CA 94043, or: 25dd0ecf67316d68940fda2733faacf73b8bd22ec6Chris Lattner * 26dd0ecf67316d68940fda2733faacf73b8bd22ec6Chris Lattner * http://www.sgi.com 2714ce9ef2e9013ba56e1daafebd91fe3ee1e8647eOwen Anderson * 28e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner * For further information regarding this notice, see: 29e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner * 3013e16b65ddd679d6edb5f182d683701fdea37b85Devang Patel * http://oss.sgi.com/projects/GenInfo/NoticeExplan/ 31ef9b9a793949469cdaa4ab6d0173136229dcab7bReid Spencer * 3278d033e086e19e016273de014f9214aa6f3f844bReid Spencer */ 339adb01cbc3ef70e7fa8b4d6b1a1229c63082a496Devang Patel/* $Id: pause01.c,v 1.2 2006/05/26 06:26:40 vapier Exp $ */ 348c231e5dda26b790ff388fe2f70eeeda621c9261Devang Patel/********************************************************** 35e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner * 36e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner * OS Test - Silicon Graphics, Inc. 37e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner * 388aa9fba7cbc9ed58a0f5e32ad5e54c3bb984b3e4Nick Lewycky * TEST IDENTIFIER : pause01 39e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner * 40e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner * EXECUTED BY : anyone 41ecd94c804a563f2a86572dcf1d2e81f397e19daaNick Lewycky * 42c2bbfc18e9adbbdcf5b3375d8d25e2452f7df7f1Dan Gohman * TEST TITLE : Basic test for pause(2) 43ae73dc1448d25b02cabc7c64c86c64371453dda8Dan Gohman * 44e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner * PARENT DOCUMENT : xxxtds01 45f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel * 46f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel * TEST CASE TOTAL : 1 47f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel * 48f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel * WALL CLOCK TIME : 2 49f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel * 50f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel * CPU TYPES : ALL 51229de95eabb7f5350a42152eab8c4c8643cdd0bfDevang Patel * 528aa9fba7cbc9ed58a0f5e32ad5e54c3bb984b3e4Nick Lewycky * AUTHOR : William Roske 53f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel * 54f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel * CO-PILOT : Dave Fenner 55f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel * 56f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel * DATE STARTED : 03/30/92 57229de95eabb7f5350a42152eab8c4c8643cdd0bfDevang Patel * 58e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner * INITIAL RELEASE : UNICOS 7.0 59e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner * 60e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner * TEST CASES 61e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner * 62e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner * 1.) pause(2) returns...(See Description) 63e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner * 6423e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel * INPUT SPECIFICATIONS 658aa9fba7cbc9ed58a0f5e32ad5e54c3bb984b3e4Nick Lewycky * The standard options for system call tests are accepted. 6623e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel * (See the parse_opts(3) man page). 6723e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel * 6823e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel * OUTPUT SPECIFICATIONS 6923e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel * 7023e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel * DURATION 7123e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel * Terminates - with frequency and infinite modes. 7223e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel * 7323e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel * SIGNALS 7423e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel * Uses SIGUSR1 to pause before test if option set. 7523e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel * (See the parse_opts(3) man page). 7623e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel * 77e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner * RESOURCES 78e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner * None 79844731a7f1909f55935e3514c9e713a62d67662eDan Gohman * 80844731a7f1909f55935e3514c9e713a62d67662eDan Gohman * ENVIRONMENTAL NEEDS 81844731a7f1909f55935e3514c9e713a62d67662eDan Gohman * No run-time environmental needs. 82844731a7f1909f55935e3514c9e713a62d67662eDan Gohman * 83e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner * SPECIAL PROCEDURAL REQUIREMENTS 84e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner * None 85e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner * 86e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner * INTERCASE DEPENDENCIES 87f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel * None 88f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel * 89f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel * DETAILED DESCRIPTION 90f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel * This is a Phase I test for the pause(2) system call. It is intended 91f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel * to provide a limited exposure of the system call, for now. It 92f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel * should/will be extended when full functional tests are written for 93f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel * pause(2). 94f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel * 9523e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel * Setup: 9623e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel * Setup signal handling. 9723e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel * Pause for SIGUSR1 if option specified. 9823e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel * 9923e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel * Test: 10023e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel * Loop if the proper options are given. 10123e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel * Execute system call 10223e528be8069ead5f598e4043481fa2ef122a0e6Devang Patel * Check return code, if system call failed (return=-1) 103bf5db817f4f66701f3efd7c7ae001cc36f825086Devang Patel * Log the errno and Issue a FAIL message. 104bf5db817f4f66701f3efd7c7ae001cc36f825086Devang Patel * Otherwise, Issue a PASS message. 105bf5db817f4f66701f3efd7c7ae001cc36f825086Devang Patel * 106bf5db817f4f66701f3efd7c7ae001cc36f825086Devang Patel * Cleanup: 107bf5db817f4f66701f3efd7c7ae001cc36f825086Devang Patel * Print errno log and/or timing stats if options given 108bf5db817f4f66701f3efd7c7ae001cc36f825086Devang Patel * 109bf5db817f4f66701f3efd7c7ae001cc36f825086Devang Patel * 110bf5db817f4f66701f3efd7c7ae001cc36f825086Devang Patel *#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#**/ 111bf5db817f4f66701f3efd7c7ae001cc36f825086Devang Patel 112bf5db817f4f66701f3efd7c7ae001cc36f825086Devang Patel#include <errno.h> 113dd0ecf67316d68940fda2733faacf73b8bd22ec6Chris Lattner#include <signal.h> 114dd0ecf67316d68940fda2733faacf73b8bd22ec6Chris Lattner#include "test.h" 1150eeb913aa17a68b1f2963b02ca1d68f09dba0b78Chris Lattner#include "usctest.h" 116dd0ecf67316d68940fda2733faacf73b8bd22ec6Chris Lattner 117dd0ecf67316d68940fda2733faacf73b8bd22ec6Chris Lattnervoid setup(); 118bf5db817f4f66701f3efd7c7ae001cc36f825086Devang Patelvoid cleanup(); 1190eeb913aa17a68b1f2963b02ca1d68f09dba0b78Chris Lattner 120dd0ecf67316d68940fda2733faacf73b8bd22ec6Chris Lattner 121bb46f52027416598a662dc1c58f48d9d56b1a65bRafael Espindola 122dd0ecf67316d68940fda2733faacf73b8bd22ec6Chris Lattnerchar *TCID="pause01"; /* Test program identifier. */ 123dd0ecf67316d68940fda2733faacf73b8bd22ec6Chris Lattnerint TST_TOTAL=1; /* Total number of test cases. */ 124dd0ecf67316d68940fda2733faacf73b8bd22ec6Chris Lattnerextern int Tst_count; /* Test Case counter for tst_* routines */ 125f23de86fa3b275cabc6450349dcbbb448ee5952bDevang Patel 126f23de86fa3b275cabc6450349dcbbb448ee5952bDevang Patelint exp_enos[]={EINTR, 0}; 127fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukmanvoid go(); 128dd0ecf67316d68940fda2733faacf73b8bd22ec6Chris Lattner 1290eeb913aa17a68b1f2963b02ca1d68f09dba0b78Chris Lattnerint 130bf5db817f4f66701f3efd7c7ae001cc36f825086Devang Patelmain(int ac, char **av) 131bf5db817f4f66701f3efd7c7ae001cc36f825086Devang Patel{ 132dd0ecf67316d68940fda2733faacf73b8bd22ec6Chris Lattner int lc; /* loop counter */ 133e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner char *msg; /* message returned from parse_opts */ 1347f1444bc0aefdd924e9b231e20d4c0529311e141Chris Lattner 1357f1444bc0aefdd924e9b231e20d4c0529311e141Chris Lattner /*************************************************************** 136f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel * parse standard options 1377f1444bc0aefdd924e9b231e20d4c0529311e141Chris Lattner ***************************************************************/ 138dec628eead87b20773c98a00830580df211acc98Chris Lattner if ( (msg=parse_opts(ac, av, (option_t *) NULL, NULL)) != (char *) NULL ) 1397f1444bc0aefdd924e9b231e20d4c0529311e141Chris Lattner tst_brkm(TBROK, cleanup, "OPTION PARSING ERROR - %s", msg); 140bb46f52027416598a662dc1c58f48d9d56b1a65bRafael Espindola 141460f656475738d1a95a6be95346908ce1597df25Daniel Dunbar /*************************************************************** 142f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel * perform global setup for test 143f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel ***************************************************************/ 1447f1444bc0aefdd924e9b231e20d4c0529311e141Chris Lattner setup(); 1457f1444bc0aefdd924e9b231e20d4c0529311e141Chris Lattner 1467f1444bc0aefdd924e9b231e20d4c0529311e141Chris Lattner /* set the expected errnos... */ 1477f1444bc0aefdd924e9b231e20d4c0529311e141Chris Lattner TEST_EXP_ENOS(exp_enos); 1487f1444bc0aefdd924e9b231e20d4c0529311e141Chris Lattner 149f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel /*************************************************************** 150f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel * check looping state if -c option given 151f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel ***************************************************************/ 152f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel for (lc=0; TEST_LOOPING(lc); lc++) { 153f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel 154f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel /* reset Tst_count in case we are looping. */ 155f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel Tst_count=0; 1567f1444bc0aefdd924e9b231e20d4c0529311e141Chris Lattner 1577f1444bc0aefdd924e9b231e20d4c0529311e141Chris Lattner (void) signal(SIGALRM, go); 1584460a7e90c318857a37be386a7ebccff3020a795Devang Patel alarm(1); 159401e10c4fbfcdcfade5065093e2ca97f69a1d144Chris Lattner /* 160401e10c4fbfcdcfade5065093e2ca97f69a1d144Chris Lattner * Call pause(2) 161401e10c4fbfcdcfade5065093e2ca97f69a1d144Chris Lattner */ 162401e10c4fbfcdcfade5065093e2ca97f69a1d144Chris Lattner TEST(pause()); 163401e10c4fbfcdcfade5065093e2ca97f69a1d144Chris Lattner 164401e10c4fbfcdcfade5065093e2ca97f69a1d144Chris Lattner /* check return code. Pause returns -1 and EINTR errno */ 165401e10c4fbfcdcfade5065093e2ca97f69a1d144Chris Lattner if (TEST_RETURN != -1) { 166401e10c4fbfcdcfade5065093e2ca97f69a1d144Chris Lattner tst_resm(TFAIL, 167401e10c4fbfcdcfade5065093e2ca97f69a1d144Chris Lattner "pause() returned WITHOUT an error return code : %d", 168401e10c4fbfcdcfade5065093e2ca97f69a1d144Chris Lattner TEST_ERRNO); 169401e10c4fbfcdcfade5065093e2ca97f69a1d144Chris Lattner } else { 170401e10c4fbfcdcfade5065093e2ca97f69a1d144Chris Lattner /* log the errno */ 1714460a7e90c318857a37be386a7ebccff3020a795Devang Patel TEST_ERROR_LOG(TEST_ERRNO); 1724460a7e90c318857a37be386a7ebccff3020a795Devang Patel /*************************************************************** 1734460a7e90c318857a37be386a7ebccff3020a795Devang Patel * only perform functional verification if flag set (-f not given) 1747db949df789383acce98ef072f08794fdd5bd04eDan Gohman ***************************************************************/ 1754460a7e90c318857a37be386a7ebccff3020a795Devang Patel if ( STD_FUNCTIONAL_TEST ) { 1764460a7e90c318857a37be386a7ebccff3020a795Devang Patel /* check the errno */ 177401e10c4fbfcdcfade5065093e2ca97f69a1d144Chris Lattner if (TEST_ERRNO == EINTR) 178401e10c4fbfcdcfade5065093e2ca97f69a1d144Chris Lattner tst_resm(TPASS, "pause() returned %d", TEST_RETURN); 1794460a7e90c318857a37be386a7ebccff3020a795Devang Patel else 180229de95eabb7f5350a42152eab8c4c8643cdd0bfDevang Patel tst_resm(TFAIL, "pause() returned %d. Expected %d (EINTR)", 181229de95eabb7f5350a42152eab8c4c8643cdd0bfDevang Patel TEST_RETURN, EINTR); 182bb46f52027416598a662dc1c58f48d9d56b1a65bRafael Espindola } 183460f656475738d1a95a6be95346908ce1597df25Daniel Dunbar } 184f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel } /* End for TEST_LOOPING */ 185229de95eabb7f5350a42152eab8c4c8643cdd0bfDevang Patel 186229de95eabb7f5350a42152eab8c4c8643cdd0bfDevang Patel /*************************************************************** 187229de95eabb7f5350a42152eab8c4c8643cdd0bfDevang Patel * cleanup and exit 188bb46f52027416598a662dc1c58f48d9d56b1a65bRafael Espindola ***************************************************************/ 189460f656475738d1a95a6be95346908ce1597df25Daniel Dunbar cleanup(); 190f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel 191f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel return 0; 192229de95eabb7f5350a42152eab8c4c8643cdd0bfDevang Patel} /* End main */ 193229de95eabb7f5350a42152eab8c4c8643cdd0bfDevang Patel 194229de95eabb7f5350a42152eab8c4c8643cdd0bfDevang Patel/*************************************************************** 195f17fc461d17f9fa85f8fbc140ded8f3c591791e2Devang Patel * setup() - performs all ONE TIME setup for this test. 1968c231e5dda26b790ff388fe2f70eeeda621c9261Devang Patel ***************************************************************/ 197229de95eabb7f5350a42152eab8c4c8643cdd0bfDevang Patelvoid 198229de95eabb7f5350a42152eab8c4c8643cdd0bfDevang Patelsetup() 199e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner{ 200229de95eabb7f5350a42152eab8c4c8643cdd0bfDevang Patel /* capture signals */ 201229de95eabb7f5350a42152eab8c4c8643cdd0bfDevang Patel tst_sig(NOFORK, DEF_HANDLER, cleanup); 202229de95eabb7f5350a42152eab8c4c8643cdd0bfDevang Patel 2037db949df789383acce98ef072f08794fdd5bd04eDan Gohman /* Pause if that option was specified */ 204e3ad43c828280cf11e8631f1a814a51a0b168016Chris Lattner TEST_PAUSE; 20576e3e50b8a2c72598b7ee586dd383bb63a236682Devang Patel} /* End setup() */ 20676e3e50b8a2c72598b7ee586dd383bb63a236682Devang Patel 207e4b275610a7a05b7ee4c0378a906a6330e4c4ab0Devang Patel 208e4b275610a7a05b7ee4c0378a906a6330e4c4ab0Devang Patel/*************************************************************** 20976e3e50b8a2c72598b7ee586dd383bb63a236682Devang Patel * cleanup() - performs all ONE TIME cleanup for this test at 2104ca9757a39a1bf3bd1264a77e52db62e02cc85fbJim Laskey * completion or premature exit. 2114ca9757a39a1bf3bd1264a77e52db62e02cc85fbJim Laskey ***************************************************************/ 2124ca9757a39a1bf3bd1264a77e52db62e02cc85fbJim Laskeyvoid 2134ca9757a39a1bf3bd1264a77e52db62e02cc85fbJim Laskeycleanup() 2144ca9757a39a1bf3bd1264a77e52db62e02cc85fbJim Laskey{ 21576e3e50b8a2c72598b7ee586dd383bb63a236682Devang Patel /* 2164ca9757a39a1bf3bd1264a77e52db62e02cc85fbJim Laskey * print timing stats if that option was specified. 217dd0ecf67316d68940fda2733faacf73b8bd22ec6Chris Lattner * print errno log if that option was specified. 218e4b275610a7a05b7ee4c0378a906a6330e4c4ab0Devang Patel */ 21976e3e50b8a2c72598b7ee586dd383bb63a236682Devang Patel TEST_CLEANUP; 22076e3e50b8a2c72598b7ee586dd383bb63a236682Devang Patel 221e4b275610a7a05b7ee4c0378a906a6330e4c4ab0Devang Patel /* exit with return code appropriate for results */ 22276e3e50b8a2c72598b7ee586dd383bb63a236682Devang Patel tst_exit(); 22376e3e50b8a2c72598b7ee586dd383bb63a236682Devang Patel} /* End cleanup() */ 22476e3e50b8a2c72598b7ee586dd383bb63a236682Devang Patel 22576e3e50b8a2c72598b7ee586dd383bb63a236682Devang Patel/* routine to catch the alarm signal */ 22676e3e50b8a2c72598b7ee586dd383bb63a236682Devang Patelvoid 22776e3e50b8a2c72598b7ee586dd383bb63a236682Devang Patelgo() 22876e3e50b8a2c72598b7ee586dd383bb63a236682Devang Patel{ 22976e3e50b8a2c72598b7ee586dd383bb63a236682Devang Patel} 23076e3e50b8a2c72598b7ee586dd383bb63a236682Devang Patel