LINUX.ORG.RU

Сообщения s0ldat

 

Вывод остальных hardlinks дял файла

Если у файла больше одного имени (hardlinks) - можно увидеть их количество во второй колонке вывода «ls -l», а как увидеть сами имена?

s0ldat
()

[C preprocessor] способ определить тип OS

Вот пример НЕЭЛЕГАНТНОГО автоопределения Linux/FreeBSD:

#ifdef NAME_MAX
# define Linux 1
#else
# define FreeBSD 1
#endif

и это (с оговорками конечно) работает

Вопрос: есть ли подлинно элегантное решение автоопределения типа OS?
На Linux и FreeBSD только - этого уже хватит. То есть явно детектить по каким-то точно определенным их заголовочных файлов константам. И если нет - ошибка компиляции.

(ибо для маленького сырца хочется обойтись без создания скрипта configure в десять раз большего чем сам исходник)

s0ldat
()

[C] stdout - как «правильно» с ним работать?

Когда просто выводим "Hello world" в stdout и завершаем работу программы - тут все ясно, но если программа ПРОДОЛЖАЕТ выполняться, то получается интересный фокус:

/***** begin test.c *****/
#include <stdio.h>

int main () {
char c;
fprintf(stdout, "Hello world!\n");
c = fgetc(stdin);
return 0;
}
/***** end test.c *****/

$ make test
$ ./test
c
Hello world!
$ ./test > 1
$ ^C
$ cat 1
$

Как видим, если аварийно (по Ctrl-C) завершить работу программы, то никакого "Hello world!" в файле "1" не будет. Хотя код вывода "Hello world" отработал. Как сделать так, чтобы перенаправление в файл работало корректно, в унисон с кодом программы?

 

s0ldat
()

[C] Имеет ли смысл кеширование?

Пишу простой http сервер, и задумал сделать небольшую оптимизацию: если index.html файл небольшой, то копирую его в оперативу и из уже нее выдаю на запросы, а обновляю этот файл только после фиксированной паузы.

Теоретически такой прием дает меньше обращений к файловой системе и гипотетически еще меньше обращений к жесткому диску... Однако я задумался о том что кеширование ядром сводит на полный ноль такую оптимизацию и что в любом случае ядро будет файл держать в оперативе, в том числе при его изменении.

Так есть ли хоть какой-то смысл делать кеширование?

 

s0ldat
()

Преключения языка для просмотра DVD-Rip файла

Допустим известно, что DVD-рипнутый файл кроме русской звуковой дорожки имеет еще english дорожку (американский фильм) - как мне посмотреть фильм в инглише?

s0ldat
()

mc hotkey - синхронизация панелей

Для синхронизации панелей в mc и з портов FreeBSD(7.1) используется "Esc-O" (как и написано в mc help), но в Linux (Mc compiled from sources, Ubuntu8.10 mc) - синхронизирует комбинация "Esc-I", а "Esc-O" ведет себя иначе.

В чем прикол? Почему mc не ведет себя как написано в mc help?

s0ldat
()

tool для перегона text в xml-compliant text

Какой консольной утилитой можно перегнать произвольный текст в текст, пригодный для вставки в XML (замена всех проблемных символов на ссылки к их сущностям)?

s0ldat
()

[C] есть ли поток аналогичный /dev/null ?

В коде заведомо прописан вывод в именованный поток, например:

fprintf (somestream, "Hi there");

но то, что есть somestream, определяется до его использования и это в зависимости от логики программы либо stdout, либо заведомо открытый файл, либо "НИЧТО" - то есть пустой поток, никуда нчего не выводить.

Есть ли стандартный аналог такого потока в C? Если нет, как таковой создать?

 

s0ldat
()

OpenVPN: вопрос насчет route и ifconfig

Мой вопрос не в том чтобы мне помогли настроить VPN, а в том чтобы получить подтверждение/опровержение того факта, что админом мне предоставлено недостаточно данных для подключения к корпоративной сети через VPN, а именно параметры ifconfig и route меня интересуют в перевую очередь. Названия файлов и сервера конечно же изменены.

