/*****************************************************************************\
 *  test7.9.prog Report any open files (other than stdin, stdout, and stderr).
 *****************************************************************************
 *  Copyright (C) 2006 The Regents of the University of California.
 *  Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER).
 *  Written by Morris Jette <jette1@llnl.gov>
 *  CODE-OCEC-09-009. All rights reserved.
 *
 *  This file is part of Slurm, a resource management program.
 *  For details, see <https://slurm.schedmd.com/>.
 *  Please also read the included file: DISCLAIMER.
 *
 *  Slurm is free software; you can redistribute it and/or modify it under
 *  the terms of the GNU General Public License as published by the Free
 *  Software Foundation; either version 2 of the License, or (at your option)
 *  any later version.
 *
 *  Slurm is distributed in the hope that it will be useful, but WITHOUT ANY
 *  WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 *  FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
 *  details.
 *
 *  You should have received a copy of the GNU General Public License along
 *  with Slurm; if not, write to the Free Software Foundation, Inc.,
 *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA.
\*****************************************************************************/
#include <errno.h>
#include <stdio.h>
#include <stdlib.h> /* exit() prototype is here */
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <time.h>
#include <unistd.h>

#define _DEBUG         0
#define _EXTREME_DEBUG 0

int main (int argc, char **argv)
{
	int i;
	struct stat buf;

	/* sleep for 0 to 100 msec to induce some randomness
	 * and better detect any synchronization issues */
	usleep(time(NULL) % 100000);

	/* start at fd=3
	 * skip stdin, stdout, and stderr */
	for (i=3; i<256; i++) {
		if (fstat(i, &buf))
			continue;
		printf("FAILED: File descriptor %d is open\n", i);
#if _DEBUG
{
		printf("  st_mode:    0%o\n",(int) buf.st_mode);
		printf("  st_uid:     %d\n", (int) buf.st_uid);
		printf("  st_gid:     %d\n", (int) buf.st_gid);
		printf("  st_size:    %d\n", (int) buf.st_size);
		printf("  st_ino:     %d\n", (int) buf.st_ino);
		printf("  st_dev:     %d\n", (int) buf.st_dev);
#if _EXTREME_DEBUG
	{
		char data[64];
		int j;
		size_t data_size;

		lseek(i, 0, SEEK_SET);
		data_size = read(i, data, 64);
		if (data_size < 0)
			printf("  read error: %s", strerror(errno));
		else {
			printf("  bytes read: %d\n", (int) data_size);
			for (j=0; j<data_size; j++)
				printf("  data[%d]:0x%x\n", j, data[j]);
		}
	}
#endif
}
#endif
	}
	exit(0);
}
