144 lines
2.7 KiB
C
144 lines
2.7 KiB
C
/*
|
|
* Creation Date: <2002/10/19 21:05:07 samuel>
|
|
* Time-stamp: <2002/10/22 22:29:18 samuel>
|
|
*
|
|
* <misc.c>
|
|
*
|
|
* Miscellaneous
|
|
*
|
|
* Copyright (C) 2002, 2003 Samuel Rydh (samuel@ibrium.se)
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* as published by the Free Software Foundation
|
|
*
|
|
*/
|
|
|
|
#include "config.h"
|
|
#include "libc/string.h"
|
|
|
|
int errno_int;
|
|
|
|
void
|
|
qsort( void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void*) )
|
|
{
|
|
unsigned int worked, i, j;
|
|
|
|
/* even more inefficient than the glibc variant :-) */
|
|
do {
|
|
char *p = base;
|
|
worked = 0;
|
|
for( i=0; i<nmemb-1; i++, p+= size ) {
|
|
if( compar( p, p + size ) > 0 ) {
|
|
worked = 1;
|
|
for( j=0; j<size; j++ ) {
|
|
char ch = p[j];
|
|
p[j] = p[j+size];
|
|
p[j+size] = ch;
|
|
}
|
|
}
|
|
}
|
|
} while( worked );
|
|
}
|
|
|
|
|
|
long int
|
|
strtol( const char *nptr, char **endptr, int base )
|
|
{
|
|
int sum, n, sign=1;
|
|
while( isspace(*nptr) )
|
|
nptr++;
|
|
|
|
if( *nptr == '-' || *nptr == '+' )
|
|
sign = (*nptr++ == '-') ? -1 : 1;
|
|
|
|
if( base == 16 || base == 0) {
|
|
if( !base )
|
|
base = (nptr[0] == '0')? 8 : 10;
|
|
if( nptr[0] == '0' && nptr[1] == 'x' ) {
|
|
nptr += 2;
|
|
base = 16;
|
|
}
|
|
}
|
|
for( sum=0 ;; nptr++ ) {
|
|
char ch = *nptr;
|
|
if( !isalnum(ch) )
|
|
break;
|
|
n = isdigit(ch) ? ch - '0' : toupper(ch) - 'A' + 10;
|
|
if( n >= base || n < 0 )
|
|
break;
|
|
sum *= base;
|
|
sum += n;
|
|
}
|
|
if( endptr )
|
|
*endptr = (char*)nptr;
|
|
|
|
return sum * sign;
|
|
}
|
|
|
|
long long int
|
|
strtoll( const char *nptr, char **endptr, int base )
|
|
{
|
|
long long int sum;
|
|
int n, sign=1;
|
|
while( isspace(*nptr) )
|
|
nptr++;
|
|
|
|
if( *nptr == '-' || *nptr == '+' )
|
|
sign = (*nptr++ == '-') ? -1 : 1;
|
|
|
|
if( base == 16 || base == 0) {
|
|
if( !base )
|
|
base = (nptr[0] == '0')? 8 : 10;
|
|
if( nptr[0] == '0' && nptr[1] == 'x' ) {
|
|
nptr += 2;
|
|
base = 16;
|
|
}
|
|
}
|
|
for( sum=0 ;; nptr++ ) {
|
|
char ch = *nptr;
|
|
if( !isalnum(ch) )
|
|
break;
|
|
n = isdigit(ch) ? ch - '0' : toupper(ch) - 'A' + 10;
|
|
if( n >= base || n < 0 )
|
|
break;
|
|
sum *= base;
|
|
sum += n;
|
|
}
|
|
if( endptr )
|
|
*endptr = (char*)nptr;
|
|
|
|
return sum * sign;
|
|
}
|
|
|
|
// Propolice support
|
|
long __guard[8] = {
|
|
#ifdef CONFIG_BIG_ENDIAN
|
|
(0 << 24) | (0 << 16) | ('\n' << 8) | 255,
|
|
#else
|
|
(255 << 24) | ('\n' << 16) | (0 << 8) | 0,
|
|
#endif
|
|
0, 0, 0, 0, 0, 0, 0
|
|
};
|
|
|
|
static void freeze(void)
|
|
{
|
|
// Freeze
|
|
// XXX: Disable interrupts?
|
|
for(;;)
|
|
;
|
|
}
|
|
|
|
void __stack_smash_handler(const char *func, int damaged)
|
|
{
|
|
printk("Propolice detected a stack smashing attack %x at function %s,"
|
|
" freezing\n", damaged, func);
|
|
freeze();
|
|
}
|
|
|
|
void __stack_chk_fail(void)
|
|
{
|
|
printk("Propolice detected a stack smashing attack, freezing\n");
|
|
|
|
freeze();
|
|
}
|