if (!hash)
return 0; // TODO: error message
memset(args[1], 0, strlen(args[1]));
- FILE *f = fopen(getdatafile("newusers.txt"), "ab" FOPEN_CLOEXEC);
+ FILE *f = fopen(getdatafile("newusers.txt"), "abe");
if (!f)
return 0; // TODO: error message
fprintf(f, "%s:%s\n", args[0], hash);
if (!is_registered(client))
return err_notregistered(client), sendbuf(client), 0;
char line[512];
- FILE *f = fopen(getdatafile("help.txt"), "r" FOPEN_CLOEXEC);
+ FILE *f = fopen(getdatafile("help.txt"), "re");
if (f) {
rpl_helpstart(client), sendbuf(client);
while (fgets(line, 512, f)) {
if (args[0] && strcmp(args[0], hostname) != 0)
return err_nosuchserver(client, args[0]), sendbuf(client), 0;
char line[512];
- FILE *f = fopen(getdatafile("admin.txt"), "r" FOPEN_CLOEXEC);
+ FILE *f = fopen(getdatafile("admin.txt"), "re");
if (f) {
auto nextline = [f, &line]()->bool{
if (fgets(line, 512, f)) {
void sendMOTD(struct client_data *client) {
char line[512];
- FILE *f = fopen(getdatafile("motd.txt"), "r" FOPEN_CLOEXEC);
+ FILE *f = fopen(getdatafile("motd.txt"), "re");
if (f) {
rpl_motdstart(client), sendbuf(client);
while (fgets(line, 512, f)) {
netpoll::reg(listener.sock, UV_READABLE);
}
- FILE *f = fopen(getdatafile("init.txt"), "rb" FOPEN_CLOEXEC);
+ FILE *f = fopen(getdatafile("init.txt"), "rbe");
if (f) {
struct client_data *fake = allocClient();
fake->FD = INVALID_SOCKET;
set_time(0);
fclose(f);
}
- fchanlog = fopen(getdatafile("chanlog.txt"), "ab" FOPEN_CLOEXEC);
+ fchanlog = fopen(getdatafile("chanlog.txt"), "abe");
if (fchanlog) {
fprintf(fchanlog, "$0 AAA :server starting %lu\r\n", (unsigned long)get_time());
fflush(fchanlog);
#define net_perror(p) (perror((p)))
#define net_wouldblock() (errno == EAGAIN || errno == EWOULDBLOCK)
#define closesocket close
-#ifndef SOCK_CLOEXEC
-#error "SOCK_CLOEXEC is required"
-#endif
-#define FOPEN_CLOEXEC "e"
#endif
// Copyright (c) 2022-2025 Egor
// SPDX-License-Identifier: GPL-2.0-or-later
-#include "netsock.h"
#include <stdio.h>
#include <string.h>
#include <unistd.h>
}
int password_set(const char *key, const char *pw, const char *fn, const char *tmpfn)
{
- FILE *fi = fopen(fn, "rb" FOPEN_CLOEXEC);
+ FILE *fi = fopen(fn, "rbe");
if (!fi)
return -1;
- FILE *fo = fopen(tmpfn, "wb" FOPEN_CLOEXEC);
+ FILE *fo = fopen(tmpfn, "wbe");
if (!fo) {
fclose(fi);
return -1;
char *password_get(const char *key, const char *fn)
{
// NOTE: there are probably a lot of timing leaks in here
- FILE *fi = fopen(fn, "rb" FOPEN_CLOEXEC);
+ FILE *fi = fopen(fn, "rbe");
if (!fi)
return 0;
int keylen = strlen(key);
}
}
const char *db_read_rhs(const char *key, const char *fn) {
- FILE *fi = fopen(fn, "rb" FOPEN_CLOEXEC);
+ FILE *fi = fopen(fn, "rbe");
if (!fi)
return 0;
int keylen = strlen(key);