StdLib: Fix compiler compatibility issues:

tcp.h:    Fix packed structure syntax.  cdefs.h is not included so the existing __packed attribute was not properly expanded.  Non-GCC compilers were also not handled correctly.  Changing to the pack(n) pragma is compatible between all supported compilers.

SysCalls.c:  The utimes() function has a fixed number of arguments and calls a function that takes a va_list argument.  GCC will not allow the va_start, etc., macros to be used in a function with a fixed number of arguments, even though that is valid C.  The workaround was to create a worker function for utimes() that takes a variable number of arguments.  The worker function then uses the va_* macros.

Signed-off-by: darylm503
Reviewed-by: leegrosenbaum


git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@12977 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
darylm503 2012-02-01 00:17:05 +00:00
parent 79b3ce7e99
commit 4883124668
2 changed files with 129 additions and 104 deletions

View File

@ -1,8 +1,17 @@
/* $NetBSD: tcp.h,v 1.28 2007/12/25 18:33:47 perry Exp $ */
/** @file
Declarations for TCP.
Copyright (c) 2012, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials are licensed and made available under
the terms and conditions of the BSD License that accompanies this distribution.
The full text of the license may be found at
http://opensource.org/licenses/bsd-license.
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
/*
* Copyright (c) 1982, 1986, 1993
* The Regents of the University of California. All rights reserved.
* The Regents of the University of California. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@ -28,105 +37,107 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* @(#)tcp.h 8.1 (Berkeley) 6/10/93
* @(#)tcp.h 8.1 (Berkeley) 6/10/93
NetBSD: tcp.h,v 1.28 2007/12/25 18:33:47 perry Exp
*/
#ifndef _NETINET_TCP_H_
#define _NETINET_TCP_H_
#include <sys/featuretest.h>
#if defined(_NETBSD_SOURCE)
typedef u_int32_t tcp_seq;
/* Flag definitions for tcphdr.th_flags */
#define TH_FIN 0x01
#define TH_SYN 0x02
#define TH_RST 0x04
#define TH_PUSH 0x08
#define TH_ACK 0x10
#define TH_URG 0x20
#define TH_ECE 0x40
#define TH_CWR 0x80
#pragma pack(1)
/*
* TCP header.
* Per RFC 793, September, 1981.
* Updated by RFC 3168, September, 2001.
*/
struct tcphdr {
u_int16_t th_sport; /* source port */
u_int16_t th_dport; /* destination port */
tcp_seq th_seq; /* sequence number */
tcp_seq th_ack; /* acknowledgement number */
u_int16_t th_sport; /* source port */
u_int16_t th_dport; /* destination port */
tcp_seq th_seq; /* sequence number */
tcp_seq th_ack; /* acknowledgement number */
#if BYTE_ORDER == LITTLE_ENDIAN
/*LINTED non-portable bitfields*/
u_int8_t th_x2:4, /* (unused) */
th_off:4; /* data offset */
/*LINTED non-portable bitfields*/
u_int8_t th_x2:4, /* (unused) */
th_off:4; /* data offset */
#endif
#if BYTE_ORDER == BIG_ENDIAN
/*LINTED non-portable bitfields*/
u_int8_t th_off:4, /* data offset */
th_x2:4; /* (unused) */
/*LINTED non-portable bitfields*/
u_int8_t th_off:4, /* data offset */
th_x2:4; /* (unused) */
#endif
u_int8_t th_flags;
#define TH_FIN 0x01
#define TH_SYN 0x02
#define TH_RST 0x04
#define TH_PUSH 0x08
#define TH_ACK 0x10
#define TH_URG 0x20
#define TH_ECE 0x40
#define TH_CWR 0x80
u_int16_t th_win; /* window */
u_int16_t th_sum; /* checksum */
u_int16_t th_urp; /* urgent pointer */
} __packed;
u_int8_t th_flags;
u_int16_t th_win; /* window */
u_int16_t th_sum; /* checksum */
u_int16_t th_urp; /* urgent pointer */
};
#pragma pack()
#define TCPOPT_EOL 0
#define TCPOPT_NOP 1
#define TCPOPT_MAXSEG 2
#define TCPOLEN_MAXSEG 4
#define TCPOPT_WINDOW 3
#define TCPOLEN_WINDOW 3
#define TCPOPT_SACK_PERMITTED 4 /* Experimental */
#define TCPOLEN_SACK_PERMITTED 2
#define TCPOPT_SACK 5 /* Experimental */
#define TCPOPT_TIMESTAMP 8
#define TCPOLEN_TIMESTAMP 10
#define TCPOLEN_TSTAMP_APPA (TCPOLEN_TIMESTAMP+2) /* appendix A */
#define TCPOPT_EOL 0
#define TCPOPT_NOP 1
#define TCPOPT_MAXSEG 2
#define TCPOLEN_MAXSEG 4
#define TCPOPT_WINDOW 3
#define TCPOLEN_WINDOW 3
#define TCPOPT_SACK_PERMITTED 4 /* Experimental */
#define TCPOLEN_SACK_PERMITTED 2
#define TCPOPT_SACK 5 /* Experimental */
#define TCPOPT_TIMESTAMP 8
#define TCPOLEN_TIMESTAMP 10
#define TCPOLEN_TSTAMP_APPA (TCPOLEN_TIMESTAMP+2) /* appendix A */
#define TCPOPT_TSTAMP_HDR \
#define TCPOPT_TSTAMP_HDR \
(TCPOPT_NOP<<24|TCPOPT_NOP<<16|TCPOPT_TIMESTAMP<<8|TCPOLEN_TIMESTAMP)
#define TCPOPT_SIGNATURE 19 /* Keyed MD5: RFC 2385 */
#define TCPOLEN_SIGNATURE 18
#define TCPOLEN_SIGLEN (TCPOLEN_SIGNATURE+2) /* padding */
#define TCPOPT_SIGNATURE 19 /* Keyed MD5: RFC 2385 */
#define TCPOLEN_SIGNATURE 18
#define TCPOLEN_SIGLEN (TCPOLEN_SIGNATURE+2) /* padding */
#define MAX_TCPOPTLEN 40 /* max # bytes that go in options */
#define MAX_TCPOPTLEN 40 /* max # bytes that go in options */
/*
* Default maximum segment size for TCP.
* This is defined by RFC 1112 Sec 4.2.2.6.
/* Default maximum segment size for TCP.
* This is defined by RFC 1112 Sec 4.2.2.6.
*/
#define TCP_MSS 536
#define TCP_MSS 536
#define TCP_MINMSS 216
#define TCP_MINMSS 216
#define TCP_MAXWIN 65535 /* largest value for (unscaled) window */
#define TCP_MAXWIN 65535 /* largest value for (unscaled) window */
#define TCP_MAX_WINSHIFT 14 /* maximum window shift */
#define TCP_MAX_WINSHIFT 14 /* maximum window shift */
#define TCP_MAXBURST 4 /* maximum segments in a burst */
#define TCP_MAXBURST 4 /* maximum segments in a burst */
#endif /* _NETBSD_SOURCE */
/* User-settable options (used with setsockopt). */
#define TCP_NODELAY 1 /* don't delay send to coalesce packets */
#define TCP_MAXSEG 2 /* set maximum segment size */
#define TCP_KEEPIDLE 3
/*
* User-settable options (used with setsockopt).
*/
#define TCP_NODELAY 1 /* don't delay send to coalesce packets */
#define TCP_MAXSEG 2 /* set maximum segment size */
#define TCP_KEEPIDLE 3
#ifdef notyet
#define TCP_NOPUSH 4 /* reserved for FreeBSD compat */
#define TCP_NOPUSH 4 /* reserved for FreeBSD compat */
#endif
#define TCP_KEEPINTVL 5
#define TCP_KEEPCNT 6
#define TCP_KEEPINIT 7
#define TCP_KEEPINTVL 5
#define TCP_KEEPCNT 6
#define TCP_KEEPINIT 7
#ifdef notyet
#define TCP_NOOPT 8 /* reserved for FreeBSD compat */
#define TCP_NOOPT 8 /* reserved for FreeBSD compat */
#endif
#define TCP_MD5SIG 0x10 /* use MD5 digests (RFC2385) */
#define TCP_CONGCTL 0x20 /* selected congestion control */
#define TCP_MD5SIG 0x10 /* use MD5 digests (RFC2385) */
#define TCP_CONGCTL 0x20 /* selected congestion control */
#endif /* !_NETINET_TCP_H_ */

