Холивары в топку

О как же меня достали эти холивары. На любом форуме кодинг/security тематике обязательно найдется тема про "дельфи и с++ что лучше?" или "linux или windows?"
По моему тупость сравнивать такие вещи... ведь по сути с таким же успехом можно сравнивать например слух и зрение. Ведь у каждого свои функции и каждый необходим. Еще больше меня бесит, то что кто то например даже ни разу не сидел в linux и говорит, что это дерьмо. И т.п.

обзор сайта из различных браузеров

browsershots.org
на этом ресурсе можно посмотреть как бы выглядел ваш сайт из самых разных браузеров
Также есть несколько ОС(win,linux,mac)

Основы *NIX кодинга. Часть 1.

Привет всем.
Цель данной статьи рассказать читателям об основах linux программирования с помощью системных вызовов.
В качестве инструментов нам понадобится gcc и make. Они входят в поставку большинства дистрибутивов, ниже я опишу их.


Инструменты.

Перед тем как начать программировать, стоит разобрать, что нам поможет в этом.
Для начала компилятор gcc(GNU project C Compiler):
Пример простейшего использования:

Код:

$gcc /proga.c -o /prog

или так:
Код:

$gcc -o /prog /proga.c

Ключ -o указываем имя и путь к будущему бинарнику
Если в исходном тексте есть ошибки, то умный компилятор укажет на них.
Маны:
http://www.linuxcenter.ru/lib/books/linuxdev/linuxdev1.phtml
http://skif.bas-net.by/bsuir/prog_in_linux/node3.html

Make - программа может состоять из множества файлов, которые нужно как то собрать в один. Если файлов мало то можно собрать использую только gcc, но файлов может быть очень много. Именно для таких случаев и применяем сборщик Make. Для ее работы необходимо использовать makefile - специальные файлы со сценарием сборки.
Что бы лучше понять эти сценарии давайте попробуем собрать программу, состоящую из двух частей с помощью gcc:
У нас есть файл main.c и modul.c:
Код:

$gcc - -c main.c
$gcc - -c modul.c

Тут мы указали ключ -c, он означает, что нужно собрать объектный файл, это еще не является полноценной программой, ее мы соберем дальше:
Код:

$ gcc -o programm main.o modul.c

Теперь мы собрали бинарник из двух файлов.
Итак, вернемся к make, как я уже говорил файлов для сборки может быть очень много, поэтому используем makefile. Попробуем сделать его самим:
Код:

hello:
main.o programm.o
gcc -o programm main.o modul.o

main.o:
main.c
gcc -c main.c

modul.o:
modul.c
gcc -c modul.c

clean:
rm -f *.o programm

Думаю все ясно. Мы выполняем почти те же действия, что и выше, но уже автоматически. В разделе Clean мы отчищаем директорию от временных файлов. Да, и не забываем про знаки табуляции, они очень важны

Вот мануал для самостоятельного изучения
http://www.linuxrsp.ru/docs/gm.html

Тянуть не будем, и перейдем к делу.
Для начала определимся, что такое системный вызов:
Системный вызов это обращение, какой либо прикладной программы к ядру ОС, для выполнения какой либо операции.

Первым, как думаю самым несложным, мы разберем работу с файлами.

Общее представление о работе с файлами.


Для работы с файлами в linux существуют вызовы open, creat, write, read. Думаю, смысл их ясен. Разберем, как они работают.
Код:

open(char *filename, int mode);

Во-первых, функция возвращает -1 при ошибке. Если все нормально, то возвращает дескриптор файла.
char *filename - имя/путь файла
int mode - режим, с которым нужно открыть, т.е. что нужно делать с файлом - читать, писать или читать и писать (=\)
O_RDONLY - чтение
O_WRONLY - запись
O_RDWR - чтение и запись
Для использования этой функции нужно подключить модуль fcntl.h

Пример:
Код:

-----
-----
open("/var/log",O_RDONLY);
-----
-----


Код:

read(int d, char *buf, size_t countb)

Аналогично предыдущей функции возвращается -1 при ошибке, а если ошибок нет то целое число.
int d - источник, т.е. дескриптор, т.е. результат выполнения функции open.
ichar *buf - место, куда будут считаны данные.
size_t countb - ну и кол-во байт, которые нужно считать.
Для использование подключаем модуль unistd.h

Пример
Код:

-------
-------

int d=open('/var/log/',RDONLY);
char *buf;
size_t count b=1024;
read(d,buf,countb)

-------
-------

Код:

creat(char *name, mode_t right)[/COLOR]


char *name - имя создаваемого файла
mode_t right - права на доступ
При ошибке -1.
Для работы подключаем модуль fcntl.h

Пример
Код:

-------
-------
creat("/home/stranger/myfile",754)
-------
-------

Код:

write(int d, char *buff,size_ size);



