1 | /* |
---|
2 | * Copyright (c) 2000-2002 Sendmail, Inc. and its suppliers. |
---|
3 | * All rights reserved. |
---|
4 | * Copyright (c) 1990, 1993 |
---|
5 | * The Regents of the University of California. All rights reserved. |
---|
6 | * |
---|
7 | * This code is derived from software contributed to Berkeley by |
---|
8 | * Chris Torek. |
---|
9 | * |
---|
10 | * By using this file, you agree to the terms and conditions set |
---|
11 | * forth in the LICENSE file which can be found at the top level of |
---|
12 | * the sendmail distribution. |
---|
13 | */ |
---|
14 | |
---|
15 | #include <sm/gen.h> |
---|
16 | SM_RCSID("@(#)$Id: wsetup.c,v 1.1.1.1 2003-04-08 15:06:59 zacheiss Exp $") |
---|
17 | #include <stdlib.h> |
---|
18 | #include <errno.h> |
---|
19 | #include <sm/io.h> |
---|
20 | #include "local.h" |
---|
21 | |
---|
22 | /* |
---|
23 | ** SM_WSETUP -- check writing is safe |
---|
24 | ** |
---|
25 | ** Various output routines call wsetup to be sure it is safe to write, |
---|
26 | ** because either flags does not include SMMWR, or buf is NULL. |
---|
27 | ** Used in the macro "cantwrite" found in "local.h". |
---|
28 | ** |
---|
29 | ** Parameters: |
---|
30 | ** fp -- the file pointer |
---|
31 | ** |
---|
32 | ** Results: |
---|
33 | ** Failure: SM_IO_EOF and sets errno |
---|
34 | ** Success: 0 (zero) |
---|
35 | */ |
---|
36 | |
---|
37 | int |
---|
38 | sm_wsetup(fp) |
---|
39 | register SM_FILE_T *fp; |
---|
40 | { |
---|
41 | /* make sure stdio is set up */ |
---|
42 | if (!Sm_IO_DidInit) |
---|
43 | sm_init(); |
---|
44 | |
---|
45 | /* If we are not writing, we had better be reading and writing. */ |
---|
46 | if ((fp->f_flags & SMWR) == 0) |
---|
47 | { |
---|
48 | if ((fp->f_flags & SMRW) == 0) |
---|
49 | { |
---|
50 | errno = EBADF; |
---|
51 | return SM_IO_EOF; |
---|
52 | } |
---|
53 | if (fp->f_flags & SMRD) |
---|
54 | { |
---|
55 | /* clobber any ungetc data */ |
---|
56 | if (HASUB(fp)) |
---|
57 | FREEUB(fp); |
---|
58 | |
---|
59 | /* discard read buffer */ |
---|
60 | fp->f_flags &= ~(SMRD|SMFEOF); |
---|
61 | fp->f_r = 0; |
---|
62 | fp->f_p = fp->f_bf.smb_base; |
---|
63 | } |
---|
64 | fp->f_flags |= SMWR; |
---|
65 | } |
---|
66 | |
---|
67 | /* Make a buffer if necessary, then set w. */ |
---|
68 | if (fp->f_bf.smb_base == NULL) |
---|
69 | sm_makebuf(fp); |
---|
70 | if (fp->f_flags & SMLBF) |
---|
71 | { |
---|
72 | /* |
---|
73 | ** It is line buffered, so make lbfsize be -bufsize |
---|
74 | ** for the sm_putc() macro. We will change lbfsize back |
---|
75 | ** to 0 whenever we turn off SMWR. |
---|
76 | */ |
---|
77 | |
---|
78 | fp->f_w = 0; |
---|
79 | fp->f_lbfsize = -fp->f_bf.smb_size; |
---|
80 | } |
---|
81 | else |
---|
82 | fp->f_w = fp->f_flags & SMNBF ? 0 : fp->f_bf.smb_size; |
---|
83 | return 0; |
---|
84 | } |
---|