LINUX.ORG.RU

Сообщения PPP328

 

Как предполагают одну точку выхода?

Во всех мануалах громко и нецензурно кричат о том, что надо писать строго одну точку выхода из функции в самом ее конце, мол так надежнее - все unlock'и в одном месте, нельзя напортачить с забытым разлоком и проч.

А скажите, господа, а как предполагается тогда писать такие функции? Через миллионы вложенных if'ов? А как это поможет читабельности и надежности?

               }
              }
             }
            }
           }
          }
         }
        }
       }
      }
     }
    }
   }
  }
 }
}
См. https://en.wikipedia.org/wiki/Pyramid_of_doom_(programming)

Собственно код, на котором мне бомбануло:

static YGGBool compare_records_str(CML_Node * haystack1, CML_Node * haystack2, char * needle)
{
    CML_Node * finder1;
    CML_Node * finder2;

    if (CML_NodeFindString(haystack1, needle, &finder1)) return YGG_FALSE;
    if (CML_NodeFindString(haystack2, needle, &finder2)) return YGG_FALSE;

    if (!finder1->data.string) return YGG_FALSE;
    if (!finder2->data.string) return YGG_FALSE;

    if (strcmp(finder1->data.string, finder2->data.string)) return YGG_FALSE;

    return YGG_TRUE;
}

 , ,

PPP328
()

grep: предупреждение: GREP_OPTIONS устарел; используйте псевдоним или сценарий

Проблема в том, что этот скрипт надо запускать и на новой машине и на слаке 2007го года рождения. Как разрулить чтобы ни там ни там не ругалось и работало?

 

PPP328
()

Помогите вспомнить название, найти игру

Вид сбоку, на поле король, который обороняет свой замок. Геймплей разбит на волны, сам персонаж достаточно большой.

Графика как в картонных театрах. Запомнилось что нужно этим королем добывать ресурсы типа дерева чтобы построить себе оборону.

 , ,

PPP328
()

Sed и NTFS

Есть файл и скрипт на ntfs разделе.

echo ">>> $DIRECTORY_PROJECT/$SUBPROJECT_FILE_CONFIG"
        sed -i "/^$SED_BEFORE/c\\$SED_AFTER" \
            "$DIRECTORY_PROJECT/$SUBPROJECT_FILE_CONFIG"
        echo "<<< $DIRECTORY_PROJECT/$SUBPROJECT_FILE_CONFIG"

Выхлоп:
[quote][quote][quote] ./code/libsmilo/project.config[br][/quote][/quote][/quote]sed: preserving permissions for ‘./code/libsmilo/sedf1tP7c’: Операция не позволена
<<< ./code/libsmilo/project.config

При этом скрипт выполняется успешно, делает что нужно. Как убрать его предупреждение?

~$ cat /etc/fstab | grep /mnt/share
# /mnt/share was on /dev/sda5 during installation
UUID=478B676900424A50 /mnt/share      ntfs    defaults,umask=007,gid=46 0       0
~$ ls -ld /mnt/share/Dropbox/Projects/Smilodon2
drwxrwx--- 1 root plugdev 4096 мар 18 15:12 /mnt/share/Dropbox/Projects/Smilodon2

 ,

PPP328
()

Как в gThumb отобразить скрытые каталоги слева?

Старая версия умела отображать, новая (на жтк3) упорно не желает.

gthumb --version
gthumb 3.4.3, Copyright © 2001-2010 Free Software Foundation, Inc.

 

PPP328
()

Что есть для сканера пальцев?

Имеется Lenovo l560 со сканером отпечатков. Что можно использовать для авторизации? Насколько в линуксе все печально?

Bus 001 Device 002: ID 138a:0017 Validity Sensors, Inc. Fingerprint Reader

 , ,

PPP328
()

Атомарная ассемблерная вставка в gcc

Хочу реализовать самый примитивный мьютекс.

