1/*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21
22/*
23 * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
24 * Use is subject to license terms.
25 */
26
27/*
28 * Copyright 2020 Robert Mustacchi
29 */
30
31/*
32 * This is the header where the internal to libc definition of the FILE
33 * structure is defined. The exrernal defintion defines the FILE structure
34 * as an array of longs. This prevents customers from writing code that
35 * depends upon the implemnetation of stdio. The __fbufsize(3C) man page
36 * documents a set of routines that customers can use so that they do not
37 * need access to the FILE structure.
38 *
39 * When compiling libc this file MUST be included BEFORE <stdio.h>, and
40 * any other headers that themselves directly or indirectly include
41 * <stdio.h>. Failure to do so, will cause the compile of libc to fail,
42 * since the structure members will not be visible to the stdio routines.
43 */
44
45#ifndef	_FILE64_H
46#define	_FILE64_H
47
48#include <synch.h>
49#include <stdio_tag.h>
50#include <wchar_impl.h>
51
52#ifdef	__cplusplus
53extern "C" {
54#endif
55
56#ifndef	_MBSTATE_T
57#define	_MBSTATE_T
58typedef __mbstate_t	mbstate_t;
59#endif
60
61#define	rmutex_t	mutex_t
62
63typedef ssize_t (*fread_t)(__FILE *, char *, size_t);
64typedef ssize_t (*fwrite_t)(__FILE *, const char *, size_t);
65typedef off_t (*fseek_t)(__FILE *, off_t, int);
66typedef int (*fclose_t)(__FILE *);
67
68typedef struct {
69	fread_t	std_read;
70	fwrite_t std_write;
71	fseek_t std_seek;
72	fclose_t std_close;
73	void *std_data;
74} stdio_ops_t;
75
76#ifdef	_LP64
77
78/*
79 * This structure cannot grow beyond its current size of 128 bytes. See the file
80 * lib/libc/port/stdio/README.design for more information.
81 */
82struct __FILE_TAG {
83	unsigned char	*_ptr;	/* next character from/to here in buffer */
84	unsigned char	*_base;	/* the buffer */
85	unsigned char	*_end;	/* the end of the buffer */
86	ssize_t		_cnt;	/* number of available characters in buffer */
87	int		_file;	/* UNIX System file descriptor */
88	unsigned int	_flag;	/* the state of the stream */
89	rmutex_t	_lock;	/* lock for this structure */
90	mbstate_t	_state;	/* mbstate_t */
91	stdio_ops_t	*_ops;	/* Alternate impl ops */
92	char		__fill[24];	/* filler to bring size to 128 bytes */
93};
94
95#else
96
97/*
98 * Stuff missing from our 32-bit FILE struct.
99 */
100struct xFILEdata {
101	uintptr_t	_magic;	/* Check: magic number, must be first */
102	unsigned char	*_end;	/* the end of the buffer */
103	rmutex_t	_lock;	/* lock for this structure */
104	mbstate_t	_state;	/* mbstate_t */
105	int		_altfd;	/* alternate fd if > 255 */
106	stdio_ops_t	*_ops;	/* Alternate impl ops */
107};
108
109#define	XFILEINITIALIZER	{ 0, NULL, RECURSIVEMUTEX, DEFAULTMBSTATE }
110
111#endif	/*	_LP64	*/
112
113#ifdef	__cplusplus
114}
115#endif
116
117#endif	/* _FILE64_H */
118