LINUX.ORG.RU

Релиз systemd-homed - нового компонента systemd

 ,


1

1

Леннарт Поттеринг с радостью представляет вам свой новый проект под названием systemd-homed - новый компонент systemd, который призван упростить жизнь пользователей, дав им возможность легко переносить домашние каталоги. Главная фишка проекта - создание самодостаточного окружения для пользовательских данных и отделение домашних каталогов от системных настроек, что позволяет в конечном итоге получить монтируемый файл-образ с зашифрованными данными окружения, который можно быстро перенести и развернуть на любой системе.

Презентация проекта

Полное описание в PDF

>>> Подробности

Ответ на: комментарий от anonymous

У него код гвоздями прибит к ядру, о чем ты. А ты о функции глибца переживаешь.

Не рассказывать же этому заабалу, что strjoin() пишется за 10 минут и потом работает где угодно.

devzero ()
Ответ на: комментарий от zabbal
int m = 754974721, N, t[1 << 22], a, *p, i, e = 1 << 22, j, s, b, c, U;
f (d)
{
  for (s = 1 << 23; s; s /= 2, d = d * 1LL * d % m)
    if (s < N)
      for (p = t; p < t + N; p += s)
    for (i = s, c = 1; i; i--)
      b = *p + p[s], p[s] = (m + *p - p[s]) *
        1LL * c % m, *p++ = b % m, c = c * 1LL * d % m;
  for (j = 0; i < N - 1;)
    {
      for (s = N / 2; !((j ^= s) & s); s /= 2);
      if (++i < j)
    a = t[i], t[i] = t[j], t[j] = a;
    }
}
main ()
{
  *t = 2;
  U = N = 1;
  while (e /= 2)
    {
      N *= 2;
      U = U * 1LL * (m + 1) / 2 % m;
      f (362);
      for (p = t; p < t + N;)
    *p++ = (*p * 1LL ** p % m) * U % m;
      f (415027540);
      for (a = 0, p = t; p < t + N;)
    a += (6972593 & e ? 2 : 1) ** p, *p++ = a % 10, a /= 10;
    }
  while (!*--p);
  t[0]--;
  while (p >= t)
    printf ("%d", *p--);
}


Как распарсишь - приходи. Тебе же не привыкать? До встречи. Прощай.

olelookoe ()
Ответ на: комментарий от olelookoe

Серьёзно?! Вот эта нечитабельная срань по-твоему «неговнокод»?

Теперь понимаю, почему истерички так стесняются показать свой вариант «правильного» кода - это ж срамота! :-D :-D :-D

zabbal ★★ ()
Ответ на: комментарий от olelookoe

Ну то, что ты можешь породить исключительно говнокод ты успешно доказал. Теперь осталось только найти программиста, недовольного кодом systemd - и можно переходить к обсуждению. Увы, таковых пока не нашлось. Либо истерички кричащие «говнокод!», при этом не умеющие программировать. Либо программисты, которые воздерживаются от идиотских заявлений. Прям-таки закономерность.

zabbal ★★ ()
Последнее исправление: zabbal (всего исправлений: 1)
Ответ на: комментарий от zabbal

ты можешь породить

Чувак, это не я породил. Это породил многоуважаемый автор для IOCCC.

Речь о том, что твой Лёня пишет так, как-будто участвует в этом соревновании на постоянной основе, желая занять все первые места.

Так понятно?

olelookoe ()
Ответ на: комментарий от zabbal

показать как надо и привести правильный код

Да тебе уже тут уши прожужжали про asprintf - не, не слышу.

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

int main() {
    char source[] = "my very own string";
    char *suffix = &source[7]; 
    int suffix_len =  suffix - source;

    // look
    char *result;
    asprintf(&result, "%.*s.#%s.lck", suffix_len, source, suffix);

    printf("%s", result);
    free(result);
}
my very.# own string.lck

olelookoe ()
Ответ на: комментарий от olelookoe

Мда, ты правда считаешь что твоё «%.*s.#%s.lck» проще читать, чем явно прописанные размеры в коде systemd?

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

То есть по итогу твой говнокод сложнее читать, он менее безопасен, да ещё и больше места занимает.

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

zabbal ★★ ()
Ответ на: комментарий от zabbal

да ещё и больше места занимает.

сравниваем