Написал такой код: http://pastebin.com/bqX9xKtQ
Компилять так: `gcc -pthread ./lock.c -o lock.elf -lpthread && ./lock.elf`

Прочитал статью в википедии: Тыц

XCHG — Операция обмена между памятью и регистром. Выполняется атомарно на x86-процессорах
Ассемблерная вставка соответствующей атомарной инструкции.

Я так понимаю что мой mutex_lock не является атомарным, а вместо него надо бы заюзать что-то вроде

__asm
{
    mov eax, 1
    xchg eax, mx
}

Так вот, как В ЭТОМ ВАШЕМ GCC С ЕГО ИНОПЛАНЕТНЫМ СИНТАКСИСОМ НАПИСАТЬ ТО ЖЕ САМОЕ?

Для тех кто не в курсе синтаксиса gcc:

asm volatile ( "rdtsc\n\t"   
               "shl $32, %%rdx\n\t"  
               "or %%rdx, %0"        
               : "=a" (msr)
               :
               : "rdx");

 , , ,

PPP328
()

Чем заменить realloc для неизвестного размера принимаемого xml?

Как продолжение топика Помогите нагуглить военный стандарт написания на C .

Есть неизвестного размера (2 - 618 кб (возможно больше)) принимаемый через LAN xml. Возникла необходимость построить суперстабильную систему, для этого пришли к выводу что надо внедрять MISRA-C. А она запрещает realloc. Как быть с принимаемой xml? Буфер статического размера как-то плохо вяжется с неизвестным размером xml. А распарсить xml кусками не представляется возможным.

Отправлять принимаемые байты в файл? А если накрылся диск? На серваке где крутится демон может: закончиться память (стабильно раз в 2-3 дня), посыпаться диск (раз в 2-3 месяца), посыпаться mysql база (раз в 2-3 недели). Серваков 1000+, поэтому вышеперечисленные события случаются каждый день.

Что посоветуете?

 , ,

PPP328
()

Лишний ConfigureNotify с бредовыми данными

Если менять размер окну то сначала приходит ConfigureNotify с x=1, y=24, потом 2xConfigureNotify с нормальными данными:

        {
        case ConfigureNotify :
            printf("%d, %d : %u, %u\n",
                    event.xconfigure.x, event.xconfigure.y,
                    event.xconfigure.width, event.xconfigure.height);
            break;
        }
# Двигаю окно
353, 100 : 791, 600
363, 113 : 791, 600
# Меняю ширину окна на один пиксель (курсором)
1, 24 : 791, 600
363, 113 : 791, 600
363, 113 : 791, 600

Откуда вообще берется такая фигня с x=1 и y=24? Мало того, если я спрашиваю XGetWindowAttributes то там x и y вообще либо всегда 100, 100, либо пресловутые 1,24.

sudo cast Zubok.

 

PPP328
()

Коды ошибок при многомодульном приложении

