1. Си / Говнокод #18128

    +143

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    9. 9
    static int card_open(struct inode *inode, struct file *f)
    {
        unsigned int		minor = MINOR(inode->i_rdev);
    
        DEBUG(KERN_CRIT "Driver: card_open()\n");
        f->private_data = (void *)(unsigned long long)minor;
    
        return 0;
    }

    А вместо минора надобно захуярить указатель на struct some_idiot_wrote_this *asshole в f->private_data.

    Запостил: codemonkey, 07 Мая 2015

    Комментарии (14) RSS

    • Неужели у этого драйвера из приватных для открытого хендла данных только минор?
      Ответить
      • Да. Там дальше для КАЖДОГО fops'а:
        minor = ((unsigned long long)(f->private_data) & 0xffffffff);
            dev = g_driver_dev[minor];


        Хотя, когда надо было закодировать пару чисел в другом драйвере, родил ЭТО:
        f->private_data = (void *) (((u64) i << 32) | j);
        Ответить
        • > g_driver_dev[minor]
          Мда. Можно же вот так?
          // open
          f->private_data = g_driver_dev[minor];
          // other file operations
          dev = (my_device*)f->private_data;
          Ответить
        • > (void *) (((u64) i << 32) | j);
          Прощание с 32-битными платформами?
          Ответить
          • Типа 32-бит не поддерживается в принципе. Так приказали мудаки в начальстве.

            Блять, что за хуйня с минусами, не видно ГК же.
            Ответить
            • > что за хуйня с минусами
              Это у одного местного жителя жопа горит. Из-за этого он пятнадцатью ботами минусует треды.

              Если хочешь, чтобы твой новый тред заметили - просто напиши к нему комментарий. Тут дофига народу читает сток, даже не заглядывая на главную.
              Ответить
              • А я думал сток - это и есть главная...
                Ответить
              • >>Это у одного местного жителя

                На воре - шапка горит, а у пiдора - жOпу бомбитЪ!
                Ответить
                • И ведь предупреждали, чтобы не садился на колючие предметы...
                  Ответить
    • Вопрос господам говнокодерам: Даны n PCI девайсов, в каждом 2m субдевайсов. Типа

      rooster@prison:~$ ll /dev/kokoko*
      crw-rw-rw- 1 root root 250,  0 May 10 11:46 /dev/kokoko0
      crw-rw-rw- 1 root root 251,  0 May 10 11:46 /dev/kokoko0koko0
      crw-rw-rw- 1 root root 251,  1 May 10 11:46 /dev/kokoko0kudkudah0
      crw-rw-rw- 1 root root 251,  2 May 10 11:46 /dev/kokoko0koko1
      crw-rw-rw- 1 root root 251,  3 May 10 11:46 /dev/kokoko0kudkudah1


      Есть ли смысл для каждого создавать свой cdev, или же джва cdevа на все как сейчас есть и оно работает?
      Ответить
      • Т.е. сейчас создаются /dev/kokoko0koko и /dev/kokoko0kudkudah, а сабдевайсы разруливаются через какое-нибудь поле в ioctl запросе?

        Ну хрен знает... Если с ними по-отдельности работают, и на них надо ссылаться в параметрах или конфигах - можно и растащить. А если одна юзерлендная прога работает со всей кучей одновременно - лучше не растаскивать, чтобы не править и не усложнять её.
        Ответить
        • >Eсли с ними по-отдельности работают, и на них надо ссылаться в параметрах или конфигах - можно и растащить.
          Это с /dev/kokokoXkudkudahY для любых X, Y.

          >А если одна юзерлендная прога работает со всей кучей одновременно - лучше не растаскивать, чтобы не править и не усложнять её.
          А это с /dev/kokokoX для любого X.
          Ответить
          • А, т.е. будет джва способа отправить запрос сабдевайсу?
            Ответить
            • Нет. У /dev/kokoko0kudkudah0 отключено ВСЁ кроме ioctl, а у /dev/kokoko0 ioctl коды другие. С точки зрения параши юзерленда это совершенно разные девайсы, хотя указывают на тот же физический быдлодевайс.

              Ну и конечно в /dev/kokoko0kudkudah0 есть защита от двойного open'a.
              Ответить

    Добавить комментарий