xref: /freebsd/contrib/sendmail/libsm/strio.c (revision e2c0e292e8a7ca00ba99bcfccc9e637f45c3e8b1)
140266059SGregory Neil Shapiro /*
25dd76dd0SGregory Neil Shapiro  * Copyright (c) 2000-2002, 2004, 2005 Proofpoint, Inc. and its suppliers.
340266059SGregory Neil Shapiro  *      All rights reserved.
440266059SGregory Neil Shapiro  * Copyright (c) 1990, 1993
540266059SGregory Neil Shapiro  *	The Regents of the University of California.  All rights reserved.
640266059SGregory Neil Shapiro  *
740266059SGregory Neil Shapiro  * This code is derived from software contributed to Berkeley by
840266059SGregory Neil Shapiro  * Chris Torek.
940266059SGregory Neil Shapiro  *
1040266059SGregory Neil Shapiro  * By using this file, you agree to the terms and conditions set
1140266059SGregory Neil Shapiro  * forth in the LICENSE file which can be found at the top level of
1240266059SGregory Neil Shapiro  * the sendmail distribution.
1340266059SGregory Neil Shapiro  */
1440266059SGregory Neil Shapiro 
1540266059SGregory Neil Shapiro #include <sm/gen.h>
164313cc83SGregory Neil Shapiro SM_IDSTR(id, "@(#)$Id: strio.c,v 1.45 2013-11-22 20:51:43 ca Exp $")
1740266059SGregory Neil Shapiro #include <stdlib.h>
1840266059SGregory Neil Shapiro #include <unistd.h>
1940266059SGregory Neil Shapiro #include <fcntl.h>
2040266059SGregory Neil Shapiro #include <string.h>
2140266059SGregory Neil Shapiro #include <errno.h>
2240266059SGregory Neil Shapiro #include <sm/rpool.h>
2340266059SGregory Neil Shapiro #include <sm/io.h>
2440266059SGregory Neil Shapiro #include <sm/heap.h>
2540266059SGregory Neil Shapiro #include <sm/conf.h>
2640266059SGregory Neil Shapiro #include "local.h"
2740266059SGregory Neil Shapiro 
28b6bacd31SGregory Neil Shapiro static int	sm_strsetmode __P((SM_FILE_T*, const int *));
29b6bacd31SGregory Neil Shapiro static int	sm_strgetmode __P((SM_FILE_T*, int *));
30b6bacd31SGregory Neil Shapiro 
3140266059SGregory Neil Shapiro /*
3240266059SGregory Neil Shapiro **  Cookie structure for the "strio" file type
3340266059SGregory Neil Shapiro */
3440266059SGregory Neil Shapiro 
3540266059SGregory Neil Shapiro struct sm_str_obj
3640266059SGregory Neil Shapiro {
3740266059SGregory Neil Shapiro 	char		*strio_base;
3840266059SGregory Neil Shapiro 	char		*strio_end;
3940266059SGregory Neil Shapiro 	size_t		strio_size;
4040266059SGregory Neil Shapiro 	size_t		strio_offset;
4140266059SGregory Neil Shapiro 	int		strio_flags;
42605302a5SGregory Neil Shapiro 	const void	*strio_rpool;
4340266059SGregory Neil Shapiro };
4440266059SGregory Neil Shapiro 
4540266059SGregory Neil Shapiro typedef struct sm_str_obj SM_STR_OBJ_T;
4640266059SGregory Neil Shapiro 
4740266059SGregory Neil Shapiro /*
4840266059SGregory Neil Shapiro **  SM_STRGROW -- increase storage space for string
4940266059SGregory Neil Shapiro **
5040266059SGregory Neil Shapiro **	Parameters:
5140266059SGregory Neil Shapiro **		s -- current cookie
5240266059SGregory Neil Shapiro **		size -- new storage size request
5340266059SGregory Neil Shapiro **
5440266059SGregory Neil Shapiro **	Returns:
5540266059SGregory Neil Shapiro **		true iff successful.
5640266059SGregory Neil Shapiro */
5740266059SGregory Neil Shapiro 
5840266059SGregory Neil Shapiro static bool sm_strgrow __P((SM_STR_OBJ_T *, size_t));
5940266059SGregory Neil Shapiro 
6040266059SGregory Neil Shapiro static bool
sm_strgrow(s,size)6140266059SGregory Neil Shapiro sm_strgrow(s, size)
6240266059SGregory Neil Shapiro 	SM_STR_OBJ_T *s;
6340266059SGregory Neil Shapiro 	size_t size;
6440266059SGregory Neil Shapiro {
6540266059SGregory Neil Shapiro 	register void *p;
6640266059SGregory Neil Shapiro 
6740266059SGregory Neil Shapiro 	if (s->strio_size >= size)
6840266059SGregory Neil Shapiro 		return true;
6940266059SGregory Neil Shapiro 	p = sm_realloc(s->strio_base, size);
7040266059SGregory Neil Shapiro 	if (p == NULL)
7140266059SGregory Neil Shapiro 		return false;
7240266059SGregory Neil Shapiro 	s->strio_base = p;
7340266059SGregory Neil Shapiro 	s->strio_end = s->strio_base + size;
7440266059SGregory Neil Shapiro 	s->strio_size = size;
7540266059SGregory Neil Shapiro 	return true;
7640266059SGregory Neil Shapiro }
7740266059SGregory Neil Shapiro 
7840266059SGregory Neil Shapiro /*
7940266059SGregory Neil Shapiro **  SM_STRREAD -- read a portion of the string
8040266059SGregory Neil Shapiro **
8140266059SGregory Neil Shapiro **	Parameters:
8240266059SGregory Neil Shapiro **		fp -- the file pointer
8340266059SGregory Neil Shapiro **		buf -- location to place read data
8440266059SGregory Neil Shapiro **		n -- number of bytes to read
8540266059SGregory Neil Shapiro **
8640266059SGregory Neil Shapiro **	Returns:
8740266059SGregory Neil Shapiro **		Failure: -1 and sets errno
8840266059SGregory Neil Shapiro **		Success: >=0, number of bytes read
8940266059SGregory Neil Shapiro */
9040266059SGregory Neil Shapiro 
9140266059SGregory Neil Shapiro ssize_t
sm_strread(fp,buf,n)9240266059SGregory Neil Shapiro sm_strread(fp, buf, n)
9340266059SGregory Neil Shapiro 	SM_FILE_T *fp;
9440266059SGregory Neil Shapiro 	char *buf;
9540266059SGregory Neil Shapiro 	size_t n;
9640266059SGregory Neil Shapiro {
9740266059SGregory Neil Shapiro 	register SM_STR_OBJ_T *s = fp->f_cookie;
9840266059SGregory Neil Shapiro 	int len;
9940266059SGregory Neil Shapiro 
10040266059SGregory Neil Shapiro 	if (!(s->strio_flags & SMRD) && !(s->strio_flags & SMRW))
10140266059SGregory Neil Shapiro 	{
10240266059SGregory Neil Shapiro 		errno = EBADF;
10340266059SGregory Neil Shapiro 		return -1;
10440266059SGregory Neil Shapiro 	}
10540266059SGregory Neil Shapiro 	len = SM_MIN(s->strio_size - s->strio_offset, n);
10640266059SGregory Neil Shapiro 	(void) memmove(buf, s->strio_base + s->strio_offset, len);
10740266059SGregory Neil Shapiro 	s->strio_offset += len;
10840266059SGregory Neil Shapiro 	return len;
10940266059SGregory Neil Shapiro }
11040266059SGregory Neil Shapiro 
11140266059SGregory Neil Shapiro /*
11240266059SGregory Neil Shapiro **  SM_STRWRITE -- write a portion of the string
11340266059SGregory Neil Shapiro **
11440266059SGregory Neil Shapiro **	Parameters:
11540266059SGregory Neil Shapiro **		fp -- the file pointer
116605302a5SGregory Neil Shapiro **		buf -- location of data for writing
11740266059SGregory Neil Shapiro **		n -- number of bytes to write
11840266059SGregory Neil Shapiro **
11940266059SGregory Neil Shapiro **	Returns:
12040266059SGregory Neil Shapiro **		Failure: -1 and sets errno
12140266059SGregory Neil Shapiro **		Success: >=0, number of bytes written
12240266059SGregory Neil Shapiro */
12340266059SGregory Neil Shapiro 
12440266059SGregory Neil Shapiro ssize_t
sm_strwrite(fp,buf,n)12540266059SGregory Neil Shapiro sm_strwrite(fp, buf, n)
12640266059SGregory Neil Shapiro 	SM_FILE_T *fp;
12740266059SGregory Neil Shapiro 	char const *buf;
12840266059SGregory Neil Shapiro 	size_t n;
12940266059SGregory Neil Shapiro {
13040266059SGregory Neil Shapiro 	register SM_STR_OBJ_T *s = fp->f_cookie;
13140266059SGregory Neil Shapiro 
13240266059SGregory Neil Shapiro 	if (!(s->strio_flags & SMWR) && !(s->strio_flags & SMRW))
13340266059SGregory Neil Shapiro 	{
13440266059SGregory Neil Shapiro 		errno = EBADF;
13540266059SGregory Neil Shapiro 		return -1;
13640266059SGregory Neil Shapiro 	}
13740266059SGregory Neil Shapiro 	if (n + s->strio_offset > s->strio_size)
13840266059SGregory Neil Shapiro 	{
13940266059SGregory Neil Shapiro 		if (!sm_strgrow(s, n + s->strio_offset))
14040266059SGregory Neil Shapiro 			return 0;
14140266059SGregory Neil Shapiro 	}
14240266059SGregory Neil Shapiro 	(void) memmove(s->strio_base + s->strio_offset, buf, n);
14340266059SGregory Neil Shapiro 	s->strio_offset += n;
14440266059SGregory Neil Shapiro 	return n;
14540266059SGregory Neil Shapiro }
14640266059SGregory Neil Shapiro 
14740266059SGregory Neil Shapiro /*
14840266059SGregory Neil Shapiro **  SM_STRSEEK -- position the offset pointer for the string
14940266059SGregory Neil Shapiro **
15040266059SGregory Neil Shapiro **	Only SM_IO_SEEK_SET, SM_IO_SEEK_CUR and SM_IO_SEEK_END are valid
15140266059SGregory Neil Shapiro **	values for whence.
15240266059SGregory Neil Shapiro **
15340266059SGregory Neil Shapiro **	Parameters:
15440266059SGregory Neil Shapiro **		fp -- the file pointer
15540266059SGregory Neil Shapiro **		offset -- number of bytes offset from "base"
15640266059SGregory Neil Shapiro **		whence -- determines "base" for 'offset'
15740266059SGregory Neil Shapiro **
15840266059SGregory Neil Shapiro **	Returns:
15940266059SGregory Neil Shapiro **		Failure: -1 and sets errno
16040266059SGregory Neil Shapiro **		Success: >=0, number of bytes read
16140266059SGregory Neil Shapiro */
16240266059SGregory Neil Shapiro 
16340266059SGregory Neil Shapiro off_t
sm_strseek(fp,offset,whence)16440266059SGregory Neil Shapiro sm_strseek(fp, offset, whence)
16540266059SGregory Neil Shapiro 	SM_FILE_T *fp;
16640266059SGregory Neil Shapiro 	off_t offset;
16740266059SGregory Neil Shapiro 	int whence;
16840266059SGregory Neil Shapiro {
16940266059SGregory Neil Shapiro 	register off_t ret;
17040266059SGregory Neil Shapiro 	register SM_STR_OBJ_T *s = fp->f_cookie;
17140266059SGregory Neil Shapiro 
17240266059SGregory Neil Shapiro reseek:
17340266059SGregory Neil Shapiro 	switch (whence)
17440266059SGregory Neil Shapiro 	{
17540266059SGregory Neil Shapiro 	  case SM_IO_SEEK_SET:
17640266059SGregory Neil Shapiro 		ret = offset;
17740266059SGregory Neil Shapiro 		break;
17840266059SGregory Neil Shapiro 	  case SM_IO_SEEK_CUR:
17940266059SGregory Neil Shapiro 		ret = s->strio_offset + offset;
18040266059SGregory Neil Shapiro 		break;
18140266059SGregory Neil Shapiro 	  case SM_IO_SEEK_END:
18240266059SGregory Neil Shapiro 		ret = s->strio_size;
18340266059SGregory Neil Shapiro 		break;
18440266059SGregory Neil Shapiro 	  default:
18540266059SGregory Neil Shapiro 		errno = EINVAL;
18640266059SGregory Neil Shapiro 		return -1;
18740266059SGregory Neil Shapiro 	}
18840266059SGregory Neil Shapiro 	if (ret < 0 || ret > (off_t)(size_t)(-1))	/* XXX ugly */
18940266059SGregory Neil Shapiro 		return -1;
19040266059SGregory Neil Shapiro 	if ((size_t) ret > s->strio_size)
19140266059SGregory Neil Shapiro 	{
19240266059SGregory Neil Shapiro 		if (sm_strgrow(s, (size_t)ret))
19340266059SGregory Neil Shapiro 			goto reseek;
19440266059SGregory Neil Shapiro 
19540266059SGregory Neil Shapiro 		/* errno set by sm_strgrow */
19640266059SGregory Neil Shapiro 		return -1;
19740266059SGregory Neil Shapiro 	}
19840266059SGregory Neil Shapiro 	s->strio_offset = (size_t) ret;
19940266059SGregory Neil Shapiro 	return ret;
20040266059SGregory Neil Shapiro }
20140266059SGregory Neil Shapiro 
20240266059SGregory Neil Shapiro /*
20340266059SGregory Neil Shapiro **  SM_STROPEN -- open a string file type
20440266059SGregory Neil Shapiro **
20540266059SGregory Neil Shapiro **	Parameters:
20640266059SGregory Neil Shapiro **		fp -- file pointer open to be associated with
207605302a5SGregory Neil Shapiro **		info -- initial contents (NULL for none)
208605302a5SGregory Neil Shapiro **		flags -- flags for methods of access (was mode)
20940266059SGregory Neil Shapiro **		rpool -- resource pool to use memory from (if applicable)
21040266059SGregory Neil Shapiro **
21140266059SGregory Neil Shapiro **	Results:
21240266059SGregory Neil Shapiro **		Success: 0 (zero)
21340266059SGregory Neil Shapiro **		Failure: -1 and sets errno
21440266059SGregory Neil Shapiro */
21540266059SGregory Neil Shapiro 
21640266059SGregory Neil Shapiro int
sm_stropen(fp,info,flags,rpool)21740266059SGregory Neil Shapiro sm_stropen(fp, info, flags, rpool)
21840266059SGregory Neil Shapiro 	SM_FILE_T *fp;
21940266059SGregory Neil Shapiro 	const void *info;
22040266059SGregory Neil Shapiro 	int flags;
22140266059SGregory Neil Shapiro 	const void *rpool;
22240266059SGregory Neil Shapiro {
22340266059SGregory Neil Shapiro 	register SM_STR_OBJ_T *s;
22440266059SGregory Neil Shapiro 
22540266059SGregory Neil Shapiro #if SM_RPOOL
22640266059SGregory Neil Shapiro 	s = sm_rpool_malloc_x(rpool, sizeof(SM_STR_OBJ_T));
227*5b0945b5SGregory Neil Shapiro #else
22840266059SGregory Neil Shapiro 	s = sm_malloc(sizeof(SM_STR_OBJ_T));
22940266059SGregory Neil Shapiro 	if (s == NULL)
23040266059SGregory Neil Shapiro 		return -1;
231*5b0945b5SGregory Neil Shapiro #endif
23240266059SGregory Neil Shapiro 
23340266059SGregory Neil Shapiro 	fp->f_cookie = s;
234605302a5SGregory Neil Shapiro 	s->strio_rpool = rpool;
23540266059SGregory Neil Shapiro 	s->strio_offset = 0;
236605302a5SGregory Neil Shapiro 	s->strio_size = 0;
237605302a5SGregory Neil Shapiro 	s->strio_base = NULL;
238*5b0945b5SGregory Neil Shapiro 	s->strio_end = NULL;
239605302a5SGregory Neil Shapiro 
240605302a5SGregory Neil Shapiro 	switch (flags)
24140266059SGregory Neil Shapiro 	{
24240266059SGregory Neil Shapiro 	  case SM_IO_RDWR:
24340266059SGregory Neil Shapiro 		s->strio_flags = SMRW;
24440266059SGregory Neil Shapiro 		break;
24540266059SGregory Neil Shapiro 	  case SM_IO_RDONLY:
24640266059SGregory Neil Shapiro 		s->strio_flags = SMRD;
24740266059SGregory Neil Shapiro 		break;
24840266059SGregory Neil Shapiro 	  case SM_IO_WRONLY:
24940266059SGregory Neil Shapiro 		s->strio_flags = SMWR;
25040266059SGregory Neil Shapiro 		break;
25140266059SGregory Neil Shapiro 	  case SM_IO_APPEND:
252605302a5SGregory Neil Shapiro 		if (s->strio_rpool == NULL)
253605302a5SGregory Neil Shapiro 			sm_free(s);
25440266059SGregory Neil Shapiro 		errno = EINVAL;
25540266059SGregory Neil Shapiro 		return -1;
256605302a5SGregory Neil Shapiro 	  default:
257605302a5SGregory Neil Shapiro 		if (s->strio_rpool == NULL)
258605302a5SGregory Neil Shapiro 			sm_free(s);
259605302a5SGregory Neil Shapiro 		errno = EINVAL;
260605302a5SGregory Neil Shapiro 		return -1;
261605302a5SGregory Neil Shapiro 	}
262605302a5SGregory Neil Shapiro 
263605302a5SGregory Neil Shapiro 	if (info != NULL)
264605302a5SGregory Neil Shapiro 	{
265605302a5SGregory Neil Shapiro 		s->strio_base = sm_strdup_x(info);
266605302a5SGregory Neil Shapiro 		if (s->strio_base == NULL)
267605302a5SGregory Neil Shapiro 		{
268605302a5SGregory Neil Shapiro 			int save_errno = errno;
269605302a5SGregory Neil Shapiro 
270605302a5SGregory Neil Shapiro 			if (s->strio_rpool == NULL)
271605302a5SGregory Neil Shapiro 				sm_free(s);
272605302a5SGregory Neil Shapiro 			errno = save_errno;
273605302a5SGregory Neil Shapiro 			return -1;
274605302a5SGregory Neil Shapiro 		}
275605302a5SGregory Neil Shapiro 		s->strio_size = strlen(info);
276605302a5SGregory Neil Shapiro 		s->strio_end = s->strio_base + s->strio_size;
27740266059SGregory Neil Shapiro 	}
27840266059SGregory Neil Shapiro 	return 0;
27940266059SGregory Neil Shapiro }
28040266059SGregory Neil Shapiro 
28140266059SGregory Neil Shapiro /*
28240266059SGregory Neil Shapiro **  SM_STRCLOSE -- close the string file type and free resources
28340266059SGregory Neil Shapiro **
28440266059SGregory Neil Shapiro **	Parameters:
28540266059SGregory Neil Shapiro **		fp -- file pointer
28640266059SGregory Neil Shapiro **
28740266059SGregory Neil Shapiro **	Results:
28840266059SGregory Neil Shapiro **		Success: 0 (zero)
28940266059SGregory Neil Shapiro */
29040266059SGregory Neil Shapiro 
29140266059SGregory Neil Shapiro int
sm_strclose(fp)29240266059SGregory Neil Shapiro sm_strclose(fp)
29340266059SGregory Neil Shapiro 	SM_FILE_T *fp;
29440266059SGregory Neil Shapiro {
29540266059SGregory Neil Shapiro 	SM_STR_OBJ_T *s = fp->f_cookie;
29640266059SGregory Neil Shapiro 
29740266059SGregory Neil Shapiro #if !SM_RPOOL
29840266059SGregory Neil Shapiro 	sm_free(s->strio_base);
29940266059SGregory Neil Shapiro 	s->strio_base = NULL;
300*5b0945b5SGregory Neil Shapiro #endif
30140266059SGregory Neil Shapiro 	return 0;
30240266059SGregory Neil Shapiro }
30340266059SGregory Neil Shapiro 
30440266059SGregory Neil Shapiro /*
30540266059SGregory Neil Shapiro **  SM_STRSETMODE -- set mode info for the file
30640266059SGregory Neil Shapiro **
30740266059SGregory Neil Shapiro **	 Note: changing the mode can be a safe way to have the "parent"
30840266059SGregory Neil Shapiro **	 set up a string that the "child" is not to modify
30940266059SGregory Neil Shapiro **
31040266059SGregory Neil Shapiro **	Parameters:
31140266059SGregory Neil Shapiro **		fp -- the file pointer
31240266059SGregory Neil Shapiro **		mode -- location of new mode to set
31340266059SGregory Neil Shapiro **
31440266059SGregory Neil Shapiro **	Results:
31540266059SGregory Neil Shapiro **		Success: 0 (zero)
31640266059SGregory Neil Shapiro **		Failure: -1 and sets errno
31740266059SGregory Neil Shapiro */
31840266059SGregory Neil Shapiro 
319b6bacd31SGregory Neil Shapiro static int
sm_strsetmode(fp,mode)32040266059SGregory Neil Shapiro sm_strsetmode(fp, mode)
32140266059SGregory Neil Shapiro 	SM_FILE_T *fp;
32240266059SGregory Neil Shapiro 	const int *mode;
32340266059SGregory Neil Shapiro {
32440266059SGregory Neil Shapiro 	register SM_STR_OBJ_T *s = fp->f_cookie;
32540266059SGregory Neil Shapiro 	int flags;
32640266059SGregory Neil Shapiro 
32740266059SGregory Neil Shapiro 	switch (*mode)
32840266059SGregory Neil Shapiro 	{
32940266059SGregory Neil Shapiro 	  case SM_IO_RDWR:
33040266059SGregory Neil Shapiro 		flags = SMRW;
33140266059SGregory Neil Shapiro 		break;
33240266059SGregory Neil Shapiro 	  case SM_IO_RDONLY:
33340266059SGregory Neil Shapiro 		flags = SMRD;
33440266059SGregory Neil Shapiro 		break;
33540266059SGregory Neil Shapiro 	  case SM_IO_WRONLY:
33640266059SGregory Neil Shapiro 		flags = SMWR;
33740266059SGregory Neil Shapiro 		break;
33840266059SGregory Neil Shapiro 	  case SM_IO_APPEND:
33940266059SGregory Neil Shapiro 		errno = EINVAL;
34040266059SGregory Neil Shapiro 		return -1;
34140266059SGregory Neil Shapiro 	  default:
34240266059SGregory Neil Shapiro 		errno = EINVAL;
34340266059SGregory Neil Shapiro 		return -1;
34440266059SGregory Neil Shapiro 	}
34540266059SGregory Neil Shapiro 	s->strio_flags &= ~SMMODEMASK;
34640266059SGregory Neil Shapiro 	s->strio_flags |= flags;
34740266059SGregory Neil Shapiro 	return 0;
34840266059SGregory Neil Shapiro }
34940266059SGregory Neil Shapiro 
35040266059SGregory Neil Shapiro /*
35140266059SGregory Neil Shapiro **  SM_STRGETMODE -- get mode info for the file
35240266059SGregory Neil Shapiro **
35340266059SGregory Neil Shapiro **	Parameters:
35440266059SGregory Neil Shapiro **		fp -- the file pointer
35540266059SGregory Neil Shapiro **		mode -- location to store current mode
35640266059SGregory Neil Shapiro **
35740266059SGregory Neil Shapiro **	Results:
35840266059SGregory Neil Shapiro **		Success: 0 (zero)
35940266059SGregory Neil Shapiro **		Failure: -1 and sets errno
36040266059SGregory Neil Shapiro */
36140266059SGregory Neil Shapiro 
3624e4196cbSGregory Neil Shapiro static int
sm_strgetmode(fp,mode)36340266059SGregory Neil Shapiro sm_strgetmode(fp, mode)
36440266059SGregory Neil Shapiro 	SM_FILE_T *fp;
36540266059SGregory Neil Shapiro 	int *mode;
36640266059SGregory Neil Shapiro {
36740266059SGregory Neil Shapiro 	register SM_STR_OBJ_T *s = fp->f_cookie;
36840266059SGregory Neil Shapiro 
36940266059SGregory Neil Shapiro 	switch (s->strio_flags & SMMODEMASK)
37040266059SGregory Neil Shapiro 	{
37140266059SGregory Neil Shapiro 	  case SMRW:
37240266059SGregory Neil Shapiro 		*mode = SM_IO_RDWR;
37340266059SGregory Neil Shapiro 		break;
37440266059SGregory Neil Shapiro 	  case SMRD:
37540266059SGregory Neil Shapiro 		*mode = SM_IO_RDONLY;
37640266059SGregory Neil Shapiro 		break;
37740266059SGregory Neil Shapiro 	  case SMWR:
37840266059SGregory Neil Shapiro 		*mode = SM_IO_WRONLY;
37940266059SGregory Neil Shapiro 		break;
38040266059SGregory Neil Shapiro 	  default:
38140266059SGregory Neil Shapiro 		errno = EINVAL;
38240266059SGregory Neil Shapiro 		return -1;
38340266059SGregory Neil Shapiro 	}
38440266059SGregory Neil Shapiro 	return 0;
38540266059SGregory Neil Shapiro }
38640266059SGregory Neil Shapiro 
38740266059SGregory Neil Shapiro /*
38840266059SGregory Neil Shapiro **  SM_STRSETINFO -- set info for the file
38940266059SGregory Neil Shapiro **
39040266059SGregory Neil Shapiro **	Currently only SM_IO_WHAT_MODE is supported for 'what'.
39140266059SGregory Neil Shapiro **
39240266059SGregory Neil Shapiro **	Parameters:
39340266059SGregory Neil Shapiro **		fp -- the file pointer
39440266059SGregory Neil Shapiro **		what -- type of information to set
39540266059SGregory Neil Shapiro **		valp -- location to data for doing set
39640266059SGregory Neil Shapiro **
39740266059SGregory Neil Shapiro **	Results:
39840266059SGregory Neil Shapiro **		Failure: -1 and sets errno
39940266059SGregory Neil Shapiro **		Success: sm_strsetmode() return [0 (zero)]
40040266059SGregory Neil Shapiro */
40140266059SGregory Neil Shapiro 
40240266059SGregory Neil Shapiro int
sm_strsetinfo(fp,what,valp)40340266059SGregory Neil Shapiro sm_strsetinfo(fp, what, valp)
40440266059SGregory Neil Shapiro 	SM_FILE_T *fp;
40540266059SGregory Neil Shapiro 	int what;
40640266059SGregory Neil Shapiro 	void *valp;
40740266059SGregory Neil Shapiro {
40840266059SGregory Neil Shapiro 	switch(what)
40940266059SGregory Neil Shapiro 	{
41040266059SGregory Neil Shapiro 	  case SM_IO_WHAT_MODE:
41140266059SGregory Neil Shapiro 		return sm_strsetmode(fp, (int *) valp);
41240266059SGregory Neil Shapiro 	  default:
41340266059SGregory Neil Shapiro 		errno = EINVAL;
41440266059SGregory Neil Shapiro 		return -1;
41540266059SGregory Neil Shapiro 	}
41640266059SGregory Neil Shapiro }
41740266059SGregory Neil Shapiro 
41840266059SGregory Neil Shapiro /*
41940266059SGregory Neil Shapiro **  SM_STRGETINFO -- get info for the file
42040266059SGregory Neil Shapiro **
42140266059SGregory Neil Shapiro **	Currently only SM_IO_WHAT_MODE is supported for 'what'.
42240266059SGregory Neil Shapiro **
42340266059SGregory Neil Shapiro **	Parameters:
42440266059SGregory Neil Shapiro **		fp -- the file pointer
42540266059SGregory Neil Shapiro **		what -- type of information requested
42640266059SGregory Neil Shapiro **		valp -- location to return information in
42740266059SGregory Neil Shapiro **
42840266059SGregory Neil Shapiro **	Results:
42940266059SGregory Neil Shapiro **		Failure: -1 and sets errno
43040266059SGregory Neil Shapiro **		Success: sm_strgetmode() return [0 (zero)]
43140266059SGregory Neil Shapiro */
43240266059SGregory Neil Shapiro 
43340266059SGregory Neil Shapiro int
sm_strgetinfo(fp,what,valp)43440266059SGregory Neil Shapiro sm_strgetinfo(fp, what, valp)
43540266059SGregory Neil Shapiro 	SM_FILE_T *fp;
43640266059SGregory Neil Shapiro 	int what;
43740266059SGregory Neil Shapiro 	void *valp;
43840266059SGregory Neil Shapiro {
43940266059SGregory Neil Shapiro 	switch(what)
44040266059SGregory Neil Shapiro 	{
44140266059SGregory Neil Shapiro 	  case SM_IO_WHAT_MODE:
44240266059SGregory Neil Shapiro 		return sm_strgetmode(fp, (int *) valp);
44340266059SGregory Neil Shapiro 	  default:
44440266059SGregory Neil Shapiro 		errno = EINVAL;
44540266059SGregory Neil Shapiro 		return -1;
44640266059SGregory Neil Shapiro 	}
44740266059SGregory Neil Shapiro }
44840266059SGregory Neil Shapiro 
44940266059SGregory Neil Shapiro /*
45040266059SGregory Neil Shapiro **  SM_STRIO_INIT -- initializes a write-only string type
45140266059SGregory Neil Shapiro **
45240266059SGregory Neil Shapiro **  Original comments below. This function does not appear to be used anywhere.
45340266059SGregory Neil Shapiro **  The same functionality can be done by changing the mode of the file.
45440266059SGregory Neil Shapiro **  ------------
45540266059SGregory Neil Shapiro ** sm_strio_init initializes an SM_FILE_T structure as a write-only file
45640266059SGregory Neil Shapiro ** that writes into the specified buffer:
45740266059SGregory Neil Shapiro ** - Use sm_io_putc, sm_io_fprintf, etc, to write into the buffer.
45840266059SGregory Neil Shapiro **   Attempts to write more than size-1 characters into the buffer will fail
45940266059SGregory Neil Shapiro **   silently (no error is reported).
46040266059SGregory Neil Shapiro ** - Use sm_io_fflush to nul terminate the string in the buffer
46140266059SGregory Neil Shapiro **   (the write pointer is not advanced).
46240266059SGregory Neil Shapiro ** No memory is allocated either by sm_strio_init or by sm_io_{putc,write} etc.
46340266059SGregory Neil Shapiro **
46440266059SGregory Neil Shapiro **	Parameters:
46540266059SGregory Neil Shapiro **		fp -- file pointer
46640266059SGregory Neil Shapiro **		buf -- memory location for stored data
46740266059SGregory Neil Shapiro **		size -- size of 'buf'
46840266059SGregory Neil Shapiro **
46940266059SGregory Neil Shapiro **	Results:
47040266059SGregory Neil Shapiro **		none.
47140266059SGregory Neil Shapiro */
47240266059SGregory Neil Shapiro 
47340266059SGregory Neil Shapiro void
sm_strio_init(fp,buf,size)47440266059SGregory Neil Shapiro sm_strio_init(fp, buf, size)
47540266059SGregory Neil Shapiro 	SM_FILE_T *fp;
47640266059SGregory Neil Shapiro 	char *buf;
47740266059SGregory Neil Shapiro 	size_t size;
47840266059SGregory Neil Shapiro {
47940266059SGregory Neil Shapiro 	fp->sm_magic = SmFileMagic;
48040266059SGregory Neil Shapiro 	fp->f_flags = SMWR | SMSTR;
48140266059SGregory Neil Shapiro 	fp->f_file = -1;
48240266059SGregory Neil Shapiro 	fp->f_bf.smb_base = fp->f_p = (unsigned char *) buf;
48340266059SGregory Neil Shapiro 	fp->f_bf.smb_size = fp->f_w = (size ? size - 1 : 0);
48440266059SGregory Neil Shapiro 	fp->f_lbfsize = 0;
48540266059SGregory Neil Shapiro 	fp->f_r = 0;
48640266059SGregory Neil Shapiro 	fp->f_read = NULL;
48740266059SGregory Neil Shapiro 	fp->f_seek = NULL;
48840266059SGregory Neil Shapiro 	fp->f_getinfo = NULL;
48940266059SGregory Neil Shapiro 	fp->f_setinfo = NULL;
49040266059SGregory Neil Shapiro }
491