LINUX.ORG.RU

Сообщения zloy_starper

 

Как бы вы на C «разобрали» сообщение DBus?

Вот реальное сообщение, описывающее блочное устройство, полученное через DBus:

method return sender=:1.28 -> dest=:1.81 reply_serial=2
   array [
      dict entry(
         string "Device"
         variant             array of bytes [
               2f 64 65 76 2f 73 64 64 31 00
            ]
      )
      dict entry(
         string "PreferredDevice"
         variant             array of bytes [
               2f 64 65 76 2f 73 64 64 31 00
            ]
      )
      dict entry(
         string "Symlinks"
         variant             array [
               array of bytes [
                  2f 64 65 76 2f 64 69 73 6b 2f 62 79 2d 69 64 2f 75 73 62 2d
                  50 72 6f 6c 69 66 69 63 5f 54 65 63 68 6e 6f 6c 6f 67 79 5f
                  49 6e 63 2e 5f 55 53 42 5f 4d 61 73 73 5f 53 74 6f 72 61 67
                  65 5f 44 65 76 69 63 65 2d 70 61 72 74 31 00
               ]
               array of bytes [
                  2f 64 65 76 2f 64 69 73 6b 2f 62 79 2d 6c 61 62 65 6c 2f 43
                  4f 52 53 41 49 52 00
               ]
               array of bytes [
                  2f 64 65 76 2f 64 69 73 6b 2f 62 79 2d 70 61 74 68 2f 70 63
                  69 2d 30 30 30 30 3a 30 30 3a 31 61 2e 30 2d 75 73 62 2d 30
                  3a 31 2e 34 2e 31 3a 31 2e 30 2d 73 63 73 69 2d 30 3a 30 3a
                  30 3a 30 2d 70 61 72 74 31 00
               ]
               array of bytes [
                  2f 64 65 76 2f 64 69 73 6b 2f 62 79 2d 75 75 69 64 2f 44 38
                  30 30 2d 37 32 45 30 00
               ]
            ]
      )
      dict entry(
         string "DeviceNumber"
         variant             uint64 2097
      )
      dict entry(
         string "Id"
         variant             string "by-uuid-D800-72E0"
      )
      dict entry(
         string "Size"
         variant             uint64 1040171008
      )
      dict entry(
         string "ReadOnly"
         variant             boolean false
      )
      dict entry(
         string "Drive"
         variant             object path "/org/freedesktop/UDisks2/drives/Prolific_Technology_Inc_2e_USB_Mass_Storage_Device_Prolific_Technology_Inc_2e_USB_Mass_Storage_Device"
      )
      dict entry(
         string "MDRaid"
         variant             object path "/"
      )
      dict entry(
         string "MDRaidMember"
         variant             object path "/"
      )
      dict entry(
         string "IdUsage"
         variant             string "filesystem"
      )
      dict entry(
         string "IdType"
         variant             string "vfat"
      )
      dict entry(
         string "IdVersion"
         variant             string "FAT16"
      )
      dict entry(
         string "IdLabel"
         variant             string "CORSAIR"
      )
      dict entry(
         string "IdUUID"
         variant             string "D800-72E0"
      )
      dict entry(
         string "Configuration"
         variant             array [
            ]
      )
      dict entry(
         string "CryptoBackingDevice"
         variant             object path "/"
      )
      dict entry(
         string "HintPartitionable"
         variant             boolean true
      )
      dict entry(
         string "HintSystem"
         variant             boolean false
      )
      dict entry(
         string "HintIgnore"
         variant             boolean false
      )
      dict entry(
         string "HintAuto"
         variant             boolean true
      )
      dict entry(
         string "HintName"
         variant             string ""
      )
      dict entry(
         string "HintIconName"
         variant             string ""
      )
      dict entry(
         string "HintSymbolicIconName"
         variant             string ""
      )
   ]
Для не особо посвященных пояснение. Это массив из некоторого числа элементов типа dict entry. Каждый элемент типа dict entry состоит из элементов типа string и variant. Элемент variant содержит любой иной элемент (строку, или массив, или булевское значение).

Libdbus дает следующие инструменты. Можно получить первый интератор сообщения. Можно получить тип итератора. Можно получить следующий итератор сообщения. Если итератор имеет составную структуру (array, variant и пр.), то можно получить первый субитератор этого составного итератора, а с ним работать аналогично.

Собственно, чтобы просто это дело напечатать (приведен вывод утилиты dbus-send), пишем функцию, которая в цикле получает очередной итератор, анализирует его тип, и, если итератор составной уходит в рекурсию, если простой печатает.

Но задача стоит иначе. Надо проанализировать итераторы типа dict entry, и в зависимости от того, что там лежит в string, поместить значение итератора variant в соответствующее поле структуры. Ну к примеру: string «Device», сохраняем array of bytes [2f 64 65 76 2f 73 64 64 31 00] в поле device.

Собственно, задачу то решил. Но как-то громоздко получилось. Может предложите что-нибудь элегантное и простое. Бывает же такое, что упрешься в одно решение, и не видишь ничего вокруг.