int d – дескриптор файла для записи
char *buff – сами данные которые нужно записать
size_ size – кол-во байт при записи
-1 при ошибке, для использования подключаем unistd.h

И в конце стоит сказать про -
Код:

close(int d);

Единственный аргумент, который нужно передать функции, это дескриптор открытого файла. И функция закрывает файл.


Ну что ж пришло время написать полноценный пример.
Начнем с простенькой программы для копирования файлов.
В качестве аргументов она будет принимать имя/путь исходного файла и имя/путь
скопированного файла.
Значит сначала открываем исходный файл (open) и считываем его(read). Далее создаем файл (create) и записываем в него считанный первый файл (write).
Код:

#include [stdio.h]
#include [unistd.h]
#include [fcntl.h]
#include [fcntl.h]
#define BUF 1024
main(int argc, char *argv[])

{
int in,out,chars;
char buffer[BUF];
if(argc!=3)
{
printf("Вы ошиблись в вводе аргументов\n");
exit(1);
}
if((in=open(argv[1],O_RDONLY))==-1)
{
printf("Ошибка открытия файла для копирования\n");
exit(1);
}
if((out=creat(argv[2],755))==-1)
{
printf("Ошибка при создании нового файла");
exit(1);
}
while((chars=read(in,buffer,1024))>0)
write(out,buffer,1024);
}

Замечу, что новый файл мы создали с правами 755, что означает rwxr-xr-x. Можно было бы принять эти данные от пользователя.
Теперь я расскажу о таком вызовы как: stat.
Он возвращает нам информацию о файле.
Код:

int i=stat(chat *name, struct stat *buff);

chat *name – имя файла
struct stat *buff – структура типа stat, в ней будет храниться информация о файле.

Какие поля есть у это структуры?:
[/code]
st_mode - тип, права доступа.
st_atime - время последнего доступа.
st_size - размер.
st_uid - юид юзера.
st_gid - идентификатор группы пользователей
st_mtime — время последней модификации файла
st_atime — время последнего доступа
[/code]
Для этого вызова нужно использовать библиотеку sys/stat.h
Давайте напишем пример, который будет выводить информацию о заданном файле:
Код:

#include [stdlib.h]
#include [stdio.h]
#include [sys/stat.h]
int main(int ac,char *ag[])
{
struct stat buffer;
int r;
if(ac!=2)
{
printf("Пожалуйста введите необходимые аргументы\n");
exit(1);
}
if((r=stat(ag[1],&buffer))==-1)
{
printf("Файл не найден\n");
exit(1);
}
printf("Размер файла: %o\n",buffer.st_size);
printf("Права доступа к файлу: %d\n ",buffer.st_mode);
printf("UID: %d\n ",buffer.st_uid);
printf("GID: %d\n ",buffer.st_gid);
}

Изменение статусной информации файла.

Мы уже разобрали несколько операций с файлами. Теперь давайте поговорим об изменении информации о файле. А это – имя, gid, uid, и т.п.
Вообще для этих целей существуют специальные вызовы (разберем ниже), но их использовать необязательно.
Приведу пример, нужно изменить uid файла. Для этого используем всю туже структуру stat, но теперь не считываем информацию, а записываем ее. Пример.
Код:

------
------

buffer.st_uid=0644;

------
------

А вот такой пример изменяет uid файла на наш собственный.
Код:

------
------
buffer.st_uid=getuid();
------
------

Прокомментирую что getuid() возвращает юид текущего юзера.

Вот такой пример проверяет рут вы или нет:
Код:

If(getuid()!=0)
Printf(“Вы не рут, курите дальше»)
Else
Printf(«Похоже вы порутили этот сервер =)»);

Выше упоминалось, что существуют специальные функции для изменения статусной информации о файле. Разберем их:
Меняем имя файла
Код:

Rename(char *oldname, char *newname);

char *oldname – старое имя
char *newname – новое имя
Для использования подключаем stdio.h
Пример:
Код:

------
------
rename(“/dvu”,/home/stranger/jd”);
------
------

Меняем права доступа к файлу.
Код:

chmod(char *namefile, mode_t mode);

char *namefile – путь и имя файла
mode_t modeновые права для файла.

Для испольвания подключаем sys/types.h, sys/stat.h
Пример
Код:

-------
-------
chmod(“/sploit.c”,755);
-------
-------


Изменяем uid,gid:
Код:

chown(char *filename,uid_t uid,gid_t gid);