View File

@ -190,11 +190,11 @@ _closeX (int fd, int NewState)
if(Fp->RefCount == 1) { // There should be no other users
if(! IsDupFd(fd)) {
// Only do the close if no one else is using the FileHandle
if(Fp->f_iflags & FIF_DELCLOSE) {
/* Handle files marked "Delete on Close". */
if(Fp->f_ops->fo_delete != NULL) {
retval = Fp->f_ops->fo_delete(Fp);
}
if(Fp->f_iflags & FIF_DELCLOSE) {
/* Handle files marked "Delete on Close". */
if(Fp->f_ops->fo_delete != NULL) {
retval = Fp->f_ops->fo_delete(Fp);
}
}
else {
retval = Fp->f_ops->fo_close( Fp);
@ -875,7 +875,7 @@ rmdir(
retval = filp->f_ops->fo_rmdir(filp);
filp->f_iflags = 0; // Close this FD
filp->RefCount = 0; // No one using this FD
}
}
return retval;
}
@ -990,8 +990,8 @@ ioctl(
}
else {
/* All other requests. */
retval = filp->f_ops->fo_ioctl(filp, request, argp);
}
retval = filp->f_ops->fo_ioctl(filp, request, argp);
}
}
else {
errno = EBADF;
@ -1195,25 +1195,25 @@ chdir (const char *path)
/* Old Shell does not support Set Current Dir. */
if(gEfiShellProtocol != NULL) {
Cwd = ShellGetCurrentDir(NULL);
if (Cwd != NULL) {
/* We have shell support */
UnicodePath = AllocatePool(((AsciiStrLen (path) + 1) * sizeof (CHAR16)));
if (UnicodePath == NULL) {
errno = ENOMEM;
return -1;
}
AsciiStrToUnicodeStr(path, UnicodePath);
Status = gEfiShellProtocol->SetCurDir(NULL, UnicodePath);
FreePool(UnicodePath);
if (EFI_ERROR(Status)) {
Cwd = ShellGetCurrentDir(NULL);
if (Cwd != NULL) {
/* We have shell support */
UnicodePath = AllocatePool(((AsciiStrLen (path) + 1) * sizeof (CHAR16)));
if (UnicodePath == NULL) {
errno = ENOMEM;
return -1;
}
AsciiStrToUnicodeStr(path, UnicodePath);
Status = gEfiShellProtocol->SetCurDir(NULL, UnicodePath);
FreePool(UnicodePath);
if (EFI_ERROR(Status)) {
errno = ENOENT;
return -1;
} else {
return 0;
return -1;
} else {
return 0;
}
}
}
}
/* Add here for non-shell */
errno = EPERM;
return -1;
@ -1229,17 +1229,16 @@ pid_t getpgrp(void)
return ((pid_t)(UINTN)(gImageHandle));
}
/** Set file access and modification times.
@param[in] path
@param[in] times
@return
**/
/* Internal worker function for utimes.
This works around an error produced by GCC when the va_* macros
are used within a function with a fixed number of arguments.
*/
static
int
utimes(
const char *path,
const struct timeval *times
EFIAPI
va_Utimes(
const char *path,
...
)
{
struct __filedes *filp;
@ -1256,6 +1255,21 @@ utimes(
}
va_end(ap);
return retval;
}
/** Set file access and modification times.
@param[in] path
@param[in] times
@return
**/
int
utimes(
const char *path,
const struct timeval *times
)
{
return va_Utimes(path, times);
}