Мою домашнюю машину (инет через adsl modem в режиме router) необходимо подключить у корпоративной сети через OpenVPN туннель.

От админа я получил:

ca.crt (CERTIFICATE в формате PEM) client.key (RSA PRIVATE KEY в формате PEM) client-config.openvpn (конфиг.файл для openvpn) up.sh и down.sh (старт/стоп скрипты - там только DNS конфигурирование, openvpn они не трогают никак) еще я получил пароль к client.key.

далее я самостоятельно создал себе самоподписанный клиентский сертификат client.crt - так как он уже был определен в конфиге.

Содержимое client-config.openvpn:

client remote openvpn.server.net 443 dev tap comp-lzo proto tcp ca ca.crt cert client.crt key client.key verb 3 up ./up.sh down ./down.sh

есть ли какие-то настройки, которых явно не хватает?

s0ldat
()

[resolv.conf/resolvconf] nameservers для конкретных доменов?

Как указать (само собою также nameserver по умолчанию) дополнительно для конкретных доменов свои конкретные nameserver'ы? Ну например все адреса резолвим через DNS A, но все сайты доменов .example.net через DNS B и т.д... ?

s0ldat
()

[C] Получить данные на TCP сокет

Пытаюсь получить на сокет TCP пакет, но пока безуспешно.
Как сделать программу работающей: чтобы ждала пакет на порту - и при получении оный вывела на терминал? (важна реализация именно с recvmsg() или с recvfrom() )

Код:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

#define PORT 55555

int main() {
int sock;
struct sockaddr_in addr;
struct msghdr msg = {NULL, 0, NULL, 0, NULL, 0, 0};
struct iovec iovbuf;
ssize_t recv_bytes;
char recv_string[1024];

printf("Listening port %i...\n", PORT);

// Create internet socket
sock = socket(AF_INET, SOCK_STREAM, 0);
if(sock < 0) printf("couldn't create socket\n");

// Bind socket to network interface (ip address) and tcp port
addr.sin_family = AF_INET;
addr.sin_port = htons(PORT);
addr.sin_addr.s_addr = htonl(INADDR_ANY);
if (bind(sock, (struct sockaddr *) &addr, sizeof(addr)) != 0)
{ printf("error: couldn't bind socket\n"); exit(1); }

// Receive message
msg.msg_name = &addr;
msg.msg_namelen = sizeof (struct sockaddr_in);
msg.msg_iov = &iovbuf;
msg.msg_iovlen = 1;
iovbuf.iov_base = recv_string;
iovbuf.iov_len = sizeof (recv_string) - 1;

if ((recv_bytes = recvmsg (sock, &msg, 0)) < 0)
{ perror("RECVMSG"); close(sock); exit(1); }
else printf("%s\n",recv_string);

close(sock);
return 0;
}

>>>

 

s0ldat
()

BD в текстовых файлах - домашняя адресная книга

Задолбался вести текстовые файлы с адресами, телефонами и прочими заметками, и теперь ищу БД-подобный механизм хранения такой информации.

SQL-серверы это как из пушки по воробьям, так что вижу цель как простую однопользовательскую базу данных в плоских текстовых файлах.

Пока нашел только один механизм - утилита join из coreutils.

Может есть еще решения?

>>>

s0ldat
()

lolng long int - 8 or 4 bytes?

Демо-программа:

#include <stdio.h>

int main () {
long long int somevar;
printf ("the type of `somevar' is long long int\n");
printf ("sizeof(somevar):\t%i bytes\n", sizeof(somevar));
somevar = -1;
printf ("somevar = -1\nunsigned value of `somevar' is %u\n", somevar);
printf ("this is a value of 4 bytes, isn't it?\n");
return 0;
}


Вопрос:

я хочу хранить данные переменной типа int в восьми байтах.
Пока получается только в 4-х.

