URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 3803
[ Назад ]

Исходное сообщение
"sys_open не работает"

Отправлено au , 08-Янв-05 03:27 
Пробую написать свой модуль, в функции module_init такая строчка
...
int F = sys_open("/etc/filename", O_RDONLY, 0);
...
возвращает -14 (есть файл, нету, все по барабану)... Прочитал про kernel/user spaces там предлагают такое решение
...
mm_segment_t fs = get_fs();
set_fs(get_ds());
int F = sys_open("/etc/filename", O_RDONLY, 0);
set_fs(fs);
...
Этот код засталяет ядро паниковать и все тут (много чего пришет, в конце "EIP bad value"). Кстати, в kern.log ни слова про панику (зачем тогда лог нужен?). Вопрос еще, как зделать чтобы логи паники появлялись в kern.log (если вообще возможно)?
Версия ядра - 2.6.9. Если кто сталкивался, раскажите

Содержание

Сообщения в этом обсуждении
"sys_open не работает"
Отправлено Bob , 10-Янв-05 10:50 
Т.е. ты хочешь из ядра открыть и прочитать файл. Так?

"sys_open не работает"
Отправлено au , 10-Янв-05 15:22 
>Т.е. ты хочешь из ядра открыть и прочитать файл. Так?

вроде так


"sys_open не работает"
Отправлено Bob , 10-Янв-05 18:02 
>>Т.е. ты хочешь из ядра открыть и прочитать файл. Так?
>
>вроде так

Poprobuy etot code:

/* copy_file.c */
#include <linux/module.h>
#include <linux/config.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <asm/uaccess.h>// get_fs(), set_fs(), KERNEL_DS
#include <linux/file.h>    // fput()
#include <linux/mm.h>    // GFP_KERNEL
#include <linux/slab.h>    // kmalloc

void copy_file(const char * fread, const char * fwrite)
{
    int length_read, length_write;
    char buffer[255];
    struct file * f = NULL;
    struct inode *inode;
    mm_segment_t orig_fs;

    f = filp_open(fread, O_RDONLY, 00);
    if (!f || !f->f_op || !f->f_op->read) {
    printk(KERN_INFO "File (read) object is a null pointer!\n");
    return;
    }

    //f->f_pos = 2;

    inode = f->f_dentry->d_inode;
    printk(KERN_INFO "File size - %u\n", (unsigned int)inode->i_size);

    orig_fs = get_fs();
    set_fs(KERNEL_DS);

    length_read = f->f_op->read(f, buffer, 4, &f->f_pos);

    fput(f);

    f = filp_open(fwrite, O_WRONLY | O_CREAT, 0600);
    if (!f || !f->f_op || !f->f_op->write) {
    printk(KERN_INFO "File (write) object is a null pointer!\n");
    return;
    }

    //f->f_pos = 4;
    orig_fs = get_fs();
    set_fs(KERNEL_DS);    

    length_write = f->f_op->write(f, buffer, 4, &f->f_pos);

    fput(f);

    return;
}


static int __init copymodule_init(void)
{
    unsigned char *file_to_read = kmalloc(20, GFP_KERNEL);
    unsigned char *file_to_write = kmalloc(20, GFP_KERNEL);

    file_to_read = "/home/readwrite/mark";
    file_to_write = "/home/readwrite/mike";
    copy_file(file_to_read, file_to_write);
    return 0;
}

static void __exit copymodule_exit(void)
{  
    return;
}

module_init(copymodule_init);
module_exit(copymodule_exit);

MODULE_LICENSE("GPL");
/* end of copy_file.c */

#Makefile:
CC = gcc
CFLAGS = -O2 -Wall
LINUX = /usr/src/linux
MODFLAGS = -D__KERNEL__ -DMODULE -I$(LINUX)/include

copy_file.o: copy_file.c
    $(CC) $(CFLAGS) $(MODFLAGS) -c copy_file.c
#end of Makefile

Posle compilyacii vvodi comandu:
insmod copy_file.o

Tolko pravil`no zaday imena faylov (file_to_read i file_to_write).


"sys_open не работает"
Отправлено Bob , 10-Янв-05 18:07 
P.S. Kernel 2.4.28.

"sys_open не работает"
Отправлено DeadMustdie , 10-Янв-05 21:19 
Может, оно и работает... Но скорее вопреки усилиям автора, чем благодаря
им. Например, меня сильно радует фрагментик:

static int __init copymodule_init(void)
{
    unsigned char *file_to_read = kmalloc(20, GFP_KERNEL);
    unsigned char *file_to_write = kmalloc(20, GFP_KERNEL);

    file_to_read = "/home/readwrite/mark";
    file_to_write = "/home/readwrite/mike";
    copy_file(file_to_read, file_to_write);
    return 0;
}


"sys_open не работает"
Отправлено genie , 11-Янв-05 00:13 
M-da... Desitvitel'no... Vopreki...

"sys_open не работает"
Отправлено au , 14-Янв-05 14:04 
>>>Т.е. ты хочешь из ядра открыть и прочитать файл. Так?
>>
>>вроде так
>
>Poprobuy etot code:
>

Разбираюсь... спасибо


"sys_open не работает"
Отправлено Murr , 11-Янв-05 19:50 
>Этот код засталяет ядро паниковать и все тут (много чего пришет, в
>конце "EIP bad value").

Скорее всего ядро заставляет паниковать другой код, т.к. то, что написано - корректно.

> Кстати, в kern.log ни слова про панику
>(зачем тогда лог нужен?). Вопрос еще, как зделать чтобы логи паники
>появлялись в kern.log (если вообще возможно)?

man klogd

>Версия ядра - 2.6.9. Если кто сталкивался, раскажите