17c478bd9Sstevel@tonic-gate /*
27c478bd9Sstevel@tonic-gate  * CDDL HEADER START
37c478bd9Sstevel@tonic-gate  *
47c478bd9Sstevel@tonic-gate  * The contents of this file are subject to the terms of the
57c478bd9Sstevel@tonic-gate  * Common Development and Distribution License, Version 1.0 only
67c478bd9Sstevel@tonic-gate  * (the "License").  You may not use this file except in compliance
77c478bd9Sstevel@tonic-gate  * with the License.
87c478bd9Sstevel@tonic-gate  *
97c478bd9Sstevel@tonic-gate  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
107c478bd9Sstevel@tonic-gate  * or http://www.opensolaris.org/os/licensing.
117c478bd9Sstevel@tonic-gate  * See the License for the specific language governing permissions
127c478bd9Sstevel@tonic-gate  * and limitations under the License.
137c478bd9Sstevel@tonic-gate  *
147c478bd9Sstevel@tonic-gate  * When distributing Covered Code, include this CDDL HEADER in each
157c478bd9Sstevel@tonic-gate  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
167c478bd9Sstevel@tonic-gate  * If applicable, add the following below this CDDL HEADER, with the
177c478bd9Sstevel@tonic-gate  * fields enclosed by brackets "[]" replaced with your own identifying
187c478bd9Sstevel@tonic-gate  * information: Portions Copyright [yyyy] [name of copyright owner]
197c478bd9Sstevel@tonic-gate  *
207c478bd9Sstevel@tonic-gate  * CDDL HEADER END
217c478bd9Sstevel@tonic-gate  */
227c478bd9Sstevel@tonic-gate /*
237c478bd9Sstevel@tonic-gate  * Copyright (c) 1996, by Sun Microsystems, Inc.
247c478bd9Sstevel@tonic-gate  * All rights reserved.
257c478bd9Sstevel@tonic-gate  */
267c478bd9Sstevel@tonic-gate 
277c478bd9Sstevel@tonic-gate /*
287c478bd9Sstevel@tonic-gate  * MKS interface extension.
297c478bd9Sstevel@tonic-gate  * Ensure that errno is set if malloc() fails.
307c478bd9Sstevel@tonic-gate  *
317c478bd9Sstevel@tonic-gate  * Copyright 1992 by Mortice Kern Systems Inc.  All rights reserved.
327c478bd9Sstevel@tonic-gate  *
337c478bd9Sstevel@tonic-gate  */
347c478bd9Sstevel@tonic-gate #ifdef M_RCSID
357c478bd9Sstevel@tonic-gate #ifndef lint
367c478bd9Sstevel@tonic-gate static char rcsID[] = "$Header: /rd/src/libc/mks/rcs/m_malloc.c 1.4 1993/12/17 15:22:04 rog Exp $";
377c478bd9Sstevel@tonic-gate #endif /*lint*/
387c478bd9Sstevel@tonic-gate #endif /*M_RCSID*/
397c478bd9Sstevel@tonic-gate 
407c478bd9Sstevel@tonic-gate #include <mks.h>
417c478bd9Sstevel@tonic-gate #include <errno.h>
427c478bd9Sstevel@tonic-gate #include <stdlib.h>
437c478bd9Sstevel@tonic-gate 
447c478bd9Sstevel@tonic-gate #ifdef __STDC__
457c478bd9Sstevel@tonic-gate #define _VOID	void
467c478bd9Sstevel@tonic-gate #else
477c478bd9Sstevel@tonic-gate #define _VOID	char
487c478bd9Sstevel@tonic-gate #endif
497c478bd9Sstevel@tonic-gate 
507c478bd9Sstevel@tonic-gate #undef m_malloc	   /* in case <mks.h> included in <errno.h> or <stdlib.h> */
517c478bd9Sstevel@tonic-gate 
527c478bd9Sstevel@tonic-gate /*f
53*1da57d55SToomas Soome  * m_malloc:
547c478bd9Sstevel@tonic-gate  *   Portable replacement for malloc().
557c478bd9Sstevel@tonic-gate  *   If malloc() fails (e.g returns NULL)
567c478bd9Sstevel@tonic-gate  *   then return ENOMEM unless malloc() sets errno for us on this system
577c478bd9Sstevel@tonic-gate  *   and ensure malloc(0) returns a non-NULL pointer.
587c478bd9Sstevel@tonic-gate  *
597c478bd9Sstevel@tonic-gate  */
607c478bd9Sstevel@tonic-gate _VOID*
m_malloc(amount)617c478bd9Sstevel@tonic-gate m_malloc(amount)
627c478bd9Sstevel@tonic-gate size_t amount;
637c478bd9Sstevel@tonic-gate {
647c478bd9Sstevel@tonic-gate 	_VOID* ptr;
657c478bd9Sstevel@tonic-gate 
667c478bd9Sstevel@tonic-gate 	/*l
677c478bd9Sstevel@tonic-gate 	 * Prob 1:
687c478bd9Sstevel@tonic-gate 	 *  ANSI does not insist setting errno when malloc() fails.
697c478bd9Sstevel@tonic-gate 	 *  But UNIX existing practice (which MKS relies on) always returns
707c478bd9Sstevel@tonic-gate 	 *  an errno when malloc() fails.
717c478bd9Sstevel@tonic-gate 	 *  Thus, on systems that implement malloc() where an errno is not
727c478bd9Sstevel@tonic-gate 	 *  returned, we set ENOMEM.
737c478bd9Sstevel@tonic-gate 	 *
747c478bd9Sstevel@tonic-gate 	 *  Note: we don't care about previous value of errno since
757c478bd9Sstevel@tonic-gate 	 *        POSIX.1 (Section 2.4) says you can only look at errno
767c478bd9Sstevel@tonic-gate 	 *        after a function returns a status indicating an error.
777c478bd9Sstevel@tonic-gate 	 *        (and the function explicitly states an errno value can be
787c478bd9Sstevel@tonic-gate 	 *         returned - Well, m_malloc() is so stated.)
797c478bd9Sstevel@tonic-gate 	 *
807c478bd9Sstevel@tonic-gate 	 * Prob 2:
817c478bd9Sstevel@tonic-gate          *  MKS code seems to rely on malloc(0) returning a valid pointer.
827c478bd9Sstevel@tonic-gate 	 *  This allows it to realloc() later when actual size is determined.
837c478bd9Sstevel@tonic-gate 	 *
847c478bd9Sstevel@tonic-gate 	 *  According to ANSI (4.10.3 line 18-19) the result of malloc(0) is
857c478bd9Sstevel@tonic-gate 	 *  implementation-defined.
867c478bd9Sstevel@tonic-gate 	 */
877c478bd9Sstevel@tonic-gate 
887c478bd9Sstevel@tonic-gate 	errno = 0;
897c478bd9Sstevel@tonic-gate 	if ((ptr = malloc(amount)) == NULL) {
907c478bd9Sstevel@tonic-gate 		if (amount == 0) {
917c478bd9Sstevel@tonic-gate 			/*
927c478bd9Sstevel@tonic-gate 			 *  confirm we are really out of memory
937c478bd9Sstevel@tonic-gate 			 */
947c478bd9Sstevel@tonic-gate 			return (m_malloc(1));
957c478bd9Sstevel@tonic-gate 		}
967c478bd9Sstevel@tonic-gate 		if (errno==0) {
977c478bd9Sstevel@tonic-gate 			/*
987c478bd9Sstevel@tonic-gate 			 *  ensure errno is always set
997c478bd9Sstevel@tonic-gate 			 */
1007c478bd9Sstevel@tonic-gate 			errno = ENOMEM;
1017c478bd9Sstevel@tonic-gate 		}
1027c478bd9Sstevel@tonic-gate 	}
1037c478bd9Sstevel@tonic-gate 	return (ptr);
1047c478bd9Sstevel@tonic-gate }
105