blob: a2ff5284ac35731c3643e2ffac4f71e2e94ef4d4 [file] [log] [blame]
Eric Andersena2a978a2001-04-05 06:08:14 +00001/* vi: set sw=4 ts=4: */
2/*
3 * some system calls possibly missing from libc
4 *
Eric Andersenc7bda1c2004-03-15 08:29:22 +00005 * Copyright (C) 1999-2004 by Erik Andersen <andersen@codepoet.org>
Eric Andersena2a978a2001-04-05 06:08:14 +00006 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 *
21 */
22
23#include <stdio.h>
24#include <errno.h>
25#include <unistd.h>
Eric Andersena2a978a2001-04-05 06:08:14 +000026#include <sys/syscall.h>
Eric Andersena2a978a2001-04-05 06:08:14 +000027#include "libbb.h"
28
Manuel Novoa III adab5172004-03-06 00:32:54 +000029/* uClibc always supplies (possibly ENOSYS) versions of these functions. */
30#ifndef __UCLIBC__
Eric Andersenacc77572001-04-05 06:24:28 +000031
Eric Andersen85e5e722003-07-22 08:56:55 +000032/* These syscalls are not included in very old glibc versions */
Eric Andersen82ab3d72003-05-26 18:48:56 +000033int delete_module(const char *name)
34{
Eric Andersenec359e92004-02-13 08:09:43 +000035#ifndef __NR_delete_module
36#warning This kernel does not support the delete_module syscall
37#warning -> The delete_module system call is being stubbed out...
38 errno=ENOSYS;
39 return -1;
40#else
Eric Andersen82ab3d72003-05-26 18:48:56 +000041 return(syscall(__NR_delete_module, name));
Eric Andersenec359e92004-02-13 08:09:43 +000042#endif
Eric Andersen82ab3d72003-05-26 18:48:56 +000043}
Eric Andersenec359e92004-02-13 08:09:43 +000044
Eric Andersen82ab3d72003-05-26 18:48:56 +000045int get_kernel_syms(__ptr_t ks)
46{
Eric Andersenec359e92004-02-13 08:09:43 +000047#ifndef __NR_get_kernel_syms
48#warning This kernel does not support the get_kernel_syms syscall
49#warning -> The get_kernel_syms system call is being stubbed out...
50 errno=ENOSYS;
51 return -1;
52#else
Eric Andersen82ab3d72003-05-26 18:48:56 +000053 return(syscall(__NR_get_kernel_syms, ks));
Eric Andersenec359e92004-02-13 08:09:43 +000054#endif
Eric Andersen82ab3d72003-05-26 18:48:56 +000055}
Eric Andersena2a978a2001-04-05 06:08:14 +000056
Eric Andersen64c8b172001-04-05 07:33:10 +000057/* This may have 5 arguments (for old 2.0 kernels) or 2 arguments
58 * (for 2.2 and 2.4 kernels). Use the greatest common denominator,
59 * and let the kernel cope with whatever it gets. Its good at that. */
Eric Andersen82ab3d72003-05-26 18:48:56 +000060int init_module(void *first, void *second, void *third, void *fourth, void *fifth)
61{
Eric Andersenec359e92004-02-13 08:09:43 +000062#ifndef __NR_init_module
63#warning This kernel does not support the init_module syscall
64#warning -> The init_module system call is being stubbed out...
65 errno=ENOSYS;
66 return -1;
67#else
Eric Andersen82ab3d72003-05-26 18:48:56 +000068 return(syscall(__NR_init_module, first, second, third, fourth, fifth));
Eric Andersenec359e92004-02-13 08:09:43 +000069#endif
Eric Andersen82ab3d72003-05-26 18:48:56 +000070}
Eric Andersen64c8b172001-04-05 07:33:10 +000071
Eric Andersen82ab3d72003-05-26 18:48:56 +000072int query_module(const char *name, int which, void *buf, size_t bufsize, size_t *ret)
73{
Eric Andersena2a978a2001-04-05 06:08:14 +000074#ifndef __NR_query_module
75#warning This kernel does not support the query_module syscall
76#warning -> The query_module system call is being stubbed out...
Eric Andersen82ab3d72003-05-26 18:48:56 +000077 bb_error_msg("\n\nTo make this application work, you will need to recompile\n"
78 "BusyBox with a kernel supporting the query_module system call.\n");
79 errno=ENOSYS;
80 return -1;
Eric Andersena2a978a2001-04-05 06:08:14 +000081#else
Eric Andersen82ab3d72003-05-26 18:48:56 +000082 return(syscall(__NR_query_module, name, which, buf, bufsize, ret));
Eric Andersena2a978a2001-04-05 06:08:14 +000083#endif
Eric Andersen82ab3d72003-05-26 18:48:56 +000084}
Eric Andersena2a978a2001-04-05 06:08:14 +000085
86/* Jump through hoops to fixup error return codes */
Eric Andersena2a978a2001-04-05 06:08:14 +000087unsigned long create_module(const char *name, size_t size)
88{
Eric Andersenec359e92004-02-13 08:09:43 +000089#ifndef __NR_create_module
90#warning This kernel does not support the create_module syscall
91#warning -> The create_module system call is being stubbed out...
92 errno=ENOSYS;
93 return -1;
94#else
Eric Andersen82ab3d72003-05-26 18:48:56 +000095 long ret = syscall(__NR_create_module, name, size);
Eric Andersena2a978a2001-04-05 06:08:14 +000096
Eric Andersen82ab3d72003-05-26 18:48:56 +000097 if (ret == -1 && errno > 125) {
98 ret = -errno;
99 errno = 0;
100 }
101 return ret;
Eric Andersen85e5e722003-07-22 08:56:55 +0000102#endif
Eric Andersenec359e92004-02-13 08:09:43 +0000103}
Eric Andersena2a978a2001-04-05 06:08:14 +0000104
105
Manuel Novoa III adab5172004-03-06 00:32:54 +0000106#endif /* __UCLIBC__ */
107
Eric Andersena2a978a2001-04-05 06:08:14 +0000108/* END CODE */
109/*
110Local Variables:
111c-file-style: "linux"
112c-basic-offset: 4
113tab-width: 4
114End:
115*/
116