87 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			87 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C
		
	
	
	
| /*
 | |
|  * Copyright (c) 1990 Regents of the University of California.
 | |
|  * All rights reserved.
 | |
|  *
 | |
|  * Redistribution and use in source and binary forms are permitted
 | |
|  * provided that the above copyright notice and this paragraph are
 | |
|  * duplicated in all such forms and that any documentation,
 | |
|  * advertising materials, and other materials related to such
 | |
|  * distribution and use acknowledge that the software was developed
 | |
|  * by the University of California, Berkeley.  The name of the
 | |
|  * University may not be used to endorse or promote products derived
 | |
|  * from this software without specific prior written permission.
 | |
|  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
 | |
|  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
 | |
|  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
 | |
|  */
 | |
| /* No user fns here. Pesch 15apr92 */
 | |
| 
 | |
| #include <_ansi.h>
 | |
| #include <stdio.h>
 | |
| #include <time.h>
 | |
| #include <fcntl.h>
 | |
| #include <errno.h>
 | |
| #include <sys/types.h>
 | |
| 
 | |
| /*
 | |
|  * Return the (stdio) flags for a given mode.  Store the flags
 | |
|  * to be passed to an open() syscall through *optr.
 | |
|  * Return 0 on error.
 | |
|  */
 | |
| 
 | |
| int
 | |
| _DEFUN(__sflags, (ptr, mode, optr),
 | |
|        struct _reent *ptr  _AND
 | |
|        register char *mode _AND
 | |
|        int *optr)
 | |
| {
 | |
|   register int ret, m, o;
 | |
| 
 | |
|   switch (mode[0])
 | |
|     {
 | |
|     case 'r':			/* open for reading */
 | |
|       ret = __SRD;
 | |
|       m = O_RDONLY;
 | |
|       o = 0;
 | |
|       break;
 | |
| 
 | |
|     case 'w':			/* open for writing */
 | |
|       ret = __SWR;
 | |
|       m = O_WRONLY;
 | |
|       o = O_CREAT | O_TRUNC;
 | |
|       break;
 | |
| 
 | |
|     case 'a':			/* open for appending */
 | |
|       ret = __SWR | __SAPP;
 | |
|       m = O_WRONLY;
 | |
|       o = O_CREAT | O_APPEND;
 | |
|       break;
 | |
|     default:			/* illegal mode */
 | |
|       ptr->_errno = EINVAL;
 | |
|       return (0);
 | |
|     }
 | |
|   if (mode[1] && (mode[1] == '+' || mode[2] == '+'))
 | |
|     {
 | |
|       ret = (ret & ~(__SRD | __SWR)) | __SRW;
 | |
|       m = O_RDWR;
 | |
|     }
 | |
|   if (mode[1] && (mode[1] == 'b' || mode[2] == 'b'))
 | |
|     {
 | |
| #ifdef O_BINARY
 | |
|       m |= O_BINARY;
 | |
| #endif
 | |
|     }
 | |
| #ifdef __CYGWIN__
 | |
|   else if (mode[1] && (mode[1] == 't' || mode[2] == 't'))
 | |
| #else
 | |
|   else
 | |
| #endif
 | |
|     {
 | |
| #ifdef O_TEXT
 | |
|       m |= O_TEXT;
 | |
| #endif
 | |
|     }
 | |
|   *optr = m | o;
 | |
|   return ret;
 | |
| }
 |