* reordered a little bit
[mascara-docs.git] / i86 / elks / elkscmd / sys_utils / insmod.c
blob6186c9561611ad82ed994ab1fc9143a7026cfa57
1 #include <stdio.h>
2 /* #include <unistd.h> */
3 #include <stdlib.h>
4 #include <fcntl.h>
5 #include <errno.h>
6 #include <sys/stat.h>
7 #include <linuxmt/config.h>
8 #include <linuxmt/mem.h>
10 char *failed = "insmod: failed\n";
11 #define F_LEN 15
12 #define STDERR_FILENO 2
14 static char modbuf[DATASIZE < TEXTSIZE ? TEXTSIZE : DATASIZE];
16 int main(argc,argv)
17 int argc;
18 char **argv;
20 int od,md,i;
21 char fname[20];
22 unsigned int data, text, len, doff, coff;
23 off_t datap, textp;
24 struct stat buf;
26 if (argc != 2) {
27 write(STDERR_FILENO, "usage: insmod <module>\n",23);
28 exit(1);
30 /* Clean up the old module */
31 insmod(MOD_TERM);
32 /* Open the mem device to access kernel space */
33 if ((md = open("/dev/mem",O_WRONLY)) == -1) {
34 write(STDERR_FILENO, failed, F_LEN);
35 write(STDERR_FILENO, "Could not open /dev/mem.\n",25);
36 exit(errno);
38 /* Get the addresses in kernel space to copy the module to */
39 if (((ioctl(md, MEM_GETMODTEXT, &text)) == -1) ||
40 ((ioctl(md, MEM_GETMODDATA, &data)) == -1) ||
41 ((ioctl(md, MEM_GETDS, &doff)) == -1) ||
42 ((ioctl(md, MEM_GETCS, &coff)) == -1)) {
43 write(STDERR_FILENO, failed, F_LEN);
44 write(STDERR_FILENO, "Kernel does not support modules.\n",33);
45 exit(errno);
47 /* Calculate /dev/mem seek points */
48 datap = ((long)doff << 4) + (long)data;
49 textp = ((long)coff << 4) + (long)text;
50 /* Open <module>.T */
51 strcpy(fname, argv[1], 15);
52 strcat(fname, ".T");
53 if ((od = open(fname,O_RDONLY)) == -1) {
54 write(STDERR_FILENO, failed, F_LEN);
55 write(STDERR_FILENO, "Could not open module ",22);
56 write(STDERR_FILENO, argv[1], strlen(argv[1]));
57 exit(errno);
59 if ((fstat(od, &buf)) == -1) {
60 write(STDERR_FILENO, failed, F_LEN);
61 exit(errno);
63 if ((len = buf.st_size) > TEXTSIZE) {
64 write(STDERR_FILENO, failed, F_LEN);
65 write(STDERR_FILENO, "Module too big.\n",16);
66 exit(errno);
68 if ((lseek(md, textp, SEEK_SET)) == -1) {
69 write(STDERR_FILENO, failed, F_LEN);
70 exit(errno);
72 /* Copy <module>.T into the kernel */
73 if ((read(od, modbuf, len)) != len) {
74 write(STDERR_FILENO, failed, F_LEN);
75 exit(errno);
77 if ((write(md, modbuf, len)) != len) {
78 write(STDERR_FILENO, failed, F_LEN);
79 exit(errno);
81 /* Open <module>.D */
82 strcpy(fname, argv[1], 15);
83 strcat(fname, ".D");
84 if ((od = open(fname,O_RDONLY)) == -1) {
85 write(STDERR_FILENO, failed, F_LEN);
86 write(STDERR_FILENO, "Could not open module ",22);
87 write(STDERR_FILENO, argv[1], strlen(argv[1]));
88 exit(errno);
90 if ((fstat(od, &buf)) == -1) {
91 write(STDERR_FILENO, failed, F_LEN);
92 exit(errno);
94 if ((len = buf.st_size) > TEXTSIZE) {
95 write(STDERR_FILENO, failed, F_LEN);
96 write(STDERR_FILENO, "Module too big.\n",16);
97 exit(errno);
99 if ((lseek(md, datap, SEEK_SET)) == -1) {
100 write(STDERR_FILENO, failed, F_LEN);
101 exit(errno);
103 /* Copy <module>.D into the kernel */
104 if ((read(od, modbuf, len)) != len) {
105 write(STDERR_FILENO, failed, F_LEN);
106 exit(errno);
108 if ((write(md, modbuf, len)) != len) {
109 write(STDERR_FILENO, failed, F_LEN);
110 exit(errno);
112 fflush(stdout);
113 /* Initialise the module. */
114 insmod(MOD_INIT);