herm1t LIVE!ng room - [entries|archive|friends|userinfo]
herm1t

[ website | twilight corner in the herm1t's cave ]
[ userinfo | ljr userinfo ]
[ archive | journal archive ]

[Jul. 26th, 2012|02:20 pm]
Previous Entry Add to Memories Tell A Friend Next Entry
[Tags|]
[Current Mood | annoyed]

mount.c:
  2174          progname = argv[0];
  2175          if ((p = strrchr(progname, '/')) != NULL)
  2176                  progname = p+1;
Зачем они так, а?
LinkLeave a comment

Comments:
From:(Anonymous)
Date:July 26th, 2012 - 02:59 pm
(Link)
./some/path/mount -> mount
[User Picture]
From:[info]herm1t
Date:July 26th, 2012 - 03:02 pm
(Link)
$ cat > 1.c
main() { execve("/bin/mount", 0, 0); }
$ gcc 1.c && ./a.out
Segmentation fault
$
From:[info]max630.net
Date:July 26th, 2012 - 08:32 pm
(Link)
если execv запускать с argv=0 - вообще много крови будет.
[User Picture]
From:[info]efemerid
Date:July 26th, 2012 - 04:52 pm
(Link)
Затем, что могут.

В смысле, язык позволяет. Если бы этим людям разрешали писать только на Паскале, мир был бы чище.
[User Picture]
From:[info]ketmar
Date:July 27th, 2012 - 09:51 am
(Link)
а нефиг на argv[0] забивать. никто — риальне, никто практически не проверяет на случай argc == 0. и я не проверяю. ибо нехуй. потому что другого переносимого способа определить, как меня зовут, нет. поэтому будьте уж так любезны, предоставляйте хоть это.
[User Picture]
From:[info]herm1t
Date:July 27th, 2012 - 10:04 am
(Link)
все-таки способы получить настоящий путь (кажется) есть везде, а если не хочется, то хотя бы argc?argv[0]:"фубарище" - к пользовательскому вводу нужно относиться так, как он этого заслуживает. имхо.
[User Picture]
From:[info]ketmar
Date:July 27th, 2012 - 10:10 am
(Link)
способы-то есть, переносимых способов нет. к тому же в argv[0] совершенно не обязательно что-то настоящее лежит (заразы).

алсо, argv[0] — это ни разу не пользовательский ввод, это системное соглашение. если кто-то забыл его соблюсти… ну, проблемы негров и индейцев. хотя и можно if (!argc) abort();, но лениво.
[User Picture]
From:[info]herm1t
Date:July 27th, 2012 - 10:16 am
(Link)
> это ни разу не пользовательский ввод

в стандарте - implementation defined. и пользователь может запихнуть туда что угодно. лениво конечно, да, и о чем тут вообще разговаривать.

вот это еще понравилось:

if (Argc < 0)
progname = "sudo";
else if ((progname = strrchr(Argv[0], '/')) != NULL)
progname++;
else
progname = Argv[0];
[User Picture]
From:[info]ketmar
Date:July 27th, 2012 - 10:11 am
(Link)
в принципе, проверять на argc<1 — это почти то же самое, что проверять, не NULL-ы ли элементы argv от 0 до argc-1. в принципе, никто не мешает так извращаться, но нафига?
From:(Anonymous)
Date:January 22nd, 2013 - 09:12 pm
(Link)
readlink() от /proc/self/exe, стало быть, тяжело сделать
[User Picture]
From:[info]herm1t
Date:January 23rd, 2013 - 11:13 am
(Link)
есть два варианта. либо действительно argv[0] (чтобы узнать чего хотел пользователь), но без тупых ошибок; либо реальный путь к бинарю - тогда в стеке за aux-вектором он родимый и лежит. можно и readlink, но зачем? I/O, и все такое...
From:(Anonymous)
Date:January 23rd, 2013 - 02:01 pm
(Link)
>либо действительно argv[0]
где-то, кажется, на Darwin, были с этим проблемы. алсо там по умолчанию нет procfs, патовая ситуация была.

>тогда в стеке за aux-вектором он родимый и лежит
это специфично для системы, которая использует ELF, не так ли?

>но зачем? I/O, и все такое...
если это раз за программу делается, то, по-моему, ок.
к тому же, парадигма Unix: "все есть файл".
[User Picture]
From:[info]herm1t
Date:January 23rd, 2013 - 02:03 pm
(Link)
"это специфично для системы,"

дык, давно пора стандартизировать некий getprogname, и перестать спотыкаться на элементарных вещах, так или иначе эта инфа есть в любой системе, либо на теке, либо отдается системным вызовом.

"к тому же, парадигма Unix: "все есть файл"."
на системном вызове нужно опять-таки не забыть проверить возвращаемое значение...
From:[info]remedie
Date:January 25th, 2013 - 03:11 pm
(Link)
ну да, стандартизация решает все эти байтопроблемы