Есть основной модуль, у него свой набор основных ошибок:

    /*        Name                Code              Description             */ \
    /* No error                                                             */ \
    SML(SUCCESS             , (0x00),        "Successfull                   ") \
    /* System general errors                                                */ \
    SML(SYSTEM_GENERALERROR , (0x01),        "Generic error                 ") \
    SML(SYSTEM_MISUSEOFBLTNS, (0x02),        "Misuse of shell built-ins     ") \
    /* Memory errors                                                        */ \
    SML(USER_BADALLOC       , (0x10 + 0x01), "Memory allocation failed      ") \
    /* Checking errors                                                      */ \
    SML(USER_BADPOINTER     , (0x20 + 0x01), "Bad pointer provided          ") \
    SML(USER_BADVALUE       , (0x20 + 0x02), "Bad value provided            ") \
    SML(USER_BADTYPE        , (0x20 + 0x03), "Bad type provided             ") \
    /* System errors                                                        */ \
    SML(SYSTEM_CANNOTEXECUTE, (0x7E),        "Command invoked cannot execute") \
    SML(SYSTEM_NOTFOUND     , (0x7F),        "Command not found             ") \
    SML(SYSTEM_INVALIDEXIT  , (0x80),        "Invalid argument to exit      ") \
    /* System signals                                                       */ \
    SML(SYSTEM_SIGHUP       , (0x80 + 0x01), "Hangup                        ") \
    SML(SYSTEM_SIGINT       , (0x80 + 0x02), "Interrupt                     ") \
    SML(SYSTEM_SIGQUIT      , (0x80 + 0x03), "Quit                          ") \
    SML(SYSTEM_SIGILL       , (0x80 + 0x04), "Illegal Instruction           ") \
    SML(SYSTEM_SIGTRAP      , (0x80 + 0x05), "Trace/Breakpoint Trap         ") \
    SML(SYSTEM_SIGABRT      , (0x80 + 0x06), "Abort                         ") \
    SML(SYSTEM_SIGEMT       , (0x80 + 0x07), "Emulation Trap                ") \
    SML(SYSTEM_SIGFPE       , (0x80 + 0x08), "Arithmetic Exception          ") \
    SML(SYSTEM_SIGKILL      , (0x80 + 0x09), "Killed                        ") \
    SML(SYSTEM_SIGBUS       , (0x80 + 0x0A), "Bus Error                     ") \
    SML(SYSTEM_SIGSEGV      , (0x80 + 0x0B), "Segmentation Fault            ") \
    SML(SYSTEM_SIGSYS       , (0x80 + 0x0C), "Bad System Call               ") \
    SML(SYSTEM_SIGPIPE      , (0x80 + 0x0D), "Broken Pipe                   ") \
    SML(SYSTEM_SIGALRM      , (0x80 + 0x0E), "Alarm Clock                   ") \
    SML(SYSTEM_SIGTERM      , (0x80 + 0x0F), "Terminated                    ") \
    SML(SYSTEM_SIGUSR1      , (0x80 + 0x10), "User Signal 1                 ") \
    SML(SYSTEM_SIGUSR2      , (0x80 + 0x11), "User Signal 2                 ") \
    SML(SYSTEM_SIGCHLD      , (0x80 + 0x12), "Child Status                  ") \
    SML(SYSTEM_SIGPWR       , (0x80 + 0x13), "Power Fail/Restart            ") \
    SML(SYSTEM_SIGWINCH     , (0x80 + 0x14), "Window Size Change            ") \
    SML(SYSTEM_SIGURG       , (0x80 + 0x15), "Urgent Socket Condition       ") \
    SML(SYSTEM_SIGPOLL      , (0x80 + 0x16), "Socket I/O Possible           ") \
    SML(SYSTEM_SIGSTOP      , (0x80 + 0x17), "Stopped (signal)              ") \
    SML(SYSTEM_SIGTSTP      , (0x80 + 0x18), "Stopped (user)                ") \
    SML(SYSTEM_SIGCONT      , (0x80 + 0x19), "Continued                     ") \
    SML(SYSTEM_SIGTTIN      , (0x80 + 0x1A), "Stopped (tty input)           ") \
    SML(SYSTEM_SIGTTOU      , (0x80 + 0x1B), "Stopped (tty output)          ") \
    SML(SYSTEM_SIGVTALRM    , (0x80 + 0x1C), "Virtual Timer Expired         ") \
    SML(SYSTEM_SIGPROF      , (0x80 + 0x1D), "Profiling Timer Expired       ") \
    SML(SYSTEM_SIGXCPU      , (0x80 + 0x1E), "CPU time limit exceeded       ") \
    SML(SYSTEM_SIGXFSZ      , (0x80 + 0x1F), "File size limit exceeded      ") \
    SML(SYSTEM_SIGWAITING   , (0x80 + 0x20), "All LWPs blocked              ") \
    SML(SYSTEM_SIGLWP       , (0x80 + 0x21), "VI Interrupt for T. Library   ") \
    SML(SYSTEM_SIGAIO       , (0x80 + 0x22), "Asynchronous I/O              ") \
                                                                               \
    SML(SYSTEM_OUTOFRANGE   , (0xFF),        "Exit status unknown           ") \
    /* Maximum is 255, as this index will be sent to exit() function        */