Что не так?

>>>

s0ldat
()

Sed/Awk/etc... вопрос

есть строка, содержащая дату в формате YYYY-MM-DD (регулярное например выражение /20[0-1][0-9]-[01][0-9]-[0-3][0-9]/), но в каком месте строки эта дата находится, заведомо не известно

как изъять эту дату из строки, чтобы на выходе была только дата?

Например из строки:
"это произвольное количество символов 2008-08-20 опять произвольное количество символов"

получить на выход:

2008-08-20

>>>

s0ldat
()

Как из скрипта выяснить полный путь к этому же скрипту?

Как из скрипта выяснить полный путь к этому же скрипту?
Например для уверенности, что можно использовать лежащие в той же директории файлы.
Dirname/basename, насколько я их изучил, не помогают.

>>>

s0ldat
()

Конвертация десятичного значения в бинарное

Как в командной строке конвертировать десятичные значения в бинарные? Например 111110001010011 в 31827

>>>

s0ldat
()

Два вопроса по SLAX 6.0.3

1. Проблема с кириллизацией консоли. Обычный способ, работающий в Slackware (loadkres ..., detfont ...), вместо печатания кириллицей дает в лучшем случае неправильные символы и некорректное поведение конслоли. На просмотр текстовых файлов, содержащих кириллицу koi8-r - вместо букв белые квадраты, независимо от шрифта.

2. Звуковой сигнал оболочки невозможно отключить полностью - даже прописав /etc/inputrc и ~/.inputrc параметр "set bell-style none" (в процессе пересборки своего варианта дистрибутива) биип отключается только в баше, а man-страницы (при достижении конца документа), vim (установленный мною) и др. программы продолжают "пищать". Как выключить?

>>>

s0ldat
()

Приведение типа char к unsigned long long

Вот пример:

#include <stdio.h>
int main () {

char charC5 = '\xC5';
char char67 = '\x67';
char charDD = '\xDD';
char char5A = '\x5A';

printf("(unsigned long long) charC5 = %llx\n", (unsigned long long) charC5);
printf("(unsigned long long) char67 = %llx\n", (unsigned long long) char67);
printf("(unsigned long long) charDD = %llx\n", (unsigned long long) charDD);
printf("(unsigned long long) char5A = %llx\n", (unsigned long long) char5A);

return 0;
}


Вот результат его выполнения:

(unsigned long long) charC5 = ffffffffffffffc5
(unsigned long long) char67 = 67
(unsigned long long) charDD = ffffffffffffffdd
(unsigned long long) char5A = 5a

Почему если char-значение начинается не с hex-цифры, на выходе приведения типов ffffffffffffffxx-значение?

>>>

s0ldat
()

(C) Почему unsigned long long не вмещает 0xXXXXXXXXXX?

Насколько я пытаюсь представить, значение типа 0x5555555555 помещается в пять байт, то есть unsigned long long точно подойдет, но компилятор говорит, что только 0x55555555 подходит. В чем я ошибаюсь?

#include <stdio.h>

int main () {
//unsigned long long dig = 0x5555555555; // Error!
unsigned long long dig = 0x55555555; // No Error

printf("sizeof(dig): %i\ndig: %llx\n",sizeof(dig), dig);
return 0;
}

>>>

s0ldat
()

Как скомпилить mc с поддержкой SMB+NLS?

Есть сырцы mc-4.6.1.tar.gz, еще сырцы samba-3.0.28a.tar.gz, и нативно установенная samba-3.0.23c-i486-1 на Slackware-11 (локаль koi8-r)

Хочу скомпилить mc не просто с поддержкой SMB, а чтобы русскоязычные названия файлов и каталогов на виндовых шарах были соответственно читаемы. Пока вместо них знаки вопросов.

Монтирую по smbmount - все замечательно, шрифт и настройки smb.conf корректны:

[global] ... dos charset = cp866 unix charset = koi8-u

>>>

s0ldat
()

RSS подписка на новые темы