Страница 1 из 1
Не работает mknod()
Добавлено: 2008-06-16 21:23:49
eJ
Народ, не работает банальный код:
Код: Выделить всё
#include <sys/stat.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
int main(int argc, char *argv[])
{
umask(0);
if (mknod("test", S_IFREG, 0))
{
perror("mknod");
return 1;
}
return 0;
}
Компиляю так:
Ошибка такая:
Re: Не работает mknod()
Добавлено: 2008-06-17 6:06:50
zingel
ну если я Вас верно понял, то вот так надо:
Код: Выделить всё
[root@zingel ~]# diff -uNr ~/code/other/old.c ~/code/other/1.c
--- /root/code/other/old.c 2008-06-17 06:05:10.000000000 +0300
+++ /root/code/other/1.c 2008-06-17 06:05:06.000000000 +0300
@@ -3,11 +3,16 @@
#include <string.h>
#include <errno.h>
+#define OP '-c'
+#define NUM 1
+#define NAME '/dev/test'
+#define ALL (OP, NUM,NAME)
+
int main(int argc, char *argv[])
{
- umask(0);
- if (mknod("test", S_IFREG, 0))
+ umask(0644);
+ if (mknod ALL, S_IFREG, 0 )
{
perror("mknod");
return 1;
работает:
Код: Выделить всё
[root@zingel ~/code/other]# objdump -T a.out | perl -lne 'if(/(\_.*)/){print $1}'
_1.0 _init_tls
__progname
_1.0 mknod
_1.0 umask
_1.0 exit
_end
_1.0 atexit
_Jv_RegisterClasses
UPD:
Вот так круче:
Код: Выделить всё
#include <sys/stat.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
/* определяем передачу параметра "-с" команде mknod, тип устройства, без этого не будет работать и отдаст нормальную Invalid argument */
#ifndef OP
#define OP "-c"
#endif
/* Определяем название устройства и путь его же */
#ifndef NAME
#define NAME "/dev/test"
#endif
/*Поскольку юзается S_IFREG, непортабельный регулярный семафор, определяем единицу */
#define NUM 1
/* Всё вместе складываем*/
#define ALL (OP, NUM,NAME)
int main(int argc, char *argv[])
{
umask(0644); /* маску меняем на стандартную для /dev */
if (mknod ALL, S_IFREG, 0 )
{
perror("mknod");
return 1;
}
return 0;
}
/* если не создастся ничего и завершится ошибкой, то идём смело и читаем man 2 mknod */
Re: Не работает mknod()
Добавлено: 2008-06-17 8:36:44
eJ
У тебя неправильный код!
Вот это:
Код: Выделить всё
int main(int argc, char *argv[])
{
umask(0644); /* маску меняем на стандартную для /dev */
if (mknod ALL, S_IFREG, 0 )
{
perror("mknod");
return 1;
}
return 0;
}
Раскладывается cc так:
Код: Выделить всё
int main(int argc, char *argv[])
{
umask(0644);
if (mknod ("-c", 1,"/dev/test"), 0100000, 0 )
{
perror("mknod");
return 1;
}
return 0;
}
Разумеется он не завершится с ошибкой. Что у тебя проверяет if?
UPD:
А надо мне создать простой файл с обычными правами доступа 0644 с помощью mknod.
Re: Не работает mknod()
Добавлено: 2008-06-17 9:18:04
zingel
как-то по-идусски вышло, я думал нужен вариант под сокет или что-то ~такое (плохо сплю последне время), держи:
Код: Выделить всё
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
#ifndef COPY
#define COPY printf("Created by zingel [aka 666.root] 10:11 17.06.2008\n")
#endif
int main(int argc, char ** argv)
{
int krevedko;
if (argc < 2) {
COPY;
printf("Usage %s filename\n", argv[0]);
return 1;
}
krevedko = mknod(argv[1], S_IFREG | 0644, 0);
if (krevedko) {
printf("mknod(%s) error: %s\n", argv[1], strerror(errno));
}
return krevedko;
}
Да прибуедт с тобой сатана.
Re: Не работает mknod()
Добавлено: 2008-06-17 11:38:55
eJ
Все равно какая-то херня, извиняюсь за выражение.
Может mknod под FreeBSD 7.0 не умеет создавать S_IFREG файлы?
Покажи uname -a.
Вот мой:
Код: Выделить всё
FreeBSD root.nill.org.ru 7.0-RELEASE-p1 FreeBSD 7.0-RELEASE-p1 #0: Tue Jan 1 03:20:51 MSK 2002 root@root.nill.org.ru:/usr/obj/usr/src/sys/ATHLON i386
Re: Не работает mknod()
Добавлено: 2008-06-17 11:46:32
zingel
Код: Выделить всё
[root@zingel ~/code]# uname -a
FreeBSD zingel.dubki.ru 7.0-RELEASE FreeBSD 7.0-RELEASE #0: Wed Apr 23 22:39:55 EEST 2008 root@zingel.dubki.ru:/usr/obj/usr/src/sys/BEASTIE i386
действительно, какая-то херня, код чистый на 100%, баг mknod? странно...
Re: Не работает mknod()
Добавлено: 2008-06-17 12:19:48
paradox
а вручную ?
не из с кода
Re: Не работает mknod()
Добавлено: 2008-06-17 12:20:20
zingel
ой косяк, ой баг, надо отписать в bugs
Код: Выделить всё
44650: sigprocmask(SIG_SETMASK,0x0,0x0) = 0 (0x0)
44650: mknod("file",0100666,-1077941728) ERR#22 'Invalid argument'
44650: fstat(1,{mode=crw------- ,inode=100,size=0,blksize=4096}) = 0 (0x0)
44650: __sysctl(0xbfbfe1fc,0x2,0x281698c0,0xbfbfe208,0x0,0x0) = 0 (0x0)
44650: __sysctl(0xbfbfdd38,0x2,0x2817603c,0xbfbfdd40,0x0,0x0) = 0 (0x0)
44650: __sysctl(0xbfbfdd88,0x2,0xbfbfdd94,0xbfbfdd98,0x0,0x0) = 0 (0x0)
44650: readlink("/etc/malloc.conf",0xbfbfddfb,1024) ERR#2 'No such file or directory'
44650: issetugid(0x2815700a,0xbfbfddfb,0x400,0xbfbfe208,0x0,0x0) = 0 (0x0)
44650: break(0x8100000) = 0 (0x0)
44650: __sysctl(0xbfbfe0a4,0x2,0xbfbfe0ac,0xbfbfe0b0,0x0,0x0) = 0 (0x0)
44650: mmap(0x0,2097152,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANON,-1,0x0) = 672632832 (0x28179000)
44650: munmap(0x28179000,552960) = 0 (0x0)
44650: munmap(0x28300000,495616) = 0 (0x0)
44650: ioctl(1,TIOCGETA,0xbfbfe228) = 0 (0x0)
mknod(file) error: Invalid argument
44650: write(1,"mknod(file) error: Invalid argum"...,36) = 36 (0x24)
44650: process exit, rval = 255
Re: Не работает mknod()
Добавлено: 2008-06-17 12:33:20
zingel
вручную всё ок:
Код: Выделить всё
[root@zingel ~]# mknod fuckass c 1 0
[root@zingel ~]# ls -la fuckass
crw-r--r-- 1 root wheel 1, 0 Jun 17 12:29 fuckass
Re: Не работает mknod()
Добавлено: 2008-06-17 16:33:28
eJ
zingel писал(а):ой косяк, ой баг, надо отписать в bugs
Код: Выделить всё
44650: sigprocmask(SIG_SETMASK,0x0,0x0) = 0 (0x0)
44650: mknod("file",0100666,-1077941728) ERR#22 'Invalid argument'
44650: fstat(1,{mode=crw------- ,inode=100,size=0,blksize=4096}) = 0 (0x0)
44650: __sysctl(0xbfbfe1fc,0x2,0x281698c0,0xbfbfe208,0x0,0x0) = 0 (0x0)
44650: __sysctl(0xbfbfdd38,0x2,0x2817603c,0xbfbfdd40,0x0,0x0) = 0 (0x0)
44650: __sysctl(0xbfbfdd88,0x2,0xbfbfdd94,0xbfbfdd98,0x0,0x0) = 0 (0x0)
44650: readlink("/etc/malloc.conf",0xbfbfddfb,1024) ERR#2 'No such file or directory'
44650: issetugid(0x2815700a,0xbfbfddfb,0x400,0xbfbfe208,0x0,0x0) = 0 (0x0)
44650: break(0x8100000) = 0 (0x0)
44650: __sysctl(0xbfbfe0a4,0x2,0xbfbfe0ac,0xbfbfe0b0,0x0,0x0) = 0 (0x0)
44650: mmap(0x0,2097152,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANON,-1,0x0) = 672632832 (0x28179000)
44650: munmap(0x28179000,552960) = 0 (0x0)
44650: munmap(0x28300000,495616) = 0 (0x0)
44650: ioctl(1,TIOCGETA,0xbfbfe228) = 0 (0x0)
mknod(file) error: Invalid argument
44650: write(1,"mknod(file) error: Invalid argum"...,36) = 36 (0x24)
44650: process exit, rval = 255
Значит я не один такой. Это хорошо.

Re: Не работает mknod()
Добавлено: 2008-06-17 16:40:04
paradox
утилита mknod
флаг S_IFREG
не юзает
Re: Не работает mknod()
Добавлено: 2008-06-18 2:03:40
zingel
это без разницы, это семафоры POSIX, для mknod используется
Код: Выделить всё
S_IFIFO FIFO-special
S_IFCHR Character-special (non-portable)
S_IFDIR Directory (non-portable)
S_IFBLK Block-special (non-portable)
S_IFREG Regular (non-portable)
Re: Не работает mknod()
Добавлено: 2008-06-18 4:08:34
zingel
paradox
Каюсь, мкнод использует всего два семафора, сука S_IFCHR и S_IFBLK
Код: Выделить всё
File /usr/src/sbin/mknod/mknod.c Row 117
.................
mode = 0666;
if (argv[2][0] == 'c')
mode |= S_IFCHR;
else if (argv[2][0] == 'b')
mode |= S_IFBLK;
else
................
Код: Выделить всё
[root@zingel ~/code]# cat test.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
#ifndef COPY
#define COPY printf("Created by zingel [aka 666.root] 10:11 17.06.2008\n")
#endif
int main(int argc, char ** argv)
{
int krevedko;
if (argc < 2) {
COPY;
printf("Usage %s filename\n", argv[0]);
return 1;
}
krevedko = mknod(argv[1], S_IFCHR | 0666, 0);
if (krevedko) {
printf("mknod(%s) error: %s\n", argv[1], strerror(errno));
}
return krevedko;
}
[root@zingel ~/code]# gcc -o test test.c
[root@zingel ~/code]# ./test device0
[root@zingel ~/code]# ls -la device0
crw-r--r-- 1 root wheel 0, 0 Jun 18 04:05 device0
Блин надо добавить остальные семафоры, но это по-моему в 8 версии уже есть....
Код: Выделить всё
--- /usr/src/sbin/mknod/mknod.c 2008-06-18 04:23:14.000000000 +0300
+++ /root/code/mknod-new.c 2008-06-18 04:24:43.000000000 +0300
@@ -123,6 +123,10 @@
mode |= S_IFCHR;
else if (argv[2][0] == 'b')
mode |= S_IFBLK;
+ else if (argv[2][0] == 'd')
+ mode |= S_IFDIR;
+ else if (argv[2][0] == 'e')
+ mode |= S_IFREG;
else
errx(1, "node must be type 'b' or 'c'");
UPD:
а вообще, нах они нужны, 2 первых вполне хватит.