И есть пара модулей, каждый из которых делает какую-нибудь свою вещь, абсолютно не связанную (или наследованный от другого) с другим модулем. Выполнены в виде .so либ. К примеру модуль работы с иксами. У него свои коды ошибок:


    /* X-Server errors                                                      */ \
    SML(USER_XBADINIT       , (0x30 + 0x01), "Bad X-Server initialisation   ") \
    SML(USER_XBADVALUE      , (0x30 + 0x02), "Bad X-Resource value          ") \
    SML(USER_XBADWINDOW     , (0x30 + 0x03), "Bad X-Window                  ") \
    SML(USER_XBADPIXMAP     , (0x30 + 0x04), "Bad X-Pixmap                  ") \
    SML(USER_XBADATOM       , (0x30 + 0x05), "Bad X-Atom                    ") \
    SML(USER_XBADCURSOR     , (0x30 + 0x06), "Bad X-Cursor                  ") \
    SML(USER_XBADFONT       , (0x30 + 0x07), "Bad X-Font                    ") \
    SML(USER_XBADMATCH      , (0x30 + 0x08), "Bad X-Match                   ") \
    SML(USER_XBADDRAWABLE   , (0x30 + 0x09), "Bad X-Drawable                ") \
    SML(USER_XBADACCESS     , (0x30 + 0x0A), "Bad X-Access                  ") \
    SML(USER_XBADALLOC      , (0x30 + 0x0B), "Bad X-Alloc                   ") \
    SML(USER_XBADCOLOUR     , (0x30 + 0x0C), "Bad X-Colour                  ") \
    SML(USER_XBADGC         , (0x30 + 0x0D), "Bad X-GC                      ") \
    SML(USER_XBADID         , (0x30 + 0x0E), "Bad X-ID                      ") \
    SML(USER_XBADNAME       , (0x30 + 0x0F), "Bad X-Name                    ") \
    SML(USER_XBADLENGTH     , (0x30 + 0x10), "Bad X-Length                  ") \
    SML(USER_XBADIMPLEMENT  , (0x30 + 0x11), "Bad X-Implement               ") \

Ну для примера, возьмем еще один модуль, модуль юза шаред памяти, у него скажем тоже будет пара своих ошибок ну и пр.

И, собственно, архитектурный вопрос (с ЯП не связанный): как лучше сделать функцию, возвращающую описание ошибки по коду? У каждого модуля своя? А если он также может вернуть какую-нибудь generic ошибку? Типа bad pointer из главного модуля. Или лучше сделать функцию RegisterError(int code, char * desc), вызываемую при ините модуля? И тогда юзать единую функцию из главного модуля? А что если ошибок понадобится > 255? Сейчас модулей уже 8 штук, каждый хочет 5-8 кодов, а все это дело я хочу возвращать в совместимом с exit(code) виде (0..255).

Ну, собственно, сабж. Есть какое-нибудь общепринятое решение?

 

PPP328
()

Инициализация модуля с наименьшим оверхедом в си

Есть либа (A-Library), предоставляющая некоторые функции. Она коннектится к другой либе (B-Library) и получает некую структуру:

typedef struct
{
   int a;
   int b;
   ...
   char z[256];
} AAA;

# In A-Library
int SomeFunc()
{
  AAA * aaa = GetAAAFromB();

  /// Do stuff
}

int SomeMoreFunc()
{
  AAA * aaa = GetAAAFromB();

  /// Do more stuff
}

int SomeEvenMoreFunc()
{
  AAA * aaa = GetAAAFromB();

  /// Do even more stuff
}

