Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'winsup/testsuite/winsup.api/ltp/asyncio02.c')
-rw-r--r--winsup/testsuite/winsup.api/ltp/asyncio02.c365
1 files changed, 365 insertions, 0 deletions
diff --git a/winsup/testsuite/winsup.api/ltp/asyncio02.c b/winsup/testsuite/winsup.api/ltp/asyncio02.c
new file mode 100644
index 000000000..23532da79
--- /dev/null
+++ b/winsup/testsuite/winsup.api/ltp/asyncio02.c
@@ -0,0 +1,365 @@
+/*
+ * Copyright (c) 2000 Silicon Graphics, Inc. All Rights Reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of version 2 of the GNU General Public License as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it would be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * Further, this software is distributed without any warranty that it is
+ * free of the rightful claim of any third person regarding infringement
+ * or the like. Any license provided herein, whether implied or
+ * otherwise, applies only to this software file. Patent licenses, if
+ * any, provided herein do not apply to combinations of this program with
+ * other software, or any other product whatsoever.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write the Free Software Foundation, Inc., 59
+ * Temple Place - Suite 330, Boston MA 02111-1307, USA.
+ *
+ * Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy,
+ * Mountain View, CA 94043, or:
+ *
+ * http://www.sgi.com
+ *
+ * For further information regarding this notice, see:
+ *
+ * http://oss.sgi.com/projects/GenInfo/NoticeExplan/
+ *
+ */
+/* $Id$ */
+/************************************************************
+ * OS Test - Silicon Graphics, Inc.
+ * Mendota Heights, Minnesota
+ *
+ * TEST IDENTIFIER: aiotcs02: write/close flushes data to the file
+ *
+ * PARENT DOCUMENT: aiotds01: kernel i/o
+ *
+ * AUTHOR: Barrie Kletscher
+ *
+ * CO-PILOT: Dave Baumgartner
+ *
+ * TEST ITEMS:
+ * for each open flags set used:
+ * 1. Multiple writes to a file work as specified for
+ * more than BUFSIZ bytes.
+ * 2. Multiple writes to a file work as specified for
+ * BUFSIZ bytes.
+ * 3. Multiple writes to a file work as specified for
+ * lower than BUFSIZ bytes.
+ *
+ * INPUT SPECIFICATIONS:
+ * Standard parse_opts supported options.
+ *
+ * OUTPUT SPECIFICATIONS
+ * Standard tst_res output format
+ *
+ * ENVIRONMENTAL NEEDS:
+ * This program uses the environment variable TMPDIR for the location
+ * of the temporary directory.
+ *
+ *
+ * SPECIAL PROCEDURAL REQUIREMENTS:
+ * The program must be linked with tst_*.o and parse_opts.o.
+ *
+ * INTERCASE DEPENDENCIES:
+ * NONE.
+ *
+ * DETAILED DESCRIPTION:
+ * Attempt to get some memory to work with.
+ * Call testrun writing (BUFSIZ + 1) bytes
+ * Call testrun writing BUFSIZ bytes
+ * Repeated call to testrun() with decreasing write sizes
+ * less than BUFSIZ
+ * End
+ *
+ * Start testrun()
+ * Attempt to open a temporary file.
+ * Write the memory to the file.
+ * Attempt to close the file which also flushes the buffers.
+ * Now check to see if the number of bytes written is the
+ * same as the number of bytes in the file.
+ * Cleanup
+ *
+ * BUGS:
+ * NONE.
+ *
+************************************************************/
+
+#include <fcntl.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/signal.h>
+#include <errno.h>
+#include <stdlib.h>
+#include "test.h"
+#include "usctest.h"
+
+#define FLAG O_RDWR | O_CREAT | O_TRUNC /* Flags used when opening temp tile */
+#define MODE 0777 /* Mode to open file with */
+#define WRITES 10 /* Number of times buffer is written */
+#define DECR 1000 /* Number of bytes decremented between */
+ /* Calls to testrun() */
+#define OK -1 /* Return value from testrun() */
+
+#define FNAME1 "aio02.1"
+#define FNAME2 "aio02.2"
+#define FNAME3 "aio02.3"
+
+#define ERR_MSG1 "Bytes in file not equal to bytes written."
+#define ERR_MSG2 "Bytes in file (%d) not equal to bytes written (%d)."
+
+char *dp; /* pointer to area of memory */
+
+void setup();
+void cleanup();
+int testrun(int flag, int bytes, int ti);
+
+char *TCID="asyncio02"; /* Test program identifier. */
+int TST_TOTAL=6; /* Total number of test cases. */
+extern int Tst_count; /* Test Case counter for tst_* routines */
+extern int Tst_nobuf; /* variable used to turn off tst_res buffering */
+
+extern int errno;
+
+int exp_enos[]={0}; /* Array of expected errnos */
+char mesg[150];
+char *filename; /* name of the temporary file */
+
+char *Progname;
+int Open_flags;
+
+int Flags[] = {
+ O_RDWR | O_CREAT | O_TRUNC,
+ O_RDWR | O_CREAT | O_TRUNC
+};
+
+int Num_flags;
+
+/***********************************************************************
+ * MAIN
+ ***********************************************************************/
+int
+main(int ac, char **av)
+{
+
+ int i; /* counter */
+ int ret_val; /* return value from testrun call */
+ int eok; /* everything is ok flag */
+ int lc; /* loop counter */
+ char *msg; /* message returned from parse_opts */
+ int flag_cnt;
+
+ Tst_nobuf=1;
+ Num_flags = sizeof(Flags)/sizeof(int);
+ TST_TOTAL= 3 * Num_flags;
+
+ /***************************************************************
+ * parse standard options, and exit if there is an error
+ ***************************************************************/
+ if ( (msg=parse_opts(ac, av, (option_t *) NULL, NULL)) != (char *) NULL ) {
+ tst_brkm(TBROK, NULL, "OPTION PARSING ERROR - %s", msg);
+ tst_exit();
+ }
+
+ /***************************************************************
+ * perform global setup for test
+ ***************************************************************/
+ setup();
+
+ /***************************************************************
+ * check looping state if -c option given
+ ***************************************************************/
+ for (lc=0; TEST_LOOPING(lc); lc++) {
+
+ /* reset Tst_count in case we are looping. */
+ Tst_count=0;
+
+ for (flag_cnt=0; flag_cnt<Num_flags; flag_cnt++) {
+
+ /*
+ * call testrun writing (BUFSIZ + 1) byte chunks
+ */
+
+ filename=FNAME1;
+ if( testrun(Flags[flag_cnt],BUFSIZ+1,1) != OK)
+ tst_resm(TFAIL,ERR_MSG1);
+
+ else if ( STD_FUNCTIONAL_TEST ) {
+ tst_resm(TPASS,
+ "More than BUFSIZE bytes multiple synchronous writes to a file check out ok");
+ }
+
+ /*
+ * call testrun writing BUFSIZ byte chunks
+ */
+
+ filename=FNAME2;
+ if(testrun(Flags[flag_cnt],BUFSIZ,2) != OK) {
+ tst_resm(TFAIL,ERR_MSG1);
+ }
+ else if ( STD_FUNCTIONAL_TEST ) {
+ tst_resm(TPASS,
+ "BUFSIZE bytes multiple synchronous writes to a file checks out ok");
+ }
+
+ /*
+ * while the byte chunks are greater than 0
+ * call testrun() with decreasing chunk sizes
+ */
+
+ filename=FNAME3;
+ eok=1;
+ for(i = BUFSIZ-1; i >= 0; i -= DECR) {
+ if((ret_val = testrun(Flags[flag_cnt],i,3)) != OK) {
+ char output[80]; /* local output char string */
+
+ (void)sprintf(output,ERR_MSG2,ret_val,i*WRITES);
+ tst_resm(TFAIL,output);
+ }
+ }
+
+ if ( eok && STD_FUNCTIONAL_TEST )
+ tst_resm(TPASS,
+ "Less than BUFSIZE bytes multiple synchronous writes to a file checks out ok");
+
+ }
+ }
+ cleanup();
+
+ return 0;
+} /* end main() */
+
+/***********************************************************
+ *
+ * This function does the actual running of the tests.
+ *
+ ***********************************************************/
+int
+testrun(int flag, int bytes, int ti)
+{
+
+ void cleanup();
+
+ int fildes, /* temporary file's descriptor */
+ i; /* counter */
+
+ int ret;
+
+ struct stat buffer; /* buffer of memory required for stat command */
+
+ /*
+ * Attempt to open a temporary file.
+ */
+
+ if((fildes = open(filename,flag,MODE)) == -1) {
+ sprintf(mesg, "open failed, errno:%d", errno);
+ tst_brkm(TBROK, cleanup, mesg);
+ }
+
+ /*
+ * Write the memory to the file.
+ */
+
+ for(i = 0; i < WRITES; i++) {
+ TEST( write(fildes,dp,(unsigned)bytes) );
+
+ if( TEST_RETURN == -1) {
+ sprintf(mesg, "write failed, errno:%d", errno);
+ tst_brkm(TBROK, cleanup, mesg);
+ }
+ } /* end for() */
+
+ /*
+ * Attempt to close the file which also flushes the buffers.
+ */
+
+ if(close(fildes) == -1) {
+ sprintf(mesg, "close failed, errno:%d", errno);
+ tst_brkm(TBROK, cleanup, mesg);
+ }
+
+ ret=OK;
+ if ( STD_FUNCTIONAL_TEST ) {
+
+ /*
+ * Now check to see if the number of bytes written is the
+ * same as the number of bytes in the file.
+ */
+
+ if(stat(filename,&buffer) == -1) {
+ sprintf(mesg, "stat failed, errno:%d", errno);
+ tst_brkm(TBROK, cleanup, mesg);
+ }
+
+
+ if(buffer.st_size != (off_t)(bytes * WRITES)) {
+ ret=(int)buffer.st_size;
+ }
+ }
+
+ if ( unlink(filename) == -1 ) {
+ sprintf(mesg, "unlink failed, errno:%d", errno);
+ tst_brkm(TBROK, cleanup, mesg);
+ }
+
+ return ret;
+
+} /* end testrun() */
+
+/***************************************************************
+ * setup() - performs all ONE TIME setup for this test.
+ ***************************************************************/
+void
+setup()
+{
+ /* capture signals */
+ tst_sig(FORK, DEF_HANDLER, cleanup);
+
+ /* create a temporary directory and go to it */
+ tst_tmpdir();
+
+ /* Indicate which errnos are expected */
+ TEST_EXP_ENOS(exp_enos);
+
+ /* Pause if that option was specified */
+ TEST_PAUSE;
+
+ /*
+ * Attempt to get some memory to work with.
+ */
+
+ if((dp = (char *)malloc((unsigned)BUFSIZ+1)) == NULL) {
+ sprintf(mesg, "malloc failed, errno:%d", errno);
+ tst_brkm(TBROK, cleanup, mesg);
+ }
+
+
+} /* End setup() */
+
+/***************************************************************
+ * cleanup() - performs all ONE TIME cleanup for this test at
+ * completion or premature exit.
+ ***************************************************************/
+void
+cleanup()
+{
+ /*
+ * print timing stats if that option was specified.
+ * print errno log if that option was specified.
+ */
+ TEST_CLEANUP;
+
+ /* remove temporary directory and all files in it. */
+ tst_rmdir();
+
+ /* exit with return code appropriate for results */
+ tst_exit();
+
+} /* End cleanup() */
+
+