1 /*
2 * Creation Date: <2002/10/19 21:05:07 samuel>
3 * Time-stamp: <2002/10/22 22:29:18 samuel>
4 *
5 * <misc.c>
6 *
7 * Miscellaneous
8 *
9 * Copyright (C) 2002, 2003 Samuel Rydh (samuel@ibrium.se)
10 *
11 * This program is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU General Public License
13 * as published by the Free Software Foundation
14 *
15 */
16
17 #include "config.h"
18 #include "libc/string.h"
19
20 int errno_int;
21
22 void
qsort(void * base,size_t nmemb,size_t size,int (* compar)(const void *,const void *))23 qsort( void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void*) )
24 {
25 unsigned int worked, i, j;
26
27 /* even more inefficient than the glibc variant :-) */
28 do {
29 char *p = base;
30 worked = 0;
31 for( i=0; i<nmemb-1; i++, p+= size ) {
32 if( compar( p, p + size ) > 0 ) {
33 worked = 1;
34 for( j=0; j<size; j++ ) {
35 char ch = p[j];
36 p[j] = p[j+size];
37 p[j+size] = ch;
38 }
39 }
40 }
41 } while( worked );
42 }
43
44
45 long int
strtol(const char * nptr,char ** endptr,int base)46 strtol( const char *nptr, char **endptr, int base )
47 {
48 int sum, n, sign=1;
49 while( isspace(*nptr) )
50 nptr++;
51
52 if( *nptr == '-' || *nptr == '+' )
53 sign = (*nptr++ == '-') ? -1 : 1;
54
55 if( base == 16 || base == 0) {
56 if( !base )
57 base = (nptr[0] == '0')? 8 : 10;
58 if( nptr[0] == '0' && nptr[1] == 'x' ) {
59 nptr += 2;
60 base = 16;
61 }
62 }
63 for( sum=0 ;; nptr++ ) {
64 char ch = *nptr;
65 if( !isalnum(ch) )
66 break;
67 n = isdigit(ch) ? ch - '0' : toupper(ch) - 'A' + 10;
68 if( n >= base || n < 0 )
69 break;
70 sum *= base;
71 sum += n;
72 }
73 if( endptr )
74 *endptr = (char*)nptr;
75
76 return sum * sign;
77 }
78
79 long long int
strtoll(const char * nptr,char ** endptr,int base)80 strtoll( const char *nptr, char **endptr, int base )
81 {
82 long long int sum;
83 int n, sign=1;
84 while( isspace(*nptr) )
85 nptr++;
86
87 if( *nptr == '-' || *nptr == '+' )
88 sign = (*nptr++ == '-') ? -1 : 1;
89
90 if( base == 16 || base == 0) {
91 if( !base )
92 base = (nptr[0] == '0')? 8 : 10;
93 if( nptr[0] == '0' && nptr[1] == 'x' ) {
94 nptr += 2;
95 base = 16;
96 }
97 }
98 for( sum=0 ;; nptr++ ) {
99 char ch = *nptr;
100 if( !isalnum(ch) )
101 break;
102 n = isdigit(ch) ? ch - '0' : toupper(ch) - 'A' + 10;
103 if( n >= base || n < 0 )
104 break;
105 sum *= base;
106 sum += n;
107 }
108 if( endptr )
109 *endptr = (char*)nptr;
110
111 return sum * sign;
112 }
113
114 // Propolice support
115 long __guard[8] = {
116 #ifdef CONFIG_BIG_ENDIAN
117 (0 << 24) | (0 << 16) | ('\n' << 8) | 255,
118 #else
119 (255 << 24) | ('\n' << 16) | (0 << 8) | 0,
120 #endif
121 0, 0, 0, 0, 0, 0, 0
122 };
123
freeze(void)124 static void freeze(void)
125 {
126 // Freeze
127 // XXX: Disable interrupts?
128 for(;;)
129 ;
130 }
131
__stack_smash_handler(const char * func,int damaged)132 void __stack_smash_handler(const char *func, int damaged)
133 {
134 printk("Propolice detected a stack smashing attack %x at function %s,"
135 " freezing\n", damaged, func);
136 freeze();
137 }
138
__stack_chk_fail(void)139 void __stack_chk_fail(void)
140 {
141 printk("Propolice detected a stack smashing attack, freezing\n");
142
143 freeze();
144 }
145