Понятно, что може например вынести ее глобально (как вариант через static):

# In A-Library
AAA * aaa = NULL;

int SomeFunc()
{
  if (!aaa) aaa = GetAAAFromB();

  /// Do stuff
}

int SomeMoreFunc()
{
  if (!aaa) aaa = GetAAAFromB();

  /// Do more stuff
}

int SomeEvenMoreFunc()
{
  if (!aaa) aaa = GetAAAFromB();

  /// Do even more stuff
}

Вопрос - как с наименьшим оверхедом проинициализировать ее? Нужно:
1. Обойтись без LibraryAInit функции
2. Обойтись без компиляторого-зависимых решений (need c89)
3. Обойтись без костылей в виде проверки в каждой функции, функций много и выглядит костыльно.
4. Представить что GetAAAFromB выполняется долго.

Может как-то намутить с адресами на функцию? Типа сначала адрес на GetAAAFromB, а потом на func() { return aaa; } ? Какие еще есть идеи?

 

PPP328
()

Чем чревата прямая инкапусляция структур в си?

#include <stdlib.h>
#include <stdio.h>

typedef struct
{
   int a;
   char b;
   char c[20];
} TypeA;

typedef struct
{
  TypeA ta;
  int d;
} TypeB;

int main(void)
{
   /* Без проверок на аллокацию, суть не в них */
   TypeA * ta = malloc(sizeof(TypeA));
   ta->a = 5;   

   TypeB * tb = realloc(ta, sizeof(TypeB));
   tb->ta.b = 6;

   printf("%d, %d\n", tb->ta.a, tb->ta.b);

   free(tb);

   return 0;
}

UB?

 

PPP328
()

Как сделать run.sh для QtCreator в режиме редактора чтобы поддерживался дебаг?

Если запускать средствами QtCreator (сам он используется тупо как редактор) - то дебаг поддерживается (он при этом спросит какой бинарь я хочу запускать). Хочу сделать чтобы у меня был run.sh, который будет запускать QtCreator и чтобы при этом можно было например поставить брякпоинт на конкретную строку и gdb понял что я от него хочу.

Осуществимо?

 ,

PPP328
()

Бага в libxml2?

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

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
  <aaa xmlns:de="http://www.dolby.com/dcinema/ws/smi/v11/SPL"        atr="abc"       xmlns:fe="http://somewhere">
   some text
   <de:bbb atr1="abb"  atr2="baa" >aaa</de:bbb>
   <de:ccc>aaa</de:ccc>
   <fe:ddd>bbb</fe:ddd>
   some more text
  </aaa>

XML валидный, проверено.

