|
|
1.1 root 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 ([email protected])
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
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
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
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:
124: static void freeze(void)
125: {
126: // Freeze
127: // XXX: Disable interrupts?
128: for(;;)
129: ;
130: }
131:
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:
139: void __stack_chk_fail(void)
140: {
141: printk("Propolice detected a stack smashing attack, freezing\n");
142:
143: freeze();
144: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.