1 |
148 |
jeremybenn |
#! /bin/sh
|
2 |
|
|
# Copyright (C) 2005 Axis Communications.
|
3 |
|
|
# All rights reserved.
|
4 |
|
|
#
|
5 |
|
|
# Redistribution and use in source and binary forms, with or without
|
6 |
|
|
# modification, are permitted provided that the following conditions
|
7 |
|
|
# are met:
|
8 |
|
|
#
|
9 |
|
|
# 1. Redistributions of source code must retain the above copyright
|
10 |
|
|
# notice, this list of conditions and the following disclaimer.
|
11 |
|
|
#
|
12 |
|
|
# 2. Neither the name of Axis Communications nor the names of its
|
13 |
|
|
# contributors may be used to endorse or promote products derived
|
14 |
|
|
# from this software without specific prior written permission.
|
15 |
|
|
#
|
16 |
|
|
# THIS SOFTWARE IS PROVIDED BY AXIS COMMUNICATIONS AND ITS CONTRIBUTORS
|
17 |
|
|
# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
18 |
|
|
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
19 |
|
|
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL AXIS
|
20 |
|
|
# COMMUNICATIONS OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
21 |
|
|
# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
22 |
|
|
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
23 |
|
|
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
24 |
|
|
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
25 |
|
|
# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
26 |
|
|
# IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
27 |
|
|
# POSSIBILITY OF SUCH DAMAGE.
|
28 |
|
|
|
29 |
|
|
# To avoid an abundance of copyright/license messages for boilerplate
|
30 |
|
|
# code, we instead generate them from this file. Generating the
|
31 |
|
|
# function code could also be done automatically, but at the cost of
|
32 |
|
|
# slightly more intricate build machinery and/or scattered syscall
|
33 |
|
|
# information. Beware that the cat-lines must match the sed regexp
|
34 |
|
|
# "^cat > \([^ ]*\).*".
|
35 |
|
|
|
36 |
|
|
lu='/* -*- buffer-read-only: t -*-
|
37 |
|
|
THIS FILE IS AUTOMATICALLY GENERATED
|
38 |
|
|
FROM "'$0'". */
|
39 |
|
|
#include "linunistd.h"
|
40 |
|
|
#define R(x) return (x); }
|
41 |
|
|
'
|
42 |
|
|
lui="$lu int"
|
43 |
|
|
r=") { R (_Sys_"
|
44 |
|
|
|
45 |
|
|
cat > close.c <
|
46 |
|
|
$lui _close (int fd${r}close (fd))
|
47 |
|
|
EOF
|
48 |
|
|
cat > execve.c <
|
49 |
|
|
$lui _execve (char *path, char **argv, char **env${r}execve (path, argv, env))
|
50 |
|
|
EOF
|
51 |
|
|
cat > exit.c <
|
52 |
|
|
$lu void _exit (int val) { _Sys_exit (val); /* Appease GCC: */ while (1) ; }
|
53 |
|
|
EOF
|
54 |
|
|
cat > fcntl.c <
|
55 |
|
|
$lui _fcntl (int fd, int cmd, long arg${r}fcntl (fd, cmd, arg))
|
56 |
|
|
EOF
|
57 |
|
|
cat > fork.c <
|
58 |
|
|
$lui _fork (void${r}fork ())
|
59 |
|
|
EOF
|
60 |
|
|
cat > fstat.c <
|
61 |
|
|
$lu#include
|
62 |
|
|
#include
|
63 |
|
|
int
|
64 |
|
|
_fstat (int fd, struct stat *buf)
|
65 |
|
|
{
|
66 |
|
|
struct new_stat ks;
|
67 |
|
|
int retval = _Sys_fstat (fd, &ks);
|
68 |
|
|
|
69 |
|
|
/* Blank before filling it in. */
|
70 |
|
|
memset (buf, 0, sizeof (*buf));
|
71 |
|
|
|
72 |
|
|
/* We have to translate from the linux struct new_stat.
|
73 |
|
|
It seems we don't have to translate the contents, though. */
|
74 |
|
|
buf->st_dev = ks.st_dev;
|
75 |
|
|
buf->st_ino = ks.st_ino;
|
76 |
|
|
buf->st_mode = ks.st_mode;
|
77 |
|
|
buf->st_nlink = ks.st_nlink;
|
78 |
|
|
buf->st_uid = ks.st_uid;
|
79 |
|
|
buf->st_gid = ks.st_gid;
|
80 |
|
|
buf->st_rdev = ks.st_rdev;
|
81 |
|
|
buf->st_size = ks.st_size;
|
82 |
|
|
buf->st_blksize = ks.st_blksize;
|
83 |
|
|
buf->st_blocks = ks.st_blocks;
|
84 |
|
|
buf->st_atime = ks.st_atime;
|
85 |
|
|
buf->st_mtime = ks.st_mtime;
|
86 |
|
|
buf->st_ctime = ks.st_ctime;
|
87 |
|
|
R (retval)
|
88 |
|
|
EOF
|
89 |
|
|
cat > getpid.c <
|
90 |
|
|
$lui _getpid (void${r}getpid ())
|
91 |
|
|
EOF
|
92 |
|
|
cat > gettod.c <
|
93 |
|
|
$lu#include
|
94 |
|
|
#include
|
95 |
|
|
int
|
96 |
|
|
_gettimeofday (struct timeval *tp, void *tzp
|
97 |
|
|
${r}gettimeofday (tp, tzp))
|
98 |
|
|
EOF
|
99 |
|
|
cat > isatty.c <
|
100 |
|
|
$lu
|
101 |
|
|
typedef unsigned int tcflag_t;
|
102 |
|
|
typedef unsigned char cc_t;
|
103 |
|
|
#define NCCS 19
|
104 |
|
|
|
105 |
|
|
struct termios {
|
106 |
|
|
tcflag_t c_iflag; /* input mode flags */
|
107 |
|
|
tcflag_t c_oflag; /* output mode flags */
|
108 |
|
|
tcflag_t c_cflag; /* control mode flags */
|
109 |
|
|
tcflag_t c_lflag; /* local mode flags */
|
110 |
|
|
cc_t c_line; /* line discipline */
|
111 |
|
|
cc_t c_cc[NCCS]; /* control characters */
|
112 |
|
|
};
|
113 |
|
|
|
114 |
|
|
/* From asm-etrax100/ioctls.h: beware of updates. */
|
115 |
|
|
#define TCGETS 0x5401
|
116 |
|
|
|
117 |
|
|
int
|
118 |
|
|
_isatty (int fd)
|
119 |
|
|
{
|
120 |
|
|
struct termios dummy;
|
121 |
|
|
int save_errno = errno;
|
122 |
|
|
int ret = _Sys_ioctl (fd, TCGETS, (unsigned long) &dummy);
|
123 |
|
|
errno = save_errno;
|
124 |
|
|
R (ret == 0)
|
125 |
|
|
EOF
|
126 |
|
|
cat > kill.c <
|
127 |
|
|
$lui _kill (int pid, int sig${r}kill (pid, sig))
|
128 |
|
|
EOF
|
129 |
|
|
cat > link.c <
|
130 |
|
|
$lui _link (const char *old, const char *new${r}link (old, new))
|
131 |
|
|
EOF
|
132 |
|
|
cat > lseek.c <
|
133 |
|
|
$lui _lseek (int fd, int offset, int whence${r}lseek (fd, offset, whence))
|
134 |
|
|
EOF
|
135 |
|
|
cat > open.c <
|
136 |
|
|
$lui _open (const char *fnam, int flags, int mode${r}open (fnam, flags, mode))
|
137 |
|
|
EOF
|
138 |
|
|
cat > read.c <
|
139 |
|
|
$lui _read (int fd, char *buf, int nbytes${r}read (fd, buf, nbytes))
|
140 |
|
|
EOF
|
141 |
|
|
cat > rename.c <
|
142 |
|
|
$lui _rename (const char *old, const char *new${r}rename (old, new))
|
143 |
|
|
EOF
|
144 |
|
|
cat > sbrk.c <
|
145 |
|
|
$lu
|
146 |
|
|
/* From asm-etrax100/mman.h: beware of updates. */
|
147 |
|
|
#define PROT_READ 0x1 /* page can be read */
|
148 |
|
|
#define PROT_WRITE 0x2 /* page can be written */
|
149 |
|
|
#define MAP_ANONYMOUS 0x20 /* don't use a file */
|
150 |
|
|
char *
|
151 |
|
|
_sbrk (int d)
|
152 |
|
|
{
|
153 |
|
|
static long last_alloc = 0;
|
154 |
|
|
|
155 |
|
|
/* FIXME: Things are a whole lot different than elinux. */
|
156 |
|
|
#ifdef __elinux__
|
157 |
|
|
|
158 |
|
|
/* We can't promise linear memory from a predetermined location.
|
159 |
|
|
We're NO_MM. We're paria. We have to rely on tweaks and unclean
|
160 |
|
|
behavior. We abuse the fact that the malloc function in newlib
|
161 |
|
|
accepts nonlinear chunks in return to its sbrk calls (with a minor
|
162 |
|
|
patch). */
|
163 |
|
|
|
164 |
|
|
/* We use an "old" type mmap, which takes a pointer to a vector of 6
|
165 |
|
|
longs where the parameters are stored. */
|
166 |
|
|
long buffer[6];
|
167 |
|
|
|
168 |
|
|
/* We can't return memory. Well we could, but we would have to keep a
|
169 |
|
|
list of previous allocations. FIXME: Seems reasonable to do that
|
170 |
|
|
later. */
|
171 |
|
|
if (d < 0)
|
172 |
|
|
return (char *) last_alloc;
|
173 |
|
|
|
174 |
|
|
buffer[3] = MAP_ANONYMOUS; /* Not associated with a file. */
|
175 |
|
|
buffer[4] = -1; /* No file. */
|
176 |
|
|
buffer[0] = 0; /* Address 0: let mmap pick one. */
|
177 |
|
|
buffer[1] = d; /* Length. */
|
178 |
|
|
buffer[2] = (PROT_READ | PROT_WRITE); /* Protection flags. */
|
179 |
|
|
buffer[5] = 0; /* Offset into file. */
|
180 |
|
|
|
181 |
|
|
last_alloc = _Sys_mmap (buffer);
|
182 |
|
|
|
183 |
|
|
return (char *) last_alloc;
|
184 |
|
|
|
185 |
|
|
#else /* not __elinux__ */
|
186 |
|
|
|
187 |
|
|
long prev_brk;
|
188 |
|
|
|
189 |
|
|
if (last_alloc == 0)
|
190 |
|
|
{
|
191 |
|
|
last_alloc = _Sys_brk (0);
|
192 |
|
|
|
193 |
|
|
if (last_alloc < 0)
|
194 |
|
|
return (char *) -1;
|
195 |
|
|
}
|
196 |
|
|
|
197 |
|
|
prev_brk = last_alloc;
|
198 |
|
|
|
199 |
|
|
if (_Sys_brk (last_alloc + d) < last_alloc + d)
|
200 |
|
|
return (char *) -1;
|
201 |
|
|
|
202 |
|
|
last_alloc += d;
|
203 |
|
|
|
204 |
|
|
return (char *) prev_brk;
|
205 |
|
|
#endif
|
206 |
|
|
}
|
207 |
|
|
EOF
|
208 |
|
|
cat > stat.c <
|
209 |
|
|
$lu#include
|
210 |
|
|
#include
|
211 |
|
|
int
|
212 |
|
|
_stat (const char *path, struct stat *buf)
|
213 |
|
|
{
|
214 |
|
|
struct new_stat ks;
|
215 |
|
|
int retval = _Sys_stat (path, &ks);
|
216 |
|
|
|
217 |
|
|
/* Blank before filling it in. */
|
218 |
|
|
memset (buf, 0, sizeof (*buf));
|
219 |
|
|
|
220 |
|
|
/* We have to translate from the linux struct new_stat.
|
221 |
|
|
It seems we don't have to translate the contents, though. */
|
222 |
|
|
buf->st_dev = ks.st_dev;
|
223 |
|
|
buf->st_ino = ks.st_ino;
|
224 |
|
|
buf->st_mode = ks.st_mode;
|
225 |
|
|
buf->st_nlink = ks.st_nlink;
|
226 |
|
|
buf->st_uid = ks.st_uid;
|
227 |
|
|
buf->st_gid = ks.st_gid;
|
228 |
|
|
buf->st_rdev = ks.st_rdev;
|
229 |
|
|
buf->st_size = ks.st_size;
|
230 |
|
|
buf->st_blksize = ks.st_blksize;
|
231 |
|
|
buf->st_blocks = ks.st_blocks;
|
232 |
|
|
buf->st_atime = ks.st_atime;
|
233 |
|
|
buf->st_mtime = ks.st_mtime;
|
234 |
|
|
buf->st_ctime = ks.st_ctime;
|
235 |
|
|
R (retval)
|
236 |
|
|
EOF
|
237 |
|
|
cat > times.c <
|
238 |
|
|
$lu#include
|
239 |
|
|
clock_t
|
240 |
|
|
_times (struct tms * tp${r}times (tp))
|
241 |
|
|
EOF
|
242 |
|
|
cat > unlink.c <
|
243 |
|
|
$lui _unlink (const char *f${r}unlink (f))
|
244 |
|
|
EOF
|
245 |
|
|
cat > wait.c <
|
246 |
|
|
$lui _wait (int *status${r}wait4 (_getpid(), status, 0, 0))
|
247 |
|
|
EOF
|
248 |
|
|
cat > write.c <
|
249 |
|
|
$lui _write (int fd, char *buf, int nbytes${r}write (fd, buf, nbytes))
|
250 |
|
|
EOF
|
251 |
|
|
exit 0
|