zloy_starper
()

Проясните вопросик про UNIX socket.

Когда создается PF_UNIX и SOCK_DGRAM сокет, то при чтении из него recvfrom выдает не имеющую смысла информацию об отправителе пакета. В таком случае такой сокет не может быть использован для двустороннего обмена информацией между одним сервером и несколькими клиентами? Или я чего-то не понимаю?

zloy_starper
()

Что за странный API у udisks2?

Что-то никак не возьму в толк, как с этим вообще работать через Dbus. Как получить перечень подключенных устройств (аналог enumerate)? Какие сигналы передаются?

zloy_starper
()

Как скомпилировать код, в котором используются __builtin расширения gcc?

Линкер ругается, что не находит соответствующий символ.

zloy_starper
()

Помогите разобраться с automake

Есть необходимость поправить Makefile.am в проекте xfce-cpufreq-plugin. Но никак не соображу как. Нужно, чтобы перед тем, как начиналась сборка бинарников из сишных исходников создавался файл freqset.h и в этом файл определялось мокроопеределение #define FREQSETDIR $(plugindir). Имеется в виду, чтобы подставлялось значение переменной plugindir, которая задается в Makefile.am.

Вот оригинальный Makefile.am


plugindir = $(libexecdir)/xfce4/panel-plugins
plugin_PROGRAMS = xfce4-cpufreq-plugin

xfce4_cpufreq_plugin_CFLAGS =					\
	-I$(top_srcdir)						\
	@LIBXFCE4PANEL_CFLAGS@					\
	@LIBXFCE4UTIL_CFLAGS@					\
	@LIBXFCEGUI4_CFLAGS@					\
	-DPACKAGE_LOCALE_DIR=\"$(localedir)\"

xfce4_cpufreq_plugin_LDADD =					\
	@LIBXFCE4PANEL_LIBS@					\
	@LIBXFCE4UTIL_LIBS@					\
	@LIBXFCEGUI4_LIBS@

xfce4_cpufreq_plugin_SOURCES =					\
	xfce4-cpufreq-plugin.h					\
	xfce4-cpufreq-plugin.c					\
	xfce4-cpufreq-linux.h					\
	xfce4-cpufreq-linux.c					\
	xfce4-cpufreq-configure.h				\
	xfce4-cpufreq-configure.c				\
	xfce4-cpufreq-overview.h				\
	xfce4-cpufreq-overview.c				\
	xfce4-cpufreq-utils.h					\
	xfce4-cpufreq-utils.c
	
desktop_in_in_files = xfce4-cpufreq-plugin.desktop.in.in
desktop_in_files = $(desktop_in_in_files:.desktop.in.in=.desktop.in)
	
desktopdir = $(datadir)/xfce4/panel-plugins
desktop_DATA = $(desktop_in_files:.desktop.in=.desktop)
@INTLTOOL_DESKTOP_RULE@

EXTRA_DIST = 								\
	$(desktop_in_in_files)

DISTCLEANFILES =							\
	$(desktop_DATA) $(desktop_in_files)
	
# get full path into .desktop file
%.desktop.in: %.desktop.in.in
	sed -e "s^@PLUGIN_PATH@^$(libexecdir)/xfce4/panel-plugins^"	\
		$< > $@

Понимаю, что по аналогии нужно задать что-то типа: sed -e «s^@PLUGIN_PATH@^$(libexecdir)/xfce4/panel-plugins^» \ $< > $@

но только для freqset.h freqset.h.in (или просто через echo без sed и шаблона). Но никак не могу понять, как правильно задать цель. И по поводу % в исходном Makefile.am тоже хотелось бы услышать разъяснения. Спасибо.

zloy_starper
()

xfce panel plugin: можно ли в плагине получить путевое имя файла плагина

Как в коде плагина для панели получить полное путевое имя каталога, в котором этот плагин лежит, или полное путевое имя файла этого плагина?

zloy_starper
()

Посоветуйте библиотеку (или иное решение), позволяющую генерировать «хорошие» случайные числа.

Пожалуй добавить к вопросу особенно нечего.«Хорошие» - понятие условное. Но, думаю, понятно, о чем речь.

zloy_starper
()

libdbus: как обработать ошибку, возвращаемую удаленным методом?

Вызываю удаленный метод, у которого есть только входной поток данных, а выходного нет, т.е. этот метод не должен ничего возвращать, если не было ошибок. А вот в случае ошибок, то как указано в доке могут вернуться ошибки: org.freedesktop.PolicyKit.Error.NotAuthorized org.freedesktop.PolicyKit.Error.Busy org.freedesktop.PolicyKit.Error.Failed org.freedesktop.PolicyKit.Error.Cancelled

и т.д.

Так вот, после отработки удаленного метода вызывается моя pending_callbac_proc. В нее передается pending, из pending получаем message.Что дальше? Искать в message iterator, у которого тип будет string, и в нем соответственно будет строчка типа:«org.freedesktop.PolicyKit.Error.NotAuthorized»? Или результат на ошибки как-то иначе проверяется?