char *filename – путь и имы файла
uid_t uid[ новые юид
gid_t gid новый gid
Можно указать только uid или только gid.
Для использоания подключаем unistd.h
Пример:
Код:

-------
-------
chown(“/jaga”,0,11);
-------
-------


Побайтное смещение.
Напоследок разберем одну функцию – lseek
она изменят текущую позицию в файле
Код:

lseek(int d,off_t di,int base);

int d – дескриптор файла
off_t di - смещение в байтах
int base – позиция.
Позиции бывают такие:
Код:

SEEK_SET – от начала файла
SEEK_CUR - от текущей позиции
SEEK_END – от конца файла

Напишем пример, который добавляет строку в конец текстового файла
Код:

#include [unistd.h]
#include [unistd.h]
#include [fcntl.h]
#include [stdio.h]
int main()
{
int r;
r=open("/home/stranger/hell.txt",O_RDWR);
lseek(r,0,SEEK_END);
write(r,"hello man!",sizeof("hello man!"));
close(r);
}

OUTRO
На этом пока все. Если статья будет актуальна, то продолжу писать.
Как дополнительный материал могу дать вам статью Ричарда Столлмена “Проект GNU”
http://www.gnu.org/gnu/thegnuproject.html
– исходный текст английский, но снизу страницы можно найти перевод
Удачи!
ps тут оформление более красивое

Украина+XSS

Книги М. Флёнова

[IMHO]
Стал замечать, что в сети все больше обсирают Михаила Фленова. На многих кодерских форумах его фамилия звучит как нецензурное выражение.
Я в этой теме стараюсь держаться особняком. Я не являюсь любителем его литературы, но и фактически противником тоже не являюсь.
У М. Фленова довольно много опубликованых книг. Наверное самые известные: Библия Delphi, Delphi/C++ глазами хакера. Только не пойму почему их не любят? В книгах очень много практики и к тому же доступный стиль повествования несомненно распологает к себе.
После занудных справочников по компьютерным сетям довольно интересно почитать такие книги. В этих публикациях мне не нравиться только название.
Собственно что мне не нравиться - такие книги как: linux глазами хакера, PHP глазами хакера. Если книги про с++ и дельфи автор описывает какие то интересные вещи, возможно даже нестандартные, то в книгах про linux и php Михаил просто описывает возможности с нуля. Т.е. получаеться очередной учебник. Ну и при чем тут хакеры?
... Вобще любая книга это огромный труд. Возможно Фленов пишет их только из за денег, но ведь каждый зарабатывает как хочет.
Вобщем мне нравиться Михаил Фленов, как человек и как программист. Мне нравиться его идеи и взгляды, но к его книгах особой симпатии не испытываю.
[/IMHO]

Мозг кипит

Блин. Замечаю, что все больше и больше стал нагружать себя информацией. Хочется изучать новые языки и при этом нужно стараться не забывать старые. А кроме этого хочется еще изучать сети протоколы и т.п. И на форуме хочеться посидеть. Вот и не знаю, как распределить свое время. Сразу вспоминается название журнала - "Хочу все знать".

P.S.Похоже это болезнь.

Ну ни пиз*ец?

Блин. Сегодня ночью поставил на загрузку федору (3 с лишним гб). Утром просыпаюсь смотрю на монитор и вижу, что виндоус ночью перезагружалась. Федора не слилась даже наполовину. Во всем виновато оказалось автоматические обновление. Ему захотелось именно в это время обновить свои ржавые файлы, и перезагрузить компутер без ведома спящего хозяина. Епт! Я чуть в Редмонд c автоматом не отправился. Блин.

Unix/Linux: теория и практика программирования


Очень интересная книжка. Описывает многие аспекты программирования в unix.
Если хотите программировать в юникс, то стоит начать с этой книжки.

Получение информации о файле, кодинг под linux

Что то давненько я про кодинг не писал.
Сегодня я приведу еще один пример на тему программирования в Linux.
На этот раз мы разберем такую вещь как получения информации о файле.
Для этих целей существует вызов Stat.
Он читает информацию о нужном файле.
Синтаксис таков:

stat(char *file,strict stat fbuf);

Возвращает -1 при ошибке.

Первый аргумент это имя файла, второй структура в которой будет размещена информация о нем, итоге мы сможем читать из этой структуры необходимые поля.
Ну что ж разберем пример, допустим нужно написать программу, которая выводит uid владельца файла.

------------------------------------------------------
#include [stdio.h]
#include [sys/stat.h]// необходимый заголовочный файл
int main(int ac,char *ag[])
{
struct stat buffer; // структура для хранения инфы
if(ac!=1) если кол во аргументов не 1 то
{
if(stat(ag[1],&buffer)!=-1) //если не произошла ошибка то
printf("uid: %d\n",buffer.st_uid); //вывод
else
printf("Не коректное имя файла\n"); // если ошибка
}
else
printf("Пожауйста введите необходимые аргументы\n");
}

---------------------------------------------------------------------------
Думаю все ясно.
Можно вывести более подробную информацию, вот некоторые поля структуры stat:

st_mode - тип, права доступа.
st_atime - время последнего доступа.
st_size - размер.
st_uid - юид юзера.
st_gid - идентификатор группы пользователей.

Кстати, если ввести команду ls -l то в списках можно увидеть как раз результат работы вызова stat.

Copyleft (Ɔ); StraNger ideas