1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144
|
/*
* 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();
}
|