zloy_starper
()

Как в bash вывести в stdout бинарное число?

Скажем, ест у меня переменная со значением 55. Нужно, чтобы скрипт выдал не строку «55», а символ, код которого равен 55, ну или иными словами записал в выходной поток байт со значением 55.

zloy_starper
()

Подсчитать частоту значений байтов в файле

Чувствую, что знатоку sh, perl, awk и т.п. написать скрипт минутное дело. Сам, к сожалению, слишком нерегулярно пользуюсь такими средствами, чтобы это быстрее осилить, нежели слабать прогу на c. Кому не жалко на это дело 5 минут, помогите. А может вообще есть стандартная утилита для этого дела, только сейчас не припомнить. Файл бинарный. Заранее спасибо.

zloy_starper
()

Можно ли определить, в каком потоке произошло segfault?

Пытаюсь найти ошибку в программе. Программулина использует libdbus, соответственно имеется цикл обработки событий и отдельный поток для gui. Кошмар заключается в том, что имеется плавающая ошибка. Возникает она видимо при определенном стечении интервалов времени между отдельными событиями и последовательности событий. Пробовал программулину на 3-х разных машинках - работает. На 4-ой иногда крэшится. Более того, при детальном выводе отладочной инфы получить это фатальное стечение обстоятельств не удается. Но таки один раз зацепил эту ошибку в gdb. Он указал, в процессе выполнения какой библиотечной функции произошло segfault. И вот тут то у меня возник, может быть и глупый, вопрос. А отслеживается ли gdb, в каком именно потоке произошел крэш, если вдруг на многоядерной системе в этот момент времени выполнялись одновременно оба потока?

zloy_starper
()

Каким образом читается Extention ROM контролеров через sysfs

Из /sys/bus/pci/devices/.../rom можно прочесть Extention ROM BIOS соответствующего контролера (у которого разумеется это расширение есть). Кто-нибудь в курсе, как это делается? Просто читается соответствующая затененная область ОЗУ, куда прописывается BIOS? Или тут что-то похитрее реализовано?

zloy_starper
()

У кого сейчас GNOME, или KDE под рукой покажите вывод xprop для root-окна.

Пожалуйста, помогите.

zloy_starper
()

Соединение компов через нуль-модемный кабель.

Хочу проверить исправность кабеля и com-портов. Я правильно думаю, что соединив два компа, можно на обоих запустить minicom, или что-нибудь в этом духе, и если на одном в компе в minicom ввести текст, то в случае исправного железа на другом компе minicom этот текст отобразит?

zloy_starper
()

Как из uri получить строку (utf-8) и наоборот на С?

ЯП C. glib не предлагать.

zloy_starper
()

Как нынче реализуются cut, copy, past для файлов в файловых менеджерах?

Собственно общий принцип понятен: когда нажимается cut или copy, то в clipboard помещается путевое имя файла (файлов), когда нажимается past, то из clipboard это имя читается, далее собственно выполняется операция с файлом.

Однако, не понятно, какие используются типы атомов. Залез на freedesktop.org. Всегда хотелось плеваться, глядя на этот сайт. Фиг там что найдешь. Чуда не случилось и сейчас. По данному вопросу там молчок.

Попользовался всякими X-ми утилитами. Вроде как для копирования файлов используется атом x-special/gnome-copyed-files. В буфер судя по всему помещается uri файла (тут тоже вопрос: как туда пишется utf8, например). Но по меньшей мере, есть над чем поработать для первого времени.

Но вот вопрос: как отличается copy от cut? Кроме x-special/gnome-copyed-files других атомов не обнаружил.

zloy_starper
()

Как разделить многобайтовую строку на несколько частей?

Как разделить многобайтовую строку на несколько составляющих ее подстрок? Первое, что приходит в голову - преобразовать mb строку в wc строку, wc строку порезать на нужное число частей, получившиеся кусочки wc строк преобразовать обратно в mb строки.

zloy_starper
()

Програма на C: простейший способ узнать IP своего хоста

Можно конечно и запустить ifconfig и отпарсить его вывод. Но может есть более простое решение?

zloy_starper
()

Можно ли перенаправить вывод lftp в канал?

Запускаю примерно следующую команду для зеркалирования некоторых данных с удаленной машины на локальную.

lftp -c «lcd update ; ftp://192.168.10.2/update; mirror »

Но запускаю это дело из другой проги. Зеркалирование занимает некоторое время. Хотелось бы отобразить в этой проге пользователю хоть какую-нибудь информацию о том, что процесс идет. Можно вывод lftp перенаправить в канал, что бы читать его из той проги, откуда запускается lftp?

zloy_starper
()

SQUID: какие протоколы доступны для acl типа proto?

Где не прочту - везде одно и то же:

acl aclname proto HTTP FTP ...

Ну а что скрывается за многоточием? Ничего?

zloy_starper
()