Что я получаю в итоге у себя (не обрабатываю неймспейсы пока):
space - text
* - attribute
$ - PI
+ - node
} - namespace definition
{ - namespace use

{
    '$xml' => {
        '*version' => '1.0',
        '*encoding' => 'UTF-8',
        '*standalone' => 'yes',
        ' xml' => '\x0A  ',
    },
    '+aaa' => {
        '*xmlns:de' => 'http://www.dolby.com/dcinema/ws/smi/v11/SPL',
        '*atr' => 'abc',
        '*xmlns:fe' => 'http://somewhere',
        ' aaa' => '\x0A   some text\x0A   ',
        '+de:bbb' => {
            '*atr1' => 'abb',
            '*atr2' => 'baa',
            ' de:bbb' => 'aaa',
        },
        ' aaa' => '\x0A   ',
        '+de:ccc' => {
            ' de:ccc' => 'aaa',
        },
        ' aaa' => '\x0A   ',
        '+fe:ddd' => {
            ' fe:ddd' => 'bbb',
        },
        ' aaa' => '\x0A   some more text\x0A  ',
    },
},

Что я получаю у libxml2:

{
    '+aaa' => {
        ' aaa' => '\x0A   some text\x0A   ',
        '+bbb' => {
            ' bbb' => 'aaa',
            '*atr1' => 'abb',
            '*atr2' => 'baa',
            '}de' => 'http://www.dolby.com/dcinema/ws/smi/v11/SPL',
            '}fe' => 'http://somewhere',
        },
        ' aaa' => '\x0A   ',
        '+ccc' => {
            ' ccc' => 'aaa',
            '}de' => 'http://www.dolby.com/dcinema/ws/smi/v11/SPL',
            '}fe' => 'http://somewhere',
        },
        ' aaa' => '\x0A   ',
        '+ddd' => {
            ' ddd' => 'bbb',
            '}fe' => 'http://somewhere',
        },
        ' aaa' => '\x0A   some more text\x0A  ',
        '*atr' => 'abc',
        '{de' => 'http://www.dolby.com/dcinema/ws/smi/v11/SPL',
        '{fe' => 'http://somewhere',
    },
},
Обратите внимание, что он пририсовал bbb сразу два неймспейса, пририсовал ccc сразу два неймспейса и пририсовал один (правильно) неймспейс для ddd.

ЧЯДНТ? Бага? Фича?

 

PPP328
()

Проясните по TLS

Добрый день!

Разрабытываю либу общения с устройством, там бинарны протокол через веб-сокеты. Попалось такое же устройство, но которое еще и оборачивает все это дело в TLS. Известны параметры ключа, все дела, протокол остается якобы тот же.

До этого дел с шифрованием не имел, в сортах криптографии не разбираюсь.

Подскажите, как мне имплементировать поддержку TLS в мою либу (pure C), чтобы это было мЕньшим геморроем? Ну то есть у меня есть внутри алгоритмы вычленения пакета, проверки, и пр. и пр, причем там для ряда устройст серии разные ветки и проверки.

Как мне все это дело обернуть в этот ваш TLS? Как это вообще выглядит в канале? TCP?

 , ,

PPP328
()

Библиотека трансляции Perl Storable <-> C struct

https://github.com/codemeow/camelion

Умеет:

  • Читать\писать perl storable
  • Читать\писать perl nfreezed binary
  • Самостоятельно создавать\редактировать структуры для трансляции

Дополнительно позволяет использовать себя как считыватель настроект для С-программы - кладем настройки в perl-storable и в файл и считываем либой. Поддерживает хэши любой вложенности, массивы, строки, инты.

 ,

PPP328
()

Модуль для слежения за аллоцируемой памятью

Старый лоровский акк потерял (Edible), запилил этот.

Короче. Модуль для слежения за аллоцируемой памятью. Можно подключить в коде (прописать один инклуд для си-проекта), можно использовать уже для скомпилированного проекта (на любом языке). Инструкции в ридми. Выхлопывает так:

[C-TH][        07_all_coloured.c:0009] Malloc :              0x00000190 B (0x09A9C008) : Success
[C-TH][        07_all_coloured.c:0013] Realloc: (0x09A9C008) 0x00000320 B (0x09A9C028) : Success
[C-TH][        07_all_coloured.c:0017] Free   : (0x09A9C028)                           : Success
[C-TH][        07_all_coloured.c:0019] Calloc :              0x00000080 B (0x09A9C008) : Success
[C-TH][        07_all_coloured.c:0022] Free   : (0x09A9C008)                           : Success

Может стрелять в stdout/stderr/файл. Может убрать необходимость проверять на null, может красить выхлоп с помощью ANSI-кодов.

https://github.com/codemeow/c-heetah

Берите, кому надо.

 , , ,

PPP328
()

Chrome + ZenMate = ERR_SPDY_PROTOCOL_ERROR

Пробовал менять сервера, пробовал флюшить сокеты, ребутить браузер и роутер.

Что можно с этим еще поделать? Опера свой впн для линукса еще не включила, фурефокс жрет почти все мои 2ГБ памяти.

 ,

PPP328
()

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