mirror of
https://github.com/wiiu-env/ftpiiu_plugin.git
synced 2024-11-25 14:16:55 +01:00
Add log upload to hastebin
This commit is contained in:
parent
16c59354da
commit
1db3c48ee4
74
3ds/romfs/sni.cloudflaressl.com.ca
Normal file
74
3ds/romfs/sni.cloudflaressl.com.ca
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
MIIFNzCCBN6gAwIBAgIQDY30H+7eX+UAL96D4Q4pCTAKBggqhkjOPQQDAjBKMQsw
|
||||||
|
CQYDVQQGEwJVUzEZMBcGA1UEChMQQ2xvdWRmbGFyZSwgSW5jLjEgMB4GA1UEAxMX
|
||||||
|
Q2xvdWRmbGFyZSBJbmMgRUNDIENBLTMwHhcNMjIwNzA2MDAwMDAwWhcNMjMwNzA2
|
||||||
|
MjM1OTU5WjB1MQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQG
|
||||||
|
A1UEBxMNU2FuIEZyYW5jaXNjbzEZMBcGA1UEChMQQ2xvdWRmbGFyZSwgSW5jLjEe
|
||||||
|
MBwGA1UEAxMVc25pLmNsb3VkZmxhcmVzc2wuY29tMFkwEwYHKoZIzj0CAQYIKoZI
|
||||||
|
zj0DAQcDQgAEYORbsKsnHR3Fgl5NnfC69t+zjW+thQ8/EsuWWyfJ/BceQF8t1h26
|
||||||
|
EN6BRaMb1c5UTpX1tI5JMgaXxXpFtESRI6OCA3kwggN1MB8GA1UdIwQYMBaAFKXO
|
||||||
|
N+rrsHUOlGeItEX62SQQh5YfMB0GA1UdDgQWBBQQcujrZ4f9+4Oh6nEzkQZ52Dku
|
||||||
|
zzA+BgNVHREENzA1gg4qLmhhc3RlYmluLmNvbYIVc25pLmNsb3VkZmxhcmVzc2wu
|
||||||
|
Y29tggxoYXN0ZWJpbi5jb20wDgYDVR0PAQH/BAQDAgeAMB0GA1UdJQQWMBQGCCsG
|
||||||
|
AQUFBwMBBggrBgEFBQcDAjB7BgNVHR8EdDByMDegNaAzhjFodHRwOi8vY3JsMy5k
|
||||||
|
aWdpY2VydC5jb20vQ2xvdWRmbGFyZUluY0VDQ0NBLTMuY3JsMDegNaAzhjFodHRw
|
||||||
|
Oi8vY3JsNC5kaWdpY2VydC5jb20vQ2xvdWRmbGFyZUluY0VDQ0NBLTMuY3JsMD4G
|
||||||
|
A1UdIAQ3MDUwMwYGZ4EMAQICMCkwJwYIKwYBBQUHAgEWG2h0dHA6Ly93d3cuZGln
|
||||||
|
aWNlcnQuY29tL0NQUzB2BggrBgEFBQcBAQRqMGgwJAYIKwYBBQUHMAGGGGh0dHA6
|
||||||
|
Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBABggrBgEFBQcwAoY0aHR0cDovL2NhY2VydHMu
|
||||||
|
ZGlnaWNlcnQuY29tL0Nsb3VkZmxhcmVJbmNFQ0NDQS0zLmNydDAMBgNVHRMBAf8E
|
||||||
|
AjAAMIIBfwYKKwYBBAHWeQIEAgSCAW8EggFrAWkAdgDoPtDaPvUGNTLnVyi8iWvJ
|
||||||
|
A9PL0RFr7Otp4Xd9bQa9bgAAAYHRAkxAAAAEAwBHMEUCIAhr5wFeEo8D3dOu+FYr
|
||||||
|
8vljOnpEIvMuNJjB6iBOcuXWAiEA6pI8/KK1U9Ig+xlAsKsol7+btAokI6OzNxfN
|
||||||
|
VOVM3KQAdgA1zxkbv7FsV78PrUxtQsu7ticgJlHqP+Eq76gDwzvWTAAAAYHRAkxs
|
||||||
|
AAAEAwBHMEUCIDIOIZDfw+ITXL6KvYGCJJx8yxDk2uiMy9ixN3XIG6AKAiEArbT1
|
||||||
|
OhUlElPkGlwHWvcDXRnT24tKxP9WteDcCUD9W8QAdwC3Pvsk35xNunXyOcW6WPRs
|
||||||
|
XfxCz3qfNcSeHQmBJe20mQAAAYHRAkx3AAAEAwBIMEYCIQCptt9MYfIgiomqP9Xb
|
||||||
|
nXD2h3RK/11gtOTCzv+/qGKF9QIhANApIgtpOEeTIbXPXFJQBScB0NksARcRcBby
|
||||||
|
uoI1A2Y/MAoGCCqGSM49BAMCA0cAMEQCIFwUBWYQxZT+B0ItToj+mkoVTO1mDQox
|
||||||
|
ruuJ/G4Jmh4dAiA4ar4ImAlk4uptLNoZzxbc1m8CyHB2siaCDv3Lf7QktA==
|
||||||
|
-----END CERTIFICATE-----
|
||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
MIIDzTCCArWgAwIBAgIQCjeHZF5ftIwiTv0b7RQMPDANBgkqhkiG9w0BAQsFADBa
|
||||||
|
MQswCQYDVQQGEwJJRTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJl
|
||||||
|
clRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTIw
|
||||||
|
MDEyNzEyNDgwOFoXDTI0MTIzMTIzNTk1OVowSjELMAkGA1UEBhMCVVMxGTAXBgNV
|
||||||
|
BAoTEENsb3VkZmxhcmUsIEluYy4xIDAeBgNVBAMTF0Nsb3VkZmxhcmUgSW5jIEVD
|
||||||
|
QyBDQS0zMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEua1NZpkUC0bsH4HRKlAe
|
||||||
|
nQMVLzQSfS2WuIg4m4Vfj7+7Te9hRsTJc9QkT+DuHM5ss1FxL2ruTAUJd9NyYqSb
|
||||||
|
16OCAWgwggFkMB0GA1UdDgQWBBSlzjfq67B1DpRniLRF+tkkEIeWHzAfBgNVHSME
|
||||||
|
GDAWgBTlnVkwgkdYzKz6CFQ2hns6tQRN8DAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0l
|
||||||
|
BBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBIGA1UdEwEB/wQIMAYBAf8CAQAwNAYI
|
||||||
|
KwYBBQUHAQEEKDAmMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5j
|
||||||
|
b20wOgYDVR0fBDMwMTAvoC2gK4YpaHR0cDovL2NybDMuZGlnaWNlcnQuY29tL09t
|
||||||
|
bmlyb290MjAyNS5jcmwwbQYDVR0gBGYwZDA3BglghkgBhv1sAQEwKjAoBggrBgEF
|
||||||
|
BQcCARYcaHR0cHM6Ly93d3cuZGlnaWNlcnQuY29tL0NQUzALBglghkgBhv1sAQIw
|
||||||
|
CAYGZ4EMAQIBMAgGBmeBDAECAjAIBgZngQwBAgMwDQYJKoZIhvcNAQELBQADggEB
|
||||||
|
AAUkHd0bsCrrmNaF4zlNXmtXnYJX/OvoMaJXkGUFvhZEOFp3ArnPEELG4ZKk40Un
|
||||||
|
+ABHLGioVplTVI+tnkDB0A+21w0LOEhsUCxJkAZbZB2LzEgwLt4I4ptJIsCSDBFe
|
||||||
|
lpKU1fwg3FZs5ZKTv3ocwDfjhUkV+ivhdDkYD7fa86JXWGBPzI6UAPxGezQxPk1H
|
||||||
|
goE6y/SJXQ7vTQ1unBuCJN0yJV0ReFEQPaA1IwQvZW+cwdFD19Ae8zFnWSfda9J1
|
||||||
|
CZMRJCQUzym+5iPDuI9yP+kHyCREU3qzuWFloUwOxkgAyXVjBYdwRVKD05WdRerw
|
||||||
|
6DEdfgkfCv4+3ao8XnTSrLE=
|
||||||
|
-----END CERTIFICATE-----
|
||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ
|
||||||
|
RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD
|
||||||
|
VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX
|
||||||
|
DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y
|
||||||
|
ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy
|
||||||
|
VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr
|
||||||
|
mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr
|
||||||
|
IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK
|
||||||
|
mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu
|
||||||
|
XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy
|
||||||
|
dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye
|
||||||
|
jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1
|
||||||
|
BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3
|
||||||
|
DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92
|
||||||
|
9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx
|
||||||
|
jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0
|
||||||
|
Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz
|
||||||
|
ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS
|
||||||
|
R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp
|
||||||
|
-----END CERTIFICATE-----
|
@ -52,7 +52,7 @@ RSF_FILE := meta/ftpd-classic-cia.rsf
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
APP_DESCRIPTION := v$(VERSION)
|
APP_DESCRIPTION := v$(VERSION)
|
||||||
APP_AUTHOR := (c) 2021 Michael Theall, Dave Murphy, TuxSH
|
APP_AUTHOR := (c) 2022 Michael Theall, Dave Murphy, TuxSH
|
||||||
|
|
||||||
ICON := meta/icon.png
|
ICON := meta/icon.png
|
||||||
BNR_IMAGE := meta/banner.png
|
BNR_IMAGE := meta/banner.png
|
||||||
@ -72,9 +72,10 @@ CFLAGS += $(INCLUDE) -DARM11 -D__3DS__ \
|
|||||||
-DSTATUS_STRING="\"ftpd v$(VERSION)\"" \
|
-DSTATUS_STRING="\"ftpd v$(VERSION)\"" \
|
||||||
-DIMGUI_DISABLE_INCLUDE_IMCONFIG_H=1 \
|
-DIMGUI_DISABLE_INCLUDE_IMCONFIG_H=1 \
|
||||||
-DNO_IPV6 -DFTPDCONFIG="\"/config/ftpd/ftpd.cfg\"" \
|
-DNO_IPV6 -DFTPDCONFIG="\"/config/ftpd/ftpd.cfg\"" \
|
||||||
-DANTI_ALIAS=1
|
-DANTI_ALIAS=1 \
|
||||||
|
`curl-config --cflags`
|
||||||
|
|
||||||
CXXFLAGS := $(CFLAGS) -fno-rtti -fno-exceptions -std=gnu++17
|
CXXFLAGS := $(CFLAGS) -fno-rtti -fno-exceptions -std=gnu++2a
|
||||||
|
|
||||||
ASFLAGS := -g $(ARCH)
|
ASFLAGS := -g $(ARCH)
|
||||||
LDFLAGS = -specs=3dsx.specs -g $(ARCH) -Wl,-Map,$(notdir $*.map) $(OPTIMIZE)
|
LDFLAGS = -specs=3dsx.specs -g $(ARCH) -Wl,-Map,$(notdir $*.map) $(OPTIMIZE)
|
||||||
@ -82,7 +83,7 @@ LDFLAGS = -specs=3dsx.specs -g $(ARCH) -Wl,-Map,$(notdir $*.map) $(OPTIMIZE)
|
|||||||
CC := `which ccache 2>/dev/null` $(CC)
|
CC := `which ccache 2>/dev/null` $(CC)
|
||||||
CXX := `which ccache 2>/dev/null` $(CXX)
|
CXX := `which ccache 2>/dev/null` $(CXX)
|
||||||
|
|
||||||
LIBS := -lcitro3d -lctru -lm
|
LIBS := `curl-config --libs` -lcitro3d -lctru -lm
|
||||||
|
|
||||||
#---------------------------------------------------------------------------------
|
#---------------------------------------------------------------------------------
|
||||||
# list of directories containing libraries, this must be the top level containing
|
# list of directories containing libraries, this must be the top level containing
|
||||||
|
@ -12,10 +12,11 @@ CPPFLAGS := -g -Wall -pthread -Iinclude -Isource/linux \
|
|||||||
-DSTATUS_STRING="\"ftpd v$(VERSION)\"" \
|
-DSTATUS_STRING="\"ftpd v$(VERSION)\"" \
|
||||||
-DIMGUI_DISABLE_INCLUDE_IMCONFIG_H=1 \
|
-DIMGUI_DISABLE_INCLUDE_IMCONFIG_H=1 \
|
||||||
-DIMGUI_IMPL_OPENGL_LOADER_GLAD=1 \
|
-DIMGUI_IMPL_OPENGL_LOADER_GLAD=1 \
|
||||||
-DFTPDCONFIG="\"ftpd.cfg\""
|
-DFTPDCONFIG="\"ftpd.cfg\"" \
|
||||||
|
`curl-config --cflags`
|
||||||
CFLAGS := $(CPPFLAGS)
|
CFLAGS := $(CPPFLAGS)
|
||||||
CXXFLAGS := $(CPPFLAGS) -std=gnu++17
|
CXXFLAGS := $(CPPFLAGS) -std=gnu++2a
|
||||||
LDFLAGS := -pthread `pkg-config --libs gl glfw3` -ldl
|
LDFLAGS := -pthread `curl-config --libs` `pkg-config --libs gl glfw3` -ldl
|
||||||
|
|
||||||
.PHONY: all clean
|
.PHONY: all clean
|
||||||
|
|
||||||
|
@ -35,7 +35,7 @@ NITRO :=
|
|||||||
# These set the information text in the nds file
|
# These set the information text in the nds file
|
||||||
GAME_TITLE := ftpd classic
|
GAME_TITLE := ftpd classic
|
||||||
GAME_SUBTITLE1 := v$(VERSION)
|
GAME_SUBTITLE1 := v$(VERSION)
|
||||||
GAME_SUBTITLE2 := (c) 2021 mtheall
|
GAME_SUBTITLE2 := (c) 2022 mtheall
|
||||||
|
|
||||||
#---------------------------------------------------------------------------------
|
#---------------------------------------------------------------------------------
|
||||||
# options for code generation
|
# options for code generation
|
||||||
@ -48,7 +48,7 @@ CFLAGS := -g -Wall $(OPTIMIZE) \
|
|||||||
-DSTATUS_STRING="\"ftpd v$(VERSION)\"" \
|
-DSTATUS_STRING="\"ftpd v$(VERSION)\"" \
|
||||||
-DIMGUI_DISABLE_INCLUDE_IMCONFIG_H=1 \
|
-DIMGUI_DISABLE_INCLUDE_IMCONFIG_H=1 \
|
||||||
-DNO_IPV6 -DCLASSIC -DFTPDCONFIG="\"/config/ftpd/ftpd.cfg\""
|
-DNO_IPV6 -DCLASSIC -DFTPDCONFIG="\"/config/ftpd/ftpd.cfg\""
|
||||||
CXXFLAGS := $(CFLAGS) -fno-rtti -fno-exceptions -std=gnu++17
|
CXXFLAGS := $(CFLAGS) -fno-rtti -fno-exceptions -std=gnu++2a
|
||||||
ASFLAGS := -g $(ARCH)
|
ASFLAGS := -g $(ARCH)
|
||||||
LDFLAGS = -specs=ds_arm9.specs -g $(ARCH) -Wl,-Map,$(notdir $*.map) $(OPTIMIZE)
|
LDFLAGS = -specs=ds_arm9.specs -g $(ARCH) -Wl,-Map,$(notdir $*.map) $(OPTIMIZE)
|
||||||
|
|
||||||
|
@ -37,7 +37,7 @@ include $(DEVKITPRO)/libnx/switch_rules
|
|||||||
# of a homebrew executable (.nro). This is intended to be used for sysmodules.
|
# of a homebrew executable (.nro). This is intended to be used for sysmodules.
|
||||||
# NACP building is skipped as well.
|
# NACP building is skipped as well.
|
||||||
#---------------------------------------------------------------------------------
|
#---------------------------------------------------------------------------------
|
||||||
APP_AUTHOR := (c) 2021 Michael Theall, Dave Murphy, TuxSH
|
APP_AUTHOR := (c) 2022 Michael Theall, Dave Murphy, TuxSH
|
||||||
ICON := meta/ftpd.jpg
|
ICON := meta/ftpd.jpg
|
||||||
APP_VERSION := $(VERSION)
|
APP_VERSION := $(VERSION)
|
||||||
|
|
||||||
@ -75,9 +75,10 @@ CFLAGS += $(INCLUDE) -D__SWITCH__ \
|
|||||||
-DSTATUS_STRING="\"ftpd v$(VERSION)\"" \
|
-DSTATUS_STRING="\"ftpd v$(VERSION)\"" \
|
||||||
-DIMGUI_DISABLE_INCLUDE_IMCONFIG_H=1 \
|
-DIMGUI_DISABLE_INCLUDE_IMCONFIG_H=1 \
|
||||||
-DFTPDCONFIG="\"/config/ftpd/ftpd.cfg\"" \
|
-DFTPDCONFIG="\"/config/ftpd/ftpd.cfg\"" \
|
||||||
`$(PREFIX)pkg-config --cflags libzstd`
|
`$(PREFIX)pkg-config --cflags libzstd` \
|
||||||
|
`curl-config --cflags`
|
||||||
|
|
||||||
CXXFLAGS := $(CFLAGS) -std=gnu++17 -fno-exceptions -fno-rtti
|
CXXFLAGS := $(CFLAGS) -std=gnu++2a -fno-exceptions -fno-rtti
|
||||||
|
|
||||||
ASFLAGS := -g $(ARCH)
|
ASFLAGS := -g $(ARCH)
|
||||||
LDFLAGS = -specs=$(DEVKITPRO)/libnx/switch.specs -g $(ARCH) \
|
LDFLAGS = -specs=$(DEVKITPRO)/libnx/switch.specs -g $(ARCH) \
|
||||||
@ -86,7 +87,7 @@ LDFLAGS = -specs=$(DEVKITPRO)/libnx/switch.specs -g $(ARCH) \
|
|||||||
CC := `which ccache 2>/dev/null` $(CC)
|
CC := `which ccache 2>/dev/null` $(CC)
|
||||||
CXX := `which ccache 2>/dev/null` $(CXX)
|
CXX := `which ccache 2>/dev/null` $(CXX)
|
||||||
|
|
||||||
LIBS := `$(PREFIX)pkg-config --libs libzstd` -ldeko3d -lnx
|
LIBS := `curl-config --libs` `$(PREFIX)pkg-config --libs libzstd` -ldeko3d -lnx
|
||||||
|
|
||||||
#---------------------------------------------------------------------------------
|
#---------------------------------------------------------------------------------
|
||||||
# list of directories containing libraries, this must be the top level containing
|
# list of directories containing libraries, this must be the top level containing
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
// - RFC 3659 (https://tools.ietf.org/html/rfc3659)
|
// - RFC 3659 (https://tools.ietf.org/html/rfc3659)
|
||||||
// - suggested implementation details from https://cr.yp.to/ftp/filesystem.html
|
// - suggested implementation details from https://cr.yp.to/ftp/filesystem.html
|
||||||
//
|
//
|
||||||
// Copyright (C) 2020 Michael Theall
|
// Copyright (C) 2022 Michael Theall
|
||||||
//
|
//
|
||||||
// This program is free software: you can redistribute it and/or modify
|
// This program is free software: you can redistribute it and/or modify
|
||||||
// it under the terms of the GNU General Public License as published by
|
// it under the terms of the GNU General Public License as published by
|
||||||
@ -44,7 +44,7 @@ public:
|
|||||||
static UniqueFtpConfig load (char const *path_);
|
static UniqueFtpConfig load (char const *path_);
|
||||||
|
|
||||||
#ifndef NDS
|
#ifndef NDS
|
||||||
std::lock_guard<platform::Mutex> lockGuard ();
|
std::scoped_lock<platform::Mutex> lockGuard ();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/// \brief Save config
|
/// \brief Save config
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
// - RFC 3659 (https://tools.ietf.org/html/rfc3659)
|
// - RFC 3659 (https://tools.ietf.org/html/rfc3659)
|
||||||
// - suggested implementation details from https://cr.yp.to/ftp/filesystem.html
|
// - suggested implementation details from https://cr.yp.to/ftp/filesystem.html
|
||||||
//
|
//
|
||||||
// Copyright (C) 2020 Michael Theall
|
// Copyright (C) 2022 Michael Theall
|
||||||
//
|
//
|
||||||
// This program is free software: you can redistribute it and/or modify
|
// This program is free software: you can redistribute it and/or modify
|
||||||
// it under the terms of the GNU General Public License as published by
|
// it under the terms of the GNU General Public License as published by
|
||||||
@ -25,6 +25,10 @@
|
|||||||
#include "platform.h"
|
#include "platform.h"
|
||||||
#include "socket.h"
|
#include "socket.h"
|
||||||
|
|
||||||
|
#ifndef CLASSIC
|
||||||
|
#include <curl/curl.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <atomic>
|
#include <atomic>
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
@ -107,6 +111,20 @@ private:
|
|||||||
/// \brief Whether thread should quit
|
/// \brief Whether thread should quit
|
||||||
std::atomic<bool> m_quit;
|
std::atomic<bool> m_quit;
|
||||||
|
|
||||||
|
#ifndef CLASSIC
|
||||||
|
/// \brief Log upload cURL context
|
||||||
|
CURLM *m_uploadLogCurlM = nullptr;
|
||||||
|
/// \brief Log upload mime context
|
||||||
|
curl_mime *m_uploadLogMime = nullptr;
|
||||||
|
/// \brief Log upload cURL context
|
||||||
|
std::atomic<CURL *> m_uploadLogCurl = nullptr;
|
||||||
|
|
||||||
|
/// \brief Log upload data
|
||||||
|
std::string m_uploadLogData;
|
||||||
|
/// \brief Log upload result
|
||||||
|
std::string m_uploadLogResult;
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef CLASSIC
|
#ifndef CLASSIC
|
||||||
/// \brief Whether to show settings menu
|
/// \brief Whether to show settings menu
|
||||||
bool m_showSettings = false;
|
bool m_showSettings = false;
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
// - RFC 3659 (https://tools.ietf.org/html/rfc3659)
|
// - RFC 3659 (https://tools.ietf.org/html/rfc3659)
|
||||||
// - suggested implementation details from https://cr.yp.to/ftp/filesystem.html
|
// - suggested implementation details from https://cr.yp.to/ftp/filesystem.html
|
||||||
//
|
//
|
||||||
// Copyright (C) 2020 Michael Theall
|
// Copyright (C) 2022 Michael Theall
|
||||||
//
|
//
|
||||||
// This program is free software: you can redistribute it and/or modify
|
// This program is free software: you can redistribute it and/or modify
|
||||||
// it under the terms of the GNU General Public License as published by
|
// it under the terms of the GNU General Public License as published by
|
||||||
@ -37,6 +37,11 @@ enum LogLevel
|
|||||||
/// \brief Draw log
|
/// \brief Draw log
|
||||||
void drawLog ();
|
void drawLog ();
|
||||||
|
|
||||||
|
#ifndef CLASSIC
|
||||||
|
/// \brief Get log
|
||||||
|
std::string getLog ();
|
||||||
|
#endif
|
||||||
|
|
||||||
/// \brief Add debug message to bound log
|
/// \brief Add debug message to bound log
|
||||||
/// \param fmt_ Message format
|
/// \param fmt_ Message format
|
||||||
__attribute__ ((format (printf, 1, 2))) void debug (char const *fmt_, ...);
|
__attribute__ ((format (printf, 1, 2))) void debug (char const *fmt_, ...);
|
||||||
|
@ -168,7 +168,7 @@ void handleAPTHook (APT_HookType const type_, void *const param_)
|
|||||||
bool getNetworkVisibility ()
|
bool getNetworkVisibility ()
|
||||||
{
|
{
|
||||||
// serialize ac:u access from multiple threads
|
// serialize ac:u access from multiple threads
|
||||||
auto lock = std::lock_guard (s_acuFence);
|
auto const lock = std::scoped_lock (s_acuFence);
|
||||||
|
|
||||||
// get wifi status
|
// get wifi status
|
||||||
std::uint32_t wifi = 0;
|
std::uint32_t wifi = 0;
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
// - RFC 3659 (https://tools.ietf.org/html/rfc3659)
|
// - RFC 3659 (https://tools.ietf.org/html/rfc3659)
|
||||||
// - suggested implementation details from https://cr.yp.to/ftp/filesystem.html
|
// - suggested implementation details from https://cr.yp.to/ftp/filesystem.html
|
||||||
//
|
//
|
||||||
// Copyright (C) 2021 Michael Theall
|
// Copyright (C) 2022 Michael Theall
|
||||||
//
|
//
|
||||||
// This program is free software: you can redistribute it and/or modify
|
// This program is free software: you can redistribute it and/or modify
|
||||||
// it under the terms of the GNU General Public License as published by
|
// it under the terms of the GNU General Public License as published by
|
||||||
@ -187,9 +187,9 @@ UniqueFtpConfig FtpConfig::load (char const *const path_)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifndef NDS
|
#ifndef NDS
|
||||||
std::lock_guard<platform::Mutex> FtpConfig::lockGuard ()
|
std::scoped_lock<platform::Mutex> FtpConfig::lockGuard ()
|
||||||
{
|
{
|
||||||
return std::lock_guard<platform::Mutex> (m_lock);
|
return std::scoped_lock<platform::Mutex> (m_lock);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
// - RFC 3659 (https://tools.ietf.org/html/rfc3659)
|
// - RFC 3659 (https://tools.ietf.org/html/rfc3659)
|
||||||
// - suggested implementation details from https://cr.yp.to/ftp/filesystem.html
|
// - suggested implementation details from https://cr.yp.to/ftp/filesystem.html
|
||||||
//
|
//
|
||||||
// Copyright (C) 2021 Michael Theall
|
// Copyright (C) 2022 Michael Theall
|
||||||
//
|
//
|
||||||
// This program is free software: you can redistribute it and/or modify
|
// This program is free software: you can redistribute it and/or modify
|
||||||
// it under the terms of the GNU General Public License as published by
|
// it under the terms of the GNU General Public License as published by
|
||||||
@ -52,7 +52,7 @@ using namespace std::chrono_literals;
|
|||||||
#define LOCKED(x) \
|
#define LOCKED(x) \
|
||||||
do \
|
do \
|
||||||
{ \
|
{ \
|
||||||
auto const lock = std::lock_guard (m_lock); \
|
auto const lock = std::scoped_lock (m_lock); \
|
||||||
x; \
|
x; \
|
||||||
} while (0)
|
} while (0)
|
||||||
#endif
|
#endif
|
||||||
@ -69,6 +69,86 @@ platform::Mutex s_lock;
|
|||||||
|
|
||||||
/// \brief Free space string
|
/// \brief Free space string
|
||||||
std::string s_freeSpace;
|
std::string s_freeSpace;
|
||||||
|
|
||||||
|
#ifndef CLASSIC
|
||||||
|
#ifndef NDEBUG
|
||||||
|
std::string printable (char *const data_, std::size_t const size_)
|
||||||
|
{
|
||||||
|
std::string result;
|
||||||
|
result.reserve (size_);
|
||||||
|
|
||||||
|
for (std::size_t i = 0; i < size_; ++i)
|
||||||
|
{
|
||||||
|
if (std::isprint (data_[i]) || std::isspace (data_[i]))
|
||||||
|
result.push_back (data_[i]);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
char buffer[5];
|
||||||
|
std::snprintf (buffer, sizeof (buffer), "%%%02u", static_cast<unsigned char> (data_[i]));
|
||||||
|
result += buffer;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
int curlDebug (CURL *const handle_, curl_infotype const type_, char *const data_, std::size_t const size_, void *const user_)
|
||||||
|
{
|
||||||
|
(void)user_;
|
||||||
|
|
||||||
|
auto const text = printable (data_, size_);
|
||||||
|
|
||||||
|
switch (type_)
|
||||||
|
{
|
||||||
|
case CURLINFO_TEXT:
|
||||||
|
info ("== Info: %s", text.c_str ());
|
||||||
|
break;
|
||||||
|
|
||||||
|
case CURLINFO_HEADER_OUT:
|
||||||
|
info ("=> Send header: %s", text.c_str ());
|
||||||
|
break;
|
||||||
|
|
||||||
|
case CURLINFO_DATA_OUT:
|
||||||
|
info ("=> Send data: %s", text.c_str ());
|
||||||
|
break;
|
||||||
|
|
||||||
|
case CURLINFO_SSL_DATA_OUT:
|
||||||
|
info ("=> Send SSL data: %s", text.c_str ());
|
||||||
|
break;
|
||||||
|
|
||||||
|
case CURLINFO_HEADER_IN:
|
||||||
|
info ("<= Receive header: %s", text.c_str ());
|
||||||
|
break;
|
||||||
|
|
||||||
|
case CURLINFO_DATA_IN:
|
||||||
|
info ("<= Receive data: %s", text.c_str ());
|
||||||
|
break;
|
||||||
|
|
||||||
|
case CURLINFO_SSL_DATA_IN:
|
||||||
|
info ("<= Receive SSL data: %s", text.c_str ());
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
std::size_t curlCallback (void *const contents_, std::size_t const size_, std::size_t const count_, void *const user_)
|
||||||
|
{
|
||||||
|
|
||||||
|
auto const total = size_ * count_;
|
||||||
|
auto const start = static_cast<char*> (contents_);
|
||||||
|
auto const end = start + total;
|
||||||
|
|
||||||
|
auto &result = *static_cast<std::string*> (user_);
|
||||||
|
result.insert (std::end (result), start, end);
|
||||||
|
|
||||||
|
return total;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////
|
||||||
@ -79,6 +159,18 @@ FtpServer::~FtpServer ()
|
|||||||
#ifndef NDS
|
#ifndef NDS
|
||||||
m_thread.join ();
|
m_thread.join ();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef CLASSIC
|
||||||
|
if (m_uploadLogCurl)
|
||||||
|
{
|
||||||
|
curl_multi_remove_handle (m_uploadLogCurlM, m_uploadLogCurl);
|
||||||
|
curl_easy_cleanup (m_uploadLogCurl);
|
||||||
|
curl_mime_free (m_uploadLogMime);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_uploadLogCurlM)
|
||||||
|
curl_multi_cleanup (m_uploadLogCurlM);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
FtpServer::FtpServer (UniqueFtpConfig config_) : m_config (std::move (config_)), m_quit (false)
|
FtpServer::FtpServer (UniqueFtpConfig config_) : m_config (std::move (config_)), m_quit (false)
|
||||||
@ -98,7 +190,7 @@ void FtpServer::draw ()
|
|||||||
{
|
{
|
||||||
char port[7];
|
char port[7];
|
||||||
#ifndef NDS
|
#ifndef NDS
|
||||||
auto const lock = std::lock_guard (m_lock);
|
auto const lock = std::scoped_lock (m_lock);
|
||||||
#endif
|
#endif
|
||||||
if (m_socket)
|
if (m_socket)
|
||||||
std::sprintf (port, ":%u", m_socket->sockName ().port ());
|
std::sprintf (port, ":%u", m_socket->sockName ().port ());
|
||||||
@ -123,7 +215,7 @@ void FtpServer::draw ()
|
|||||||
|
|
||||||
{
|
{
|
||||||
#ifndef NDS
|
#ifndef NDS
|
||||||
auto const lock = std::lock_guard (s_lock);
|
auto const lock = std::scoped_lock (s_lock);
|
||||||
#endif
|
#endif
|
||||||
if (!s_freeSpace.empty ())
|
if (!s_freeSpace.empty ())
|
||||||
{
|
{
|
||||||
@ -137,7 +229,7 @@ void FtpServer::draw ()
|
|||||||
|
|
||||||
{
|
{
|
||||||
#ifndef NDS
|
#ifndef NDS
|
||||||
auto const lock = std::lock_guard (m_lock);
|
auto const lock = std::scoped_lock (m_lock);
|
||||||
#endif
|
#endif
|
||||||
consoleSelect (&g_sessionConsole);
|
consoleSelect (&g_sessionConsole);
|
||||||
std::fputs ("\x1b[2J", stdout);
|
std::fputs ("\x1b[2J", stdout);
|
||||||
@ -167,7 +259,7 @@ void FtpServer::draw ()
|
|||||||
char title[64];
|
char title[64];
|
||||||
|
|
||||||
{
|
{
|
||||||
auto const serverLock = std::lock_guard (m_lock);
|
auto const serverLock = std::scoped_lock (m_lock);
|
||||||
std::snprintf (title,
|
std::snprintf (title,
|
||||||
sizeof (title),
|
sizeof (title),
|
||||||
STATUS_STRING " %s###ftpd",
|
STATUS_STRING " %s###ftpd",
|
||||||
@ -213,7 +305,7 @@ void FtpServer::draw ()
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
{
|
{
|
||||||
auto const lock = std::lock_guard (m_lock);
|
auto const lock = std::scoped_lock (m_lock);
|
||||||
for (auto &session : m_sessions)
|
for (auto &session : m_sessions)
|
||||||
session->draw ();
|
session->draw ();
|
||||||
}
|
}
|
||||||
@ -234,7 +326,7 @@ UniqueFtpServer FtpServer::create ()
|
|||||||
std::string FtpServer::getFreeSpace ()
|
std::string FtpServer::getFreeSpace ()
|
||||||
{
|
{
|
||||||
#ifndef NDS
|
#ifndef NDS
|
||||||
auto const lock = std::lock_guard (s_lock);
|
auto const lock = std::scoped_lock (s_lock);
|
||||||
#endif
|
#endif
|
||||||
return s_freeSpace;
|
return s_freeSpace;
|
||||||
}
|
}
|
||||||
@ -252,7 +344,7 @@ void FtpServer::updateFreeSpace ()
|
|||||||
auto freeSpace = fs::printSize (static_cast<std::uint64_t> (st.f_bsize) * st.f_bfree);
|
auto freeSpace = fs::printSize (static_cast<std::uint64_t> (st.f_bsize) * st.f_bfree);
|
||||||
|
|
||||||
#ifndef NDS
|
#ifndef NDS
|
||||||
auto const lock = std::lock_guard (s_lock);
|
auto const lock = std::scoped_lock (s_lock);
|
||||||
#endif
|
#endif
|
||||||
if (freeSpace != s_freeSpace)
|
if (freeSpace != s_freeSpace)
|
||||||
s_freeSpace = std::move (freeSpace);
|
s_freeSpace = std::move (freeSpace);
|
||||||
@ -330,7 +422,7 @@ void FtpServer::showMenu ()
|
|||||||
if (ImGui::BeginMenuBar ())
|
if (ImGui::BeginMenuBar ())
|
||||||
{
|
{
|
||||||
#if defined(__3DS__) || defined(__SWITCH__)
|
#if defined(__3DS__) || defined(__SWITCH__)
|
||||||
if (ImGui::BeginMenu (u8"Menu \xee\x80\x83")) // Y Button
|
if (ImGui::BeginMenu ("Menu \xee\x80\x83")) // Y Button
|
||||||
#else
|
#else
|
||||||
if (ImGui::BeginMenu ("Menu"))
|
if (ImGui::BeginMenu ("Menu"))
|
||||||
#endif
|
#endif
|
||||||
@ -338,6 +430,58 @@ void FtpServer::showMenu ()
|
|||||||
if (ImGui::MenuItem ("Settings"))
|
if (ImGui::MenuItem ("Settings"))
|
||||||
m_showSettings = true;
|
m_showSettings = true;
|
||||||
|
|
||||||
|
if (ImGui::MenuItem ("Upload Log"))
|
||||||
|
{
|
||||||
|
#ifndef NDS
|
||||||
|
auto const lock = std::scoped_lock (m_lock);
|
||||||
|
#endif
|
||||||
|
if (!m_uploadLogCurlM)
|
||||||
|
m_uploadLogCurlM = curl_multi_init ();
|
||||||
|
|
||||||
|
if (m_uploadLogCurlM && !m_uploadLogCurl.load (std::memory_order_relaxed))
|
||||||
|
{
|
||||||
|
m_uploadLogData = getLog ();
|
||||||
|
|
||||||
|
auto const handle = curl_easy_init ();
|
||||||
|
|
||||||
|
#ifdef __3DS__
|
||||||
|
// 3DS CA fails peer verification, so add CA here
|
||||||
|
curl_easy_setopt (handle, CURLOPT_CAINFO, "romfs:/sni.cloudflaressl.com.ca");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef NDEBUG
|
||||||
|
curl_easy_setopt (handle, CURLOPT_DEBUGFUNCTION, &curlDebug);
|
||||||
|
curl_easy_setopt (handle, CURLOPT_DEBUGDATA, nullptr);
|
||||||
|
curl_easy_setopt (handle, CURLOPT_VERBOSE, 1L);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// write result into string
|
||||||
|
m_uploadLogResult.clear ();
|
||||||
|
curl_easy_setopt (handle, CURLOPT_WRITEFUNCTION, &curlCallback);
|
||||||
|
curl_easy_setopt (handle, CURLOPT_WRITEDATA, &m_uploadLogResult);
|
||||||
|
|
||||||
|
// set headers
|
||||||
|
static char contentType[] = "Content-Type: multipart/form-data";
|
||||||
|
static curl_slist const headers = { contentType, nullptr };
|
||||||
|
curl_easy_setopt (handle, CURLOPT_URL, "https://hastebin.com/documents");
|
||||||
|
curl_easy_setopt (handle, CURLOPT_HTTPHEADER, &headers);
|
||||||
|
|
||||||
|
// set form data
|
||||||
|
auto const mime = curl_mime_init (handle);
|
||||||
|
auto const part = curl_mime_addpart (mime);
|
||||||
|
curl_mime_name (part, "data");
|
||||||
|
curl_mime_data (part, m_uploadLogData.data (), m_uploadLogData.size ());
|
||||||
|
curl_easy_setopt (handle, CURLOPT_MIMEPOST, mime);
|
||||||
|
|
||||||
|
// add to multi handle
|
||||||
|
curl_multi_add_handle (m_uploadLogCurlM, handle);
|
||||||
|
|
||||||
|
// signal network thread to process
|
||||||
|
m_uploadLogMime = mime;
|
||||||
|
m_uploadLogCurl.store (handle, std::memory_order_relaxed);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (ImGui::MenuItem ("About"))
|
if (ImGui::MenuItem ("About"))
|
||||||
m_showAbout = true;
|
m_showAbout = true;
|
||||||
|
|
||||||
@ -666,6 +810,49 @@ void FtpServer::loop ()
|
|||||||
handleNetworkFound ();
|
handleNetworkFound ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef CLASSIC
|
||||||
|
{
|
||||||
|
auto const lock = std::scoped_lock (m_lock);
|
||||||
|
if (m_uploadLogCurl.load (std::memory_order_relaxed))
|
||||||
|
{
|
||||||
|
int busy = 0;
|
||||||
|
auto const mc = curl_multi_perform (m_uploadLogCurlM, &busy);
|
||||||
|
if (mc != CURLM_OK)
|
||||||
|
{
|
||||||
|
error ("curl_multi_perform: %d %s\n", mc, curl_multi_strerror (mc));
|
||||||
|
|
||||||
|
curl_multi_remove_handle (m_uploadLogCurlM, m_uploadLogCurl);
|
||||||
|
curl_easy_cleanup (m_uploadLogCurl);
|
||||||
|
curl_mime_free (m_uploadLogMime);
|
||||||
|
m_uploadLogMime = nullptr;
|
||||||
|
m_uploadLogCurl.store (nullptr, std::memory_order_relaxed);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int count = 0;
|
||||||
|
auto const msg = curl_multi_info_read (m_uploadLogCurlM, &count);
|
||||||
|
if (msg && msg->msg == CURLMSG_DONE && msg->easy_handle == m_uploadLogCurl)
|
||||||
|
{
|
||||||
|
if (msg->data.result != CURLE_OK)
|
||||||
|
info ("cURL finished with status %d\n", msg->data.result);
|
||||||
|
|
||||||
|
if (m_uploadLogResult.starts_with ("{\"key\":\""))
|
||||||
|
{
|
||||||
|
auto const key = m_uploadLogResult.substr (8, 10);
|
||||||
|
info ("https://hastebin.com/%s\n", key.c_str ());
|
||||||
|
}
|
||||||
|
|
||||||
|
curl_multi_remove_handle (m_uploadLogCurlM, m_uploadLogCurl);
|
||||||
|
curl_easy_cleanup (m_uploadLogCurl);
|
||||||
|
curl_mime_free (m_uploadLogMime);
|
||||||
|
m_uploadLogMime = nullptr;
|
||||||
|
m_uploadLogCurl.store (nullptr, std::memory_order_relaxed);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
// poll listen socket
|
// poll listen socket
|
||||||
if (m_socket)
|
if (m_socket)
|
||||||
{
|
{
|
||||||
@ -698,7 +885,7 @@ void FtpServer::loop ()
|
|||||||
{
|
{
|
||||||
// remove dead sessions
|
// remove dead sessions
|
||||||
#ifndef NDS
|
#ifndef NDS
|
||||||
auto const lock = std::lock_guard (m_lock);
|
auto const lock = std::scoped_lock (m_lock);
|
||||||
#endif
|
#endif
|
||||||
auto it = std::begin (m_sessions);
|
auto it = std::begin (m_sessions);
|
||||||
while (it != std::end (m_sessions))
|
while (it != std::end (m_sessions))
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
// - RFC 3659 (https://tools.ietf.org/html/rfc3659)
|
// - RFC 3659 (https://tools.ietf.org/html/rfc3659)
|
||||||
// - suggested implementation details from https://cr.yp.to/ftp/filesystem.html
|
// - suggested implementation details from https://cr.yp.to/ftp/filesystem.html
|
||||||
//
|
//
|
||||||
// Copyright (C) 2020 Michael Theall
|
// Copyright (C) 2022 Michael Theall
|
||||||
//
|
//
|
||||||
// This program is free software: you can redistribute it and/or modify
|
// This program is free software: you can redistribute it and/or modify
|
||||||
// it under the terms of the GNU General Public License as published by
|
// it under the terms of the GNU General Public License as published by
|
||||||
@ -50,7 +50,7 @@ using namespace std::chrono_literals;
|
|||||||
#define LOCKED(x) \
|
#define LOCKED(x) \
|
||||||
do \
|
do \
|
||||||
{ \
|
{ \
|
||||||
auto const lock = std::lock_guard (m_lock); \
|
auto const lock = std::scoped_lock (m_lock); \
|
||||||
x; \
|
x; \
|
||||||
} while (0)
|
} while (0)
|
||||||
#endif
|
#endif
|
||||||
@ -318,7 +318,7 @@ FtpSession::FtpSession (FtpConfig &config_, UniqueSocket commandSocket_)
|
|||||||
bool FtpSession::dead ()
|
bool FtpSession::dead ()
|
||||||
{
|
{
|
||||||
#ifndef NDS
|
#ifndef NDS
|
||||||
auto const lock = std::lock_guard (m_lock);
|
auto const lock = std::scoped_lock (m_lock);
|
||||||
#endif
|
#endif
|
||||||
if (m_commandSocket || m_pasvSocket || m_dataSocket)
|
if (m_commandSocket || m_pasvSocket || m_dataSocket)
|
||||||
return false;
|
return false;
|
||||||
@ -329,7 +329,7 @@ bool FtpSession::dead ()
|
|||||||
void FtpSession::draw ()
|
void FtpSession::draw ()
|
||||||
{
|
{
|
||||||
#ifndef NDS
|
#ifndef NDS
|
||||||
auto const lock = std::lock_guard (m_lock);
|
auto const lock = std::scoped_lock (m_lock);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CLASSIC
|
#ifdef CLASSIC
|
||||||
@ -615,7 +615,7 @@ void FtpSession::setState (State const state_, bool const closePasv_, bool const
|
|||||||
{
|
{
|
||||||
{
|
{
|
||||||
#ifndef NDS
|
#ifndef NDS
|
||||||
auto lock = std::lock_guard (m_lock);
|
auto const lock = std::scoped_lock (m_lock);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
m_restartPosition = 0;
|
m_restartPosition = 0;
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
// - RFC 3659 (https://tools.ietf.org/html/rfc3659)
|
// - RFC 3659 (https://tools.ietf.org/html/rfc3659)
|
||||||
// - suggested implementation details from https://cr.yp.to/ftp/filesystem.html
|
// - suggested implementation details from https://cr.yp.to/ftp/filesystem.html
|
||||||
//
|
//
|
||||||
// Copyright (C) 2020 Michael Theall
|
// Copyright (C) 2022 Michael Theall
|
||||||
//
|
//
|
||||||
// This program is free software: you can redistribute it and/or modify
|
// This program is free software: you can redistribute it and/or modify
|
||||||
// it under the terms of the GNU General Public License as published by
|
// it under the terms of the GNU General Public License as published by
|
||||||
@ -25,6 +25,7 @@
|
|||||||
#include "imgui.h"
|
#include "imgui.h"
|
||||||
|
|
||||||
#include <mutex>
|
#include <mutex>
|
||||||
|
#include <ranges>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
namespace
|
namespace
|
||||||
@ -79,7 +80,7 @@ platform::Mutex s_lock;
|
|||||||
void drawLog ()
|
void drawLog ()
|
||||||
{
|
{
|
||||||
#ifndef NDS
|
#ifndef NDS
|
||||||
auto const lock = std::lock_guard (s_lock);
|
auto const lock = std::scoped_lock (s_lock);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CLASSIC
|
#ifdef CLASSIC
|
||||||
@ -149,6 +150,39 @@ void drawLog ()
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef CLASSIC
|
||||||
|
std::string getLog ()
|
||||||
|
{
|
||||||
|
#ifndef NDS
|
||||||
|
auto const lock = std::scoped_lock (s_lock);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (s_messages.empty ())
|
||||||
|
return {};
|
||||||
|
|
||||||
|
std::vector<Message const *> stack;
|
||||||
|
stack.reserve (s_messages.size ());
|
||||||
|
|
||||||
|
std::size_t size = 0;
|
||||||
|
for (auto const &msg : s_messages | std::views::reverse)
|
||||||
|
{
|
||||||
|
if (size + msg.message.size () > 1024 * 1024)
|
||||||
|
break;
|
||||||
|
|
||||||
|
size += msg.message.size ();
|
||||||
|
stack.emplace_back (&msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string log;
|
||||||
|
log.reserve (size);
|
||||||
|
|
||||||
|
for (auto const &msg : stack | std::views::reverse)
|
||||||
|
log += msg->message;
|
||||||
|
|
||||||
|
return log;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
void debug (char const *const fmt_, ...)
|
void debug (char const *const fmt_, ...)
|
||||||
{
|
{
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
@ -211,7 +245,7 @@ void addLog (LogLevel const level_, char const *const fmt_, va_list ap_)
|
|||||||
std::vsnprintf (buffer, sizeof (buffer), fmt_, ap_);
|
std::vsnprintf (buffer, sizeof (buffer), fmt_, ap_);
|
||||||
|
|
||||||
#ifndef NDS
|
#ifndef NDS
|
||||||
auto const lock = std::lock_guard (s_lock);
|
auto const lock = std::scoped_lock (s_lock);
|
||||||
#endif
|
#endif
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
// std::fprintf (stderr, "%s", s_prefix[level_]);
|
// std::fprintf (stderr, "%s", s_prefix[level_]);
|
||||||
@ -239,7 +273,7 @@ void addLog (LogLevel const level_, std::string_view const message_)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifndef NDS
|
#ifndef NDS
|
||||||
auto const lock = std::lock_guard (s_lock);
|
auto const lock = std::scoped_lock (s_lock);
|
||||||
#endif
|
#endif
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
// std::fprintf (stderr, "%s", s_prefix[level_]);
|
// std::fprintf (stderr, "%s", s_prefix[level_]);
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
// - RFC 3659 (https://tools.ietf.org/html/rfc3659)
|
// - RFC 3659 (https://tools.ietf.org/html/rfc3659)
|
||||||
// - suggested implementation details from https://cr.yp.to/ftp/filesystem.html
|
// - suggested implementation details from https://cr.yp.to/ftp/filesystem.html
|
||||||
//
|
//
|
||||||
// Copyright (C) 2020 Michael Theall
|
// Copyright (C) 2022 Michael Theall
|
||||||
//
|
//
|
||||||
// This program is free software: you can redistribute it and/or modify
|
// This program is free software: you can redistribute it and/or modify
|
||||||
// it under the terms of the GNU General Public License as published by
|
// it under the terms of the GNU General Public License as published by
|
||||||
@ -24,12 +24,17 @@
|
|||||||
|
|
||||||
#include "imgui.h"
|
#include "imgui.h"
|
||||||
|
|
||||||
|
#ifndef CLASSIC
|
||||||
|
#include <curl/curl.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
|
|
||||||
int main (int argc_, char *argv_[])
|
int main (int argc_, char *argv_[])
|
||||||
{
|
{
|
||||||
#ifndef CLASSIC
|
#ifndef CLASSIC
|
||||||
|
curl_global_init (CURL_GLOBAL_ALL);
|
||||||
IMGUI_CHECKVERSION ();
|
IMGUI_CHECKVERSION ();
|
||||||
ImGui::CreateContext ();
|
ImGui::CreateContext ();
|
||||||
#endif
|
#endif
|
||||||
@ -65,5 +70,6 @@ int main (int argc_, char *argv_[])
|
|||||||
|
|
||||||
#ifndef CLASSIC
|
#ifndef CLASSIC
|
||||||
ImGui::DestroyContext ();
|
ImGui::DestroyContext ();
|
||||||
|
curl_global_cleanup ();
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user