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
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
|
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/termios.h>
// CODE FOR Stack Smashing Protector, TODO: MOVE / and do not duplicate
// with kernel.c
// http://wiki.osdev.org/Stack_Smashing_Protector
#include <stdint.h>
#include <stdlib.h>
#if UINT32_MAX == UINTPTR_MAX
#define STACK_CHK_GUARD 0xe2dee396
#else
#define STACK_CHK_GUARD 0x595e9fbd94fda766
#endif
uintptr_t __stack_chk_guard = STACK_CHK_GUARD;
__attribute__((noreturn))
void __stack_chk_fail(void)
{
write(1,"stack smashing!\n",16);
exit(99);
}
///////////////////
// required by binutils!
long sysconf(int name)
{
printf("UNIMPL: sysconf\n");
printf("SYSCONF CALLED WITH : %s\n",name);
return 0;
}
// set file mode creation mask
mode_t umask(mode_t mask)
{
printf("UNIMPL: umask\n");
return mask;
}
// chmod
int chmod(const char * path, mode_t mode)
{
printf("UNIMPL: chmod\n");
return -1;
}
// manipulating file descriptor
int fcntl(int fd, int cmd, ...)
{
printf("UNIMPL: fcntl\n");
return -1;
}
// working directory
char *getwd(char *buf)
{
printf("UNIMPL: getwd\n");
static char wd[]="/";
buf=wd;
return buf;
}
// check if access allowed
int access(const char *pathname, int mode)
{
printf("UNIMPL: access\n");
//TODO: at leas check if this file exists!
return 0;
}
// update time
int utime(const char *filename, const int *x)
{
printf("UNIMPL: utime\n");
return -1;
}
// rmdir
int rmdir (const char *pathname)
{
printf("UNIMPL: rmdir\n");
return -1;
}
// chonw
int chown(const char *path, uid_t owner, gid_t group)
{
printf("UNIMPL: chown\n");
return -1;
}
// termios / ncurses
int tcgetattr(int fd, struct termios *termios_p)
{
printf("UNIMPL: tcgetattr\n");
return 0;
}
int tcsetattr(int fd, int optional_actions, const struct termios *termios_p){
printf("UNIMPL: tsetattr\n");
return 0;
}
int mkdir(const char *pathname, mode_t mode)
{
printf("UNIMPL: mkdir\n");
return -1;
}
int chdir (const char *pathname)
{
printf("UNIMPL: chdir\n");
return -1;
}
// TODO; check if this is allright for not-real serial line!?
// http://www.chemie.fu-berlin.de/chemnet/use/info/libc/libc_12.html#SEC242
// here they write something about padding may be affected? experiment.
speed_t cfgetospeed(const struct termios *termios_p)
{
// printf("UNIMPL: cfgetospeed\n");
return 9600;
}
char *ttyname(int fd)
{
printf("UNIMPL: ttyname\n");
return "foolterm";
}
DIR *opendir(const char *name)
{
printf("UNIMPL: opendir\n");
return 0;
}
int closedir(DIR *dirp)
{
printf("UNIMPL: closedir\n");
return 0;
}
int tcflush(int fd, int queue_selector)
{
printf("UNIMPL: tcflush\n");
return -1;
}
long fpathconf(int fd, int name)
{
printf("UNIMPL: fpathconf\n");
return -1;
}
unsigned int sleep(unsigned int seconds)
{
printf("UNIMPL: sleep\n");
return 0;
}
char *getlogin(void)
{
printf("UNIMPL: getlogin\n");
return NULL;
}
int ioctl(int fd, unsigned long request, ...)
{
printf("UNIMPL: ioctl\n");
return -1;
}
int gtty(int fd, void *buf)
{
// printf("UNIMPL: gettty\n");
return -1;
}
int stty(int fd, void *buf)
{
// printf("UNIMPL: settty\n");
return -1;
}
|