140266059SGregory Neil Shapiro /* 24e4196cbSGregory Neil Shapiro * Copyright (c) 2000-2002, 2004, 2005 Sendmail, 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> 164e4196cbSGregory Neil Shapiro SM_IDSTR(id, "@(#)$Id: strio.c,v 1.44 2005/06/09 21:40:19 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 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 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 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 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 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)); 22740266059SGregory Neil Shapiro #else /* SM_RPOOL */ 22840266059SGregory Neil Shapiro s = sm_malloc(sizeof(SM_STR_OBJ_T)); 22940266059SGregory Neil Shapiro if (s == NULL) 23040266059SGregory Neil Shapiro return -1; 23140266059SGregory Neil Shapiro #endif /* SM_RPOOL */ 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; 23840266059SGregory Neil Shapiro s->strio_end = 0; 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 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; 30040266059SGregory Neil Shapiro #endif /* !SM_RPOOL */ 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 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 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 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 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 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