t = newa(char, strlen(p) + 2 + 4 + 1);
stpcpy(stpcpy(stpcpy(mempcpy(t, p, fn - p), ".#"), fn), ".lck");
asprintf(&result, "%.*s.#%s.lck", suffix - source, source, suffix);

ты правда считаешь что твоё «%.*s.#%s.lck» проще читать, чем явно прописанные размеры в коде systemd?

asprintf(&result, "%.*s%s%s%s", suffix - source, source, ".#", suffix, ".lck");

и будь счастлив. Явно указанные размеры литералов - это код смелл.

И это не считая того, что память тебе придётся освобождать вручную.

t = newa(char, strlen(p) + 2 + 4 + 1); освободит память само?

Причём проверку корректности выделения ты тоже продолбал.

шота я не заметил проверки корректности выделения в

t = newa(char, strlen(p) + 2 + 4 + 1);
stpcpy(stpcpy(stpcpy(mempcpy(t, p, fn - p), ".#"), fn), ".lck");
Сам справишься? На всякий
error_if (-1 == asprintf(&result, "%.*s.#%s.lck", suffix - source, source, suffix));

сложнее читать

Кому и кобыла невеста(с)

olelookoe ()
Ответ на: комментарий от olelookoe

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

anonymous ()
Ответ на: комментарий от olelookoe

да вообще, картина маслом: пока Поттеринг и Ко стараются не увлекаться нестандартными расширениями, эксперты с ЛОРа хреначат их во все поля с вот такими аргументами. Сколько ты там строчек кода сэкономил, одну или две? Прямо сразу видно, кто пилит серьезный проект, а кто - хелловорлды.

anonymous ()
Ответ на: комментарий от anonymous

не увлекаться нестандартными расширениями

Держи, изучай:

http://man.openbsd.org/asprintf

https://www.freebsd.org/cgi/man.cgi?query=asprintf

Как соберешься портировать systemd на соляру, напишешь обертку через vsnprintf(). Ты же крутой программист, стандарты знаешь — обертку осилишь. Я думаю, asprintf() будет у тебя наименьшей проблеме при скрещивании соляры и сустемд.

devzero ()
Ответ на: комментарий от anonymous

Тебя или твоего друга Лёню POSIX вынуждает говнокодить?

Про экономию строчек - это к твоему коллеге, которому многабукав везде мерещится. Уже стопицот раз тут писали - код смелл. Непонятно? Явно указанный размер литералов (при выделении памяти, что доставляет отдельно), имена переменных ниачом, стиль func(func(func(func(a,d,e)f,g,h)j,k,l)w,q,e).

olelookoe ()
Ответ на: комментарий от olelookoe

Явно указанные размеры литералов - это код смелл.

Нет, это облегчает понимание кода.

освободит память само?

Да. Погоди, ты серьёзно этого не понял?! То есть ты настолько плохо знаешь С?

Неудивительно, что ты так опозорился :-D :-D :-D

zabbal ★★ ()
Последнее исправление: zabbal (всего исправлений: 1)
Ответ на: комментарий от olelookoe

Да там мрак.

newa() - это макрос над alloca(), определённый при помощи нестандартного gcc-шного заворачивания кода в выражение: ({...}) И они еще про стандарты что-то брешут.

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

А как тебе такой перл?

        l = strlen(identifier);
        header = newa(char, l + 1 + 1 + 2 + 2 + 2 + 2 + 2);

        memcpy(header, identifier, l);
        header[l++] = '\n';
        header[l++] = '\n'; /* unit id */
        header[l++] = '0' + priority;
        header[l++] = '\n';
        header[l++] = '0' + !!level_prefix;
        header[l++] = '\n';
        header[l++] = '0';
        header[l++] = '\n';
        header[l++] = '0';
        header[l++] = '\n';
        header[l++] = '0';
        header[l++] = '\n';
devzero ()
Последнее исправление: devzero (всего исправлений: 1)
Ответ на: комментарий от devzero

newa() - это макрос над alloca(), определённый при помощи нестандартного gcc-шного заворачивания кода в выражение: ({...})

Оооо, какой знатный велосипединг. Читаю и плачу.

перл

последствия легалайза? )

olelookoe ()
Ответ на: комментарий от devzero

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

Уже.

https://security-tracker.debian.org/tracker/CVE-2019-6454

olelookoe ()