2019-09-10 11:19:01 +02:00
|
|
|
// SPDX-License-Identifier: LGPL-2.1+
|
2019-09-25 13:13:40 +02:00
|
|
|
/*
|
2019-10-01 09:20:35 +02:00
|
|
|
* Copyright (C) 2018 Red Hat, Inc.
|
2018-08-30 15:00:39 +02:00
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
#ifndef __NM_IO_UTILS_H__
|
|
|
|
|
#define __NM_IO_UTILS_H__
|
|
|
|
|
|
|
|
|
|
#include "nm-macros-internal.h"
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
|
|
2018-08-30 15:13:52 +02:00
|
|
|
/**
|
|
|
|
|
* NMUtilsFileGetContentsFlags:
|
|
|
|
|
* @NM_UTILS_FILE_GET_CONTENTS_FLAG_NONE: no flag
|
|
|
|
|
* @NM_UTILS_FILE_GET_CONTENTS_FLAG_SECRET: if present, ensure that no
|
|
|
|
|
* data is left in memory. Essentially, it means to call explicity_bzero()
|
|
|
|
|
* to not leave key material on the heap (when reading secrets).
|
|
|
|
|
*/
|
|
|
|
|
typedef enum {
|
|
|
|
|
NM_UTILS_FILE_GET_CONTENTS_FLAG_NONE = 0,
|
|
|
|
|
NM_UTILS_FILE_GET_CONTENTS_FLAG_SECRET = (1 << 0),
|
|
|
|
|
} NMUtilsFileGetContentsFlags;
|
|
|
|
|
|
shared,all: return boolean success from nm_utils_file_get_contents()
... and nm_utils_fd_get_contents() and nm_utils_file_set_contents().
Don't mix negative errno return value with a GError output. Instead,
return a boolean result indicating success or failure.
Also, optionally
- output GError
- set out_errsv to the positive errno (or 0 on success)
Obviously, the return value and the output arguments (contents, length,
out_errsv, error) must all agree in their success/failure result.
That means, you may check any of the return value, out_errsv, error, and
contents to reliably detect failure or success.
Also note that out_errsv gives the positive(!) errno. But you probably
shouldn't care about the distinction and use nm_errno_native() either
way to normalize the value.
2019-08-08 11:09:58 +02:00
|
|
|
gboolean nm_utils_fd_get_contents (int fd,
|
|
|
|
|
gboolean close_fd,
|
|
|
|
|
gsize max_length,
|
|
|
|
|
NMUtilsFileGetContentsFlags flags,
|
|
|
|
|
char **contents,
|
|
|
|
|
gsize *length,
|
|
|
|
|
int *out_errsv,
|
|
|
|
|
GError **error);
|
2018-08-30 15:13:52 +02:00
|
|
|
|
shared,all: return boolean success from nm_utils_file_get_contents()
... and nm_utils_fd_get_contents() and nm_utils_file_set_contents().
Don't mix negative errno return value with a GError output. Instead,
return a boolean result indicating success or failure.
Also, optionally
- output GError
- set out_errsv to the positive errno (or 0 on success)
Obviously, the return value and the output arguments (contents, length,
out_errsv, error) must all agree in their success/failure result.
That means, you may check any of the return value, out_errsv, error, and
contents to reliably detect failure or success.
Also note that out_errsv gives the positive(!) errno. But you probably
shouldn't care about the distinction and use nm_errno_native() either
way to normalize the value.
2019-08-08 11:09:58 +02:00
|
|
|
gboolean nm_utils_file_get_contents (int dirfd,
|
|
|
|
|
const char *filename,
|
|
|
|
|
gsize max_length,
|
|
|
|
|
NMUtilsFileGetContentsFlags flags,
|
|
|
|
|
char **contents,
|
|
|
|
|
gsize *length,
|
|
|
|
|
int *out_errsv,
|
|
|
|
|
GError **error);
|
2018-08-30 15:13:52 +02:00
|
|
|
|
shared,all: return boolean success from nm_utils_file_get_contents()
... and nm_utils_fd_get_contents() and nm_utils_file_set_contents().
Don't mix negative errno return value with a GError output. Instead,
return a boolean result indicating success or failure.
Also, optionally
- output GError
- set out_errsv to the positive errno (or 0 on success)
Obviously, the return value and the output arguments (contents, length,
out_errsv, error) must all agree in their success/failure result.
That means, you may check any of the return value, out_errsv, error, and
contents to reliably detect failure or success.
Also note that out_errsv gives the positive(!) errno. But you probably
shouldn't care about the distinction and use nm_errno_native() either
way to normalize the value.
2019-08-08 11:09:58 +02:00
|
|
|
gboolean nm_utils_file_set_contents (const char *filename,
|
|
|
|
|
const char *contents,
|
|
|
|
|
gssize length,
|
|
|
|
|
mode_t mode,
|
|
|
|
|
int *out_errsv,
|
|
|
|
|
GError **error);
|
2018-08-30 15:13:52 +02:00
|
|
|
|
cli/polkit: make parsing polkit-agent-helper-1 protocol more conforming
- in io_watch_have_data(), ensure that we handle incomplete lines
that don't yet have a newline by waiting for more data. That means,
if the current content of the in_buffer does not have a newline, we
wait longer.
- in io_watch_have_data(), implement (and ignore) certain commands
instead of failing the request.
- in io_watch_have_data(), no longer g_compress() the entire line.
"polkitagenthelper-pam.c" never backslash escapes the command, it
only escapes the arguments. Of course, there should be no difference
in practice, except that we don't want to handle escape sequences
in the commands.
- in io_watch_have_data(), compare SUCCESS/FAILURE literally.
"polkitagenthelper-pam.c" never appends any trailing garbage to these
commands, and we shouldn't handle that (although "polkitagentsession.c"
does).
- when io_watch_have_data() completes with success, we cannot destroy
AuthRequest right away. It probably still has data pending that we first
need to write to the polkit helper. Wait longer, and let io_watch_can_write()
complete the request.
- ensure we always answer the GDBusMethodInvocation. Otherwise, it gets
leaked.
- use NMStrBuf instead of GString.
2020-04-06 10:54:35 +02:00
|
|
|
struct _NMStrBuf;
|
|
|
|
|
|
|
|
|
|
gssize nm_utils_fd_read (int fd, struct _NMStrBuf *out_string);
|
2019-12-19 11:30:03 +01:00
|
|
|
|
2019-06-24 09:00:15 +02:00
|
|
|
struct stat;
|
|
|
|
|
|
|
|
|
|
int nm_utils_file_stat (const char *filename, struct stat *out_st);
|
|
|
|
|
|
2018-08-30 15:00:39 +02:00
|
|
|
#endif /* __NM_IO_UTILS_H__ */
|