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

    +133

    1. 1
    2. 2
    3. 3
    if (access(path, aflag) && mkfifo(path, mode) {
            exit(-1);
    }

    Весьма интуитивная запись условия

    Запостил: evg_ever, 11 Апреля 2014

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

    • Проверяют существование файла фифы access()'ом... Упрлс.
      Ответить
      • Это ж не сокет, так что открыть можно.
        Edit: а хотя у меня на FreeBSD access возвращает "ОК" на сокеты, хотя их и открыть нельзя.
        Ответить
      • Почему существование? Там в качестве aflag передаётся R_OK или W_OK
        Ответить
        • А потому что если он существует, а прав нету, то mkfifo один хуй эту проблему не исправит :)

          1) фифы нету - access вернет -1, mkfifo попытается запилить новую
          2) фифа есть, но нету нужных прав - access вернет -1, mkfifo попытается запилить и всяко обломается
          3) фифа есть, есть права - access вернет 0
          Ответить
          • Имхо корректней будет как-то так:
            if (mkfifo(path, mode) == 0) {
                // фифа создана, все зашибись
            } else if (errno == EEXIST) {
                // фифа уже существует
            } else {
                // создание фифы обломалось
            }
            Ну либо смотреть на errno после access() и создавать только по ENOENT.
            Ответить
            • > Ну либо смотреть на errno после access() и создавать только по ENOENT.
              Как-то так:
              if (access(path, aflag) == 0) {
                  // фифа есть, работаем с ней
              } else if (errno == ENOENT) {
                  // фифы нет, запиливаем
                  if (mkfifo(path, mode) == 0) {
                      // запилилась, можно работать
                  } else {
                      // не запилилась, делаем харакири
                  }
              } else {
                  // нету прав или что-то еще, делаем харакири
              }
              Но на самом деле access() большого смысла тут не имеет, т.к. скорее всего фифу один хер будут открывать, и проще и атомарней смотреть на ошибку open()'а :)

              Короче чтобы выбрать правильный вариант надо знать что именно делают с фифой и что делать если она уже есть/ее нет/нет прав и т.п. ;)
              Ответить
              • Можно ли атомарно открыть именно FIFO на запись? А то вдруг между stat и open нам подсунут вместо FIFO симлинк на /etc/passwd?
                Ответить
                • Ну fstat() разве что сделать после open().

                  P.S. А вообще - нехуй гонять демонюг под рутом ;)
                  Ответить
          • фифа 2015?
            Ответить
          • >> один хуй эту проблему не исправит

            Ты сомневаешься в моём могуществе?
            Ответить
    • А у вас молоко скобка убежала.
      Ответить

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