RedfishPkg: Apply uncrustify changes
REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3737 Apply uncrustify changes to .c/.h files in the RedfishPkg package Cc: Andrew Fish <afish@apple.com> Cc: Leif Lindholm <leif@nuviainc.com> Cc: Michael D Kinney <michael.d.kinney@intel.com> Signed-off-by: Michael Kubacki <michael.kubacki@microsoft.com> Reviewed-by: Abner Chang <abner.chang@hpe.com>
This commit is contained in:
committed by
mergify[bot]
parent
5220bd211d
commit
39de741e2d
@@ -14,17 +14,20 @@
|
||||
#include <Library/SortLib.h>
|
||||
#include <Library/UefiRuntimeServicesTableLib.h>
|
||||
|
||||
int errno = 0;
|
||||
char errnum_message [] = "We don't support to map errnum to the error message on edk2 Redfish\n";
|
||||
int errno = 0;
|
||||
char errnum_message[] = "We don't support to map errnum to the error message on edk2 Redfish\n";
|
||||
|
||||
// This is required to keep VC++ happy if you use floating-point
|
||||
int _fltused = 1;
|
||||
int _fltused = 1;
|
||||
|
||||
/**
|
||||
Determine if a particular character is an alphanumeric character
|
||||
@return Returns 1 if c is an alphanumeric character, otherwise returns 0.
|
||||
**/
|
||||
int isalnum (int c)
|
||||
int
|
||||
isalnum (
|
||||
int c
|
||||
)
|
||||
{
|
||||
//
|
||||
// <alnum> ::= [0-9] | [a-z] | [A-Z]
|
||||
@@ -39,7 +42,10 @@ int isalnum (int c)
|
||||
|
||||
@return Returns 1 if c is an digital character, otherwise returns 0.
|
||||
**/
|
||||
int isdchar (int c)
|
||||
int
|
||||
isdchar (
|
||||
int c
|
||||
)
|
||||
{
|
||||
//
|
||||
// [0-9] | [e +-.]
|
||||
@@ -55,7 +61,10 @@ int isdchar (int c)
|
||||
|
||||
@return Returns 1 if c is a space character
|
||||
**/
|
||||
int isspace (int c)
|
||||
int
|
||||
isspace (
|
||||
int c
|
||||
)
|
||||
{
|
||||
//
|
||||
// <space> ::= [ ]
|
||||
@@ -66,15 +75,21 @@ int isspace (int c)
|
||||
/**
|
||||
Allocates memory blocks
|
||||
*/
|
||||
void *malloc (size_t size)
|
||||
void *
|
||||
malloc (
|
||||
size_t size
|
||||
)
|
||||
{
|
||||
return AllocatePool ((UINTN) size);
|
||||
return AllocatePool ((UINTN)size);
|
||||
}
|
||||
|
||||
/**
|
||||
De-allocates or frees a memory block
|
||||
*/
|
||||
void free (void *ptr)
|
||||
void
|
||||
free (
|
||||
void *ptr
|
||||
)
|
||||
{
|
||||
//
|
||||
// In Standard C, free() handles a null pointer argument transparently. This
|
||||
@@ -90,15 +105,20 @@ void free (void *ptr)
|
||||
|
||||
@return Returns the pointer to duplicated string.
|
||||
**/
|
||||
char * strdup(const char *str)
|
||||
char *
|
||||
strdup (
|
||||
const char *str
|
||||
)
|
||||
{
|
||||
size_t len;
|
||||
char *copy;
|
||||
size_t len;
|
||||
char *copy;
|
||||
|
||||
len = strlen(str) + 1;
|
||||
if ((copy = malloc(len)) == NULL)
|
||||
len = strlen (str) + 1;
|
||||
if ((copy = malloc (len)) == NULL) {
|
||||
return (NULL);
|
||||
memcpy(copy, str, len);
|
||||
}
|
||||
|
||||
memcpy (copy, str, len);
|
||||
return (copy);
|
||||
}
|
||||
|
||||
@@ -115,13 +135,14 @@ char * strdup(const char *str)
|
||||
returned unchanged.
|
||||
**/
|
||||
int
|
||||
toupper(
|
||||
IN int c
|
||||
toupper (
|
||||
IN int c
|
||||
)
|
||||
{
|
||||
if ( (c >= 'a') && (c <= 'z') ) {
|
||||
if ((c >= 'a') && (c <= 'z')) {
|
||||
c = c - ('a' - 'A');
|
||||
}
|
||||
|
||||
return c;
|
||||
}
|
||||
|
||||
@@ -131,15 +152,18 @@ toupper(
|
||||
@return Returns the value of digit.
|
||||
**/
|
||||
int
|
||||
Digit2Val( int c)
|
||||
Digit2Val (
|
||||
int c
|
||||
)
|
||||
{
|
||||
if (((c >= 'a') && (c <= 'z')) || ((c >= 'A') && (c <= 'Z'))) { /* If c is one of [A-Za-z]... */
|
||||
c = toupper(c) - 7; // Adjust so 'A' is ('9' + 1)
|
||||
if (((c >= 'a') && (c <= 'z')) || ((c >= 'A') && (c <= 'Z'))) {
|
||||
/* If c is one of [A-Za-z]... */
|
||||
c = toupper (c) - 7; // Adjust so 'A' is ('9' + 1)
|
||||
}
|
||||
|
||||
return c - '0'; // Value returned is between 0 and 35, inclusive.
|
||||
}
|
||||
|
||||
|
||||
/** The strtoll function converts the initial portion of the string pointed to
|
||||
by nptr to long long int representation.
|
||||
|
||||
@@ -152,9 +176,13 @@ Digit2Val( int c)
|
||||
and the value of the macro ERANGE is stored in errno.
|
||||
**/
|
||||
long long
|
||||
strtoll(const char * nptr, char ** endptr, int base)
|
||||
strtoll (
|
||||
const char *nptr,
|
||||
char **endptr,
|
||||
int base
|
||||
)
|
||||
{
|
||||
const char *pEnd;
|
||||
const char *pEnd;
|
||||
long long Result = 0;
|
||||
long long Previous;
|
||||
int temp;
|
||||
@@ -162,71 +190,86 @@ strtoll(const char * nptr, char ** endptr, int base)
|
||||
|
||||
pEnd = nptr;
|
||||
|
||||
if((base < 0) || (base == 1) || (base > 36)) {
|
||||
if(endptr != NULL) {
|
||||
*endptr = NULL;
|
||||
if ((base < 0) || (base == 1) || (base > 36)) {
|
||||
if (endptr != NULL) {
|
||||
*endptr = NULL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
// Skip leading spaces.
|
||||
while(isspace(*nptr)) ++nptr;
|
||||
|
||||
// Process Subject sequence: optional sign followed by digits.
|
||||
if(*nptr == '+') {
|
||||
Negative = FALSE;
|
||||
// Skip leading spaces.
|
||||
while (isspace (*nptr)) {
|
||||
++nptr;
|
||||
}
|
||||
else if(*nptr == '-') {
|
||||
|
||||
// Process Subject sequence: optional sign followed by digits.
|
||||
if (*nptr == '+') {
|
||||
Negative = FALSE;
|
||||
++nptr;
|
||||
} else if (*nptr == '-') {
|
||||
Negative = TRUE;
|
||||
++nptr;
|
||||
}
|
||||
|
||||
if(*nptr == '0') { /* Might be Octal or Hex */
|
||||
if(toupper(nptr[1]) == 'X') { /* Looks like Hex */
|
||||
if((base == 0) || (base == 16)) {
|
||||
if (*nptr == '0') {
|
||||
/* Might be Octal or Hex */
|
||||
if (toupper (nptr[1]) == 'X') {
|
||||
/* Looks like Hex */
|
||||
if ((base == 0) || (base == 16)) {
|
||||
nptr += 2; /* Skip the "0X" */
|
||||
base = 16; /* In case base was 0 */
|
||||
base = 16; /* In case base was 0 */
|
||||
}
|
||||
}
|
||||
else { /* Looks like Octal */
|
||||
if((base == 0) || (base == 8)) {
|
||||
} else {
|
||||
/* Looks like Octal */
|
||||
if ((base == 0) || (base == 8)) {
|
||||
++nptr; /* Skip the leading "0" */
|
||||
base = 8; /* In case base was 0 */
|
||||
}
|
||||
}
|
||||
}
|
||||
if(base == 0) { /* If still zero then must be decimal */
|
||||
|
||||
if (base == 0) {
|
||||
/* If still zero then must be decimal */
|
||||
base = 10;
|
||||
}
|
||||
if(*nptr == '0') {
|
||||
for( ; *nptr == '0'; ++nptr); /* Skip any remaining leading zeros */
|
||||
|
||||
if (*nptr == '0') {
|
||||
for ( ; *nptr == '0'; ++nptr) {
|
||||
/* Skip any remaining leading zeros */
|
||||
}
|
||||
|
||||
pEnd = nptr;
|
||||
}
|
||||
|
||||
while( isalnum(*nptr) && ((temp = Digit2Val(*nptr)) < base)) {
|
||||
while ( isalnum (*nptr) && ((temp = Digit2Val (*nptr)) < base)) {
|
||||
Previous = Result;
|
||||
Result = MultS64x64 (Result, base) + (long long int)temp;
|
||||
if( Result <= Previous) { // Detect Overflow
|
||||
if(Negative) {
|
||||
Result = MultS64x64 (Result, base) + (long long int)temp;
|
||||
if ( Result <= Previous) {
|
||||
// Detect Overflow
|
||||
if (Negative) {
|
||||
Result = LLONG_MIN;
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
Result = LLONG_MAX;
|
||||
}
|
||||
|
||||
Negative = FALSE;
|
||||
errno = ERANGE;
|
||||
errno = ERANGE;
|
||||
break;
|
||||
}
|
||||
|
||||
pEnd = ++nptr;
|
||||
}
|
||||
if(Negative) {
|
||||
|
||||
if (Negative) {
|
||||
Result = -Result;
|
||||
}
|
||||
|
||||
// Save pointer to final sequence
|
||||
if(endptr != NULL) {
|
||||
if (endptr != NULL) {
|
||||
*endptr = (char *)pEnd;
|
||||
}
|
||||
|
||||
return Result;
|
||||
}
|
||||
|
||||
@@ -285,9 +328,13 @@ strtoll(const char * nptr, char ** endptr, int base)
|
||||
is stored in errno.
|
||||
**/
|
||||
long
|
||||
strtol(const char * nptr, char ** endptr, int base)
|
||||
strtol (
|
||||
const char *nptr,
|
||||
char **endptr,
|
||||
int base
|
||||
)
|
||||
{
|
||||
const char *pEnd;
|
||||
const char *pEnd;
|
||||
long Result = 0;
|
||||
long Previous;
|
||||
int temp;
|
||||
@@ -295,71 +342,86 @@ strtol(const char * nptr, char ** endptr, int base)
|
||||
|
||||
pEnd = nptr;
|
||||
|
||||
if((base < 0) || (base == 1) || (base > 36)) {
|
||||
if(endptr != NULL) {
|
||||
*endptr = NULL;
|
||||
if ((base < 0) || (base == 1) || (base > 36)) {
|
||||
if (endptr != NULL) {
|
||||
*endptr = NULL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
// Skip leading spaces.
|
||||
while(isspace(*nptr)) ++nptr;
|
||||
|
||||
// Process Subject sequence: optional sign followed by digits.
|
||||
if(*nptr == '+') {
|
||||
Negative = FALSE;
|
||||
// Skip leading spaces.
|
||||
while (isspace (*nptr)) {
|
||||
++nptr;
|
||||
}
|
||||
else if(*nptr == '-') {
|
||||
|
||||
// Process Subject sequence: optional sign followed by digits.
|
||||
if (*nptr == '+') {
|
||||
Negative = FALSE;
|
||||
++nptr;
|
||||
} else if (*nptr == '-') {
|
||||
Negative = TRUE;
|
||||
++nptr;
|
||||
}
|
||||
|
||||
if(*nptr == '0') { /* Might be Octal or Hex */
|
||||
if(toupper(nptr[1]) == 'X') { /* Looks like Hex */
|
||||
if((base == 0) || (base == 16)) {
|
||||
if (*nptr == '0') {
|
||||
/* Might be Octal or Hex */
|
||||
if (toupper (nptr[1]) == 'X') {
|
||||
/* Looks like Hex */
|
||||
if ((base == 0) || (base == 16)) {
|
||||
nptr += 2; /* Skip the "0X" */
|
||||
base = 16; /* In case base was 0 */
|
||||
base = 16; /* In case base was 0 */
|
||||
}
|
||||
}
|
||||
else { /* Looks like Octal */
|
||||
if((base == 0) || (base == 8)) {
|
||||
} else {
|
||||
/* Looks like Octal */
|
||||
if ((base == 0) || (base == 8)) {
|
||||
++nptr; /* Skip the leading "0" */
|
||||
base = 8; /* In case base was 0 */
|
||||
}
|
||||
}
|
||||
}
|
||||
if(base == 0) { /* If still zero then must be decimal */
|
||||
|
||||
if (base == 0) {
|
||||
/* If still zero then must be decimal */
|
||||
base = 10;
|
||||
}
|
||||
if(*nptr == '0') {
|
||||
for( ; *nptr == '0'; ++nptr); /* Skip any remaining leading zeros */
|
||||
|
||||
if (*nptr == '0') {
|
||||
for ( ; *nptr == '0'; ++nptr) {
|
||||
/* Skip any remaining leading zeros */
|
||||
}
|
||||
|
||||
pEnd = nptr;
|
||||
}
|
||||
|
||||
while( isalnum(*nptr) && ((temp = Digit2Val(*nptr)) < base)) {
|
||||
while ( isalnum (*nptr) && ((temp = Digit2Val (*nptr)) < base)) {
|
||||
Previous = Result;
|
||||
Result = (Result * base) + (long int)temp;
|
||||
if( Result <= Previous) { // Detect Overflow
|
||||
if(Negative) {
|
||||
Result = (Result * base) + (long int)temp;
|
||||
if ( Result <= Previous) {
|
||||
// Detect Overflow
|
||||
if (Negative) {
|
||||
Result = LONG_MIN;
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
Result = LONG_MAX;
|
||||
}
|
||||
|
||||
Negative = FALSE;
|
||||
errno = ERANGE;
|
||||
errno = ERANGE;
|
||||
break;
|
||||
}
|
||||
|
||||
pEnd = ++nptr;
|
||||
}
|
||||
if(Negative) {
|
||||
|
||||
if (Negative) {
|
||||
Result = -Result;
|
||||
}
|
||||
|
||||
// Save pointer to final sequence
|
||||
if(endptr != NULL) {
|
||||
if (endptr != NULL) {
|
||||
*endptr = (char *)pEnd;
|
||||
}
|
||||
|
||||
return Result;
|
||||
}
|
||||
|
||||
@@ -374,66 +436,85 @@ strtol(const char * nptr, char ** endptr, int base)
|
||||
returned and the value of the macro ERANGE is stored in errno.
|
||||
**/
|
||||
unsigned long long
|
||||
strtoull(const char * nptr, char ** endptr, int base)
|
||||
strtoull (
|
||||
const char *nptr,
|
||||
char **endptr,
|
||||
int base
|
||||
)
|
||||
{
|
||||
const char *pEnd;
|
||||
unsigned long long Result = 0;
|
||||
unsigned long long Previous;
|
||||
int temp;
|
||||
const char *pEnd;
|
||||
unsigned long long Result = 0;
|
||||
unsigned long long Previous;
|
||||
int temp;
|
||||
|
||||
pEnd = nptr;
|
||||
|
||||
if((base < 0) || (base == 1) || (base > 36)) {
|
||||
if(endptr != NULL) {
|
||||
*endptr = NULL;
|
||||
if ((base < 0) || (base == 1) || (base > 36)) {
|
||||
if (endptr != NULL) {
|
||||
*endptr = NULL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
// Skip leading spaces.
|
||||
while(isspace(*nptr)) ++nptr;
|
||||
|
||||
// Process Subject sequence: optional + sign followed by digits.
|
||||
if(*nptr == '+') {
|
||||
// Skip leading spaces.
|
||||
while (isspace (*nptr)) {
|
||||
++nptr;
|
||||
}
|
||||
|
||||
if(*nptr == '0') { /* Might be Octal or Hex */
|
||||
if(toupper(nptr[1]) == 'X') { /* Looks like Hex */
|
||||
if((base == 0) || (base == 16)) {
|
||||
// Process Subject sequence: optional + sign followed by digits.
|
||||
if (*nptr == '+') {
|
||||
++nptr;
|
||||
}
|
||||
|
||||
if (*nptr == '0') {
|
||||
/* Might be Octal or Hex */
|
||||
if (toupper (nptr[1]) == 'X') {
|
||||
/* Looks like Hex */
|
||||
if ((base == 0) || (base == 16)) {
|
||||
nptr += 2; /* Skip the "0X" */
|
||||
base = 16; /* In case base was 0 */
|
||||
base = 16; /* In case base was 0 */
|
||||
}
|
||||
}
|
||||
else { /* Looks like Octal */
|
||||
if((base == 0) || (base == 8)) {
|
||||
} else {
|
||||
/* Looks like Octal */
|
||||
if ((base == 0) || (base == 8)) {
|
||||
++nptr; /* Skip the leading "0" */
|
||||
base = 8; /* In case base was 0 */
|
||||
}
|
||||
}
|
||||
}
|
||||
if(base == 0) { /* If still zero then must be decimal */
|
||||
|
||||
if (base == 0) {
|
||||
/* If still zero then must be decimal */
|
||||
base = 10;
|
||||
}
|
||||
if(*nptr == '0') {
|
||||
for( ; *nptr == '0'; ++nptr); /* Skip any remaining leading zeros */
|
||||
|
||||
if (*nptr == '0') {
|
||||
for ( ; *nptr == '0'; ++nptr) {
|
||||
/* Skip any remaining leading zeros */
|
||||
}
|
||||
|
||||
pEnd = nptr;
|
||||
}
|
||||
|
||||
while( isalnum(*nptr) && ((temp = Digit2Val(*nptr)) < base)) {
|
||||
while ( isalnum (*nptr) && ((temp = Digit2Val (*nptr)) < base)) {
|
||||
Previous = Result;
|
||||
Result = DivU64x32 (Result, base) + (unsigned long long)temp;
|
||||
if( Result < Previous) { // If we overflowed
|
||||
Result = DivU64x32 (Result, base) + (unsigned long long)temp;
|
||||
if ( Result < Previous) {
|
||||
// If we overflowed
|
||||
Result = ULLONG_MAX;
|
||||
errno = ERANGE;
|
||||
errno = ERANGE;
|
||||
break;
|
||||
}
|
||||
|
||||
pEnd = ++nptr;
|
||||
}
|
||||
|
||||
// Save pointer to final sequence
|
||||
if(endptr != NULL) {
|
||||
if (endptr != NULL) {
|
||||
*endptr = (char *)pEnd;
|
||||
}
|
||||
|
||||
return Result;
|
||||
}
|
||||
|
||||
@@ -462,27 +543,34 @@ strtoull(const char * nptr, char ** endptr, int base)
|
||||
@return Return 0.
|
||||
**/
|
||||
double
|
||||
strtod (const char * __restrict nptr, char ** __restrict endptr) {
|
||||
|
||||
DEBUG((DEBUG_INFO, "We don't supprot double type on edk2 yet!"));
|
||||
ASSERT(FALSE);
|
||||
return (double)0;
|
||||
strtod (
|
||||
const char *__restrict nptr,
|
||||
char **__restrict endptr
|
||||
)
|
||||
{
|
||||
DEBUG ((DEBUG_INFO, "We don't supprot double type on edk2 yet!"));
|
||||
ASSERT (FALSE);
|
||||
return (double)0;
|
||||
}
|
||||
|
||||
static UINT8 BitMask[] = {
|
||||
0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80
|
||||
};
|
||||
};
|
||||
|
||||
#define WHICH8(c) ((unsigned char)(c) >> 3)
|
||||
#define WHICH_BIT(c) (BitMask[((c) & 0x7)])
|
||||
#define BITMAP64 ((UINT64 *)bitmap)
|
||||
#define BITMAP64 ((UINT64 *)bitmap)
|
||||
|
||||
static
|
||||
void
|
||||
BuildBitmap(unsigned char * bitmap, const char *s2, int n)
|
||||
BuildBitmap (
|
||||
unsigned char *bitmap,
|
||||
const char *s2,
|
||||
int n
|
||||
)
|
||||
{
|
||||
unsigned char bit;
|
||||
int index;
|
||||
unsigned char bit;
|
||||
int index;
|
||||
|
||||
// Initialize bitmap. Bit 0 is always 1 which corresponds to '\0'
|
||||
for (BITMAP64[0] = index = 1; index < n; index++) {
|
||||
@@ -490,9 +578,9 @@ BuildBitmap(unsigned char * bitmap, const char *s2, int n)
|
||||
}
|
||||
|
||||
// Set bits in bitmap corresponding to the characters in s2
|
||||
for (; *s2 != '\0'; s2++) {
|
||||
index = WHICH8(*s2);
|
||||
bit = WHICH_BIT(*s2);
|
||||
for ( ; *s2 != '\0'; s2++) {
|
||||
index = WHICH8 (*s2);
|
||||
bit = WHICH_BIT (*s2);
|
||||
bitmap[index] = bitmap[index] | bit;
|
||||
}
|
||||
}
|
||||
@@ -504,21 +592,25 @@ BuildBitmap(unsigned char * bitmap, const char *s2, int n)
|
||||
null pointer if no character from s2 occurs in s1.
|
||||
**/
|
||||
char *
|
||||
strpbrk(const char *s1, const char *s2)
|
||||
strpbrk (
|
||||
const char *s1,
|
||||
const char *s2
|
||||
)
|
||||
{
|
||||
UINT8 bitmap[ (((UCHAR_MAX + 1) / CHAR_BIT) + (CHAR_BIT - 1)) & ~7U];
|
||||
UINT8 bit;
|
||||
int index;
|
||||
UINT8 bitmap[(((UCHAR_MAX + 1) / CHAR_BIT) + (CHAR_BIT - 1)) & ~7U];
|
||||
UINT8 bit;
|
||||
int index;
|
||||
|
||||
BuildBitmap( bitmap, s2, sizeof(bitmap) / sizeof(UINT64));
|
||||
BuildBitmap (bitmap, s2, sizeof (bitmap) / sizeof (UINT64));
|
||||
|
||||
for( ; *s1 != '\0'; ++s1) {
|
||||
index = WHICH8(*s1);
|
||||
bit = WHICH_BIT(*s1);
|
||||
if( (bitmap[index] & bit) != 0) {
|
||||
for ( ; *s1 != '\0'; ++s1) {
|
||||
index = WHICH8 (*s1);
|
||||
bit = WHICH_BIT (*s1);
|
||||
if ((bitmap[index] & bit) != 0) {
|
||||
return (char *)s1;
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -535,7 +627,9 @@ strpbrk(const char *s1, const char *s2)
|
||||
a subsequent call to the strerror function.
|
||||
**/
|
||||
char *
|
||||
strerror(int errnum)
|
||||
strerror (
|
||||
int errnum
|
||||
)
|
||||
{
|
||||
return errnum_message;
|
||||
}
|
||||
@@ -544,20 +638,24 @@ strerror(int errnum)
|
||||
Allocate and zero-initialize array.
|
||||
**/
|
||||
void *
|
||||
calloc(size_t Num, size_t Size)
|
||||
calloc (
|
||||
size_t Num,
|
||||
size_t Size
|
||||
)
|
||||
{
|
||||
void *RetVal;
|
||||
size_t NumSize;
|
||||
void *RetVal;
|
||||
size_t NumSize;
|
||||
|
||||
NumSize = Num * Size;
|
||||
RetVal = NULL;
|
||||
if (NumSize != 0) {
|
||||
RetVal = malloc(NumSize);
|
||||
if( RetVal != NULL) {
|
||||
(VOID)ZeroMem( RetVal, NumSize);
|
||||
RetVal = malloc (NumSize);
|
||||
if ( RetVal != NULL) {
|
||||
(VOID)ZeroMem (RetVal, NumSize);
|
||||
}
|
||||
}
|
||||
}
|
||||
DEBUG((DEBUG_POOL, "0x%p = calloc(%d, %d)\n", RetVal, Num, Size));
|
||||
|
||||
DEBUG ((DEBUG_POOL, "0x%p = calloc(%d, %d)\n", RetVal, Num, Size));
|
||||
|
||||
return RetVal;
|
||||
}
|
||||
@@ -567,7 +665,7 @@ calloc(size_t Num, size_t Size)
|
||||
// month number used as the index (1 -> 12) for regular and leap years.
|
||||
// The value at index 13 is for the whole year.
|
||||
//
|
||||
UINTN CumulativeDays[2][14] = {
|
||||
UINTN CumulativeDays[2][14] = {
|
||||
{
|
||||
0,
|
||||
0,
|
||||
@@ -602,15 +700,18 @@ UINTN CumulativeDays[2][14] = {
|
||||
}
|
||||
};
|
||||
|
||||
#define IsLeap(y) (((y) % 4) == 0 && (((y) % 100) != 0 || ((y) % 400) == 0))
|
||||
#define SECSPERMIN (60)
|
||||
#define SECSPERHOUR (60 * 60)
|
||||
#define SECSPERDAY (24 * SECSPERHOUR)
|
||||
#define IsLeap(y) (((y) % 4) == 0 && (((y) % 100) != 0 || ((y) % 400) == 0))
|
||||
#define SECSPERMIN (60)
|
||||
#define SECSPERHOUR (60 * 60)
|
||||
#define SECSPERDAY (24 * SECSPERHOUR)
|
||||
|
||||
/**
|
||||
Get the system time as seconds elapsed since midnight, January 1, 1970.
|
||||
**/
|
||||
time_t time (time_t *timer)
|
||||
time_t
|
||||
time (
|
||||
time_t *timer
|
||||
)
|
||||
{
|
||||
EFI_TIME Time;
|
||||
time_t CalTime;
|
||||
@@ -626,7 +727,7 @@ time_t time (time_t *timer)
|
||||
// UTime should now be set to 00:00:00 on Jan 1 of the current year.
|
||||
//
|
||||
for (Year = 1970, CalTime = 0; Year != Time.Year; Year++) {
|
||||
CalTime = CalTime + (time_t)(CumulativeDays[IsLeap(Year)][13] * SECSPERDAY);
|
||||
CalTime = CalTime + (time_t)(CumulativeDays[IsLeap (Year)][13] * SECSPERDAY);
|
||||
}
|
||||
|
||||
//
|
||||
@@ -634,7 +735,7 @@ time_t time (time_t *timer)
|
||||
//
|
||||
CalTime = CalTime +
|
||||
(time_t)((Time.TimeZone != EFI_UNSPECIFIED_TIMEZONE) ? (Time.TimeZone * 60) : 0) +
|
||||
(time_t)(CumulativeDays[IsLeap(Time.Year)][Time.Month] * SECSPERDAY) +
|
||||
(time_t)(CumulativeDays[IsLeap (Time.Year)][Time.Month] * SECSPERDAY) +
|
||||
(time_t)(((Time.Day > 0) ? Time.Day - 1 : 0) * SECSPERDAY) +
|
||||
(time_t)(Time.Hour * SECSPERHOUR) +
|
||||
(time_t)(Time.Minute * 60) +
|
||||
@@ -650,9 +751,14 @@ time_t time (time_t *timer)
|
||||
/**
|
||||
Performs a quick sort
|
||||
**/
|
||||
void qsort (void *base, size_t num, size_t width, int (*compare)(const void *, const void *))
|
||||
void
|
||||
qsort (
|
||||
void *base,
|
||||
size_t num,
|
||||
size_t width,
|
||||
int ( *compare )(const void *, const void *)
|
||||
)
|
||||
{
|
||||
|
||||
ASSERT (base != NULL);
|
||||
ASSERT (compare != NULL);
|
||||
|
||||
@@ -666,54 +772,93 @@ void qsort (void *base, size_t num, size_t width, int (*compare)(const void *, c
|
||||
@return Returns the character currently pointed by the internal file position indicator of the specified stream
|
||||
|
||||
**/
|
||||
int fgetc(FILE * _File){
|
||||
return EOF;
|
||||
int
|
||||
fgetc (
|
||||
FILE *_File
|
||||
)
|
||||
{
|
||||
return EOF;
|
||||
}
|
||||
|
||||
/**
|
||||
Open stream file, we don't support file operastion on edk2 JSON library.
|
||||
|
||||
@return 0 Unsupported
|
||||
|
||||
**/
|
||||
FILE *fopen (const char *filename, const char *mode) {
|
||||
FILE *
|
||||
fopen (
|
||||
const char *filename,
|
||||
const char *mode
|
||||
)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
Read stream from file, we don't support file operastion on edk2 JSON library.
|
||||
|
||||
@return 0 Unsupported
|
||||
|
||||
**/
|
||||
size_t fread (void * ptr, size_t size, size_t count, FILE * stream) {
|
||||
size_t
|
||||
fread (
|
||||
void *ptr,
|
||||
size_t size,
|
||||
size_t count,
|
||||
FILE *stream
|
||||
)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
Write stream from file, we don't support file operastion on edk2 JSON library.
|
||||
|
||||
@return 0 Unsupported
|
||||
|
||||
**/
|
||||
size_t fwrite (const void * ptr, size_t size, size_t count, FILE * stream) {
|
||||
size_t
|
||||
fwrite (
|
||||
const void *ptr,
|
||||
size_t size,
|
||||
size_t count,
|
||||
FILE *stream
|
||||
)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
Close file, we don't support file operastion on edk2 JSON library.
|
||||
|
||||
@return 0 Unsupported
|
||||
|
||||
**/
|
||||
int fclose (FILE * stream) {
|
||||
int
|
||||
fclose (
|
||||
FILE *stream
|
||||
)
|
||||
{
|
||||
return EOF;
|
||||
}
|
||||
|
||||
/**
|
||||
Write the formatted string to file, we don't support file operastion on edk2 JSON library.
|
||||
|
||||
@return 0 Unsupported
|
||||
|
||||
**/
|
||||
int fprintf (FILE * stream, const char * format, ...) {
|
||||
int
|
||||
fprintf (
|
||||
FILE *stream,
|
||||
const char *format,
|
||||
...
|
||||
)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
/**
|
||||
This function check if this is the formating string specifier.
|
||||
|
||||
@@ -730,12 +875,12 @@ int fprintf (FILE * stream, const char * format, ...) {
|
||||
**/
|
||||
BOOLEAN
|
||||
CheckFormatingString (
|
||||
IN CONST CHAR8 *FormatString,
|
||||
IN OUT UINTN *CurrentPosition,
|
||||
IN UINTN StrLength
|
||||
IN CONST CHAR8 *FormatString,
|
||||
IN OUT UINTN *CurrentPosition,
|
||||
IN UINTN StrLength
|
||||
)
|
||||
{
|
||||
CHAR8 FormatStringParamater;
|
||||
CHAR8 FormatStringParamater;
|
||||
|
||||
while (*(FormatString + *CurrentPosition) != 's') {
|
||||
//
|
||||
@@ -749,14 +894,17 @@ CheckFormatingString (
|
||||
(FormatStringParamater != '*') &&
|
||||
(FormatStringParamater != '.') &&
|
||||
!(((UINTN)FormatStringParamater >= (UINTN)'0') && ((UINTN)FormatStringParamater <= (UINTN)'9'))
|
||||
) {
|
||||
)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
(*CurrentPosition)++;
|
||||
if (*CurrentPosition >= StrLength) {
|
||||
return FALSE;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@@ -772,15 +920,15 @@ CheckFormatingString (
|
||||
**/
|
||||
CHAR8 *
|
||||
ReplaceUnicodeToAsciiStrFormat (
|
||||
IN CONST CHAR8 *FormatString
|
||||
)
|
||||
IN CONST CHAR8 *FormatString
|
||||
)
|
||||
{
|
||||
UINTN FormatStrSize;
|
||||
UINTN FormatStrIndex;
|
||||
UINTN FormatStrSpecifier;
|
||||
BOOLEAN PercentageMark;
|
||||
CHAR8 *TempFormatBuffer;
|
||||
BOOLEAN IsFormatString;
|
||||
UINTN FormatStrSize;
|
||||
UINTN FormatStrIndex;
|
||||
UINTN FormatStrSpecifier;
|
||||
BOOLEAN PercentageMark;
|
||||
CHAR8 *TempFormatBuffer;
|
||||
BOOLEAN IsFormatString;
|
||||
|
||||
//
|
||||
// Error checking.
|
||||
@@ -788,15 +936,18 @@ ReplaceUnicodeToAsciiStrFormat (
|
||||
if (FormatString == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
FormatStrSize = AsciiStrSize(FormatString);
|
||||
|
||||
FormatStrSize = AsciiStrSize (FormatString);
|
||||
if (FormatStrSize == 0) {
|
||||
return NULL;
|
||||
}
|
||||
TempFormatBuffer = AllocatePool(FormatStrSize); // Allocate memory for the
|
||||
// new string.
|
||||
if (TempFormatBuffer== NULL) {
|
||||
|
||||
TempFormatBuffer = AllocatePool (FormatStrSize); // Allocate memory for the
|
||||
// new string.
|
||||
if (TempFormatBuffer == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
//
|
||||
// Clone *FormatString but replace "%s" wih "%a".
|
||||
// "%%" is not considered as the format tag.
|
||||
@@ -809,18 +960,21 @@ ReplaceUnicodeToAsciiStrFormat (
|
||||
// Previous character is "%".
|
||||
//
|
||||
PercentageMark = FALSE;
|
||||
if (*(FormatString + FormatStrIndex) != '%') { // Check if this is double "%".
|
||||
if (*(FormatString + FormatStrIndex) != '%') {
|
||||
// Check if this is double "%".
|
||||
FormatStrSpecifier = FormatStrIndex;
|
||||
//
|
||||
// Check if this is the formating string specifier.
|
||||
//
|
||||
IsFormatString = CheckFormatingString (FormatString, &FormatStrSpecifier, FormatStrSize);
|
||||
if ((FormatStrSpecifier - FormatStrIndex) != 0) {
|
||||
CopyMem((VOID *)(TempFormatBuffer + FormatStrIndex),
|
||||
(VOID *)(FormatString + FormatStrIndex),
|
||||
FormatStrSpecifier - FormatStrIndex
|
||||
);
|
||||
CopyMem (
|
||||
(VOID *)(TempFormatBuffer + FormatStrIndex),
|
||||
(VOID *)(FormatString + FormatStrIndex),
|
||||
FormatStrSpecifier - FormatStrIndex
|
||||
);
|
||||
}
|
||||
|
||||
FormatStrIndex = FormatStrSpecifier;
|
||||
if (IsFormatString == TRUE) {
|
||||
//
|
||||
@@ -828,18 +982,22 @@ ReplaceUnicodeToAsciiStrFormat (
|
||||
// format on edk2 environment.
|
||||
//
|
||||
*(TempFormatBuffer + FormatStrSpecifier) = 'a';
|
||||
FormatStrIndex ++;
|
||||
FormatStrIndex++;
|
||||
}
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
goto ContinueCheck;
|
||||
}
|
||||
|
||||
if (*(FormatString + FormatStrIndex) == '%') {
|
||||
//
|
||||
// This character is "%", set the flag.
|
||||
//
|
||||
PercentageMark = TRUE;
|
||||
}
|
||||
|
||||
ContinueCheck:
|
||||
//
|
||||
// Clone character to the new string and advance FormatStrIndex
|
||||
@@ -847,7 +1005,8 @@ ContinueCheck:
|
||||
//
|
||||
*(TempFormatBuffer + FormatStrIndex) = *(FormatString + FormatStrIndex);
|
||||
FormatStrIndex++;
|
||||
};
|
||||
}
|
||||
|
||||
return TempFormatBuffer;
|
||||
}
|
||||
|
||||
@@ -870,14 +1029,14 @@ ContinueCheck:
|
||||
UINTN
|
||||
EFIAPI
|
||||
RedfishAsciiVSPrint (
|
||||
OUT CHAR8 *StartOfBuffer,
|
||||
IN UINTN BufferSize,
|
||||
IN CONST CHAR8 *FormatString,
|
||||
IN VA_LIST Marker
|
||||
OUT CHAR8 *StartOfBuffer,
|
||||
IN UINTN BufferSize,
|
||||
IN CONST CHAR8 *FormatString,
|
||||
IN VA_LIST Marker
|
||||
)
|
||||
{
|
||||
CHAR8 *TempFormatBuffer;
|
||||
UINTN LenStrProduced;
|
||||
CHAR8 *TempFormatBuffer;
|
||||
UINTN LenStrProduced;
|
||||
|
||||
//
|
||||
// Looking for "%s" in the format string and replace it
|
||||
@@ -888,6 +1047,7 @@ RedfishAsciiVSPrint (
|
||||
if (TempFormatBuffer == NULL) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
LenStrProduced = AsciiVSPrint (StartOfBuffer, BufferSize, (CONST CHAR8 *)TempFormatBuffer, Marker);
|
||||
FreePool (TempFormatBuffer);
|
||||
return LenStrProduced;
|
||||
@@ -919,11 +1079,10 @@ RedfishAsciiSPrint (
|
||||
...
|
||||
)
|
||||
{
|
||||
VA_LIST Marker;
|
||||
UINTN LenStrProduced;
|
||||
VA_LIST Marker;
|
||||
UINTN LenStrProduced;
|
||||
|
||||
VA_START(Marker, FormatString);
|
||||
VA_START (Marker, FormatString);
|
||||
LenStrProduced = RedfishAsciiVSPrint (StartOfBuffer, BufferSize, FormatString, Marker);
|
||||
return LenStrProduced;
|
||||
}
|
||||
|
||||
|
@@ -27,7 +27,7 @@
|
||||
REDFISH_SERVICE
|
||||
EFIAPI
|
||||
RedfishCreateService (
|
||||
IN REDFISH_CONFIG_SERVICE_INFORMATION *RedfishConfigServiceInfo
|
||||
IN REDFISH_CONFIG_SERVICE_INFORMATION *RedfishConfigServiceInfo
|
||||
)
|
||||
{
|
||||
REDFISH_SERVICE RedfishService;
|
||||
@@ -69,7 +69,8 @@ ON_EXIT:
|
||||
if (UserId != NULL) {
|
||||
FreePool (UserId);
|
||||
}
|
||||
if (Password!= NULL) {
|
||||
|
||||
if (Password != NULL) {
|
||||
FreePool (Password);
|
||||
}
|
||||
|
||||
@@ -85,7 +86,7 @@ ON_EXIT:
|
||||
VOID
|
||||
EFIAPI
|
||||
RedfishCleanupService (
|
||||
IN REDFISH_SERVICE RedfishService
|
||||
IN REDFISH_SERVICE RedfishService
|
||||
)
|
||||
{
|
||||
if (RedfishService == NULL) {
|
||||
@@ -94,6 +95,7 @@ RedfishCleanupService (
|
||||
|
||||
cleanupServiceEnumerator (RedfishService);
|
||||
}
|
||||
|
||||
/**
|
||||
Create REDFISH_PAYLOAD instance in local with JSON represented resource value and
|
||||
the Redfish Service.
|
||||
@@ -112,11 +114,11 @@ RedfishCleanupService (
|
||||
REDFISH_PAYLOAD
|
||||
EFIAPI
|
||||
RedfishCreatePayload (
|
||||
IN EDKII_JSON_VALUE Value,
|
||||
IN REDFISH_SERVICE RedfishService
|
||||
IN EDKII_JSON_VALUE Value,
|
||||
IN REDFISH_SERVICE RedfishService
|
||||
)
|
||||
{
|
||||
EDKII_JSON_VALUE CopyValue;
|
||||
EDKII_JSON_VALUE CopyValue;
|
||||
|
||||
CopyValue = JsonValueClone (Value);
|
||||
return createRedfishPayload (CopyValue, RedfishService);
|
||||
@@ -131,14 +133,14 @@ RedfishCreatePayload (
|
||||
VOID
|
||||
EFIAPI
|
||||
RedfishCleanupPayload (
|
||||
IN REDFISH_PAYLOAD Payload
|
||||
IN REDFISH_PAYLOAD Payload
|
||||
)
|
||||
{
|
||||
if (Payload == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
cleanupPayload ((redfishPayload *) Payload);
|
||||
cleanupPayload ((redfishPayload *)Payload);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -155,14 +157,14 @@ RedfishCleanupPayload (
|
||||
EDKII_JSON_VALUE
|
||||
EFIAPI
|
||||
RedfishJsonInPayload (
|
||||
IN REDFISH_PAYLOAD Payload
|
||||
IN REDFISH_PAYLOAD Payload
|
||||
)
|
||||
{
|
||||
if (Payload == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return ((redfishPayload*)Payload)->json;
|
||||
return ((redfishPayload *)Payload)->json;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -187,15 +189,15 @@ RedfishJsonInPayload (
|
||||
CHAR8 *
|
||||
EFIAPI
|
||||
RedfishBuildPathWithSystemUuid (
|
||||
IN CONST CHAR8 *RedPath,
|
||||
IN BOOLEAN FromSmbios,
|
||||
IN CHAR8 *IdString OPTIONAL
|
||||
IN CONST CHAR8 *RedPath,
|
||||
IN BOOLEAN FromSmbios,
|
||||
IN CHAR8 *IdString OPTIONAL
|
||||
)
|
||||
{
|
||||
UINTN BufSize;
|
||||
CHAR8* RetRedPath;
|
||||
EFI_GUID SystemUuid;
|
||||
EFI_STATUS Status;
|
||||
UINTN BufSize;
|
||||
CHAR8 *RetRedPath;
|
||||
EFI_GUID SystemUuid;
|
||||
EFI_STATUS Status;
|
||||
|
||||
if (RedPath == NULL) {
|
||||
return NULL;
|
||||
@@ -205,10 +207,11 @@ RedfishBuildPathWithSystemUuid (
|
||||
// Find system UUID from SMBIOS table.
|
||||
//
|
||||
if (FromSmbios) {
|
||||
Status = NetLibGetSystemGuid(&SystemUuid);
|
||||
Status = NetLibGetSystemGuid (&SystemUuid);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
// AsciiStrLen ("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx") = 36
|
||||
BufSize = AsciiStrSize (RedPath) + AsciiStrLen ("XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX");
|
||||
} else {
|
||||
@@ -219,13 +222,16 @@ RedfishBuildPathWithSystemUuid (
|
||||
if (RetRedPath == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (FromSmbios) {
|
||||
AsciiSPrint (RetRedPath, BufSize, RedPath, &SystemUuid);
|
||||
} else {
|
||||
AsciiSPrint (RetRedPath, BufSize, RedPath, IdString);
|
||||
}
|
||||
|
||||
return RetRedPath;
|
||||
}
|
||||
|
||||
/**
|
||||
Get a redfish response addressed by a RedPath string, including HTTP StatusCode, Headers
|
||||
and Payload which record any HTTP response messages.
|
||||
@@ -252,24 +258,24 @@ RedfishBuildPathWithSystemUuid (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
RedfishGetByService (
|
||||
IN REDFISH_SERVICE RedfishService,
|
||||
IN CONST CHAR8 *RedPath,
|
||||
OUT REDFISH_RESPONSE *RedResponse
|
||||
IN REDFISH_SERVICE RedfishService,
|
||||
IN CONST CHAR8 *RedPath,
|
||||
OUT REDFISH_RESPONSE *RedResponse
|
||||
)
|
||||
{
|
||||
if (RedfishService == NULL || RedPath == NULL || RedResponse == NULL) {
|
||||
if ((RedfishService == NULL) || (RedPath == NULL) || (RedResponse == NULL)) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
ZeroMem (RedResponse, sizeof (REDFISH_RESPONSE));
|
||||
|
||||
RedResponse->Payload = (REDFISH_PAYLOAD) getPayloadByPath (RedfishService, RedPath, &(RedResponse->StatusCode));
|
||||
RedResponse->Payload = (REDFISH_PAYLOAD)getPayloadByPath (RedfishService, RedPath, &(RedResponse->StatusCode));
|
||||
|
||||
//
|
||||
// 1. If the returned Payload is NULL, indicates any error happen.
|
||||
// 2. If the returned StatusCode is NULL, indicates any error happen.
|
||||
//
|
||||
if (RedResponse->Payload == NULL || RedResponse->StatusCode == NULL) {
|
||||
if ((RedResponse->Payload == NULL) || (RedResponse->StatusCode == NULL)) {
|
||||
return EFI_DEVICE_ERROR;
|
||||
}
|
||||
|
||||
@@ -278,13 +284,15 @@ RedfishGetByService (
|
||||
// NOTE: If there is any error message returned from server, it will be returned in
|
||||
// Payload within RedResponse.
|
||||
//
|
||||
if (*(RedResponse->StatusCode) < HTTP_STATUS_200_OK || \
|
||||
*(RedResponse->StatusCode) > HTTP_STATUS_206_PARTIAL_CONTENT) {
|
||||
if ((*(RedResponse->StatusCode) < HTTP_STATUS_200_OK) || \
|
||||
(*(RedResponse->StatusCode) > HTTP_STATUS_206_PARTIAL_CONTENT))
|
||||
{
|
||||
return EFI_DEVICE_ERROR;
|
||||
}
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
Get a redfish response addressed by URI, including HTTP StatusCode, Headers
|
||||
and Payload which record any HTTP response messages.
|
||||
@@ -310,27 +318,27 @@ RedfishGetByService (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
RedfishGetByUri (
|
||||
IN REDFISH_SERVICE RedfishService,
|
||||
IN CONST CHAR8 *Uri,
|
||||
OUT REDFISH_RESPONSE *RedResponse
|
||||
IN REDFISH_SERVICE RedfishService,
|
||||
IN CONST CHAR8 *Uri,
|
||||
OUT REDFISH_RESPONSE *RedResponse
|
||||
)
|
||||
{
|
||||
EDKII_JSON_VALUE JsonValue;
|
||||
EDKII_JSON_VALUE JsonValue;
|
||||
|
||||
if (RedfishService == NULL || Uri == NULL || RedResponse == NULL) {
|
||||
if ((RedfishService == NULL) || (Uri == NULL) || (RedResponse == NULL)) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
ZeroMem (RedResponse, sizeof (REDFISH_RESPONSE));
|
||||
|
||||
JsonValue = getUriFromService (RedfishService, Uri, &RedResponse->StatusCode);
|
||||
RedResponse->Payload = createRedfishPayload(JsonValue, RedfishService);
|
||||
JsonValue = getUriFromService (RedfishService, Uri, &RedResponse->StatusCode);
|
||||
RedResponse->Payload = createRedfishPayload (JsonValue, RedfishService);
|
||||
|
||||
//
|
||||
// 1. If the returned Payload is NULL, indicates any error happen.
|
||||
// 2. If the returned StatusCode is NULL, indicates any error happen.
|
||||
//
|
||||
if (RedResponse->Payload == NULL || RedResponse->StatusCode == NULL) {
|
||||
if ((RedResponse->Payload == NULL) || (RedResponse->StatusCode == NULL)) {
|
||||
return EFI_DEVICE_ERROR;
|
||||
}
|
||||
|
||||
@@ -339,12 +347,15 @@ RedfishGetByUri (
|
||||
// NOTE: If there is any error message returned from server, it will be returned in
|
||||
// Payload within RedResponse.
|
||||
//
|
||||
if (*(RedResponse->StatusCode) < HTTP_STATUS_200_OK || \
|
||||
*(RedResponse->StatusCode) > HTTP_STATUS_206_PARTIAL_CONTENT) {
|
||||
if ((*(RedResponse->StatusCode) < HTTP_STATUS_200_OK) || \
|
||||
(*(RedResponse->StatusCode) > HTTP_STATUS_206_PARTIAL_CONTENT))
|
||||
{
|
||||
return EFI_DEVICE_ERROR;
|
||||
}
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
Get a redfish response addressed by the input Payload and relative RedPath string,
|
||||
including HTTP StatusCode, Headers and Payload which record any HTTP response messages.
|
||||
@@ -374,18 +385,18 @@ RedfishGetByUri (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
RedfishGetByPayload (
|
||||
IN REDFISH_PAYLOAD Payload,
|
||||
IN CONST CHAR8 *RedPath,
|
||||
OUT REDFISH_RESPONSE *RedResponse
|
||||
IN REDFISH_PAYLOAD Payload,
|
||||
IN CONST CHAR8 *RedPath,
|
||||
OUT REDFISH_RESPONSE *RedResponse
|
||||
)
|
||||
{
|
||||
if (Payload == NULL || RedPath == NULL || RedResponse == NULL) {
|
||||
if ((Payload == NULL) || (RedPath == NULL) || (RedResponse == NULL)) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
ZeroMem (RedResponse, sizeof (REDFISH_RESPONSE));
|
||||
|
||||
RedResponse->Payload = (REDFISH_PAYLOAD) getPayloadForPathString (Payload, RedPath, &(RedResponse->StatusCode));
|
||||
RedResponse->Payload = (REDFISH_PAYLOAD)getPayloadForPathString (Payload, RedPath, &(RedResponse->StatusCode));
|
||||
|
||||
//
|
||||
// 1. If the returned Payload is NULL, indicates any error happen.
|
||||
@@ -400,15 +411,17 @@ RedfishGetByPayload (
|
||||
// NOTE: If there is any error message returned from server, it will be returned in
|
||||
// Payload within RedResponse.
|
||||
//
|
||||
if (RedResponse->StatusCode != NULL && \
|
||||
(*(RedResponse->StatusCode) < HTTP_STATUS_200_OK || \
|
||||
*(RedResponse->StatusCode) > HTTP_STATUS_206_PARTIAL_CONTENT
|
||||
)) {
|
||||
if ((RedResponse->StatusCode != NULL) && \
|
||||
((*(RedResponse->StatusCode) < HTTP_STATUS_200_OK) || \
|
||||
(*(RedResponse->StatusCode) > HTTP_STATUS_206_PARTIAL_CONTENT)
|
||||
))
|
||||
{
|
||||
return EFI_DEVICE_ERROR;
|
||||
}
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
Use HTTP PATCH to perform updates on pre-existing Redfish resource.
|
||||
|
||||
@@ -442,30 +455,30 @@ RedfishGetByPayload (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
RedfishPatchToUri (
|
||||
IN REDFISH_SERVICE RedfishService,
|
||||
IN CONST CHAR8 *Uri,
|
||||
IN CONST CHAR8 *Content,
|
||||
OUT REDFISH_RESPONSE *RedResponse
|
||||
IN REDFISH_SERVICE RedfishService,
|
||||
IN CONST CHAR8 *Uri,
|
||||
IN CONST CHAR8 *Content,
|
||||
OUT REDFISH_RESPONSE *RedResponse
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EDKII_JSON_VALUE JsonValue;
|
||||
EFI_STATUS Status;
|
||||
EDKII_JSON_VALUE JsonValue;
|
||||
|
||||
Status = EFI_SUCCESS;
|
||||
JsonValue = NULL;
|
||||
|
||||
if (RedfishService == NULL || Uri == NULL || Content == NULL || RedResponse == NULL) {
|
||||
if ((RedfishService == NULL) || (Uri == NULL) || (Content == NULL) || (RedResponse == NULL)) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
ZeroMem (RedResponse, sizeof (REDFISH_RESPONSE));
|
||||
|
||||
JsonValue = (EDKII_JSON_VALUE) patchUriFromService (
|
||||
RedfishService,
|
||||
Uri,
|
||||
Content,
|
||||
&(RedResponse->StatusCode)
|
||||
);
|
||||
JsonValue = (EDKII_JSON_VALUE)patchUriFromService (
|
||||
RedfishService,
|
||||
Uri,
|
||||
Content,
|
||||
&(RedResponse->StatusCode)
|
||||
);
|
||||
|
||||
//
|
||||
// 1. If the returned StatusCode is NULL, indicates any error happen.
|
||||
@@ -480,8 +493,9 @@ RedfishPatchToUri (
|
||||
// NOTE: If there is any error message returned from server, it will be returned in
|
||||
// Payload within RedResponse.
|
||||
//
|
||||
if (*(RedResponse->StatusCode) < HTTP_STATUS_200_OK || \
|
||||
*(RedResponse->StatusCode) > HTTP_STATUS_206_PARTIAL_CONTENT) {
|
||||
if ((*(RedResponse->StatusCode) < HTTP_STATUS_200_OK) || \
|
||||
(*(RedResponse->StatusCode) > HTTP_STATUS_206_PARTIAL_CONTENT))
|
||||
{
|
||||
Status = EFI_DEVICE_ERROR;
|
||||
}
|
||||
|
||||
@@ -499,6 +513,7 @@ ON_EXIT:
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
/**
|
||||
Use HTTP PATCH to perform updates on target payload. Patch to odata.id in Payload directly.
|
||||
|
||||
@@ -530,22 +545,22 @@ ON_EXIT:
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
RedfishPatchToPayload (
|
||||
IN REDFISH_PAYLOAD Target,
|
||||
IN REDFISH_PAYLOAD Payload,
|
||||
OUT REDFISH_RESPONSE *RedResponse
|
||||
IN REDFISH_PAYLOAD Target,
|
||||
IN REDFISH_PAYLOAD Payload,
|
||||
OUT REDFISH_RESPONSE *RedResponse
|
||||
)
|
||||
{
|
||||
if (Target == NULL || Payload == NULL || RedResponse == NULL) {
|
||||
if ((Target == NULL) || (Payload == NULL) || (RedResponse == NULL)) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
ZeroMem (RedResponse, sizeof (REDFISH_RESPONSE));
|
||||
|
||||
RedResponse->Payload = (REDFISH_PAYLOAD) patchPayload (
|
||||
Target,
|
||||
Payload,
|
||||
&(RedResponse->StatusCode)
|
||||
);
|
||||
RedResponse->Payload = (REDFISH_PAYLOAD)patchPayload (
|
||||
Target,
|
||||
Payload,
|
||||
&(RedResponse->StatusCode)
|
||||
);
|
||||
|
||||
//
|
||||
// 1. If the returned StatusCode is NULL, indicates any error happen.
|
||||
@@ -559,13 +574,15 @@ RedfishPatchToPayload (
|
||||
// NOTE: If there is any error message returned from server, it will be returned in
|
||||
// Payload within RedResponse.
|
||||
//
|
||||
if (*(RedResponse->StatusCode) < HTTP_STATUS_200_OK || \
|
||||
*(RedResponse->StatusCode) > HTTP_STATUS_206_PARTIAL_CONTENT) {
|
||||
if ((*(RedResponse->StatusCode) < HTTP_STATUS_200_OK) || \
|
||||
(*(RedResponse->StatusCode) > HTTP_STATUS_206_PARTIAL_CONTENT))
|
||||
{
|
||||
return EFI_DEVICE_ERROR;
|
||||
}
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
Use HTTP POST to create a new resource in target payload.
|
||||
|
||||
@@ -596,22 +613,22 @@ RedfishPatchToPayload (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
RedfishPostToPayload (
|
||||
IN REDFISH_PAYLOAD Target,
|
||||
IN REDFISH_PAYLOAD Payload,
|
||||
OUT REDFISH_RESPONSE *RedResponse
|
||||
IN REDFISH_PAYLOAD Target,
|
||||
IN REDFISH_PAYLOAD Payload,
|
||||
OUT REDFISH_RESPONSE *RedResponse
|
||||
)
|
||||
{
|
||||
if (Target == NULL || Payload == NULL || RedResponse == NULL) {
|
||||
if ((Target == NULL) || (Payload == NULL) || (RedResponse == NULL)) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
ZeroMem (RedResponse, sizeof (REDFISH_RESPONSE));
|
||||
|
||||
RedResponse->Payload = (REDFISH_PAYLOAD) postPayload (
|
||||
Target,
|
||||
Payload,
|
||||
&(RedResponse->StatusCode)
|
||||
);
|
||||
RedResponse->Payload = (REDFISH_PAYLOAD)postPayload (
|
||||
Target,
|
||||
Payload,
|
||||
&(RedResponse->StatusCode)
|
||||
);
|
||||
|
||||
//
|
||||
// 1. If the returned StatusCode is NULL, indicates any error happen.
|
||||
@@ -625,13 +642,15 @@ RedfishPostToPayload (
|
||||
// NOTE: If there is any error message returned from server, it will be returned in
|
||||
// Payload within RedResponse.
|
||||
//
|
||||
if (*(RedResponse->StatusCode) < HTTP_STATUS_200_OK || \
|
||||
*(RedResponse->StatusCode) > HTTP_STATUS_206_PARTIAL_CONTENT) {
|
||||
if ((*(RedResponse->StatusCode) < HTTP_STATUS_200_OK) || \
|
||||
(*(RedResponse->StatusCode) > HTTP_STATUS_206_PARTIAL_CONTENT))
|
||||
{
|
||||
return EFI_DEVICE_ERROR;
|
||||
}
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
Use HTTP DELETE to remove a resource.
|
||||
|
||||
@@ -662,28 +681,28 @@ RedfishPostToPayload (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
RedfishDeleteByUri (
|
||||
IN REDFISH_SERVICE RedfishService,
|
||||
IN CONST CHAR8 *Uri,
|
||||
OUT REDFISH_RESPONSE *RedResponse
|
||||
IN REDFISH_SERVICE RedfishService,
|
||||
IN CONST CHAR8 *Uri,
|
||||
OUT REDFISH_RESPONSE *RedResponse
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EDKII_JSON_VALUE JsonValue;
|
||||
EFI_STATUS Status;
|
||||
EDKII_JSON_VALUE JsonValue;
|
||||
|
||||
Status = EFI_SUCCESS;
|
||||
JsonValue = NULL;
|
||||
|
||||
if (RedfishService == NULL || Uri == NULL || RedResponse == NULL) {
|
||||
if ((RedfishService == NULL) || (Uri == NULL) || (RedResponse == NULL)) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
ZeroMem (RedResponse, sizeof (REDFISH_RESPONSE));
|
||||
|
||||
JsonValue = (EDKII_JSON_VALUE) deleteUriFromService (
|
||||
RedfishService,
|
||||
Uri,
|
||||
&(RedResponse->StatusCode)
|
||||
);
|
||||
JsonValue = (EDKII_JSON_VALUE)deleteUriFromService (
|
||||
RedfishService,
|
||||
Uri,
|
||||
&(RedResponse->StatusCode)
|
||||
);
|
||||
|
||||
//
|
||||
// 1. If the returned StatusCode is NULL, indicates any error happen.
|
||||
@@ -698,8 +717,9 @@ RedfishDeleteByUri (
|
||||
// NOTE: If there is any error message returned from server, it will be returned in
|
||||
// Payload within RedResponse.
|
||||
//
|
||||
if (*(RedResponse->StatusCode) < HTTP_STATUS_200_OK || \
|
||||
*(RedResponse->StatusCode) > HTTP_STATUS_206_PARTIAL_CONTENT) {
|
||||
if ((*(RedResponse->StatusCode) < HTTP_STATUS_200_OK) || \
|
||||
(*(RedResponse->StatusCode) > HTTP_STATUS_206_PARTIAL_CONTENT))
|
||||
{
|
||||
Status = EFI_DEVICE_ERROR;
|
||||
}
|
||||
|
||||
@@ -717,6 +737,7 @@ ON_EXIT:
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
/**
|
||||
Dump text in fractions.
|
||||
|
||||
@@ -725,37 +746,40 @@ ON_EXIT:
|
||||
**/
|
||||
VOID
|
||||
RedfishDumpJsonStringFractions (
|
||||
IN CHAR8 *String
|
||||
IN CHAR8 *String
|
||||
)
|
||||
{
|
||||
CHAR8 *NextFraction;
|
||||
UINTN StringFractionSize;
|
||||
UINTN StrLen;
|
||||
UINTN Count;
|
||||
CHAR8 BackupChar;
|
||||
CHAR8 *NextFraction;
|
||||
UINTN StringFractionSize;
|
||||
UINTN StrLen;
|
||||
UINTN Count;
|
||||
CHAR8 BackupChar;
|
||||
|
||||
StringFractionSize = 200;
|
||||
if (String == NULL) {
|
||||
return ;
|
||||
return;
|
||||
}
|
||||
|
||||
DEBUG((DEBUG_INFO, "JSON text:\n"));
|
||||
DEBUG ((DEBUG_INFO, "JSON text:\n"));
|
||||
NextFraction = String;
|
||||
StrLen = AsciiStrLen (String);
|
||||
StrLen = AsciiStrLen (String);
|
||||
if (StrLen == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (Count = 0; Count < (StrLen / StringFractionSize); Count++) {
|
||||
BackupChar = *(NextFraction + StringFractionSize);
|
||||
BackupChar = *(NextFraction + StringFractionSize);
|
||||
*(NextFraction + StringFractionSize) = 0;
|
||||
DEBUG((DEBUG_INFO, "%a", NextFraction));
|
||||
DEBUG ((DEBUG_INFO, "%a", NextFraction));
|
||||
*(NextFraction + StringFractionSize) = BackupChar;
|
||||
NextFraction += StringFractionSize;
|
||||
NextFraction += StringFractionSize;
|
||||
}
|
||||
|
||||
if ((StrLen % StringFractionSize) != 0) {
|
||||
DEBUG((DEBUG_INFO, "%a\n\n", NextFraction));
|
||||
DEBUG ((DEBUG_INFO, "%a\n\n", NextFraction));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
Dump text in JSON value.
|
||||
|
||||
@@ -767,15 +791,17 @@ RedfishDumpJson (
|
||||
IN EDKII_JSON_VALUE JsonValue
|
||||
)
|
||||
{
|
||||
CHAR8 *String;
|
||||
CHAR8 *String;
|
||||
|
||||
String = JsonDumpString (JsonValue, 0);
|
||||
if (String == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
RedfishDumpJsonStringFractions (String);
|
||||
FreePool(String);
|
||||
FreePool (String);
|
||||
}
|
||||
|
||||
/**
|
||||
Extract the JSON text content from REDFISH_PAYLOAD and dump to debug console.
|
||||
|
||||
@@ -784,14 +810,14 @@ RedfishDumpJson (
|
||||
**/
|
||||
VOID
|
||||
RedfishDumpPayload (
|
||||
IN REDFISH_PAYLOAD Payload
|
||||
IN REDFISH_PAYLOAD Payload
|
||||
)
|
||||
{
|
||||
EDKII_JSON_VALUE JsonValue;
|
||||
CHAR8 *String;
|
||||
EDKII_JSON_VALUE JsonValue;
|
||||
CHAR8 *String;
|
||||
|
||||
JsonValue = NULL;
|
||||
String = NULL;
|
||||
String = NULL;
|
||||
|
||||
if (Payload == NULL) {
|
||||
return;
|
||||
@@ -808,8 +834,9 @@ RedfishDumpPayload (
|
||||
}
|
||||
|
||||
RedfishDumpJsonStringFractions (String);
|
||||
FreePool(String);
|
||||
FreePool (String);
|
||||
}
|
||||
|
||||
/**
|
||||
This function will cleanup the HTTP header and Redfish payload resources.
|
||||
|
||||
@@ -832,8 +859,8 @@ RedfishFreeResponse (
|
||||
StatusCode = NULL;
|
||||
}
|
||||
|
||||
if (HeaderCount != 0 && Headers != NULL) {
|
||||
HttpFreeHeaderFields(Headers, HeaderCount);
|
||||
if ((HeaderCount != 0) && (Headers != NULL)) {
|
||||
HttpFreeHeaderFields (Headers, HeaderCount);
|
||||
Headers = NULL;
|
||||
}
|
||||
|
||||
@@ -842,6 +869,7 @@ RedfishFreeResponse (
|
||||
Payload = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
Check if the "@odata.type" in Payload is valid or not.
|
||||
|
||||
@@ -855,17 +883,17 @@ RedfishFreeResponse (
|
||||
**/
|
||||
BOOLEAN
|
||||
RedfishIsValidOdataType (
|
||||
IN REDFISH_PAYLOAD Payload,
|
||||
IN CONST CHAR8 *OdataTypeName,
|
||||
IN REDFISH_ODATA_TYPE_MAPPING *OdataTypeMappingList,
|
||||
IN UINTN OdataTypeMappingListSize
|
||||
IN REDFISH_PAYLOAD Payload,
|
||||
IN CONST CHAR8 *OdataTypeName,
|
||||
IN REDFISH_ODATA_TYPE_MAPPING *OdataTypeMappingList,
|
||||
IN UINTN OdataTypeMappingListSize
|
||||
)
|
||||
{
|
||||
UINTN Index;
|
||||
EDKII_JSON_VALUE OdataType;
|
||||
EDKII_JSON_VALUE JsonValue;
|
||||
UINTN Index;
|
||||
EDKII_JSON_VALUE OdataType;
|
||||
EDKII_JSON_VALUE JsonValue;
|
||||
|
||||
if (Payload == NULL || OdataTypeName == NULL) {
|
||||
if ((Payload == NULL) || (OdataTypeName == NULL)) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
@@ -875,19 +903,22 @@ RedfishIsValidOdataType (
|
||||
}
|
||||
|
||||
OdataType = JsonObjectGetValue (JsonValueGetObject (JsonValue), "@odata.type");
|
||||
if (!JsonValueIsString (OdataType) || JsonValueGetAsciiString (OdataType) == NULL) {
|
||||
if (!JsonValueIsString (OdataType) || (JsonValueGetAsciiString (OdataType) == NULL)) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
for (Index = 0; Index < OdataTypeMappingListSize; Index ++) {
|
||||
if (AsciiStrCmp (OdataTypeMappingList[Index].OdataTypeName, OdataTypeName) == 0 &&
|
||||
AsciiStrCmp (OdataTypeMappingList[Index].OdataType, JsonValueGetAsciiString (OdataType)) == 0) {
|
||||
for (Index = 0; Index < OdataTypeMappingListSize; Index++) {
|
||||
if ((AsciiStrCmp (OdataTypeMappingList[Index].OdataTypeName, OdataTypeName) == 0) &&
|
||||
(AsciiStrCmp (OdataTypeMappingList[Index].OdataType, JsonValueGetAsciiString (OdataType)) == 0))
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
DEBUG ((DEBUG_INFO, "%a: This Odata type is not in the list.\n", __FUNCTION__));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/**
|
||||
Check if the payload is collection
|
||||
|
||||
@@ -898,11 +929,12 @@ RedfishIsValidOdataType (
|
||||
**/
|
||||
BOOLEAN
|
||||
RedfishIsPayloadCollection (
|
||||
IN REDFISH_PAYLOAD Payload
|
||||
)
|
||||
IN REDFISH_PAYLOAD Payload
|
||||
)
|
||||
{
|
||||
return isPayloadCollection (Payload);
|
||||
}
|
||||
|
||||
/**
|
||||
Get collection size.
|
||||
|
||||
@@ -913,21 +945,23 @@ RedfishIsPayloadCollection (
|
||||
@return EFI_INVALID_PARAMETER The payload is not a collection.
|
||||
**/
|
||||
EFI_STATUS
|
||||
RedfishGetCollectionSize(
|
||||
IN REDFISH_PAYLOAD Payload,
|
||||
IN UINTN *CollectionSize
|
||||
RedfishGetCollectionSize (
|
||||
IN REDFISH_PAYLOAD Payload,
|
||||
IN UINTN *CollectionSize
|
||||
)
|
||||
{
|
||||
if (Payload == NULL || CollectionSize == NULL) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
if (!RedfishIsPayloadCollection(Payload)) {
|
||||
if ((Payload == NULL) || (CollectionSize == NULL)) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
*CollectionSize = (UINTN)getCollectionSize(Payload);
|
||||
if (!RedfishIsPayloadCollection (Payload)) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
*CollectionSize = (UINTN)getCollectionSize (Payload);
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
Get Redfish payload of collection member
|
||||
|
||||
@@ -939,20 +973,23 @@ RedfishGetCollectionSize(
|
||||
**/
|
||||
REDFISH_PAYLOAD
|
||||
RedfishGetPayloadByIndex (
|
||||
IN REDFISH_PAYLOAD Payload,
|
||||
IN UINTN Index
|
||||
)
|
||||
IN REDFISH_PAYLOAD Payload,
|
||||
IN UINTN Index
|
||||
)
|
||||
{
|
||||
REDFISH_RESPONSE RedfishResponse;
|
||||
REDFISH_PAYLOAD PayloadReturn;
|
||||
REDFISH_RESPONSE RedfishResponse;
|
||||
REDFISH_PAYLOAD PayloadReturn;
|
||||
|
||||
PayloadReturn = (VOID *)getPayloadByIndex (Payload, Index, &RedfishResponse.StatusCode);
|
||||
if(PayloadReturn == NULL ||
|
||||
(*(RedfishResponse.StatusCode) < HTTP_STATUS_200_OK && *(RedfishResponse.StatusCode) > HTTP_STATUS_206_PARTIAL_CONTENT)){
|
||||
if ((PayloadReturn == NULL) ||
|
||||
((*(RedfishResponse.StatusCode) < HTTP_STATUS_200_OK) && (*(RedfishResponse.StatusCode) > HTTP_STATUS_206_PARTIAL_CONTENT)))
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return PayloadReturn;
|
||||
}
|
||||
|
||||
/**
|
||||
Check and return Redfish resource of the given Redpath.
|
||||
|
||||
@@ -964,30 +1001,33 @@ RedfishGetPayloadByIndex (
|
||||
**/
|
||||
EFI_STATUS
|
||||
RedfishCheckIfRedpathExist (
|
||||
IN REDFISH_SERVICE RedfishService,
|
||||
IN CHAR8 *Redpath,
|
||||
IN REDFISH_RESPONSE *Response OPTIONAL
|
||||
IN REDFISH_SERVICE RedfishService,
|
||||
IN CHAR8 *Redpath,
|
||||
IN REDFISH_RESPONSE *Response OPTIONAL
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
REDFISH_RESPONSE TempResponse;
|
||||
EFI_STATUS Status;
|
||||
REDFISH_RESPONSE TempResponse;
|
||||
|
||||
if (Redpath == NULL) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
Status = RedfishGetByService (RedfishService, Redpath, &TempResponse);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
if (Response == NULL) {
|
||||
RedfishFreeResponse(
|
||||
RedfishFreeResponse (
|
||||
TempResponse.StatusCode,
|
||||
TempResponse.HeaderCount,
|
||||
TempResponse.Headers,
|
||||
TempResponse.Payload
|
||||
);
|
||||
);
|
||||
} else {
|
||||
CopyMem ((VOID *)Response, (VOID *)&TempResponse, sizeof (REDFISH_RESPONSE));
|
||||
}
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
@@ -10,7 +10,7 @@
|
||||
|
||||
#include "RedfishMisc.h"
|
||||
|
||||
EDKII_REDFISH_CREDENTIAL_PROTOCOL *mCredentialProtocol = NULL;
|
||||
EDKII_REDFISH_CREDENTIAL_PROTOCOL *mCredentialProtocol = NULL;
|
||||
|
||||
/**
|
||||
This function returns the string of Redfish service version.
|
||||
@@ -23,25 +23,28 @@ EDKII_REDFISH_CREDENTIAL_PROTOCOL *mCredentialProtocol = NULL;
|
||||
**/
|
||||
EFI_STATUS
|
||||
RedfishGetServiceVersion (
|
||||
IN REDFISH_SERVICE RedfishService,
|
||||
OUT CHAR8 **ServiceVersionStr
|
||||
IN REDFISH_SERVICE RedfishService,
|
||||
OUT CHAR8 **ServiceVersionStr
|
||||
)
|
||||
{
|
||||
redfishService *Redfish;
|
||||
CHAR8 **KeysArray;
|
||||
UINTN KeysNum;
|
||||
redfishService *Redfish;
|
||||
CHAR8 **KeysArray;
|
||||
UINTN KeysNum;
|
||||
|
||||
if (RedfishService == NULL || ServiceVersionStr == NULL) {
|
||||
if ((RedfishService == NULL) || (ServiceVersionStr == NULL)) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
Redfish = (redfishService *)RedfishService;
|
||||
if (Redfish->versions == NULL) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
KeysArray = JsonObjectGetKeys (Redfish->versions, &KeysNum);
|
||||
if (KeysNum == 0 || KeysArray == NULL) {
|
||||
if ((KeysNum == 0) || (KeysArray == NULL)) {
|
||||
return EFI_NOT_FOUND;
|
||||
}
|
||||
|
||||
*ServiceVersionStr = *KeysArray;
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
@@ -65,18 +68,17 @@ RedfishGetServiceVersion (
|
||||
**/
|
||||
REDFISH_SERVICE
|
||||
RedfishCreateLibredfishService (
|
||||
IN REDFISH_CONFIG_SERVICE_INFORMATION *RedfishConfigServiceInfo,
|
||||
IN EDKII_REDFISH_AUTH_METHOD AuthMethod,
|
||||
IN CHAR8 *UserId,
|
||||
IN CHAR8 *Password
|
||||
IN REDFISH_CONFIG_SERVICE_INFORMATION *RedfishConfigServiceInfo,
|
||||
IN EDKII_REDFISH_AUTH_METHOD AuthMethod,
|
||||
IN CHAR8 *UserId,
|
||||
IN CHAR8 *Password
|
||||
)
|
||||
{
|
||||
UINTN Flags;
|
||||
enumeratorAuthentication Auth;
|
||||
redfishService *Redfish;
|
||||
|
||||
UINTN Flags;
|
||||
enumeratorAuthentication Auth;
|
||||
redfishService* Redfish;
|
||||
|
||||
Redfish = NULL;
|
||||
Redfish = NULL;
|
||||
|
||||
ZeroMem (&Auth, sizeof (Auth));
|
||||
if (AuthMethod == AuthMethodHttpBasic) {
|
||||
@@ -84,25 +86,26 @@ RedfishCreateLibredfishService (
|
||||
} else if (AuthMethod == AuthMethodRedfishSession) {
|
||||
Auth.authType = REDFISH_AUTH_SESSION;
|
||||
}
|
||||
|
||||
Auth.authCodes.userPass.username = UserId;
|
||||
Auth.authCodes.userPass.password = Password;
|
||||
|
||||
Flags = REDFISH_FLAG_SERVICE_NO_VERSION_DOC;
|
||||
|
||||
if (AuthMethod != AuthMethodNone) {
|
||||
Redfish = createServiceEnumerator(RedfishConfigServiceInfo, NULL, &Auth, (unsigned int ) Flags);
|
||||
Redfish = createServiceEnumerator (RedfishConfigServiceInfo, NULL, &Auth, (unsigned int)Flags);
|
||||
} else {
|
||||
Redfish = createServiceEnumerator(RedfishConfigServiceInfo, NULL, NULL, (unsigned int) Flags);
|
||||
Redfish = createServiceEnumerator (RedfishConfigServiceInfo, NULL, NULL, (unsigned int)Flags);
|
||||
}
|
||||
|
||||
//
|
||||
// Zero the Password after use.
|
||||
//
|
||||
if (Password != NULL) {
|
||||
ZeroMem (Password, AsciiStrLen(Password));
|
||||
ZeroMem (Password, AsciiStrLen (Password));
|
||||
}
|
||||
|
||||
return (REDFISH_SERVICE) Redfish;
|
||||
return (REDFISH_SERVICE)Redfish;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -130,14 +133,14 @@ RedfishCreateLibredfishService (
|
||||
**/
|
||||
EFI_STATUS
|
||||
RedfishGetAuthInfo (
|
||||
OUT EDKII_REDFISH_AUTH_METHOD *AuthMethod,
|
||||
OUT CHAR8 **UserId,
|
||||
OUT CHAR8 **Password
|
||||
OUT EDKII_REDFISH_AUTH_METHOD *AuthMethod,
|
||||
OUT CHAR8 **UserId,
|
||||
OUT CHAR8 **Password
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_STATUS Status;
|
||||
|
||||
if (AuthMethod == NULL || UserId == NULL || Password == NULL) {
|
||||
if ((AuthMethod == NULL) || (UserId == NULL) || (Password == NULL)) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
@@ -161,6 +164,7 @@ RedfishGetAuthInfo (
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
/**
|
||||
This function returns the string of Redfish service version.
|
||||
|
||||
@@ -175,15 +179,15 @@ RedfishGetAuthInfo (
|
||||
**/
|
||||
EFI_STATUS
|
||||
RedfishBuildRedpathUseId (
|
||||
IN CHAR8 *ServiceVerisonStr,
|
||||
IN CHAR8 *Url,
|
||||
IN CHAR8 *Id,
|
||||
OUT CHAR8 **Redpath
|
||||
IN CHAR8 *ServiceVerisonStr,
|
||||
IN CHAR8 *Url,
|
||||
IN CHAR8 *Id,
|
||||
OUT CHAR8 **Redpath
|
||||
)
|
||||
{
|
||||
UINTN RedpathSize;
|
||||
UINTN RedpathSize;
|
||||
|
||||
if (Redpath == NULL || ServiceVerisonStr == NULL || Url == NULL || Id == NULL) {
|
||||
if ((Redpath == NULL) || (ServiceVerisonStr == NULL) || (Url == NULL) || (Id == NULL)) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
@@ -192,10 +196,11 @@ RedfishBuildRedpathUseId (
|
||||
AsciiStrLen (Url) +
|
||||
AsciiStrLen ("[Id=]") +
|
||||
AsciiStrLen (Id) + 1;
|
||||
*Redpath = AllocatePool(RedpathSize);
|
||||
*Redpath = AllocatePool (RedpathSize);
|
||||
if (*Redpath == NULL) {
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
|
||||
AsciiSPrint (*Redpath, RedpathSize, "/%a%a[Id=%a]", ServiceVerisonStr, Url, Id);
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
@@ -22,7 +22,7 @@
|
||||
#include <Protocol/EdkIIRedfishCredential.h>
|
||||
#include <redfish.h>
|
||||
|
||||
#define ARRAY_SIZE(Array) (sizeof (Array) / sizeof ((Array)[0]))
|
||||
#define ARRAY_SIZE(Array) (sizeof (Array) / sizeof ((Array)[0]))
|
||||
|
||||
/**
|
||||
Creates a REDFISH_SERVICE which can be later used to access the Redfish resources.
|
||||
@@ -43,10 +43,10 @@
|
||||
**/
|
||||
REDFISH_SERVICE
|
||||
RedfishCreateLibredfishService (
|
||||
IN REDFISH_CONFIG_SERVICE_INFORMATION *RedfishConfigServiceInfo,
|
||||
IN EDKII_REDFISH_AUTH_METHOD AuthMethod,
|
||||
IN CHAR8 *UserId,
|
||||
IN CHAR8 *Password
|
||||
IN REDFISH_CONFIG_SERVICE_INFORMATION *RedfishConfigServiceInfo,
|
||||
IN EDKII_REDFISH_AUTH_METHOD AuthMethod,
|
||||
IN CHAR8 *UserId,
|
||||
IN CHAR8 *Password
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -74,9 +74,9 @@ RedfishCreateLibredfishService (
|
||||
**/
|
||||
EFI_STATUS
|
||||
RedfishGetAuthInfo (
|
||||
OUT EDKII_REDFISH_AUTH_METHOD *AuthMethod,
|
||||
OUT CHAR8 **UserId,
|
||||
OUT CHAR8 **Password
|
||||
OUT EDKII_REDFISH_AUTH_METHOD *AuthMethod,
|
||||
OUT CHAR8 **UserId,
|
||||
OUT CHAR8 **Password
|
||||
);
|
||||
|
||||
#endif
|
||||
|
@@ -14,6 +14,7 @@
|
||||
SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
|
||||
**/
|
||||
|
||||
#ifndef LIBREDFISH_REDFISH_H_
|
||||
#define LIBREDFISH_REDFISH_H_
|
||||
|
||||
|
@@ -14,6 +14,7 @@
|
||||
SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
|
||||
**/
|
||||
|
||||
#ifndef LIBREDFISH_REDFISH_PAYLOAD_H_
|
||||
#define LIBREDFISH_REDFISH_PAYLOAD_H_
|
||||
|
||||
@@ -23,17 +24,83 @@
|
||||
#include <redfishService.h>
|
||||
#include <redpath.h>
|
||||
|
||||
redfishPayload* createRedfishPayload(json_t* value, redfishService* service);
|
||||
redfishPayload* getPayloadByNodeName(redfishPayload* payload, const char* nodeName, EFI_HTTP_STATUS_CODE** StatusCode);
|
||||
redfishPayload* getPayloadByIndex(redfishPayload* payload, size_t index, EFI_HTTP_STATUS_CODE** StatusCode);
|
||||
redfishPayload* getPayloadForPath(redfishPayload* payload, redPathNode* redpath, EFI_HTTP_STATUS_CODE** StatusCode);
|
||||
redfishPayload* getPayloadForPathString(redfishPayload* payload, const char* string, EFI_HTTP_STATUS_CODE** StatusCode);
|
||||
redfishPayload* patchPayload(redfishPayload* target, redfishPayload* payload, EFI_HTTP_STATUS_CODE** StatusCode);
|
||||
redfishPayload* postContentToPayload(redfishPayload* target, const char* data, size_t dataSize, const char* contentType, EFI_HTTP_STATUS_CODE** StatusCode);
|
||||
redfishPayload* postPayload(redfishPayload* target, redfishPayload* payload, EFI_HTTP_STATUS_CODE** StatusCode);
|
||||
void cleanupPayload(redfishPayload* payload);
|
||||
bool isPayloadCollection (redfishPayload *Payload);
|
||||
size_t getCollectionSize(redfishPayload* payload);
|
||||
redfishPayload* getPayloadByIndex (redfishPayload* payload, size_t index, EFI_HTTP_STATUS_CODE** StatusCode);
|
||||
redfishPayload *
|
||||
createRedfishPayload (
|
||||
json_t *value,
|
||||
redfishService *service
|
||||
);
|
||||
|
||||
redfishPayload *
|
||||
getPayloadByNodeName (
|
||||
redfishPayload *payload,
|
||||
const char *nodeName,
|
||||
EFI_HTTP_STATUS_CODE **StatusCode
|
||||
);
|
||||
|
||||
redfishPayload *
|
||||
getPayloadByIndex (
|
||||
redfishPayload *payload,
|
||||
size_t index,
|
||||
EFI_HTTP_STATUS_CODE **StatusCode
|
||||
);
|
||||
|
||||
redfishPayload *
|
||||
getPayloadForPath (
|
||||
redfishPayload *payload,
|
||||
redPathNode *redpath,
|
||||
EFI_HTTP_STATUS_CODE **StatusCode
|
||||
);
|
||||
|
||||
redfishPayload *
|
||||
getPayloadForPathString (
|
||||
redfishPayload *payload,
|
||||
const char *string,
|
||||
EFI_HTTP_STATUS_CODE **StatusCode
|
||||
);
|
||||
|
||||
redfishPayload *
|
||||
patchPayload (
|
||||
redfishPayload *target,
|
||||
redfishPayload *payload,
|
||||
EFI_HTTP_STATUS_CODE **StatusCode
|
||||
);
|
||||
|
||||
redfishPayload *
|
||||
postContentToPayload (
|
||||
redfishPayload *target,
|
||||
const char *data,
|
||||
size_t dataSize,
|
||||
const char *contentType,
|
||||
EFI_HTTP_STATUS_CODE **StatusCode
|
||||
);
|
||||
|
||||
redfishPayload *
|
||||
postPayload (
|
||||
redfishPayload *target,
|
||||
redfishPayload *payload,
|
||||
EFI_HTTP_STATUS_CODE **StatusCode
|
||||
);
|
||||
|
||||
void
|
||||
cleanupPayload (
|
||||
redfishPayload *payload
|
||||
);
|
||||
|
||||
bool
|
||||
isPayloadCollection (
|
||||
redfishPayload *Payload
|
||||
);
|
||||
|
||||
size_t
|
||||
getCollectionSize (
|
||||
redfishPayload *payload
|
||||
);
|
||||
|
||||
redfishPayload *
|
||||
getPayloadByIndex (
|
||||
redfishPayload *payload,
|
||||
size_t index,
|
||||
EFI_HTTP_STATUS_CODE **StatusCode
|
||||
);
|
||||
|
||||
#endif
|
||||
|
@@ -38,64 +38,114 @@
|
||||
#include <jansson.h>
|
||||
|
||||
typedef struct {
|
||||
char* host;
|
||||
json_t* versions;
|
||||
unsigned int flags;
|
||||
char* sessionToken;
|
||||
char* basicAuthStr;
|
||||
//
|
||||
// point to the <HOST> part in above "host" field, which will be put into
|
||||
// the "Host" header of HTTP request message.
|
||||
//
|
||||
char* HostHeaderValue;
|
||||
EFI_REST_EX_PROTOCOL *RestEx;
|
||||
char *host;
|
||||
json_t *versions;
|
||||
unsigned int flags;
|
||||
char *sessionToken;
|
||||
char *basicAuthStr;
|
||||
//
|
||||
// point to the <HOST> part in above "host" field, which will be put into
|
||||
// the "Host" header of HTTP request message.
|
||||
//
|
||||
char *HostHeaderValue;
|
||||
EFI_REST_EX_PROTOCOL *RestEx;
|
||||
} redfishService;
|
||||
|
||||
typedef struct {
|
||||
json_t* json;
|
||||
redfishService* service;
|
||||
json_t *json;
|
||||
redfishService *service;
|
||||
} redfishPayload;
|
||||
|
||||
#define REDFISH_AUTH_BASIC 0
|
||||
#define REDFISH_AUTH_BEARER_TOKEN 1
|
||||
#define REDFISH_AUTH_SESSION 2
|
||||
#define REDFISH_AUTH_BASIC 0
|
||||
#define REDFISH_AUTH_BEARER_TOKEN 1
|
||||
#define REDFISH_AUTH_SESSION 2
|
||||
|
||||
#define REDFISH_HTTP_RESPONSE_TIMEOUT 5000 /// 5 seconds in uints of millisecond.
|
||||
#define REDFISH_HTTP_RESPONSE_TIMEOUT 5000 /// 5 seconds in uints of millisecond.
|
||||
|
||||
///
|
||||
/// Library class public defines
|
||||
///
|
||||
#define HTTP_FLAG L"http://"
|
||||
#define HTTPS_FLAG L"https://"
|
||||
#define HTTP_FLAG L"http://"
|
||||
#define HTTPS_FLAG L"https://"
|
||||
|
||||
///
|
||||
/// The redfish first URL should be "/redfish/v1/", while we use "/redfish/v1" here without "/"
|
||||
/// in the end is to avoid the 301 Perment redirect response from Redfish profile simulator.
|
||||
///
|
||||
#define REDFISH_FIRST_URL L"/redfish/v1"
|
||||
#define REDFISH_FIRST_URL L"/redfish/v1"
|
||||
|
||||
typedef struct {
|
||||
unsigned int authType;
|
||||
union {
|
||||
struct {
|
||||
char* username;
|
||||
char* password;
|
||||
} userPass;
|
||||
struct {
|
||||
char* token;
|
||||
} authToken;
|
||||
} authCodes;
|
||||
unsigned int authType;
|
||||
union {
|
||||
struct {
|
||||
char *username;
|
||||
char *password;
|
||||
} userPass;
|
||||
struct {
|
||||
char *token;
|
||||
} authToken;
|
||||
} authCodes;
|
||||
} enumeratorAuthentication;
|
||||
|
||||
//Values for flags
|
||||
#define REDFISH_FLAG_SERVICE_NO_VERSION_DOC 0x00000001 //The Redfish Service lacks the version document (in violation of the Redfish spec)
|
||||
redfishService* createServiceEnumerator(REDFISH_CONFIG_SERVICE_INFORMATION *RedfishConfigServiceInfo, const char* rootUri, enumeratorAuthentication* auth, unsigned int flags);
|
||||
json_t* getUriFromService(redfishService* service, const char* uri, EFI_HTTP_STATUS_CODE** StatusCode);
|
||||
json_t* patchUriFromService(redfishService* service, const char* uri, const char* content, EFI_HTTP_STATUS_CODE** StatusCode);
|
||||
json_t* postUriFromService(redfishService* service, const char* uri, const char* content, size_t contentLength, const char* contentType, EFI_HTTP_STATUS_CODE** StatusCode);
|
||||
json_t* deleteUriFromService(redfishService* service, const char* uri, EFI_HTTP_STATUS_CODE** StatusCode);
|
||||
redfishPayload* getRedfishServiceRoot(redfishService* service, const char* version, EFI_HTTP_STATUS_CODE** StatusCode);
|
||||
redfishPayload* getPayloadByPath(redfishService* service, const char* path, EFI_HTTP_STATUS_CODE** StatusCode);
|
||||
void cleanupServiceEnumerator(redfishService* service);
|
||||
// Values for flags
|
||||
#define REDFISH_FLAG_SERVICE_NO_VERSION_DOC 0x00000001// The Redfish Service lacks the version document (in violation of the Redfish spec)
|
||||
redfishService *
|
||||
createServiceEnumerator (
|
||||
REDFISH_CONFIG_SERVICE_INFORMATION *RedfishConfigServiceInfo,
|
||||
const char *rootUri,
|
||||
enumeratorAuthentication *auth,
|
||||
unsigned int flags
|
||||
);
|
||||
|
||||
json_t *
|
||||
getUriFromService (
|
||||
redfishService *service,
|
||||
const char *uri,
|
||||
EFI_HTTP_STATUS_CODE **StatusCode
|
||||
);
|
||||
|
||||
json_t *
|
||||
patchUriFromService (
|
||||
redfishService *service,
|
||||
const char *uri,
|
||||
const char *content,
|
||||
EFI_HTTP_STATUS_CODE **StatusCode
|
||||
);
|
||||
|
||||
json_t *
|
||||
postUriFromService (
|
||||
redfishService *service,
|
||||
const char *uri,
|
||||
const char *content,
|
||||
size_t contentLength,
|
||||
const char *contentType,
|
||||
EFI_HTTP_STATUS_CODE **StatusCode
|
||||
);
|
||||
|
||||
json_t *
|
||||
deleteUriFromService (
|
||||
redfishService *service,
|
||||
const char *uri,
|
||||
EFI_HTTP_STATUS_CODE **StatusCode
|
||||
);
|
||||
|
||||
redfishPayload *
|
||||
getRedfishServiceRoot (
|
||||
redfishService *service,
|
||||
const char *version,
|
||||
EFI_HTTP_STATUS_CODE **StatusCode
|
||||
);
|
||||
|
||||
redfishPayload *
|
||||
getPayloadByPath (
|
||||
redfishService *service,
|
||||
const char *path,
|
||||
EFI_HTTP_STATUS_CODE **StatusCode
|
||||
);
|
||||
|
||||
void
|
||||
cleanupServiceEnumerator (
|
||||
redfishService *service
|
||||
);
|
||||
|
||||
#endif
|
||||
|
@@ -14,6 +14,7 @@
|
||||
SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
|
||||
**/
|
||||
|
||||
#ifndef LIBREDFISH_REDPATH_H_
|
||||
#define LIBREDFISH_REDPATH_H_
|
||||
|
||||
@@ -21,22 +22,28 @@
|
||||
|
||||
#include <jansson.h>
|
||||
|
||||
typedef struct _redPathNode
|
||||
{
|
||||
bool isRoot;
|
||||
bool isIndex;
|
||||
typedef struct _redPathNode {
|
||||
bool isRoot;
|
||||
bool isIndex;
|
||||
|
||||
char* version;
|
||||
char* nodeName;
|
||||
size_t index;
|
||||
char* op;
|
||||
char* propName;
|
||||
char* value;
|
||||
char *version;
|
||||
char *nodeName;
|
||||
size_t index;
|
||||
char *op;
|
||||
char *propName;
|
||||
char *value;
|
||||
|
||||
struct _redPathNode* next;
|
||||
struct _redPathNode *next;
|
||||
} redPathNode;
|
||||
|
||||
redPathNode* parseRedPath(const char* path);
|
||||
void cleanupRedPath(redPathNode* node);
|
||||
redPathNode *
|
||||
parseRedPath (
|
||||
const char *path
|
||||
);
|
||||
|
||||
void
|
||||
cleanupRedPath (
|
||||
redPathNode *node
|
||||
);
|
||||
|
||||
#endif
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -16,177 +16,209 @@
|
||||
**/
|
||||
#include <redpath.h>
|
||||
|
||||
static char* getVersion(const char* path, char** end);
|
||||
static void parseNode(const char* path, redPathNode* node, redPathNode** end);
|
||||
static char *
|
||||
getVersion (
|
||||
const char *path,
|
||||
char **end
|
||||
);
|
||||
|
||||
static char* getStringTill(const char* string, const char* terminator, char** retEnd);
|
||||
static void
|
||||
parseNode (
|
||||
const char *path,
|
||||
redPathNode *node,
|
||||
redPathNode **end
|
||||
);
|
||||
|
||||
redPathNode* parseRedPath(const char* path)
|
||||
static char *
|
||||
getStringTill (
|
||||
const char *string,
|
||||
const char *terminator,
|
||||
char **retEnd
|
||||
);
|
||||
|
||||
redPathNode *
|
||||
parseRedPath (
|
||||
const char *path
|
||||
)
|
||||
{
|
||||
redPathNode* node;
|
||||
redPathNode* endNode;
|
||||
char* curPath;
|
||||
char* end;
|
||||
redPathNode *node;
|
||||
redPathNode *endNode;
|
||||
char *curPath;
|
||||
char *end;
|
||||
|
||||
if(!path || strlen(path) == 0)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
if (!path || (strlen (path) == 0)) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
node = (redPathNode*)calloc(1, sizeof(redPathNode));
|
||||
if(!node)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
if(path[0] == '/')
|
||||
{
|
||||
node->isRoot = true;
|
||||
if(path[1] == 'v')
|
||||
{
|
||||
node->version = getVersion(path+1, &curPath);
|
||||
if(curPath == NULL)
|
||||
{
|
||||
return node;
|
||||
}
|
||||
if(curPath[0] == '/')
|
||||
{
|
||||
curPath++;
|
||||
}
|
||||
node->next = parseRedPath(curPath);
|
||||
}
|
||||
else
|
||||
{
|
||||
node->next = parseRedPath(path+1);
|
||||
}
|
||||
node = (redPathNode *)calloc (1, sizeof (redPathNode));
|
||||
if (!node) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (path[0] == '/') {
|
||||
node->isRoot = true;
|
||||
if (path[1] == 'v') {
|
||||
node->version = getVersion (path+1, &curPath);
|
||||
if (curPath == NULL) {
|
||||
return node;
|
||||
}
|
||||
|
||||
if (curPath[0] == '/') {
|
||||
curPath++;
|
||||
}
|
||||
|
||||
node->next = parseRedPath (curPath);
|
||||
} else {
|
||||
node->next = parseRedPath (path+1);
|
||||
}
|
||||
node->isRoot = false;
|
||||
curPath = getStringTill(path, "/", &end);
|
||||
endNode = node;
|
||||
parseNode(curPath, node, &endNode);
|
||||
free(curPath);
|
||||
if(end != NULL)
|
||||
{
|
||||
endNode->next = parseRedPath(end+1);
|
||||
}
|
||||
|
||||
return node;
|
||||
}
|
||||
|
||||
node->isRoot = false;
|
||||
curPath = getStringTill (path, "/", &end);
|
||||
endNode = node;
|
||||
parseNode (curPath, node, &endNode);
|
||||
free (curPath);
|
||||
if (end != NULL) {
|
||||
endNode->next = parseRedPath (end+1);
|
||||
}
|
||||
|
||||
return node;
|
||||
}
|
||||
|
||||
void cleanupRedPath(redPathNode* node)
|
||||
void
|
||||
cleanupRedPath (
|
||||
redPathNode *node
|
||||
)
|
||||
{
|
||||
if(!node)
|
||||
{
|
||||
return;
|
||||
}
|
||||
cleanupRedPath(node->next);
|
||||
node->next = NULL;
|
||||
if(node->version)
|
||||
{
|
||||
free(node->version);
|
||||
}
|
||||
if(node->nodeName)
|
||||
{
|
||||
free(node->nodeName);
|
||||
}
|
||||
if(node->op)
|
||||
{
|
||||
free(node->op);
|
||||
}
|
||||
if(node->propName)
|
||||
{
|
||||
free(node->propName);
|
||||
}
|
||||
if(node->value)
|
||||
{
|
||||
free(node->value);
|
||||
}
|
||||
free(node);
|
||||
if (!node) {
|
||||
return;
|
||||
}
|
||||
|
||||
cleanupRedPath (node->next);
|
||||
node->next = NULL;
|
||||
if (node->version) {
|
||||
free (node->version);
|
||||
}
|
||||
|
||||
if (node->nodeName) {
|
||||
free (node->nodeName);
|
||||
}
|
||||
|
||||
if (node->op) {
|
||||
free (node->op);
|
||||
}
|
||||
|
||||
if (node->propName) {
|
||||
free (node->propName);
|
||||
}
|
||||
|
||||
if (node->value) {
|
||||
free (node->value);
|
||||
}
|
||||
|
||||
free (node);
|
||||
}
|
||||
|
||||
static char* getVersion(const char* path, char** end)
|
||||
static char *
|
||||
getVersion (
|
||||
const char *path,
|
||||
char **end
|
||||
)
|
||||
{
|
||||
return getStringTill(path, "/", end);
|
||||
return getStringTill (path, "/", end);
|
||||
}
|
||||
|
||||
static void parseNode(const char* path, redPathNode* node, redPathNode** end)
|
||||
static void
|
||||
parseNode (
|
||||
const char *path,
|
||||
redPathNode *node,
|
||||
redPathNode **end
|
||||
)
|
||||
{
|
||||
char* indexStart;
|
||||
char* index;
|
||||
char* indexEnd;
|
||||
char* nodeName = getStringTill(path, "[", &indexStart);
|
||||
size_t tmpIndex;
|
||||
char* opChars;
|
||||
char *indexStart;
|
||||
char *index;
|
||||
char *indexEnd;
|
||||
char *nodeName = getStringTill (path, "[", &indexStart);
|
||||
size_t tmpIndex;
|
||||
char *opChars;
|
||||
|
||||
node->nodeName = nodeName;
|
||||
if(indexStart == NULL)
|
||||
{
|
||||
*end = node;
|
||||
return;
|
||||
}
|
||||
node->next = (redPathNode*)calloc(1, sizeof(redPathNode));
|
||||
if(!node->next)
|
||||
{
|
||||
return;
|
||||
}
|
||||
//Skip past [
|
||||
indexStart++;
|
||||
*end = node->next;
|
||||
index = getStringTill(indexStart, "]", NULL);
|
||||
tmpIndex = (size_t)strtoull(index, &indexEnd, 0);
|
||||
if(indexEnd != index)
|
||||
{
|
||||
free(index);
|
||||
node->next->index = tmpIndex;
|
||||
node->next->isIndex = true;
|
||||
return;
|
||||
}
|
||||
opChars = strpbrk(index, "<>=~");
|
||||
if(opChars == NULL)
|
||||
{
|
||||
//TODO handle last() and position()
|
||||
node->next->op = strdup("exists");
|
||||
node->next->propName = index;
|
||||
return;
|
||||
}
|
||||
node->next->propName = (char*)malloc((opChars - index)+1);
|
||||
memcpy(node->next->propName, index, (opChars - index));
|
||||
node->next->propName[(opChars - index)] = 0;
|
||||
node->nodeName = nodeName;
|
||||
if (indexStart == NULL) {
|
||||
*end = node;
|
||||
return;
|
||||
}
|
||||
|
||||
tmpIndex = 1;
|
||||
while(1)
|
||||
{
|
||||
if(opChars[tmpIndex] == '=' || opChars[tmpIndex] == '<' || opChars[tmpIndex] == '>' || opChars[tmpIndex] == '~')
|
||||
{
|
||||
tmpIndex++;
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
node->next = (redPathNode *)calloc (1, sizeof (redPathNode));
|
||||
if (!node->next) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Skip past [
|
||||
indexStart++;
|
||||
*end = node->next;
|
||||
index = getStringTill (indexStart, "]", NULL);
|
||||
tmpIndex = (size_t)strtoull (index, &indexEnd, 0);
|
||||
if (indexEnd != index) {
|
||||
free (index);
|
||||
node->next->index = tmpIndex;
|
||||
node->next->isIndex = true;
|
||||
return;
|
||||
}
|
||||
|
||||
opChars = strpbrk (index, "<>=~");
|
||||
if (opChars == NULL) {
|
||||
// TODO handle last() and position()
|
||||
node->next->op = strdup ("exists");
|
||||
node->next->propName = index;
|
||||
return;
|
||||
}
|
||||
|
||||
node->next->propName = (char *)malloc ((opChars - index)+1);
|
||||
memcpy (node->next->propName, index, (opChars - index));
|
||||
node->next->propName[(opChars - index)] = 0;
|
||||
|
||||
tmpIndex = 1;
|
||||
while (1) {
|
||||
if ((opChars[tmpIndex] == '=') || (opChars[tmpIndex] == '<') || (opChars[tmpIndex] == '>') || (opChars[tmpIndex] == '~')) {
|
||||
tmpIndex++;
|
||||
continue;
|
||||
}
|
||||
|
||||
node->next->op = (char*)malloc(tmpIndex+1);
|
||||
memcpy(node->next->op, opChars, tmpIndex);
|
||||
node->next->op[tmpIndex] = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
node->next->value = strdup(opChars+tmpIndex);
|
||||
free(index);
|
||||
node->next->op = (char *)malloc (tmpIndex+1);
|
||||
memcpy (node->next->op, opChars, tmpIndex);
|
||||
node->next->op[tmpIndex] = 0;
|
||||
|
||||
node->next->value = strdup (opChars+tmpIndex);
|
||||
free (index);
|
||||
}
|
||||
|
||||
static char* getStringTill(const char* string, const char* terminator, char** retEnd)
|
||||
static char *
|
||||
getStringTill (
|
||||
const char *string,
|
||||
const char *terminator,
|
||||
char **retEnd
|
||||
)
|
||||
{
|
||||
char* ret;
|
||||
char* end;
|
||||
end = strstr((char*)string, terminator);
|
||||
if(retEnd)
|
||||
{
|
||||
*retEnd = end;
|
||||
}
|
||||
if(end == NULL)
|
||||
{
|
||||
//No terminator
|
||||
return strdup(string);
|
||||
}
|
||||
ret = (char*)malloc((end-string)+1);
|
||||
memcpy(ret, string, (end-string));
|
||||
ret[(end-string)] = 0;
|
||||
return ret;
|
||||
char *ret;
|
||||
char *end;
|
||||
|
||||
end = strstr ((char *)string, terminator);
|
||||
if (retEnd) {
|
||||
*retEnd = end;
|
||||
}
|
||||
|
||||
if (end == NULL) {
|
||||
// No terminator
|
||||
return strdup (string);
|
||||
}
|
||||
|
||||
ret = (char *)malloc ((end-string)+1);
|
||||
memcpy (ret, string, (end-string));
|
||||
ret[(end-string)] = 0;
|
||||
return ret;
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user