]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
Merge pull request #12222 from yuwata/macsec
authorLennart Poettering <lennart@poettering.net>
Fri, 12 Apr 2019 11:59:30 +0000 (13:59 +0200)
committerGitHub <noreply@github.com>
Fri, 12 Apr 2019 11:59:30 +0000 (13:59 +0200)
network: introduce MACsec

1  2 
src/basic/fileio.c
src/basic/fileio.h

diff --combined src/basic/fileio.c
index 85a49b1f9ee05d8a7f4fa95acfa323978b00473e,130902a05d31a318c66a71d9650ce1febc2d7d0a..2cec054610012001ce19a94e45165a67f1d08778
  
  #define READ_FULL_BYTES_MAX (4U*1024U*1024U)
  
 +int fopen_unlocked(const char *path, const char *options, FILE **ret) {
 +        assert(ret);
 +
 +        FILE *f = fopen(path, options);
 +        if (!f)
 +                return -errno;
 +
 +        (void) __fsetlocking(f, FSETLOCKING_BYCALLER);
 +
 +        *ret = f;
 +        return 0;
 +}
 +
 +int fdopen_unlocked(int fd, const char *options, FILE **ret) {
 +        assert(ret);
 +
 +        FILE *f = fdopen(fd, options);
 +        if (!f)
 +                return -errno;
 +
 +        (void) __fsetlocking(f, FSETLOCKING_BYCALLER);
 +
 +        *ret = f;
 +        return 0;
 +}
 +
 +FILE* open_memstream_unlocked(char **ptr, size_t *sizeloc) {
 +        FILE *f = open_memstream(ptr, sizeloc);
 +        if (!f)
 +                return NULL;
 +
 +        (void) __fsetlocking(f, FSETLOCKING_BYCALLER);
 +
 +        return f;
 +}
 +
 +FILE* fmemopen_unlocked(void *buf, size_t size, const char *mode) {
 +        FILE *f = fmemopen(buf, size, mode);
 +        if (!f)
 +                return NULL;
 +
 +        (void) __fsetlocking(f, FSETLOCKING_BYCALLER);
 +
 +        return f;
 +}
 +
  int write_string_stream_ts(
                  FILE *f,
                  const char *line,
@@@ -141,6 -95,7 +141,6 @@@ static int write_string_file_atomic
          if (r < 0)
                  return r;
  
 -        (void) __fsetlocking(f, FSETLOCKING_BYCALLER);
          (void) fchmod_umask(fileno(f), 0644);
  
          r = write_string_stream_ts(f, line, flags, ts);
@@@ -186,9 -141,11 +186,9 @@@ int write_string_file_ts
                  assert(!ts);
  
          if (flags & WRITE_STRING_FILE_CREATE) {
 -                f = fopen(fn, "we");
 -                if (!f) {
 -                        r = -errno;
 +                r = fopen_unlocked(fn, "we", &f);
 +                if (r < 0)
                          goto fail;
 -                }
          } else {
                  int fd;
  
                          goto fail;
                  }
  
 -                f = fdopen(fd, "w");
 -                if (!f) {
 -                        r = -errno;
 +                r = fdopen_unlocked(fd, "w", &f);
 +                if (r < 0) {
                          safe_close(fd);
                          goto fail;
                  }
          }
  
 -        (void) __fsetlocking(f, FSETLOCKING_BYCALLER);
 -
          if (flags & WRITE_STRING_FILE_DISABLE_BUFFER)
                  setvbuf(f, NULL, _IONBF, 0);
  
@@@ -253,14 -213,15 +253,14 @@@ int write_string_filef
  
  int read_one_line_file(const char *fn, char **line) {
          _cleanup_fclose_ FILE *f = NULL;
 +        int r;
  
          assert(fn);
          assert(line);
  
 -        f = fopen(fn, "re");
 -        if (!f)
 -                return -errno;
 -
 -        (void) __fsetlocking(f, FSETLOCKING_BYCALLER);
 +        r = fopen_unlocked(fn, "re", &f);
 +        if (r < 0)
 +                return r;
  
          return read_line(f, LONG_LINE_MAX, line);
  }
@@@ -269,7 -230,6 +269,7 @@@ int verify_file(const char *fn, const c
          _cleanup_fclose_ FILE *f = NULL;
          _cleanup_free_ char *buf = NULL;
          size_t l, k;
 +        int r;
  
          assert(fn);
          assert(blob);
          if (!buf)
                  return -ENOMEM;
  
 -        f = fopen(fn, "re");
 -        if (!f)
 -                return -errno;
 -
 -        (void) __fsetlocking(f, FSETLOCKING_BYCALLER);
 +        r = fopen_unlocked(fn, "re", &f);
 +        if (r < 0)
 +                return r;
  
          /* We try to read one byte more than we need, so that we know whether we hit eof */
          errno = 0;
@@@ -317,7 -279,8 +317,8 @@@ int read_full_stream_full
  
          assert(f);
          assert(ret_contents);
-         assert(!(flags & READ_FULL_FILE_UNBASE64) || ret_size);
+         assert(!FLAGS_SET(flags, READ_FULL_FILE_UNBASE64 | READ_FULL_FILE_UNHEX));
+         assert(!(flags & (READ_FULL_FILE_UNBASE64 | READ_FULL_FILE_UNHEX)) || ret_size);
  
          n_next = LINE_MAX; /* Start size */
  
                  n_next = MIN(n * 2, READ_FULL_BYTES_MAX);
          }
  
-         if (flags & READ_FULL_FILE_UNBASE64) {
+         if (flags & (READ_FULL_FILE_UNBASE64 | READ_FULL_FILE_UNHEX)) {
                  buf[l++] = 0;
-                 r = unbase64mem_full(buf, l, flags & READ_FULL_FILE_SECURE, (void **) ret_contents, ret_size);
+                 if (flags & READ_FULL_FILE_UNBASE64)
+                         r = unbase64mem_full(buf, l, flags & READ_FULL_FILE_SECURE, (void **) ret_contents, ret_size);
+                 else
+                         r = unhexmem_full(buf, l, flags & READ_FULL_FILE_SECURE, (void **) ret_contents, ret_size);
                  goto finalize;
          }
  
@@@ -428,14 -394,15 +432,14 @@@ finalize
  
  int read_full_file_full(const char *filename, ReadFullFileFlags flags, char **contents, size_t *size) {
          _cleanup_fclose_ FILE *f = NULL;
 +        int r;
  
          assert(filename);
          assert(contents);
  
 -        f = fopen(filename, "re");
 -        if (!f)
 -                return -errno;
 -
 -        (void) __fsetlocking(f, FSETLOCKING_BYCALLER);
 +        r = fopen_unlocked(filename, "re", &f);
 +        if (r < 0)
 +                return r;
  
          return read_full_stream_full(f, filename, flags, contents, size);
  }
diff --combined src/basic/fileio.h
index ffe900b486b3612dd67c94c70f0040e4874cbc76,6fe00f456fee78058340cb94003413daace558c0..eb551c7ac14c9be21d55c84eccce519f3bf18af6
@@@ -31,13 -31,9 +31,14 @@@ typedef enum 
  typedef enum {
          READ_FULL_FILE_SECURE   = 1 << 0,
          READ_FULL_FILE_UNBASE64 = 1 << 1,
+         READ_FULL_FILE_UNHEX    = 1 << 2,
  } ReadFullFileFlags;
  
 +int fopen_unlocked(const char *path, const char *options, FILE **ret);
 +int fdopen_unlocked(int fd, const char *options, FILE **ret);
 +FILE* open_memstream_unlocked(char **ptr, size_t *sizeloc);
 +FILE* fmemopen_unlocked(void *buf, size_t size, const char *mode);
 +
  int write_string_stream_ts(FILE *f, const char *line, WriteStringFileFlags flags, struct timespec *ts);
  static inline int write_string_stream(FILE *f, const char *line, WriteStringFileFlags flags) {
          return write_string_stream_ts(f, line, flags, NULL);