Compare commits

..

1 Commits

Author SHA1 Message Date
b73865157d test 2024-02-27 08:53:18 +00:00
251 changed files with 693 additions and 32866 deletions

View File

@ -1,59 +0,0 @@
# NanoMQ Configuration 0.18.0
# #============================================================
# # NanoMQ Broker
# #============================================================
mqtt {
property_size = 32
max_packet_size = 260MB
max_mqueue_len = 2048
retry_interval = 10s
keepalive_multiplier = 1.25
# Three of below, unsupported now
max_inflight_window = 2048
max_awaiting_rel = 10s
await_rel_timeout = 10s
}
listeners.tcp {
bind = "192.168.1.78:1883"
}
listeners.ws {
bind = "192.168.1.78:9001"
}
http_server {
port = 8081
limit_conn = 2
username = admin
password = public
auth_type = basic
jwt {
public.keyfile = "/etc/certs/jwt/jwtRS256.key.pub"
}
}
log {
to = [file, console]
level = warn
dir = "/tmp"
file = "nanomq.log"
rotation {
size = 10MB
count = 5
}
}
auth {
allow_anonymous = true
no_match = allow
deny_action = ignore
cache = {
max_size = 32
ttl = 1m
}
}

View File

@ -1 +0,0 @@
.\nanomq.exe start --conf .\nanomq.conf

View File

@ -1,71 +0,0 @@
# NanoMQ Configuration 0.18.0
# #============================================================
# # NanoMQ Broker
# #============================================================
mqtt {
property_size = 32
max_packet_size = 260MB
max_mqueue_len = 2048
retry_interval = 10s
keepalive_multiplier = 1.25
# Three of below, unsupported now
max_inflight_window = 2048
max_awaiting_rel = 10s
await_rel_timeout = 10s
}
listeners.tcp {
bind = "0.0.0.0:1883"
}
# listeners.ssl {
# bind = "0.0.0.0:8883"
# keyfile = "/etc/certs/key.pem"
# certfile = "/etc/certs/cert.pem"
# cacertfile = "/etc/certs/cacert.pem"
# verify_peer = false
# fail_if_no_peer_cert = false
# }
listeners.ws {
bind = "0.0.0.0:9001"
}
http_server {
port = 8081
limit_conn = 2
username = admin
password = public
auth_type = basic
jwt {
public.keyfile = "/etc/certs/jwt/jwtRS256.key.pub"
}
}
log {
to = [file, console]
level = warn
dir = "/tmp"
file = "nanomq.log"
rotation {
size = 10MB
count = 5
}
}
auth {
allow_anonymous = true
no_match = allow
deny_action = ignore
cache = {
max_size = 32
ttl = 1m
}
# password = {include "/etc/nanomq_pwd.conf"}
# acl = {include "/etc/nanomq_acl.conf"}
}

View File

@ -1,14 +0,0 @@
# #====================================================================
# # Configuration for Acl
# #====================================================================
rules = [
# # Allow MQTT client using username "dashboard" to subscribe to "$SYS/#" topics
{"permit": "allow", "username": "dashboard", "action": "subscribe", "topics": ["$SYS/#"]}
# # Deny "All Users" subscribe to "$SYS/#" "#" Topics
# {"permit": "deny", "username": "#", "action": "subscribe", "topics": ["$SYS/#", "#"]}
# # Allow any other publish/subscribe operation
{"permit": "allow"}
]

View File

@ -1,399 +0,0 @@
# #====================================================================
# # MQTT Broker Bridge
# #====================================================================
bridges.mqtt.emqx1 {
# # Bridge address: host:port .
# #
# # Value: String
# # Example: mqtt-tcp://127.0.0.1:1883
# # tls+mqtt-tcp://127.0.0.1:8883
# # mqtt-quic://54.75.171.11:14567
server = "mqtt-tcp://127.0.0.1:1883"
# # Protocol version of the bridge.
# #
# # Value: Enum
# # - 5: mqttv5
# # - 4: mqttv311
# # - 3: mqttv31
proto_ver = 4
# # The ClientId of a remote bridge.
# # Default random string.
# #
# # Value: String
# clientid="bridge_client"
# # Ping: interval of a downward bridge.
# #
# # Value: Duration
# # Default: 10 seconds
keepalive = 60s
# # The maximum backoff timeout.
# # Reconnect after no more than backoff_max when bridge connection lost.
# #
# # Value: Duration
# # Default: 60s
backoff_max = 60s
# # The Clean start flag of a remote bridge.
# #
# # Value: boolean
# # Default: false
# #
# # NOTE: Some IoT platforms require clean_start
# # must be set to 'true'
clean_start = false
# # The username for a remote bridge.
# #
# # Value: String
username = username
# # The password for a remote bridge.
# #
# # Value: String
password = passwd
# # Properties for MQTT V5
conn_properties = {
# # Maximum Packet Size
# #
# # If the Maximum Packet Size is not present, no limit on the packet size is imposed beyond
# # the limitations in the protocol as a result of the remaining length encoding and the protocol header sizes.
# # Value: 1 ~ 4294967295
maximum_packet_size = 1024
# # Receive Maximum
# #
# # The Client uses this value to limit the number of QoS 1 and QoS 2 publications that it is willing to process concurrently.
# # There is no mechanism to limit the QoS 0 publications that the Server might try to send.
# # The value of Receive Maximum applies only to the current Network Connection.
# # If the Receive Maximum value is absent then its value defaults to 65,535.
# #
# # Value: 1 ~ 65535
receive_maximum = 65535
# # Topic Alias Maximum
# #
# # If the Topic Alias Maximum property is absent, the default value is 0.
# # This value indicates the highest value that the Client will accept as a Topic Alias sent by the Server.
# # The Client uses this value to limit the number of Topic Aliases that it is willing to hold on this Connection.
# # Default: 0
# # Value: 0 ~ 65535
topic_alias_maximum = 0
# # Request Problem Information
# #
# # If the Request Problem Information is absent, the value of 1 is used.
# # The Client uses this value to indicate whether the Reason String or User Properties are sent in the case of failures.
# # If the value of Request Problem Information is 0, the Server MAY return a Reason String or User Properties on a CONNACK or DISCONNECT packet,
# # but MUST NOT send a Reason String or User Properties on any packet other than PUBLISH, CONNACK, or DISCONNECT.
# # If the value is 0 and the Client receives a Reason String or User Properties in a packet other than PUBLISH, CONNACK, or DISCONNECT,
# # it uses a DISCONNECT packet with Reason Code 0x82 (Protocol Error) as described in section 4.13 Handling errors.
# # If this value is 1, the Server MAY return a Reason String or User Properties on any packet where it is allowed.
# #
# # Default: 1
# # Value: 0 | 1
request_problem_infomation = 1
# # Request Response Information
# #
# # If the Request Response Information is absent, the value of 0 is used.
# # The Client uses this value to request the Server to return Response Information in the CONNACK.
# # A value of 0 indicates that the Server MUST NOT return Response Information.
# # If the value is 1 the Server MAY return Response Information in the CONNACK packet.
# #
# # Default: 0
# # Value: 0 | 1
request_response_infomation = 0
# # Session Expiry Interval
# #
# # If the Session Expiry Interval is absent the value 0 is used.
# # If it is set to 0, or is absent, the Session ends when the Network Connection is closed.
# # If the Session Expiry Interval is 4294967295 (UINT_MAX), the Session does not expire.
# #
# # Value: 0 ~ 4294967295
session_expiry_interval = 0
# # User Property
# #
# # The User Property is allowed to appear multiple times to represent multiple name, value pairs.
# # The same name is allowed to appear more than once.
# # Value: Map[key(String) - value(String)]
user_property = {
key1 = value1
key2 = value2
}
}
will {
# # Will topic
topic = "will_topic"
# # Will QoS
qos = 1
# # Will paylad retain flag
retain = false
# # Will payload
payload = "will_message"
# # Will properties
properties = {
# # Payload Format Indicator
# #
# # 0 (0x00) Byte Indicates that the Will Message is unspecified bytes,
# # which is equivalent to not sending a Payload Format Indicator.
# #
# # 1 (0x01) Byte Indicates that the Will Message is UTF-8 Encoded Character Data.
# #
# # Default: 0
# # Value: 0 | 1
payload_format_indicator = 0
# # Message Expiry Interval
# #
# # If present, the Four Byte value is the lifetime of the Will Message in seconds
# # and is sent as the Publication Expiry Interval when the Server publishes the Will Message.
# #
# # If absent, no Message Expiry Interval is sent when the Server publishes the Will Message.
message_expiry_interval = 0
# # Content Type
# # The value of the Content Type is defined by the sending and receiving application.
content_type = ""
# # Response Topic
# # The presence of a Response Topic identifies the Will Message as a Request.
response_topic = ""
# # Correlation Data
# # The Correlation Data is used by the sender of the Request Message to identify which request
# # the Response Message is for when it is received.
correlation_data = ""
# # Will Delay Interval
# #
# # If the Will Delay Interval is absent, the default value is 0 and there is no delay
# # before the Will Message is published.
# #
# # The Server delays publishing the Clients Will Message until the Will Delay Interval
# # has passed or the Session ends, whichever happens first.
# # If a new Network Connection to this Session is made before the Will Delay Interval has passed, the Server MUST NOT send the Will Message
will_delay_interval = 0
# # User Property
# #
# # The User Property is allowed to appear multiple times to represent multiple name, value pairs.
# # The same name is allowed to appear more than once.
# # Value: Map[key(String) - value(String)]
user_property = {
key1 = value1
key2 = value2
}
}
}
# # Ssl config ##
# # Ssl config is invalid when working in MQTT over QUIC mode ##
# ssl {
# # # Ssl key password
# # # String containing the user's password. Only used if the private keyfile
# # # is password-protected.
# # #
# # # Value: String
# # # key_password = "yourpass"
# # # Ssl keyfile
# # # Path of the file containing the client's private key.
# # #
# # # Value: File
# keyfile = "../etc/certs/key.pem"
# # # Ssl cert file
# # # Path of the file containing the client certificate.
# # #
# # # Value: File
# certfile = "../etc/certs/cert.pem"
# # # Ssl ca cert file
# # # Path of the file containing the server's root CA certificate.
# # #
# # # This certificate is used to identify the AWS IoT server and is publicly
# # # available.
# # #
# # # Value: File
# cacertfile = "../etc/certs/cacert.pem"
# }
# # Topics that need to be forward to IoTHUB
# #
# # Value: String
# # Example: topic1/#,topic2/#
forwards = [
{
# # Need to forward to remote broker topics
# #
# # Value: String
remote_topic = "fwd/topic1"
# # topic reflection with remote_topic
# #
# # Value: String
local_topic = "topic1"
}
{
remote_topic = "fwd/topic2"
local_topic = "topic2"
}
]
# #--------------------------------------------------------------------
# # The following config params only effective when set QUIC as the
# # transport layer of bridging connection (mqtt-quic://{host}:{port})!
# #
# # Ping: interval of a sending keepalive packet via QUIC transport.
# #
# # Value: Duration
# # Default: 120 seconds
quic_keepalive = 120s
# # Idle Timeout: How long a connection can go idle before it is gracefully shut down.
# # 0 to disable timeout, which may lost disconnect event msg.
# # Value: Duration
# # Default: 120 seconds
quic_idle_timeout = 120s
# # Disconnect Timeout: How long to wait for an ACK before declaring
# # a path dead and disconnecting, This affects stream living time.
# # Value: Duration
# # Default: 20 seconds
quic_discon_timeout = 20s
# # Handshake Timeout: the Max time NanoMQ waits for establishing QUIC connection
# # How long a handshake can idle before it is discarded
# # Value: Duration
# # Default: 60 seconds
quic_handshake_timeout = 60s
# # Send Idle Timeout: Reset congestion control after being idle `SendIdleTimeout`
# # Value: Duration
# # Default: 60 seconds
quic_send_idle_timeout = 2s
# # Initial RTT: Initial RTT estimate. (ms)
# # RTT: round trip time
# # Default: 800ms
quic_initial_rtt_ms = 800ms
# # Max Ack Delay: How long to wait after receiving data before sending an ACK.
# # Value: Duration
# # Default: 100ms
quic_max_ack_delay_ms = 100ms
# # multi-stream mode: enable or disable the multi-stream bridging mode
# # Warning: This is a feature WIP. Do not enable it!
# # Value: True/False
# # Default: False
quic_multi_stream = false
# # qos_priority: send QoS 1/2 msg in high prority
# # QoS 0 messages remain as same
# # Value: true/false
# # Default: true
quic_qos_priority = true
# # 0RTT: enable or diable 0RTT, 0RTT is a feature of QUIC to re-establish
# # connection quickly.
# # Value: true/false
# # Default: true
quic_0rtt = true
subscription = [
{
# # The topic filter of which subscribe to remote broker
# # This must present to enable the subscription of bridging
# #
# # Value: String
remote_topic = "cmd/topic3"
# # This is for Topic reflection, if you want the vanila way:
# # Leave `local_topic=""` to preserve the original topic in msg
# # Value: String
local_topic = "topic3"
# # Need to subscribe to remote topics QoS.
# # Please set QoS for each subscription topic
# # otherwise topic is invalid, NanoMQ won't sub to any topic
# # Value: Number
qos = 1
}
{
remote_topic = "cmd/topic4"
local_topic = "topic4"
qos = 2
}
]
# # Properties of subscribe for MQTT V5
sub_properties {
# # Subscription Identifier
# #
# # The Subscription Identifier can have the value of 1 to 268,435,455.
# # It is a Protocol Error if the Subscription Identifier has a value of 0.
# # It is a Protocol Error to include the Subscription Identifier more than once.
# # The Subscription Identifier is associated with any subscription created or modified as the result of this SUBSCRIBE packet.
# # If there is a Subscription Identifier, it is stored with the subscription.
# # If this property is not specified, then the absence of a Subscription Identifier is stored with the subscription.
# #
# # Value: 1 ~ 268,435,455
identifier = 1
# # User Property
# #
# # The User Property is allowed to appear multiple times to represent multiple name, value pairs.
# # The same name is allowed to appear more than once.
# #
# # Value: Map[key(String) - value(String)]
user_property = {
key1 = value1
key2 = value2
}
}
# # Hybrid bridging: enable or disable the hybrid bridging mode
# # Value: True/False
# # Default: False
hybrid_bridging = false
# # Hybrid servers
# # When hybrid mode is enabled and the connection to server is
# # disconnected. Bridge will switch to hybrid_servers in roundrobin.
# # Value: Array
# # Default: []
hybrid_servers = ["mqtt-quic://127.1:14567", "mqtt-tcp://127.1:1883"]
# # max_parallel_processes
# # Handle a specified maximum number of outstanding requests
# #
# # Value: 1-infinity
max_parallel_processes = 2
# # max send queue length
# # Handle a specified maximum number of message send queue length
# #
# # Value: 1-infinity
max_send_queue_len = 32
# # max receive queue length
# # Handle a specified maximum number of message receive queue length
# #
# # Value: 1-infinity
max_recv_queue_len = 128
}
bridges.mqtt.cache {
# # Max message limitation for caching
# # ( 0 means ineffective )
# # Value: 1-infinity
disk_cache_size = 102400
# # Mounted file path
# #
# # Value: path
# mounted_file_path="/tmp/"
# # The threshold of flushing messages to flash.
# #
# # Value: 1-infinity
flush_mem_threshold = 100
# # Resend interval (ms)
# # The interval for resending the messages after failure recovered. (not related to trigger)
# #
# # Value: 1-infinity
resend_interval = 5000
}

View File

@ -1,164 +0,0 @@
# Example1. (default)
# This configure will make msgs with topic topic1 be shared in DDS network and MQTT network.
# It receive messages from MQTT network in topic DDSCMD/topic1 and send them to DDS network with topic MQTT/topic1.
# It receive messages from DDS network in topic MQTTCMD/topic1 and send them to MQTT network with topic DDS/topic1.
forward_rules = {
dds_to_mqtt = [
{
from_dds = "MQTTCMD/topic1"
to_mqtt = "DDS/topic1"
struct_name = "example_struct"
}
{
from_dds = "MQTTCMD/topic2"
to_mqtt = "DDS/topic2"
struct_name = "example_struct"
}
],
mqtt_to_dds = [
{
from_mqtt = "DDSCMD/topic1"
to_dds = "MQTT/topic1"
struct_name = "example_struct"
}
{
from_mqtt = "DDSCMD/topic2"
to_dds = "MQTT/topic2"
struct_name = "example_struct"
}
]
}
dds {
# # dds domain id
# # default: 0
# # Value: uint32
domain_id = 0
# # dds subscriber partition. Setting multiple partitions is not supported yet.
# # default: "partition"
# # Value: string
subscriber_partition = "partition"
# # dds publisher partition. Setting multiple partitions is not supported yet.
# # default: "partition"
# # Value: string
publisher_partition = "partition"
shared_memory = {
# # Enable shared memory transport.
# # Iceoryx is required if enable shared memory transport.
# #
# # Default: false
# # Value: boolean
enable = false
# # controls the output of the iceoryx runtime and can be set to, in order of decreasing output:
# # log level: verbose, debug, info, warn, error, fatal, off
# # Default: info
# # Value: enum
log_level = info
}
}
mqtt {
connector {
# # Bridge address: host:port .
# #
# # Value: String
# # Example: mqtt-tcp://127.0.0.1:1883
# # tls+mqtt-tcp://127.0.0.1:8883
server = "mqtt-tcp://127.0.0.1:1883"
# # Protocol version of the bridge.
# #
# # Value: Enum
# # - 5: mqttv5
# # - 4: mqttv311
# # - 3: mqttv31
proto_ver = 4
# # The ClientId of a remote bridge.
# # Default random string.
# #
# # Value: String
# clientid="bridge_client"
# # Ping: interval of a downward bridge.
# #
# # Value: Duration
# # Default: 10 seconds
keepalive = 60s
# # The Clean start flag of a remote bridge.
# #
# # Value: boolean
# # Default: false
# #
# # NOTE: Some IoT platforms require clean_start
# # must be set to 'true'
clean_start = true
# # The username for a remote bridge.
# #
# # Value: String
username = username
# # The password for a remote bridge.
# #
# # Value: String
password = passwd
// ssl {
// # # Ssl key password
// # # String containing the user's password. Only used if the private keyfile
// # # is password-protected.
// # #
// # # Value: String
// key_password = "yourpass"
// # # Ssl keyfile
// # # Path of the file containing the client's private key.
// # #
// # # Value: File
// keyfile = "/etc/certs/key.pem"
// # # Ssl cert file
// # # Path of the file containing the client certificate.
// # #
// # # Value: File
// certfile = "/etc/certs/cert.pem"
// # # Ssl ca cert file
// # # Path of the file containing the server's root CA certificate.
// # #
// # # This certificate is used to identify the AWS IoT server and is publicly
// # # available.
// # #
// # # Value: File
// cacertfile = "/etc/certs/cacert.pem"
// }
}
}
# #============================================================
# # Http server
# #============================================================
http_server {
# # http server port
# #
# # Value: 0 - 65535
port = 8082
# # parallel for http server
# # Handle a specified maximum number of outstanding requests
# #
# # Value: 1-infinity
parallel = 2
# # username
# #
# # Basic authorization
# #
# # Value: String
username = admin
# # password
# #
# # Basic authorization
# #
# # Value: String
password = public
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,8 +0,0 @@
# #====================================================================
# # Configuration for Password
# #====================================================================
# # Write "username":"password" in this way.
"admin": "public"
"client": "public"

View File

@ -1,53 +0,0 @@
##====================================================================
# # Configuration for MQTT VSOMEIP Gateway
# #====================================================================
gateway.mqtt {
address = "mqtt-tcp://localhost:1885"
sub_topic = "topic/sub"
sub_qos = 0
proto_ver = 4
keepalive = 60
clean_start = true
username = "username"
password = "passwd"
clientid = "vsomeip_gateway"
forward = "topic/pub"
parallel = 2
}
gateway.vsomeip {
service_id = "0x1111"
service_instance_id = "0x2222"
service_method_id = "0x3333"
service_event_id = "0x8778"
service_eventgroup_id = "0x4465"
conf_path = "/etc/vsomeip.json"
}
# #============================================================
# # Http server
# #============================================================
http_server {
# # http server port
# #
# # Value: 0 - 65535
port = 8082
# # parallel for http server
# # Handle a specified maximum number of outstanding requests
# #
# # Value: 1-infinity
parallel = 2
# # username
# #
# # Basic authorization
# #
# # Value: String
username = admin
# # password
# #
# # Basic authorization
# #
# # Value: String
password = public
}

View File

@ -1,102 +0,0 @@
##====================================================================
## Configuration for MQTT ZeroMQ Gateway
##====================================================================
gateway.mqtt {
## MQTT Broker address: host:port .
##
## Value: String
## Example: mqtt-tcp://127.0.0.1:1883
address="mqtt-tcp://broker.emqx.io:1883"
## Need to subscribe to remote broker topics
##
## Value: String
sub_topic="topic/sub"
## Protocol version of the mqtt client.
##
## Value: Enum
## - 5: mqttv5
## - 4: mqttv4
## - 3: mqttv3
proto_ver=4
## Ping interval of a down mqtt client.
##
## Value: Duration
## Default: 10 seconds
keepalive=60
## The Clean start flag of mqtt client.
##
## Value: boolean
## Default: true
##
## NOTE: Some IoT platforms require clean_start
## must be set to 'true'
clean_start=true
## The username for mqtt client.
##
## Value: String
username="username"
## The password for mqtt client.
##
## Value: String
password="passwd"
## Topics that need to be forward to IoTHUB
##
## Value: String
## Example: topic1/pub
forward="topic/pub"
## parallel
## Handle a specified maximum number of outstanding requests
##
## Value: 1-infinity
parallel=2
}
gateway.zmq {
## ZeroMQ Subscribe address: host:port .
##
## Value: String
## Example: tcp://127.0.0.1:5560
sub_address="tcp://127.0.0.1:5560"
## ZeroMQ Publish address: host:port .
##
## Value: String
## Example: tcp://127.0.0.1:5559
pub_address="tcp://127.0.0.1:5559"
## ZeroMQ subscription prefix
##
## Value: String
## Example: sub_prefix
sub_pre="sub_prefix"
## ZeroMQ publish prefix
##
## Value: String
## Example: pub_prefix
pub_pre="pub_prefix"
}
# #============================================================
# # Http server
# #============================================================
http_server {
# # http server port
# #
# # Value: 0 - 65535
port = 8082
# # parallel for http server
# # Handle a specified maximum number of outstanding requests
# #
# # Value: 1-infinity
parallel = 2
# # username
# #
# # Basic authorization
# #
# # Value: String
username = admin
# # password
# #
# # Basic authorization
# #
# # Value: String
password = public
}

View File

@ -1 +0,0 @@
aux_source_directory(. DIR_LIB_SRCS)

View File

@ -1,12 +0,0 @@
#ifndef NANOMQ_ACL_HANDLER_H
#define NANOMQ_ACL_HANDLER_H
#include "nng/nng.h"
#include "nng/supplemental/nanolib/conf.h"
#include "nng/supplemental/nanolib/acl_conf.h"
#ifdef ACL_SUPP
extern bool auth_acl(
conf *config, acl_action_type type, conn_param *param, const char *topic);
#endif
#endif

View File

@ -1,10 +0,0 @@
#ifndef AWS_BRIDGE_H
#define AWS_BRIDGE_H
#include "nng/supplemental/nanolib/conf.h"
#include "broker.h"
extern int aws_bridge_client(conf_bridge_node *node);
extern void aws_bridge_forward(nano_work *work);
#endif

View File

@ -1,42 +0,0 @@
#ifndef NANOMQ_BRIDGE_H
#define NANOMQ_BRIDGE_H
#include "nng/mqtt/mqtt_client.h"
#include "nng/nng.h"
#include "nng/supplemental/nanolib/conf.h"
#include "nng/supplemental/util/platform.h"
#include <stdio.h>
#include <stdlib.h>
#include "broker.h"
#include "pub_handler.h"
typedef struct {
nng_socket *sock;
conf_bridge_node *config; // bridge conf file
nng_mqtt_client *client;
nng_msg *connmsg;
conf *conf; //parent conf file
nng_mtx *switch_mtx;
nng_cv *switch_cv;
nng_mtx *exec_mtx;
nng_cv *exec_cv;
nng_duration cancel_timeout;
} bridge_param;
extern bool topic_filter(const char *origin, const char *input);
extern int bridge_client(
nng_socket *sock, conf *config, conf_bridge_node *bridge_conf);
extern int hybrid_bridge_client(
nng_socket *sock, conf *config, conf_bridge_node *node);
extern void bridge_handle_topic_reflection(nano_work *work, conf_bridge *bridge);
extern nng_msg *bridge_publish_msg(const char *topic, uint8_t *payload,
uint32_t len, bool dup, uint8_t qos, bool retain, property *props);
extern int bridge_reload(nng_socket *sock, conf *config, conf_bridge_node *node);
extern int bridge_subscribe(nng_socket *sock, conf_bridge_node *node,
nng_mqtt_topic_qos *topic_qos, size_t sub_count, property *properties);
extern int bridge_unsubscribe(nng_socket *sock, conf_bridge_node *node,
nng_mqtt_topic *topic, size_t unsub_count, property *properties);
#endif // NANOMQ_BRIDGE_H

View File

@ -1,106 +0,0 @@
#ifndef NANOMQ_BROKER_H
#define NANOMQ_BROKER_H
#define HTTP_CTX_NUM 4
#include "nng/supplemental/nanolib/conf.h"
#include "nng/supplemental/nanolib/nanolib.h"
#include "nng/nng.h"
#include "nng/protocol/mqtt/mqtt.h"
#include "nng/supplemental/util/platform.h"
#include "nng/mqtt/packet.h"
#include "hashmap.h"
#define PROTO_MQTT_BROKER 0x00
#define PROTO_MQTT_BRIDGE 0x01
#define PROTO_AWS_BRIDGE 0x02
#define PROTO_HTTP_SERVER 0x03
#define PROTO_ICEORYX_BRIDGE 0x04
#define STATISTICS
#if defined(ENABLE_NANOMQ_TESTS)
#undef STATISTICS
#endif
typedef struct work nano_work;
struct work {
enum {
INIT,
RECV,
WAIT,
SEND, // Actions after sending msg
HOOK, // Rule Engine
END, // Clear state and cache before disconnect
CLOSE // sending disconnect packet and err code
} state;
uint8_t proto; // logic proto
uint8_t proto_ver; // MQTT version cache
uint8_t flag; // flag for webhook & rule_engine
nng_aio * aio;
nng_msg * msg;
nng_msg ** msg_ret;
nng_ctx ctx; // ctx for mqtt broker
nng_ctx extra_ctx; // ctx for bridging/http post
nng_pipe pid;
dbtree * db;
dbtree * db_ret;
conf * config;
conf_bridge_node *node; // only works for bridge ctx
reason_code code; // MQTT reason code
nng_socket hook_sock;
struct pipe_content * pipe_ct;
conn_param * cparam;
struct pub_packet_struct *pub_packet;
packet_subscribe * sub_pkt;
packet_unsubscribe * unsub_pkt;
void *sqlite_db;
#if defined(SUPP_PLUGIN)
property *user_property;
#endif
#if defined(SUPP_ICEORYX)
void *iceoryx_suber;
void *iceoryx_puber;
nng_socket iceoryx_sock;
#endif
};
struct client_ctx {
nng_pipe pid;
#ifdef STATISTICS
nng_atomic_u64 *recv_cnt;
#endif
conn_param *cparam;
uint32_t prop_len;
property *properties;
uint8_t proto_ver;
};
static int broker_start_rc;
typedef struct client_ctx client_ctx;
extern int broker_start(int argc, char **argv);
extern int broker_stop(int argc, char **argv);
extern int broker_restart(int argc, char **argv);
extern int broker_reload(int argc, char **argv);
extern int broker_dflt(int argc, char **argv);
extern void bridge_send_cb(void *arg);
extern void *broker_start_with_conf(void *nmq_conf);
#ifdef STATISTICS
extern uint64_t nanomq_get_message_in(void);
extern uint64_t nanomq_get_message_out(void);
extern uint64_t nanomq_get_message_drop(void);
#endif
extern dbtree * get_broker_db(void);
extern struct hashmap_s *get_hashmap(void);
extern int rule_engine_insert_sql(nano_work *work);
#endif

View File

@ -1,20 +0,0 @@
#ifndef NANOMQ_CMD_PROC_H
#define NANOMQ_CMD_PROC_H
#define CMD_IPC_URL "ipc:///tmp/nanomq_cmd.ipc"
#define IPC_URL_PATH "/tmp/nanomq_cmd.ipc"
// #define CMD_IPC_URL "tcp://127.0.0.1:10000"
#define CMD_PROC_PARALLEL 1
#include "nng/nng.h"
#include "nng/supplemental/nanolib/conf.h"
#include "nng/supplemental/nanolib/log.h"
typedef struct cmd_work cmd_work;
extern void cmd_server_cb(void *arg);
extern cmd_work *alloc_cmd_work(nng_socket sock, conf *config);
extern void start_cmd_client(const char *cmd, const char *url);
extern char * encode_client_cmd(const char *conf_file, int type);
#endif // NANOMQ_CMD_PROC_H

View File

@ -1,43 +0,0 @@
#ifndef NANOMQ_CONF_API_H
#define NANOMQ_CONF_API_H
#include "nng/supplemental/nanolib/conf.h"
#include "nng/supplemental/nanolib/cJSON.h"
#include "nng/supplemental/nanolib/file.h"
#include "nng/supplemental/nanolib/utils.h"
#include "nng/supplemental/nanolib/cvector.h"
#include "rest_api.h"
extern cJSON *get_reload_config(conf *config);
extern cJSON *get_basic_config(conf *config);
extern cJSON *get_tls_config(conf_tls *tls, bool is_server);
extern cJSON *get_auth_config(conf_auth *auth);
extern cJSON *get_auth_http_config(conf_auth_http *auth_http);
extern cJSON *get_websocket_config(conf_websocket *ws);
extern cJSON *get_http_config(conf_http_server *http);
extern cJSON *get_sqlite_config(conf_sqlite *sqlite);
extern cJSON *get_bridge_config(conf_bridge *bridge, const char *node_name);
extern void set_bridge_node_conf(
conf_bridge *config, cJSON *node_obj, const char *name);
extern void set_reload_config(cJSON *json, conf *config);
extern void set_basic_config(cJSON *json, conf *config);
extern void set_tls_config(
cJSON *json, const char *conf_path, conf_tls *tls, const char *key_prefix);
extern void set_auth_config(
cJSON *json, const char *conf_path, conf_auth *auth);
extern void set_auth_http_config(
cJSON *json, const char *conf_path, conf_auth_http *auth);
extern void set_http_config(
cJSON *json, const char *conf_path, conf_http_server *http);
extern void set_websocket_config(
cJSON *json, const char *conf_path, conf_websocket *ws);
extern void set_sqlite_config(cJSON *json, const char *conf_path,
conf_sqlite *sqlite, const char *key_prefix);
extern void reload_basic_config(conf *cur_conf, conf *new_conf);
extern void reload_sqlite_config(conf_sqlite *cur_conf, conf_sqlite *new_conf);
extern void reload_auth_config(conf_auth *cur_conf, conf_auth *new_conf);
extern void reload_log_config(conf *cur_conf, conf *new_conf);
#endif

View File

@ -1,2 +0,0 @@
extern const char tmp_example[];

View File

@ -1,79 +0,0 @@
/*
* AWS IoT Device SDK for Embedded C 202108.00
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of
* this software and associated documentation files (the "Software"), to deal in
* the Software without restriction, including without limitation the rights to
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
* the Software, and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#ifndef CORE_MQTT_CONFIG_H_
#define CORE_MQTT_CONFIG_H_
/**************************************************/
/******* DO NOT CHANGE the following order ********/
/**************************************************/
/* Include logging header files and define logging macros in the following order:
* 1. Include the header file "logging_levels.h".
* 2. Define the LIBRARY_LOG_NAME and LIBRARY_LOG_LEVEL macros depending on
* the logging configuration for MQTT.
* 3. Include the header file "logging_stack.h", if logging is enabled for MQTT.
*/
#include <aws/logging_levels.h>
/* Logging configuration for the MQTT library. */
#ifndef LIBRARY_LOG_NAME
#define LIBRARY_LOG_NAME "MQTT"
#endif
#ifndef LIBRARY_LOG_LEVEL
#define LIBRARY_LOG_LEVEL LOG_NONE
#endif
#include <aws/logging_stack.h>
/************ End of logging configuration ****************/
/**
* @brief Determines the maximum number of MQTT PUBLISH messages, pending
* acknowledgement at a time, that are supported for incoming and outgoing
* direction of messages, separately.
*
* QoS 1 and 2 MQTT PUBLISHes require acknowledgement from the server before
* they can be completed. While they are awaiting the acknowledgement, the
* client must maintain information about their state. The value of this
* macro sets the limit on how many simultaneous PUBLISH states an MQTT
* context maintains, separately, for both incoming and outgoing direction of
* PUBLISHes.
*
* @note The MQTT context maintains separate state records for outgoing
* and incoming PUBLISHes, and thus, 2 * MQTT_STATE_ARRAY_MAX_COUNT amount
* of memory is statically allocated for the state records.
*/
#define MQTT_STATE_ARRAY_MAX_COUNT ( 10U )
/**
* @brief Number of milliseconds to wait for a ping response to a ping
* request as part of the keep-alive mechanism.
*
* If a ping response is not received before this timeout, then
* #MQTT_ProcessLoop will return #MQTTKeepAliveTimeout.
*/
#define MQTT_PINGRESP_TIMEOUT_MS ( 5000U )
#endif /* ifndef CORE_MQTT_CONFIG_H_ */

View File

@ -1,12 +0,0 @@
#ifndef DB_CLI_H
#define DB_CLI_H
#include "fdb_version.h"
#include <pthread.h>
#include <stdlib.h>
#include <foundationdb/fdb_c.h>
#include <foundationdb/fdb_c_options.g.h>
FDBDatabase* openDatabase(pthread_t* netThread);
#endif

View File

@ -1,113 +0,0 @@
#ifndef SHEREDOM_HASHMAP_H_INCLUDED
#define SHEREDOM_HASHMAP_H_INCLUDED
#if defined(_MSC_VER)
// Workaround a bug in the MSVC runtime where it uses __cplusplus when not
// defined.
#pragma warning(push, 0)
#pragma warning(disable : 4668)
#endif
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include "nng/nng.h"
#include "nng/supplemental/util/platform.h"
#if (defined(_MSC_VER) && defined(__AVX__)) || \
(!defined(_MSC_VER) && defined(__SSE4_2__))
#define HASHMAP_SSE42
#endif
#if defined(HASHMAP_SSE42)
#include <nmmintrin.h>
#endif
#if defined(_MSC_VER)
#pragma warning(pop)
#endif
#if defined(_MSC_VER)
#pragma warning(push)
/* Stop MSVC complaining about unreferenced functions */
#pragma warning(disable : 4505)
/* Stop MSVC complaining about not inlining functions */
#pragma warning(disable : 4710)
/* Stop MSVC complaining about inlining functions! */
#pragma warning(disable : 4711)
#elif defined(__clang__)
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused-function"
#endif
#if defined(_MSC_VER)
#define HASHMAP_USED
#elif defined(__GNUC__)
#define HASHMAP_USED __attribute__((used))
#else
#define HASHMAP_USED
#endif
typedef struct hashmap_s hashmap_s;
/* We need to keep keys and values. */
struct hashmap_element_s {
const char *key;
unsigned key_len;
int in_use;
uint32_t data;
};
/* A hashmap has some maximum size and current size, as well as the data to
* hold. */
struct hashmap_s {
unsigned table_size;
unsigned size;
struct hashmap_element_s *data;
};
#define HASHMAP_MAX_CHAIN_LENGTH (8)
#if defined(__cplusplus)
extern "C" {
#endif
int nano_hashmap_create(const unsigned initial_size,
struct hashmap_s * out_hashmap) HASHMAP_USED;
int nano_hashmap_put(struct hashmap_s * hashmap, const char *const key,
const unsigned len, uint32_t value) HASHMAP_USED;
uint32_t nano_hashmap_get(const struct hashmap_s *const hashmap,
const char *const key,
const unsigned len) HASHMAP_USED;
int nano_hashmap_remove(struct hashmap_s * m, const char *const key,
const unsigned len);
void nano_hashmap_destroy(struct hashmap_s * m);
#if defined(__cplusplus)
}
#endif
#if defined(__cplusplus)
#define HASHMAP_CAST(type, x) static_cast<type>(x)
#define HASHMAP_PTR_CAST(type, x) reinterpret_cast<type>(x)
#define HASHMAP_NULL NULL
#else
#define HASHMAP_CAST(type, x) ((type)x)
#define HASHMAP_PTR_CAST(type, x) ((type)x)
#define HASHMAP_NULL 0
#endif
#if defined(_MSC_VER)
#pragma warning(pop)
#elif defined(__clang__)
#pragma clang diagnostic pop
#endif
#endif

View File

@ -1,38 +0,0 @@
#ifndef MQTT_API_H
#define MQTT_API_H
#include "nng/mqtt/mqtt_client.h"
#include "nng/protocol/mqtt/mqtt.h"
#include "nng/supplemental/nanolib/conf.h"
#include "nng/supplemental/tls/tls.h"
#include "nng/supplemental/util/options.h"
#include "nng/supplemental/util/platform.h"
#define INPROC_SERVER_URL "inproc://inproc_server"
int nano_listen(
nng_socket sid, const char *addr, nng_listener *lp, int flags, conf *conf);
int init_listener_tls(nng_listener l, conf_tls *tls);
extern int decode_common_mqtt_msg(nng_msg **dest, nng_msg *src);
extern int encode_common_mqtt_msg(
nng_msg **dest, nng_msg *src, const char *clientid, uint8_t proto_ver);
extern int log_init(conf_log *log);
extern int log_fini(conf_log *log);
extern char *nano_pipe_get_local_address(nng_pipe p);
extern uint8_t *nano_pipe_get_local_address6(nng_pipe p);
extern uint16_t nano_pipe_get_local_port(nng_pipe p);
extern uint16_t nano_pipe_get_local_port6(nng_pipe p);
#if defined(SUPP_ICEORYX)
#include "nng/iceoryx_shm/iceoryx_shm.h"
extern int nano_iceoryx_send_nng_msg(
nng_iceoryx_puber *puber, nng_msg *msg, nng_socket *sock);
extern int nano_iceoryx_recv_nng_msg(
nng_iceoryx_suber *suber, nng_msg *icemsg, nng_msg **msg);
extern bool nano_iceoryx_topic_filter(char *icetopic, char *topic, uint32_t topicsz);
#endif
#endif // MQTT_API_H

View File

@ -1,67 +0,0 @@
#ifndef NANOMQ_NANOMQ_H
#define NANOMQ_NANOMQ_H
#include "nng/supplemental/nanolib/log.h"
#ifndef _GNU_SOURCE
#define _GNU_SOURCE
#endif
#define NNI_PUT16(ptr, u) \
do { \
(ptr)[0] = (uint8_t)(((uint16_t)(u)) >> 8u); \
(ptr)[1] = (uint8_t)((uint16_t)(u)); \
} while (0)
#define NNI_PUT32(ptr, u) \
do { \
(ptr)[0] = (uint8_t)(((uint32_t)(u)) >> 24u); \
(ptr)[1] = (uint8_t)(((uint32_t)(u)) >> 16u); \
(ptr)[2] = (uint8_t)(((uint32_t)(u)) >> 8u); \
(ptr)[3] = (uint8_t)((uint32_t)(u)); \
} while (0)
#define NNI_PUT64(ptr, u) \
do { \
(ptr)[0] = (uint8_t)(((uint64_t)(u)) >> 56u); \
(ptr)[1] = (uint8_t)(((uint64_t)(u)) >> 48u); \
(ptr)[2] = (uint8_t)(((uint64_t)(u)) >> 40u); \
(ptr)[3] = (uint8_t)(((uint64_t)(u)) >> 32u); \
(ptr)[4] = (uint8_t)(((uint64_t)(u)) >> 24u); \
(ptr)[5] = (uint8_t)(((uint64_t)(u)) >> 16u); \
(ptr)[6] = (uint8_t)(((uint64_t)(u)) >> 8u); \
(ptr)[7] = (uint8_t)((uint64_t)(u)); \
} while (0)
#define NNI_GET16(ptr, v) \
v = (((uint16_t)((uint8_t)(ptr)[0])) << 8u) + \
(((uint16_t)(uint8_t)(ptr)[1]))
#define NNI_GET32(ptr, v) \
v = (((uint32_t)((uint8_t)(ptr)[0])) << 24u) + \
(((uint32_t)((uint8_t)(ptr)[1])) << 16u) + \
(((uint32_t)((uint8_t)(ptr)[2])) << 8u) + \
(((uint32_t)(uint8_t)(ptr)[3]))
#define NNI_GET64(ptr, v) \
v = (((uint64_t)((uint8_t)(ptr)[0])) << 56u) + \
(((uint64_t)((uint8_t)(ptr)[1])) << 48u) + \
(((uint64_t)((uint8_t)(ptr)[2])) << 40u) + \
(((uint64_t)((uint8_t)(ptr)[3])) << 32u) + \
(((uint64_t)((uint8_t)(ptr)[4])) << 24u) + \
(((uint64_t)((uint8_t)(ptr)[5])) << 16u) + \
(((uint64_t)((uint8_t)(ptr)[6])) << 8u) + \
(((uint64_t)(uint8_t)(ptr)[7]))
#define NANO_UNUSED(x) (x) __attribute__((unused))
#define NANO_NNG_FATAL(s, rv) \
do { \
log_fatal(s); \
nng_fatal((s), (rv)); \
} while(0)
extern int get_cache_argc();
extern char **get_cache_argv();
#endif

View File

@ -1,19 +0,0 @@
#ifndef NANOMQ_RULE_H
#define NANOMQ_RULE_H
#include "nng/mqtt/mqtt_client.h"
#include "nng/supplemental/sqlite/sqlite3.h"
#include "nng/supplemental/nanolib/conf.h"
#include "nng/nng.h"
#include <stdio.h>
#include <stdlib.h>
#if defined(SUPP_RULE_ENGINE)
extern int nano_client(nng_socket *sock, repub_t *repub);
extern int nano_client_publish(nng_socket *sock, const char *topic,
uint8_t *payload, uint32_t len, uint8_t qos, property *props);
extern int nanomq_client_sqlite(conf_rule *cr, bool init_last);
extern int nanomq_client_mysql(conf_rule *cr, bool init_last);
#endif
#endif // NANOMQ_RULE_H

View File

@ -1,36 +0,0 @@
//
// Copyright 2024 NanoMQ Team, Inc. <jaylin@emqx.io>
//
// This software is supplied under the terms of the MIT License, a
// copy of which should be located in the distribution where this
// file was obtained (LICENSE.txt). A copy of the license may also be
// found online at https://opensource.org/licenses/MIT.
//
#ifndef NANOMQ_PLUGIN_H
#define NANOMQ_PLUGIN_H
#include "nng/nng.h"
#include "nng/supplemental/nanolib/conf.h"
#include "nng/supplemental/nanolib/log.h"
struct nano_plugin {
char *path;
int (*init)(void);
};
enum hook_point {
HOOK_USER_PROPERTY,
};
struct plugin_hook {
unsigned int point;
int (*cb)(void *data);
};
extern int plugin_hook_register(unsigned int point, int (*cb)(void *data));
extern int plugin_hook_call(unsigned int point, void *data);
extern int plugin_register(char *path);
extern void plugins_clear();
extern int plugin_init(struct nano_plugin *plugin);
#endif // NANOMQ_PLUGIN_H

View File

@ -1,14 +0,0 @@
#ifndef PROCESS_H
#define PROCESS_H
#ifndef _GNU_SOURCE
#define _GNU_SOURCE
#endif
extern int process_is_alive(int pid);
extern int process_send_signal(int pid, int signal);
extern int pidgrp_send_signal(int pid, int signal);
extern int process_daemonize(void);
extern int process_create_child(int (*child_run)(void *), void *data);
#endif

View File

@ -1,71 +0,0 @@
/**
* Created by Alvin on 2020/7/25.
*/
#ifndef NANOMQ_PUB_HANDLER_H
#define NANOMQ_PUB_HANDLER_H
#include "broker.h"
#include <nng/mqtt/packet.h>
#include <nng/nng.h>
#include <nng/protocol/mqtt/mqtt.h>
typedef uint32_t variable_integer;
// MQTT Fixed header
struct fixed_header {
// flag_bits
uint8_t retain : 1;
uint8_t qos : 2;
uint8_t dup : 1;
// packet_types
uint8_t packet_type : 4;
// remaining length
uint32_t remain_len;
};
// MQTT Variable header
union variable_header {
struct {
uint16_t packet_id;
struct mqtt_string topic_name;
property *properties;
uint32_t prop_len;
} publish;
struct {
uint16_t packet_id;
reason_code reason_code;
property *properties;
uint32_t prop_len;
} pub_arrc, puback, pubrec, pubrel, pubcomp;
};
struct mqtt_payload {
uint8_t *data;
uint32_t len;
};
struct pub_packet_struct {
struct fixed_header fixed_header;
union variable_header var_header;
struct mqtt_payload payload;
};
struct pipe_content {
mqtt_msg_info *msg_infos;
};
bool encode_pub_message(
nng_msg *dest_msg, nano_work *work, mqtt_control_packet_types cmd);
reason_code decode_pub_message(nano_work *work, uint8_t proto);
void free_pub_packet(struct pub_packet_struct *pub_packet);
void free_msg_infos(mqtt_msg_info *msg_infos);
void init_pipe_content(struct pipe_content *pipe_ct);
void init_pub_packet_property(struct pub_packet_struct *pub_packet);
bool check_msg_exp(nng_msg *msg, property *prop);
reason_code handle_pub(nano_work *work, struct pipe_content *pipe_ct,
uint8_t proto, bool is_event);
#endif // NNG_PUB_HANDLER_H

View File

@ -1,130 +0,0 @@
//
// Copyright 2020 NanoMQ Team, Inc. <jaylin@emqx.io>
//
// This software is supplied under the terms of the MIT License, a
// copy of which should be located in the distribution where this
// file was obtained (LICENSE.txt). A copy of the license may also be
// found online at https://opensource.org/licenses/MIT.
//
#ifndef REST_API_H
#define REST_API_H
#include "web_server.h"
#include "mqtt_api.h"
#include <ctype.h>
#include <nng/nng.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define REST_URI_ROOT "/api/v4"
#define REST_HOST "http://0.0.0.0:%u"
#define REST_URL REST_HOST REST_URI_ROOT
#define getNumberValue(obj, item, key, value, rv) \
{ \
item = cJSON_GetObjectItem(obj, key); \
if (cJSON_IsNumber(item)) { \
value = cJSON_GetNumberValue(item); \
rv = (0); \
} else { \
rv = (-1); \
} \
}
#define getBoolValue(obj, item, key, value, rv) \
{ \
item = cJSON_GetObjectItem(obj, key); \
if (cJSON_IsBool(item)) { \
value = cJSON_IsTrue(item); \
rv = (0); \
} else { \
rv = (-1); \
} \
}
#define getStringValue(obj, item, key, value, rv) \
{ \
item = cJSON_GetObjectItem(obj, key); \
if (cJSON_IsString(item)) { \
value = cJSON_GetStringValue(item); \
rv = (0); \
} else { \
rv = (-1); \
} \
}
enum result_code {
SUCCEED = 0,
RPC_ERROR = 101,
UNKNOWN_MISTAKE = 102,
WRONG_USERNAME_OR_PASSWORD = 103,
EMPTY_USERNAME_OR_PASSWORD = 104,
USER_DOES_NOT_EXIST = 105,
ADMIN_CANNOT_BE_DELETED = 106,
MISSING_KEY_REQUEST_PARAMES = 107,
REQ_PARAM_ERROR = 108,
REQ_PARAMS_JSON_FORMAT_ILLEGAL = 109,
PLUGIN_IS_ENABLED = 110,
PLUGIN_IS_CLOSED = 111,
CLIENT_IS_OFFLINE = 112,
USER_ALREADY_EXISTS = 113,
OLD_PASSWORD_IS_WRONG = 114,
ILLEGAL_SUBJECT = 115,
TOKEN_EXPIRED = 116,
PARAMS_HOCON_FORMAT_ILLEGAL = 117,
WRITE_CONFIG_FAILED = 118,
};
typedef struct http_msg {
uint16_t status;
int request;
size_t content_type_len;
char * content_type;
size_t method_len;
char * method;
size_t uri_len;
char * uri;
size_t token_len;
char * token;
size_t data_len;
char * data;
bool encrypt_data;
} http_msg;
extern void put_http_msg(http_msg *msg, const char *content_type,
const char *method, const char *uri, const char *token, const char *data,
size_t data_sz);
extern void destory_http_msg(http_msg *msg);
extern http_msg process_request(
http_msg *msg, conf_http_server *config, nng_socket *sock);
#define GET_METHOD "GET"
#define POST_METHOD "POST"
#define PUT_METHOD "PUT"
#define DELETE_METHOD "DELETE"
#define REQ_ENDPOINTS 1
#define REQ_BROKERS 2
#define REQ_NODES 3
#define REQ_SUBSCRIPTIONS 4
#define REQ_CLIENTS 5
#define REQ_LOGIN 6
#define REQ_LOGOUT 7
#define REQ_CTRL 10
#define REQ_GET_CONFIG 11
#define REQ_SET_CONFIG 12
#define REQ_TREE 13
#define cJSON_AddStringOrNullToObject(obj, name, value) \
{ \
if (value) { \
cJSON_AddStringToObject(obj, name, value); \
} else { \
cJSON_AddNullToObject(obj, name); \
} \
}
#endif

View File

@ -1,51 +0,0 @@
#ifndef MQTT_SUBSCRIBE_HANDLE_H
#define MQTT_SUBSCRIBE_HANDLE_H
#include <nng/nng.h>
#include <nng/mqtt/packet.h>
#include "broker.h"
typedef struct {
uint32_t pid;
dbtree *db;
} sub_destroy_info;
/*
* Use to decode sub msg.
*/
int decode_sub_msg(nano_work *);
/*
* Use to encode an ack for sub msg
*/
int encode_suback_msg(nng_msg *, nano_work *);
int sub_ctx_handle(nano_work *);
/*
* Delete a client ctx from topic node in dbtree
*/
int sub_ctx_del(void *db, char *topic, uint32_t pid);
/*
* Free the client ctx
*/
void sub_ctx_free(client_ctx *);
/*
* A wrap for sub ctx free
*/
void * wrap_sub_ctx_free_cb(void *arg);
/*
* Free a packet_subscribe.
*/
void sub_pkt_free(packet_subscribe *);
/*
* Delete all refs in dbtree about client ctx
*/
void destroy_sub_client(uint32_t pid, dbtree * db);
#endif

View File

@ -1,14 +0,0 @@
#ifndef MQTT_UNSUBSCRIBE_HANDLE_H
#define MQTT_UNSUBSCRIBE_HANDLE_H
#include <nng/nng.h>
#include "broker.h"
#include <nng/mqtt/packet.h>
int decode_unsub_msg(nano_work *);
int encode_unsuback_msg(nng_msg *, nano_work *);
int unsub_ctx_handle(nano_work *);
void unsub_pkt_free(packet_unsubscribe *);
#endif // MQTT_UNSUBSCRIBE_HANDLE_H

View File

@ -1,5 +0,0 @@
#define NANO_VER_MAJOR 0
#define NANO_VER_MINOR 22
#define NANO_VER_PATCH 10
#define NANO_VER_ID_SHORT "15"

View File

@ -1,35 +0,0 @@
//
// Copyright 2020 NanoMQ Team, Inc. <jaylin@emqx.io>
//
// This software is supplied under the terms of the MIT License, a
// copy of which should be located in the distribution where this
// file was obtained (LICENSE.txt). A copy of the license may also be
// found online at https://opensource.org/licenses/MIT.
//
#ifndef WEB_SERVER_H
#define WEB_SERVER_H
#include "nng/nng.h"
#include "nng/supplemental/util/platform.h"
#include "nng/supplemental/nanolib/conf.h"
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define HTTP_DEFAULT_USER "admin"
#define HTTP_DEFAULT_PASSWORD "public"
#define HTTP_DEFAULT_PORT 8081
extern int start_rest_server(conf *conf);
extern void stop_rest_server(void);
extern void set_http_server_conf(conf_http_server *conf);
extern conf_http_server *get_http_server_conf(void);
extern void set_global_conf(conf *config);
extern conf * get_global_conf(void);
extern char * get_jwt_key(void);
extern nng_time get_boot_time(void);
#endif

View File

@ -1,13 +0,0 @@
#ifndef WEBHOOK_INPROC_H
#define WEBHOOK_INPROC_H
#include "nng/supplemental/nanolib/conf.h"
#include "nng/nng.h"
#define HOOK_IPC_URL "ipc:///tmp/nanomq_hook.ipc"
#define EXTERNAL2NANO_IPC "EX2NANO"
extern int start_hook_service(conf *conf);
extern int stop_hook_service(void);
#endif

View File

@ -1,20 +0,0 @@
#ifndef WEBHOOK_POST_H
#define WEBHOOK_POST_H
#include "webhook_inproc.h"
#include "broker.h"
extern int webhook_msg_publish(nng_socket *sock, conf_web_hook *hook_conf,
pub_packet_struct *pub_packet, const char *username,
const char *client_id);
extern int webhook_client_connack(nng_socket *sock, conf_web_hook *hook_conf,
uint8_t proto_ver, uint16_t keepalive, uint8_t reason,
const char *username, const char *client_id);
extern int webhook_client_disconnect(nng_socket *sock,
conf_web_hook *hook_conf, uint8_t proto_ver, uint16_t keepalive,
uint8_t reason, const char *username, const char *client_id);
extern int hook_entry(nano_work *work, uint8_t reason);
extern int hook_exchange_init(conf *nanomq_conf, uint64_t num_ctx);
extern int hook_exchange_sender_init(conf *nanomq_conf, struct work **works, uint64_t num_ctx);
#endif

View File

@ -1,33 +0,0 @@
//
// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech>
// Copyright 2018 Capitar IT Group BV <info@capitar.com>
//
// This software is supplied under the terms of the MIT License, a
// copy of which should be located in the distribution where this
// file was obtained (LICENSE.txt). A copy of the license may also be
// found online at https://opensource.org/licenses/MIT.
//
#ifndef NNG_COMPAT_BUS_H
#define NNG_COMPAT_BUS_H
// This header contains interfaces that are intended to offer compatibility
// with nanomsg v1.0. These are not the "preferred" interfaces for nng,
// and consumers should only use these if they are porting software that
// previously used nanomsg. New programs should use the nng native APIs.
#ifdef __cplusplus
extern "C" {
#endif
// BUS sockopt level.
#define NN_PROTO_BUS 7
#define NN_BUS (NN_PROTO_BUS * 16 + 0)
// BUS has no options.
#ifdef __cplusplus
}
#endif
#endif // NNG_COMPAT_BUS_H

View File

@ -1,31 +0,0 @@
//
// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech>
// Copyright 2018 Capitar IT Group BV <info@capitar.com>
//
// This software is supplied under the terms of the MIT License, a
// copy of which should be located in the distribution where this
// file was obtained (LICENSE.txt). A copy of the license may also be
// found online at https://opensource.org/licenses/MIT.
//
#ifndef NNG_COMPAT_INPROC_H
#define NNG_COMPAT_INPROC_H
// This header contains interfaces that are intended to offer compatibility
// with nanomsg v1.0. These are not the "preferred" interfaces for nng,
// and consumers should only use these if they are porting software that
// previously used nanomsg. New programs should use the nng native APIs.
#ifdef __cplusplus
extern "C" {
#endif
// inproc sockopt level.
// There are no inproc tunables.
#define NN_INPROC (-1)
#ifdef __cplusplus
}
#endif
#endif // NNG_COMPAT_INPROC_H

View File

@ -1,39 +0,0 @@
//
// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech>
// Copyright 2018 Capitar IT Group BV <info@capitar.com>
//
// This software is supplied under the terms of the MIT License, a
// copy of which should be located in the distribution where this
// file was obtained (LICENSE.txt). A copy of the license may also be
// found online at https://opensource.org/licenses/MIT.
//
#ifndef NNG_COMPAT_IPC_H
#define NNG_COMPAT_IPC_H
// This header contains interfaces that are intended to offer compatibility
// with nanomsg v1.0. These are not the "preferred" interfaces for nng,
// and consumers should only use these if they are porting software that
// previously used nanomsg. New programs should use the nng native APIs.
#ifdef __cplusplus
extern "C" {
#endif
// IPC sockopt level.
#define NN_IPC (-2)
// IPC options. Note that these are not currently supported.
// IPC_SEC_ATTR works quite differently in NNG, and must be
// configured using the new API. The buffer sizing options are
// not supported at all. None of these were ever documented, and
// are offered here only for source compatibility.
#define NN_IPC_SEC_ATTR 1
#define NN_IPC_OUTBUFSZ 2
#define NN_IPC_INBUFSZ 3
#ifdef __cplusplus
}
#endif
#endif // NNG_COMPAT_IPC_H

View File

@ -1,284 +0,0 @@
//
// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech>
// Copyright 2018 Capitar IT Group BV <info@capitar.com>
//
// This software is supplied under the terms of the MIT License, a
// copy of which should be located in the distribution where this
// file was obtained (LICENSE.txt). A copy of the license may also be
// found online at https://opensource.org/licenses/MIT.
//
#ifndef NNG_COMPAT_NN_H
#define NNG_COMPAT_NN_H
// This header contains interfaces that are intended to offer compatibility
// with nanomsg v1.0. These are not the "preferred" interfaces for nng,
// and consumers should only use these if they are porting software that
// previously used nanomsg. New programs should use the nng native APIs.
// Note that compatibility promises are limited to public portions of the
// nanomsg API, and specifically do NOT extend to the ABI. Furthermore,
// there may be other limitations around less commonly used portions of the
// API; for example only SP headers may be transported in control data for
// messages, there is almost no compatibility offered for statistics.
// Error values may differ from those returned by nanomsg as well; the nng
// error reporting facility expresses only a subset of the possibilities of
// nanomsg.
// Note that unlike nanomsg, nng does not aggressively recycle socket or
// endpoint IDs, which means applications which made assumptions that these
// would be relatively small integers (e.g. to use them as array indices)
// may break. (No promise about values was ever made.)
#ifdef __cplusplus
extern "C" {
#endif
#include <errno.h>
#include <stddef.h>
#include <stdint.h>
// clang-format gets in the way of most of this file.
// We turn it off, at least until it gets smarter about aligning
// macro definitions or we adopt enums or somesuch.
// clang-format off
// NNG_DECL is used on declarations to deal with scope.
// For building Windows DLLs, it should be the appropriate __declspec().
// For shared libraries with platforms that support hidden visibility,
// it should evaluate to __attribute__((visibility("default"))).
#ifndef NN_DECL
#if defined(_WIN32) && !defined(NNG_STATIC_LIB)
#if defined(NNG_SHARED_LIB)
#define NN_DECL __declspec(dllexport)
#else
#define NN_DECL __declspec(dllimport)
#endif // NNG_SHARED_LIB
#else
#if defined(NNG_SHARED_LIB) && defined(NNG_HIDDEN_VISIBILITY)
#define NN_DECL __attribute__((visibility("default")))
#else
#define NN_DECL extern
#endif
#endif // _WIN32 && !NNG_STATIC_LIB
#endif // NN_DECL
#define AF_SP 1
#define AF_SP_RAW 2
#define NN_SOCKADDR_MAX 128
#define NN_SOL_SOCKET 0
// Flag for send/recv (nonblocking)
#define NN_DONTWAIT 1
// CMSG data type
#define PROTO_SP 1
#define SP_HDR 1
// Errnos. Legacy nanomsg uses posix errnos where possible.
// If a define is not set, use add NN_ERRBASE. nng does not
// return all of these values, so there may be some loss of
// of information for edge cases, but we don't expect that to be
// a problem really.
#define NN_ERRBASE (0x10000000)
#ifndef ENOTSUP
#define ENOTSUP (NN_ERRBASE+1)
#endif
#ifndef EPROTONOSUPPORT
#define EPROTONOSUPPORT (NN_ERRBASE+2)
#endif
#ifndef ENOBUFS
#define ENOBUFS (NN_ERRBASE+3)
#endif
#ifndef ENETDOWN
#define ENETDOWN (NN_ERRBASE+4)
#endif
#ifndef EADDRINUSE
#define EADDRINUSE (NN_ERRBASE+5)
#endif
#ifndef EADDRNOTAVAIL
#define EADDRNOTAVAIL (NN_ERRBASE+6)
#endif
#ifndef ENOTSOCK
#define ENOTSOCK (NN_ERRBASE+7)
#endif
#ifndef EAGAIN
#define EAGAIN (NN_ERRBASE+8)
#endif
#ifndef EBADF
#define EBADF (NN_ERRBASE+9)
#endif
#ifndef EINVAL
#define EINVAL (NN_ERRBASE+10)
#endif
#ifndef EMFILE
#define EMFILE (NN_ERRBASE+11)
#endif
#ifndef EFAULT
#define EFAULT (NN_ERRBASE+12)
#endif
#ifndef EACCES
#define EACCES (NN_ERRBASE+13)
#endif
#ifndef ENETRESET
#define ENETRESET (NN_ERRBASE+14)
#endif
#ifndef ENETUNREACH
#define ENETUNREACH (NN_ERRBASE+15)
#endif
#ifndef EHOSTUNREACH
#define EHOSTUNREACH (NN_ERRBASE+16)
#endif
#ifndef EAFNOSUPPORT
#define EAFNOSUPPORT (NN_ERRBASE+17)
#endif
#ifndef EINPROGRESS
#define EINPROGRESS (NN_ERRBASE+18)
#endif
#ifndef EPROTO
#define EPROTO (NN_ERRBASE+19)
#endif
#ifndef ECONNREFUSED
#define ECONNREFUSED (NN_ERRBASE+20)
#endif
#ifndef ENOTCONN
#define ENOTCONN (NN_ERRBASE+21)
#endif
#ifndef EMSGSIZE
#define EMSGSIZE (NN_ERRBASE+22)
#endif
#ifndef ETIMEDOUT
#define ETIMEDOUT (NN_ERRBASE+23)
#endif
#ifndef ECONNABORTED
#define ECONNABORTED (NN_ERRBASE+24)
#endif
#ifndef ECONNRESET
#define ECONNRESET (NN_ERRBASE+25)
#endif
#ifndef ENOPROTOOPT
#define ENOPROTOOPT (NN_ERRBASE+26)
#endif
#ifndef EISCONN
#define EISCONN (NN_ERRBASE+27)
#endif
#ifndef ESOCKNOSUPPORT
#define ESOCKNOSPPORT (NN_ERRBASE+28)
#endif
#ifndef ETERM
#define ETERM (NN_ERRBASE+29)
#endif
#ifndef EFSM
#define EFSM (NN_ERRBASE+30)
#endif
#ifndef ENOENT
#define ENOENT (NN_ERRBASE+31)
#endif
#ifndef EIO
#define EIO (NN_ERRBASE+32)
#endif
#ifndef EEXIST
#define EEXIST (NN_ERRBASE+33)
#endif
#ifndef ENOSPC
#define ENOSPC (NN_ERRBASE+34)
#endif
// Socket options
#define NN_LINGER 1
#define NN_SNDBUF 2
#define NN_RCVBUF 3
#define NN_SNDTIMEO 4
#define NN_RCVTIMEO 5
#define NN_RECONNECT_IVL 6
#define NN_RECONNECT_IVL_MAX 7
#define NN_SNDPRIO 8
#define NN_RCVPRIO 9
#define NN_SNDFD 10
#define NN_RCVFD 11
#define NN_DOMAIN 12
#define NN_PROTOCOL 13
#define NN_IPV4ONLY 14
#define NN_SOCKET_NAME 15
#define NN_RCVMAXSIZE 16
#define NN_MAXTTL 17
// from this point on formatting is fine
// clang-format on
// Poll stuff
#define NN_POLLIN 1
#define NN_POLLOUT 2
struct nn_pollfd {
int fd;
uint16_t events;
uint16_t revents;
};
// Magical size for allocation
#define NN_MSG ((size_t) -1)
struct nn_iovec {
void * iov_base;
size_t iov_len;
};
struct nn_msghdr {
struct nn_iovec *msg_iov;
int msg_iovlen;
void * msg_control;
size_t msg_controllen;
};
struct nn_cmsghdr {
size_t cmsg_len;
int cmsg_level;
int cmsg_type;
};
#define NN_CMSG_ALIGN(len) \
(((len) + sizeof(size_t) - 1) & (size_t) ~(sizeof(size_t) - 1))
// Unlike old nanomsg, we explicitly only support the SP header as attached
// cmsg data. It turns out that old nanomsg didn't really store anything
// useful otherwise anyway. (One specific exception was that it stored the
// message type of text or binary for the websocket transport. We don't think
// anyone used that in practice though.)
#define NN_CMSG_FIRSTHDR(mh) nn_cmsg_next((struct nn_msghdr *) (mh), NULL)
#define NN_CMSG_NXTHDR(mh, ch) \
nn_cmsg_next((struct nn_msghdr *) (mh), (struct nn_cmsghdr *) ch)
#define NN_CMSG_DATA(ch) ((unsigned char *) (((struct nn_cmsghdr *) (ch)) + 1))
#define NN_CMSG_SPACE(len) \
(NN_CMSG_ALIGN(len) + NN_CMSG_ALIGN(sizeof(struct nn_cmsghdr)))
#define NN_CMSG_LEN(len) (NN_CMSG_ALIGN(sizeof(struct nn_cmsghdr)) + (len))
NN_DECL struct nn_cmsghdr *nn_cmsg_next(
struct nn_msghdr *, struct nn_cmsghdr *);
NN_DECL int nn_socket(int, int);
NN_DECL int nn_setsockopt(int, int, int, const void *, size_t);
NN_DECL int nn_getsockopt(int, int, int, void *, size_t *);
NN_DECL int nn_bind(int, const char *);
NN_DECL int nn_connect(int, const char *);
NN_DECL int nn_shutdown(int, int);
NN_DECL int nn_send(int, const void *, size_t, int);
NN_DECL int nn_recv(int, void *, size_t, int);
NN_DECL int nn_sendmsg(int, const struct nn_msghdr *, int);
NN_DECL int nn_recvmsg(int, struct nn_msghdr *, int);
NN_DECL int nn_close(int);
NN_DECL int nn_poll(struct nn_pollfd *, int, int);
NN_DECL int nn_device(int, int);
NN_DECL uint64_t nn_get_statistic(int, int);
NN_DECL void * nn_allocmsg(size_t, int);
NN_DECL void * nn_reallocmsg(void *, size_t);
NN_DECL int nn_freemsg(void *);
NN_DECL int nn_errno(void);
NN_DECL const char *nn_strerror(int);
NN_DECL void nn_term(void);
#ifdef __cplusplus
}
#endif
#endif // NNG_COMPAT_NN_H

View File

@ -1,39 +0,0 @@
//
// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech>
// Copyright 2018 Capitar IT Group BV <info@capitar.com>
//
// This software is supplied under the terms of the MIT License, a
// copy of which should be located in the distribution where this
// file was obtained (LICENSE.txt). A copy of the license may also be
// found online at https://opensource.org/licenses/MIT.
//
#ifndef NNG_COMPAT_PAIR_H
#define NNG_COMPAT_PAIR_H
// This header contains interfaces that are intended to offer compatibility
// with nanomsg v1.0. These are not the "preferred" interfaces for nng,
// and consumers should only use these if they are porting software that
// previously used nanomsg. New programs should use the nng native APIs.
#ifdef __cplusplus
extern "C" {
#endif
// PAIR sockopt level.
#define NN_PROTO_PAIR 1
#define NN_PAIR (NN_PROTO_PAIR * 16 + 0)
// These are technically "new", and not available in nanomsg, but
// offered here as a transition aid. If you want to use the advanced
// PAIRv1 options (POLYAMOROUS mode) you still need to use the new API.
#define NN_PAIR_v0 (NN_PROTO_PAIR * 16 + 0)
#define NN_PAIR_V1 (NN_PROTO_PAIR * 16 + 1)
// PAIR has no options.
#ifdef __cplusplus
}
#endif
#endif // NNG_COMPAT_PAIR_H

View File

@ -1,34 +0,0 @@
//
// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech>
// Copyright 2018 Capitar IT Group BV <info@capitar.com>
//
// This software is supplied under the terms of the MIT License, a
// copy of which should be located in the distribution where this
// file was obtained (LICENSE.txt). A copy of the license may also be
// found online at https://opensource.org/licenses/MIT.
//
#ifndef NNG_COMPAT_PIPELINE_H
#define NNG_COMPAT_PIPELINE_H
// This header contains interfaces that are intended to offer compatibility
// with nanomsg v1.0. These are not the "preferred" interfaces for nng,
// and consumers should only use these if they are porting software that
// previously used nanomsg. New programs should use the nng native APIs.
#ifdef __cplusplus
extern "C" {
#endif
// PUSH and PULL sockopt level.
#define NN_PROTO_PIPELINE 5
#define NN_PUSH (NN_PROTO_PIPELINE * 16 + 0)
#define NN_PULL (NN_PROTO_PIPELINE * 16 + 1)
// PUSH and PULL have no options.
#ifdef __cplusplus
}
#endif
#endif // NNG_COMPAT_PIPELINE_H

View File

@ -1,36 +0,0 @@
//
// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech>
// Copyright 2018 Capitar IT Group BV <info@capitar.com>
//
// This software is supplied under the terms of the MIT License, a
// copy of which should be located in the distribution where this
// file was obtained (LICENSE.txt). A copy of the license may also be
// found online at https://opensource.org/licenses/MIT.
//
#ifndef NNG_COMPAT_PUBSUB_H
#define NNG_COMPAT_PUBSUB_H
// This header contains interfaces that are intended to offer compatibility
// with nanomsg v1.0. These are not the "preferred" interfaces for nng,
// and consumers should only use these if they are porting software that
// previously used nanomsg. New programs should use the nng native APIs.
#ifdef __cplusplus
extern "C" {
#endif
// PUB and SUB sockopt level.
#define NN_PROTO_PUBSUB 2
#define NN_PUB (NN_PROTO_PUBSUB * 16 + 0)
#define NN_SUB (NN_PROTO_PUBSUB * 16 + 1)
// SUB options. (PUB has none.)
#define NN_SUB_SUBSCRIBE (NN_SUB * 16 + 1)
#define NN_SUB_UNSUBSCRIBE (NN_SUB * 16 + 2)
#ifdef __cplusplus
}
#endif
#endif // NNG_COMPAT_PUBSUB_H

View File

@ -1,35 +0,0 @@
//
// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech>
// Copyright 2018 Capitar IT Group BV <info@capitar.com>
//
// This software is supplied under the terms of the MIT License, a
// copy of which should be located in the distribution where this
// file was obtained (LICENSE.txt). A copy of the license may also be
// found online at https://opensource.org/licenses/MIT.
//
#ifndef NNG_COMPAT_REQREP_H
#define NNG_COMPAT_REQREP_H
// This header contains interfaces that are intended to offer compatibility
// with nanomsg v1.0. These are not the "preferred" interfaces for nng,
// and consumers should only use these if they are porting software that
// previously used nanomsg. New programs should use the nng native APIs.
#ifdef __cplusplus
extern "C" {
#endif
// REQ and REP sockopt level.
#define NN_PROTO_REQREP 3
#define NN_REQ (NN_PROTO_REQREP * 16 + 0)
#define NN_REP (NN_PROTO_REQREP * 16 + 1)
// REQ options. (REP has none.)
#define NN_REQ_RESEND_IVL (NN_REQ * 16 + 1)
#ifdef __cplusplus
}
#endif
#endif // NNG_COMPAT_REQREP_H

View File

@ -1,36 +0,0 @@
//
// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech>
// Copyright 2018 Capitar IT Group BV <info@capitar.com>
//
// This software is supplied under the terms of the MIT License, a
// copy of which should be located in the distribution where this
// file was obtained (LICENSE.txt). A copy of the license may also be
// found online at https://opensource.org/licenses/MIT.
//
#ifndef NNG_COMPAT_SURVEY_H
#define NNG_COMPAT_SURVEY_H
// This header contains interfaces that are intended to offer compatibility
// with nanomsg v1.0. These are not the "preferred" interfaces for nng,
// and consumers should only use these if they are porting software that
// previously used nanomsg. New programs should use the nng native APIs.
#ifdef __cplusplus
extern "C" {
#endif
// SURVEYOR and RESPONDENT sockopt level.
#define NN_PROTO_SURVEY 6
#define NN_SURVEYOR (NN_PROTO_SURVEY * 16 + 2)
#define NN_RESPONDENT (NN_PROTO_SURVEY * 16 + 3)
// SURVEYOR options. (RESPONDENT has none.)
#define NN_SURVEYOR_DEADLINE (NN_SURVEYOR * 16 + 1)
#ifdef __cplusplus
}
#endif
#endif // NNG_COMPAT_SURVEY_H

View File

@ -1,33 +0,0 @@
//
// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech>
// Copyright 2018 Capitar IT Group BV <info@capitar.com>
//
// This software is supplied under the terms of the MIT License, a
// copy of which should be located in the distribution where this
// file was obtained (LICENSE.txt). A copy of the license may also be
// found online at https://opensource.org/licenses/MIT.
//
#ifndef NNG_COMPAT_TCP_H
#define NNG_COMPAT_TCP_H
// This header contains interfaces that are intended to offer compatibility
// with nanomsg v1.0. These are not the "preferred" interfaces for nng,
// and consumers should only use these if they are porting software that
// previously used nanomsg. New programs should use the nng native APIs.
#ifdef __cplusplus
extern "C" {
#endif
// TCP sockopt level.
#define NN_TCP (-3)
// TCP options.
#define NN_TCP_NODELAY 1
#ifdef __cplusplus
}
#endif
#endif // NNG_COMPAT_TCP_H

View File

@ -1,41 +0,0 @@
//
// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech>
// Copyright 2018 Capitar IT Group BV <info@capitar.com>
//
// This software is supplied under the terms of the MIT License, a
// copy of which should be located in the distribution where this
// file was obtained (LICENSE.txt). A copy of the license may also be
// found online at https://opensource.org/licenses/MIT.
//
#ifndef NNG_COMPAT_WS_H
#define NNG_COMPAT_WS_H
// This header contains interfaces that are intended to offer compatibility
// with nanomsg v1.0. These are not the "preferred" interfaces for nng,
// and consumers should only use these if they are porting software that
// previously used nanomsg. New programs should use the nng native APIs.
#ifdef __cplusplus
extern "C" {
#endif
// WS sockopt level.
#define NN_WS (-4)
// WS options.
// Note that while legacy libnanomsg had *some* support for text messages,
// NNG only supports binary. Binary types are required to pass protocol
// headers with NNG and nanomsg in any event. This means that the NNG
// WebSocket support will not be compatible with some very old browsers.
#define NN_WS_MSG_TYPE 1
#define NN_WS_MSG_TYPE_TEXT 0x1
#define NN_WS_MSG_TYPE_BINARY 0x2
#ifdef __cplusplus
}
#endif
#endif // NNG_COMPAT_WS_H

View File

@ -1,34 +0,0 @@
#ifndef EXCHANGE_H
#define EXCHANGE_H
#include <stddef.h>
#include "core/nng_impl.h"
#include "nng/supplemental/nanolib/conf.h"
// Exchange MQ
#define EXCHANGE_NAME_LEN 32
#define TOPIC_NAME_LEN 128
#define RINGBUFFER_MAX 64
typedef struct exchange_s exchange_t;
struct exchange_s {
char name[EXCHANGE_NAME_LEN];
char topic[TOPIC_NAME_LEN];
ringBuffer_t *rbs[RINGBUFFER_MAX];
unsigned int rb_count;
};
NNG_DECL int exchange_client_get_msg_by_key(void *arg, uint64_t key, nni_msg **msg);
NNG_DECL int exchange_client_get_msgs_by_key(void *arg, uint64_t key, uint32_t count, nng_msg ***list);
NNG_DECL int exchange_client_get_msgs_fuzz(void *arg, uint64_t start, uint64_t end, uint32_t *count, nng_msg ***list);
NNG_DECL int exchange_init(exchange_t **ex, char *name, char *topic,
unsigned int *rbsCaps, char **rbsName, uint8_t *rbsFullOp, unsigned int rbsCount);
NNG_DECL int exchange_add_rb(exchange_t *ex, ringBuffer_t *rb);
NNG_DECL int exchange_release(exchange_t *ex);
NNG_DECL int exchange_handle_msg(exchange_t *ex, uint64_t key, void *msg, nng_aio *aio);
NNG_DECL int exchange_get_ringBuffer(exchange_t *ex, char *rbName, ringBuffer_t **rb);
#endif

View File

@ -1,42 +0,0 @@
//
// Copyright 2023 NanoMQ Team, Inc.
//
// This software is supplied under the terms of the MIT License, a
// copy of which should be located in the distribution where this
// file was obtained (LICENSE.txt). A copy of the license may also be
// found online at https://opensource.org/licenses/MIT.
//
#ifndef EXCHANGE_CLIENT_H
#define EXCHANGE_CLIENT_H
#ifdef __cplusplus
extern "C" {
#endif
#define nng_exchange_self 0
#define nng_exchange_self_name "exchange-client"
#define nng_exchange_peer 0
#define nng_exchange_peer_name "exchange-server"
#define nng_opt_exchange_add "exchange-client-add"
#define NNG_EXCHANGE_SELF 0
#define NNG_EXCHANGE_SELF_NAME "exchange-client"
#define NNG_EXCHANGE_PEER 0
#define NNG_EXCHANGE_PEER_NAME "exchange-server"
#define NNG_OPT_EXCHANGE_BIND "exchange-client-bind"
#define NNG_OPT_EXCHANGE_GET_EX_QUEUE "exchange-client-get-ex-queue"
#define NNG_OPT_EXCHANGE_GET_RBMSGMAP "exchange-client-get-rbmsgmap"
NNG_DECL int nng_exchange_client_open(nng_socket *sock);
#ifndef nng_exchange_open
#define nng_exchange_open nng_exchange_client_open
#endif
#ifdef __cplusplus
}
#endif
#endif // #define EXCHANGE_CLIENT_H

View File

@ -1,23 +0,0 @@
#ifndef PRODUCER_H
#define PRODUCER_H
#include<stddef.h>
typedef struct producer_s producer_t;
struct producer_s {
/*
* return: 0: success, -1: failed
*/
int (*match)(void *data);
/*
* return: 0: continue, -1: stop and return
*/
int (*target)(void *data);
};
int producer_init(producer_t **p,
int (*match)(void *data),
int (*target)(void *data));
int producer_release(producer_t *p);
#endif

View File

@ -1,54 +0,0 @@
//
// Copyright 2024 NanoMQ Team, Inc. <wangwei@emqx.io>
//
// This software is supplied under the terms of the MIT License, a
// copy of which should be located in the distribution where this
// file was obtained (LICENSE.txt). A copy of the license may also be
// found online at https://opensource.org/licenses/MIT.
//
#if defined(SUPP_ICEORYX)
#ifndef NNG_ICEORYX_SHM_H
#define NNG_ICEORYX_SHM_H
#ifdef __cplusplus
extern "C" {
#endif
// TODO
#include "../../../src/supplemental/iceoryx/iceoryx_api.h"
struct nng_iceoryx_suber {
nano_iceoryx_suber *suber;
};
typedef struct nng_iceoryx_suber nng_iceoryx_suber;
struct nng_iceoryx_puber {
nano_iceoryx_puber *puber;
};
typedef struct nng_iceoryx_puber nng_iceoryx_puber;
NNG_DECL int nng_iceoryx_open(nng_socket *sock, const char *runtimename);
NNG_DECL int nng_iceoryx_sub(nng_socket *sock, const char *subername,
const char *const service_name, const char *const instance_name,
const char *const event, nng_iceoryx_suber **nsp);
NNG_DECL int nng_iceoryx_pub(nng_socket *sock, const char *pubername,
const char *const service_name, const char *const instance_name,
const char *const event, nng_iceoryx_puber **npp);
NNG_DECL int nng_msg_iceoryx_alloc(nng_msg **msgp, nng_iceoryx_puber *puber, size_t sz);
NNG_DECL int nng_msg_iceoryx_free(nng_msg *msg, nng_iceoryx_suber *suber);
NNG_DECL int nng_msg_iceoryx_append(nng_msg *msg, const void *data, size_t sz);
#ifdef __cplusplus
}
#endif
#endif
#endif

View File

@ -1,596 +0,0 @@
//
// Copyright 2023 NanoMQ Team, Inc. <jaylin@emqx.io>
//
// This software is supplied under the terms of the MIT License, a
// copy of which should be located in the distribution where this
// file was obtained (LICENSE.txt). A copy of the license may also be
// found online at https://opensource.org/licenses/MIT.
//
// This file is for the MQTT client implementation.
// Note that while there are some similarities, MQTT is sufficiently
// different enough from SP that many of the APIs cannot be easily
// shared.
//
// At this time there is no server provided by NNG itself, although
// the nanomq project provides such a server (and is based on NNG.)
//
// About our semantics:
//
// 1. MQTT client sockets have a single implicit dialer, and cannot
// support creation of additional dialers or listeners.
// 2. MQTT client sockets do support contexts; each context will
// maintain its own subscriptions, and the socket will keep a
// per-socket list of them and manage the full list.
// 3. Send sends PUBLISH messages.
// 4. Receive is used to receive published data from the server.
// 5. Most of the MQTT specific "features" are as options on the socket,
// dialer, or even the message. (For example message topics are set
// as options on the message.)
// 6. Pipe events can be used to detect connect/disconnect events.
// 7. Any QoS details such as retransmit, etc. are handled under the hood.
// This includes packet IDs.
// 8. PING and keep-alive is handled under the hood.
// 9. For publish actions, a separate method is used (not send/receive).
#ifndef NNG_MQTT_CLIENT_H
#define NNG_MQTT_CLIENT_H
#include <nng/nng.h>
#include <stdbool.h>
#include <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif
#define MQTT_PROTOCOL_NAME_v31 "MQIsdp"
#define MQTT_PROTOCOL_VERSION_v31 3
#define MQTT_PROTOCOL_NAME "MQTT"
#define MQTT_PROTOCOL_VERSION_v311 4
#define MQTT_PROTOCOL_VERSION_v5 5
// NNG_OPT_MQTT_EXPIRES is a 32-bit integer representing the expiration in
// seconds. This can be applied to a message.
// (TODO: What about session expiry?)
#define NNG_OPT_MQTT_EXPIRES "expires"
#define NNG_OPT_MQTT_CONNMSG "mqtt-connect-msg"
#define NNG_OPT_MQTT_CONNECT_PROPERTY "mqtt-connack-property"
#define NNG_OPT_MQTT_CONNECT_REASON "mqtt-connack-reason"
#define NNG_OPT_MQTT_RECONNECT_BACKOFF_MAX "mqtt-reconnect-backoff-max"
#define NNG_OPT_MQTT_DISCONNECT_PROPERTY "mqtt-disconnect-property"
#define NNG_OPT_MQTT_RETRY_INTERVAL "mqtt-client-retry-interval"
#define NNG_OPT_MQTT_RETRY_WAIT_TIME "mqtt-client-retry-wait-time"
#define NNG_OPT_MQTT_DISCONNECT_REASON "mqtt-disconnect-reason"
#define NNG_OPT_MQTT_SQLITE "mqtt-sqlite-option"
#define NNG_OPT_MQTT_ENABLE_SCRAM "mqtt-scram-option"
// NNG_OPT_MQTT_QOS is a byte (only lower two bits significant) representing
// the quality of service. At this time, only level zero is supported.
// TODO: level 1 and level 2 QoS
#define NNG_OPT_MQTT_QOS "qos"
// NNG_OPT_MQTT_RETAIN indicates that the message should be retained on
// the server as the single retained message for the associated topic.
// This is a boolean.
#define NNG_OPT_MQTT_RETAIN "retain"
// NNG_OPT_MQTT_DUP indicates that the message is a duplicate. This can
// only be returned on a message -- this client will add this flag if
// sending a duplicate message (QoS 1 and 2 only).
#define NNG_OPT_MQTT_DUP "dup"
// NNG_OPT_MQTT_TOPIC is the message topic. It is encoded as an "Encoded
// UTF-8 string" (uint16 length followed by UTF-8 data). At the API, it
// is just a UTF-8 string (C style, with a terminating byte.) Note that
// we do not support embedded NUL bytes in our UTF-8 strings. Every
// MQTT published message must have a topic.
#define NNG_OPT_MQTT_TOPIC "topic"
// NNG_OPT_MQTT_REASON is a reason that can be conveyed with a message.
// It is a UTF-8 string.
#define NNG_OPT_MQTT_REASON "reason"
// NNG_OPT_MQTT_USER_PROPS is an array of user properties. These are
// send with the message, and used for application specific purposes.
// The properties are of the type nng_mqtt_user_props_t.
#define NNG_OPT_MQTT_USER_PROPS "user-props"
// NNG_OPT_MQTT_PAYLOAD_FORMAT is the format of the payload for a message.
// It can be 0, indicating binary data, or 1, indicating UTF-8.
#define NNG_OPT_MQTT_PAYLOAD_FORMAT "mqtt-payload-format"
// NNG_OPT_MQTT_CONTENT_TYPE is the mime type as UTF-8 for PUBLISH
// or Will messages.
#define NNG_OPT_MQTT_CONTENT_TYPE "content-type"
// The following options are reserved for MQTT v5.0 request/reply support.
#define NNG_OPT_MQTT_RESPONSE_TOPIC "response-topic"
#define NNG_OPT_MQTT_CORRELATION_DATA "correlation-data"
// NNG_OPT_MQTT_CLIENT_ID is the UTF-8 string corresponding to the client
// identification. We automatically generate an initial value fo this,
// which is the UUID.
// TODO: Should applications be permitted to change this?
#define NNG_OPT_MQTT_CLIENT_ID "client-id" // UTF-8 string
#define NNG_OPT_MQTT_WILL_DELAY "will-delay"
// NNG_OPT_MQTT_RECEIVE_MAX is used with QoS 1 or 2 (not implemented),
// and indicates the level of concurrent receives it is willing to
// process. (TODO: Implementation note: we will need to preallocate a complete
// state machine (aio, plus any state) for each value of this > 0.
// It's not clear whether this should be tunable.) This is read-only
// property on the socket, and records the value given from the server.
// It will be 64K if the server did not indicate a specific value.
#define NNG_OPT_MQTT_RECEIVE_MAX "mqtt-receive-max"
// NNG_OPT_MQTT_SESSION_EXPIRES is an nng_duration.
// If set to NNG_DURATION_ZERO, then the session will expire automatically
// when the connection is closed.
// If it set to NNG_DURATION_INFINITE, the session never expires.
// Otherwise it will be a whole number of seconds indicating the session
// expiry interval.
#define NNG_OPT_MQTT_SESSION_EXPIRES "session-expires"
#define NNG_OPT_MQTT_TOPIC_ALIAS_MAX "alias-max"
#define NNG_OPT_MQTT_TOPIC_ALIAS "topic-alias"
#define NNG_OPT_MQTT_MAX_QOS "max-qos"
// NNG_MAX_RECV_LMQ and NNG_MAX_SEND_LMQ define the length of waiting queue
// they are the length of nni_lmq, please be ware it affects the memory usage
// significantly while having heavy throughput
#define NNG_MAX_RECV_LMQ 64
#define NNG_MAX_SEND_LMQ 64
#define NNG_TRAN_MAX_LMQ_SIZE 128
// NNG_TLS_xxx options can be set on the client as well.
// E.g. NNG_OPT_TLS_CA_CERT, etc.
// TBD: Extended authentication. I think we should skip it -- everyone
// should just use TLS if they need security.
// NNG_OPT_MQTT_KEEP_ALIVE is set on the client, and can be retrieved
// by the client. This is an nng_duration but will always be zero or
// a whole number of seconds less than 65536. If setting the value,
// it must be set before the client connects. When retrieved, the
// server's value will be returned (if it is different from what we
// requested.) If we reconnect, we will try again with the configured
// value rather than the value that we got from the server last time.
#define NNG_OPT_MQTT_KEEP_ALIVE "mqtt-keep-alive"
// NNG_OPT_MQTT_MAX_PACKET_SIZE is the maximum packet size that can
// be used. It needs to be set before the client dials.
#define NNG_OPT_MQTT_MAX_PACKET_SIZE "mqtt-max-packet-size"
#define NNG_OPT_MQTT_USERNAME "username"
#define NNG_OPT_MQTT_PASSWORD "password"
// Message handling. Note that topic aliases are handled by the library
// automatically on behalf of the consumer.
typedef enum {
nng_mqtt_msg_format_binary = 0,
nng_mqtt_msg_format_utf8 = 1,
} nng_mqtt_msg_format_t;
/* Message types & flags */
#define CMD_UNKNOWN 0x00
#define CMD_CONNECT 0x10
#define CMD_CONNACK 0x20
#define CMD_PUBLISH 0x30 // indicates PUBLISH packet & MQTTV4 pub packet
#define CMD_PUBLISH_V5 0x31 // this is the flag for differing MQTTV5 from V4 V3
#define CMD_PUBACK 0x40
#define CMD_PUBREC 0x50
#define CMD_PUBREL 0x60
#define CMD_PUBCOMP 0x70
#define CMD_SUBSCRIBE 0x80
#define CMD_SUBACK 0x90
#define CMD_UNSUBSCRIBE 0xA0
#define CMD_UNSUBACK 0xB0
#define CMD_PINGREQ 0xC0
#define CMD_PINGRESP 0xD0
#define CMD_DISCONNECT 0xE0
#define CMD_AUTH_V5 0xF0
#define CMD_DISCONNECT_EV 0xE2
#define CMD_LASTWILL 0XE3
typedef enum {
NNG_MQTT_CONNECT = 0x01,
NNG_MQTT_CONNACK = 0x02,
NNG_MQTT_PUBLISH = 0x03,
NNG_MQTT_PUBACK = 0x04,
NNG_MQTT_PUBREC = 0x05,
NNG_MQTT_PUBREL = 0x06,
NNG_MQTT_PUBCOMP = 0x07,
NNG_MQTT_SUBSCRIBE = 0x08,
NNG_MQTT_SUBACK = 0x09,
NNG_MQTT_UNSUBSCRIBE = 0x0A,
NNG_MQTT_UNSUBACK = 0x0B,
NNG_MQTT_PINGREQ = 0x0C,
NNG_MQTT_PINGRESP = 0x0D,
NNG_MQTT_DISCONNECT = 0x0E,
NNG_MQTT_AUTH = 0x0F
} nng_mqtt_packet_type;
//TODO Enum is not fitting here
typedef enum {
SUCCESS = 0,
NORMAL_DISCONNECTION = 0,
GRANTED_QOS_0 = 0,
GRANTED_QOS_1 = 1,
GRANTED_QOS_2 = 2,
DISCONNECT_WITH_WILL_MESSAGE = 4,
NO_MATCHING_SUBSCRIBERS = 16,
NO_SUBSCRIPTION_EXISTED = 17,
CONTINUE_AUTHENTICATION = 24,
RE_AUTHENTICATE = 25,
UNSPECIFIED_ERROR = 128,
MALFORMED_PACKET = 129,
PROTOCOL_ERROR = 130,
IMPLEMENTATION_SPECIFIC_ERROR = 131,
UNSUPPORTED_PROTOCOL_VERSION = 132,
CLIENT_IDENTIFIER_NOT_VALID = 133,
BAD_USER_NAME_OR_PASSWORD = 134,
NOT_AUTHORIZED = 135,
SERVER_UNAVAILABLE = 136,
SERVER_BUSY = 137,
BANNED = 138,
SERVER_SHUTTING_DOWN = 139,
BAD_AUTHENTICATION_METHOD = 140,
KEEP_ALIVE_TIMEOUT = 141,
SESSION_TAKEN_OVER = 142,
TOPIC_FILTER_INVALID = 143,
TOPIC_NAME_INVALID = 144,
PACKET_IDENTIFIER_IN_USE = 145,
PACKET_IDENTIFIER_NOT_FOUND = 146,
RECEIVE_MAXIMUM_EXCEEDED = 147,
TOPIC_ALIAS_INVALID = 148,
PACKET_TOO_LARGE = 149,
MESSAGE_RATE_TOO_HIGH = 150,
QUOTA_EXCEEDED = 151,
ADMINISTRATIVE_ACTION = 152,
PAYLOAD_FORMAT_INVALID = 153,
RETAIN_NOT_SUPPORTED = 154,
QOS_NOT_SUPPORTED = 155,
USE_ANOTHER_SERVER = 156,
SERVER_MOVED = 157,
SHARED_SUBSCRIPTIONS_NOT_SUPPORTED = 158,
CONNECTION_RATE_EXCEEDED = 159,
MAXIMUM_CONNECT_TIME = 160,
SUBSCRIPTION_IDENTIFIERS_NOT_SUPPORTED = 161,
WILDCARD_SUBSCRIPTIONS_NOT_SUPPORTED = 162
} reason_code;
typedef enum {
PAYLOAD_FORMAT_INDICATOR = 1,
MESSAGE_EXPIRY_INTERVAL = 2,
CONTENT_TYPE = 3,
RESPONSE_TOPIC = 8,
CORRELATION_DATA = 9,
SUBSCRIPTION_IDENTIFIER = 11,
SESSION_EXPIRY_INTERVAL = 17,
ASSIGNED_CLIENT_IDENTIFIER = 18,
SERVER_KEEP_ALIVE = 19,
AUTHENTICATION_METHOD = 21,
AUTHENTICATION_DATA = 22,
REQUEST_PROBLEM_INFORMATION = 23,
WILL_DELAY_INTERVAL = 24,
REQUEST_RESPONSE_INFORMATION = 25,
RESPONSE_INFORMATION = 26,
SERVER_REFERENCE = 28,
REASON_STRING = 31,
RECEIVE_MAXIMUM = 33,
TOPIC_ALIAS_MAXIMUM = 34,
TOPIC_ALIAS = 35,
PUBLISH_MAXIMUM_QOS = 36,
RETAIN_AVAILABLE = 37,
USER_PROPERTY = 38,
MAXIMUM_PACKET_SIZE = 39,
WILDCARD_SUBSCRIPTION_AVAILABLE = 40,
SUBSCRIPTION_IDENTIFIER_AVAILABLE = 41,
SHARED_SUBSCRIPTION_AVAILABLE = 42
} properties_type;
struct mqtt_buf_t {
uint32_t length;
uint8_t *buf;
};
typedef struct mqtt_buf_t mqtt_buf;
typedef struct mqtt_buf_t nng_mqtt_buffer;
typedef struct mqtt_buf_t nng_mqtt_topic;
struct mqtt_kv_t {
mqtt_buf key;
mqtt_buf value;
};
typedef struct mqtt_kv_t mqtt_kv;
typedef struct mqtt_topic_qos_t {
nng_mqtt_topic topic;
uint8_t qos;
uint8_t nolocal;
uint8_t rap;
uint8_t retain_handling;
} mqtt_topic_qos;
typedef struct mqtt_topic_qos_t nng_mqtt_topic_qos;
extern uint16_t nni_msg_get_pub_pid(nng_msg *m);
struct mqtt_string {
char * body;
uint32_t len;
};
typedef struct mqtt_string mqtt_string;
struct mqtt_string_node {
struct mqtt_string_node *next;
mqtt_string * it;
};
typedef struct mqtt_string_node mqtt_string_node;
struct mqtt_binary {
uint8_t *body;
uint32_t len;
};
typedef struct mqtt_binary mqtt_binary;
struct mqtt_str_pair {
char * key; // key
uint32_t len_key;
char * val; // value
uint32_t len_val;
};
typedef struct mqtt_str_pair mqtt_str_pair;
union Property_type {
uint8_t u8;
uint16_t u16;
uint32_t u32;
uint32_t varint;
mqtt_buf binary;
mqtt_buf str;
mqtt_kv strpair;
};
typedef enum {
U8,
U16,
U32,
VARINT,
BINARY,
STR,
STR_PAIR,
UNKNOWN
} property_type_enum;
struct property_data {
property_type_enum p_type;
union Property_type p_value;
bool is_copy;
};
typedef struct property_data property_data;
struct property {
uint8_t id;
property_data data;
struct property *next;
};
typedef struct property property;
NNG_DECL int nng_mqtt_msg_alloc(nng_msg **, size_t);
NNG_DECL int nng_mqtt_msg_proto_data_alloc(nng_msg *);
NNG_DECL void nng_mqtt_msg_proto_data_free(nng_msg *);
NNG_DECL int nng_mqtt_msg_encode(nng_msg *);
NNG_DECL int nng_mqtt_msg_decode(nng_msg *);
NNG_DECL int nng_mqttv5_msg_encode(nng_msg *);
NNG_DECL int nng_mqttv5_msg_decode(nng_msg *);
NNG_DECL int nng_mqtt_msg_validate(nng_msg *, uint8_t);
NNG_DECL void nng_mqtt_msg_set_packet_type(nng_msg *, nng_mqtt_packet_type);
NNG_DECL nng_mqtt_packet_type nng_mqtt_msg_get_packet_type(nng_msg *);
NNG_DECL void nng_mqtt_msg_set_bridge_bool(nng_msg *msg, bool bridged);
NNG_DECL bool nng_mqtt_msg_get_bridge_bool(nng_msg *msg);
NNG_DECL void nng_mqtt_msg_set_sub_retain_bool(nng_msg *msg, bool retain);
NNG_DECL bool nng_mqtt_msg_get_sub_retain_bool(nng_msg *msg);
NNG_DECL void nng_mqtt_msg_set_connect_proto_version(nng_msg *, uint8_t);
NNG_DECL void nng_mqtt_msg_set_connect_keep_alive(nng_msg *, uint16_t);
NNG_DECL void nng_mqtt_msg_set_connect_client_id(nng_msg *, const char *);
NNG_DECL void nng_mqtt_msg_set_connect_user_name(nng_msg *, const char *);
NNG_DECL void nng_mqtt_msg_set_connect_password(nng_msg *, const char *);
NNG_DECL void nng_mqtt_msg_set_connect_clean_session(nng_msg *, bool);
NNG_DECL void nng_mqtt_msg_set_connect_will_topic(nng_msg *, const char *);
NNG_DECL void nng_mqtt_msg_set_connect_will_msg(
nng_msg *, uint8_t *, uint32_t);
NNG_DECL void nng_mqtt_msg_set_connect_will_retain(nng_msg *, bool);
NNG_DECL void nng_mqtt_msg_set_connect_will_qos(nng_msg *, uint8_t);
NNG_DECL void nng_mqtt_msg_set_connect_property(nng_msg *, property *);
NNG_DECL property *nng_mqtt_msg_get_connect_will_property(nng_msg *);
NNG_DECL void nng_mqtt_msg_set_connect_will_property(nng_msg *, property *);
NNG_DECL const char *nng_mqtt_msg_get_connect_user_name(nng_msg *);
NNG_DECL const char *nng_mqtt_msg_get_connect_password(nng_msg *);
NNG_DECL bool nng_mqtt_msg_get_connect_clean_session(nng_msg *);
NNG_DECL uint8_t nng_mqtt_msg_get_connect_proto_version(nng_msg *);
NNG_DECL uint16_t nng_mqtt_msg_get_connect_keep_alive(nng_msg *);
NNG_DECL const char *nng_mqtt_msg_get_connect_client_id(nng_msg *);
NNG_DECL const char *nng_mqtt_msg_get_connect_will_topic(nng_msg *);
NNG_DECL uint8_t *nng_mqtt_msg_get_connect_will_msg(nng_msg *, uint32_t *);
NNG_DECL bool nng_mqtt_msg_get_connect_will_retain(nng_msg *);
NNG_DECL uint8_t nng_mqtt_msg_get_connect_will_qos(nng_msg *);
NNG_DECL property *nng_mqtt_msg_get_connect_property(nng_msg *);
NNG_DECL void nng_mqtt_msg_set_connack_return_code(nng_msg *, uint8_t);
NNG_DECL void nng_mqtt_msg_set_connack_flags(nng_msg *, uint8_t);
NNG_DECL void nng_mqtt_msg_set_connack_property(nng_msg *, property *);
NNG_DECL uint8_t nng_mqtt_msg_get_connack_return_code(nng_msg *);
NNG_DECL uint8_t nng_mqtt_msg_get_connack_flags(nng_msg *);
NNG_DECL property *nng_mqtt_msg_get_connack_property(nng_msg *);
NNG_DECL void nng_mqtt_msg_set_publish_qos(nng_msg *, uint8_t);
NNG_DECL uint8_t nng_mqtt_msg_get_publish_qos(nng_msg *);
NNG_DECL void nng_mqtt_msg_set_publish_retain(nng_msg *, bool);
NNG_DECL bool nng_mqtt_msg_get_publish_retain(nng_msg *);
NNG_DECL void nng_mqtt_msg_set_publish_dup(nng_msg *, bool);
NNG_DECL bool nng_mqtt_msg_get_publish_dup(nng_msg *);
NNG_DECL int nng_mqtt_msg_set_publish_topic(nng_msg *, const char *);
NNG_DECL int nng_mqtt_msg_set_publish_topic_len(nng_msg *msg, uint32_t len);
NNG_DECL const char *nng_mqtt_msg_get_publish_topic(nng_msg *, uint32_t *);
NNG_DECL int nng_mqtt_msg_set_publish_payload(nng_msg *, uint8_t *, uint32_t);
NNG_DECL uint8_t *nng_mqtt_msg_get_publish_payload(nng_msg *, uint32_t *);
NNG_DECL property *nng_mqtt_msg_get_publish_property(nng_msg *);
NNG_DECL void nng_mqtt_msg_set_publish_property(nng_msg *, property *);
NNG_DECL uint16_t nng_mqtt_msg_get_puback_packet_id(nng_msg *);
NNG_DECL property *nng_mqtt_msg_get_puback_property(nng_msg *);
NNG_DECL void nng_mqtt_msg_set_puback_property(nng_msg *, property *);
NNG_DECL uint16_t nng_mqtt_msg_get_pubrec_packet_id(nng_msg *);
NNG_DECL property *nng_mqtt_msg_get_pubrec_property(nng_msg *);
NNG_DECL void nng_mqtt_msg_set_pubrec_property(nng_msg *, property *);
NNG_DECL uint16_t nng_mqtt_msg_get_pubrel_packet_id(nng_msg *);
NNG_DECL property *nng_mqtt_msg_get_pubrel_property(nng_msg *);
NNG_DECL void nng_mqtt_msg_set_pubrel_property(nng_msg *, property *);
NNG_DECL uint16_t nng_mqtt_msg_get_pubcomp_packet_id(nng_msg *);
NNG_DECL property *nng_mqtt_msg_get_pubcomp_property(nng_msg *);
NNG_DECL void nng_mqtt_msg_set_pubcomp_property(nng_msg *, property *);
NNG_DECL nng_mqtt_topic_qos *nng_mqtt_msg_get_subscribe_topics(
nng_msg *, uint32_t *);
NNG_DECL void nng_mqtt_msg_set_subscribe_topics(
nng_msg *, nng_mqtt_topic_qos *, uint32_t);
NNG_DECL property *nng_mqtt_msg_get_subscribe_property(nng_msg *);
NNG_DECL void nng_mqtt_msg_set_subscribe_property(nng_msg *, property *);
NNG_DECL void nng_mqtt_msg_set_suback_return_codes(
nng_msg *, uint8_t *, uint32_t);
NNG_DECL uint8_t *nng_mqtt_msg_get_suback_return_codes(nng_msg *, uint32_t *);
NNG_DECL property *nng_mqtt_msg_get_suback_property(nng_msg *);
NNG_DECL void nng_mqtt_msg_set_suback_property(nng_msg *, property *);
NNG_DECL void nng_mqtt_msg_set_unsubscribe_topics(
nng_msg *, nng_mqtt_topic *, uint32_t);
NNG_DECL nng_mqtt_topic *nng_mqtt_msg_get_unsubscribe_topics(
nng_msg *, uint32_t *);
NNG_DECL property *nng_mqtt_msg_get_unsubscribe_property(nng_msg *);
NNG_DECL void nng_mqtt_msg_set_unsubscribe_property(nng_msg *, property *);
NNG_DECL void nng_mqtt_msg_set_unsuback_return_codes(
nng_msg *, uint8_t *, uint32_t);
NNG_DECL uint8_t *nng_mqtt_msg_get_unsuback_return_codes(nng_msg *, uint32_t *);
NNG_DECL property *nng_mqtt_msg_get_unsuback_property(nng_msg *);
NNG_DECL void nng_mqtt_msg_set_unsuback_property(nng_msg *, property *);
NNG_DECL property *nng_mqtt_msg_get_disconnect_property(nng_msg *);
NNG_DECL void nng_mqtt_msg_set_disconnect_property(nng_msg *, property *);
NNG_DECL nng_mqtt_topic *nng_mqtt_topic_array_create(size_t);
NNG_DECL void nng_mqtt_topic_array_set(nng_mqtt_topic *, size_t, const char *);
NNG_DECL void nng_mqtt_topic_array_free(nng_mqtt_topic *, size_t);
NNG_DECL nng_mqtt_topic_qos *nng_mqtt_topic_qos_array_create(size_t);
NNG_DECL void nng_mqtt_topic_qos_array_set(nng_mqtt_topic_qos *, size_t,
const char *, uint8_t, uint8_t, uint8_t, uint8_t);
NNG_DECL void nng_mqtt_topic_qos_array_free(nng_mqtt_topic_qos *, size_t);
NNG_DECL int nng_mqtt_set_connect_cb(nng_socket, nng_pipe_cb, void *);
NNG_DECL int nng_mqtt_set_disconnect_cb(nng_socket, nng_pipe_cb, void *);
NNG_DECL void nng_mqtt_msg_dump(nng_msg *, uint8_t *, uint32_t, bool);
NNG_DECL conn_param *nng_get_conn_param_from_msg(nng_msg *);
NNG_DECL void nng_msg_proto_set_property(nng_msg *msg, void *p);
NNG_DECL void nng_mqtt_msg_set_disconnect_reason_code(nng_msg *msg, uint8_t reason_code);
NNG_DECL uint32_t get_mqtt_properties_len(property *prop);
NNG_DECL int mqtt_property_free(property *prop);
NNG_DECL void mqtt_property_foreach(property *prop, void (*cb)(property *));
NNG_DECL int mqtt_property_dup(property **dup, const property *src);
NNG_DECL property *mqtt_property_pub_by_will(property *will_prop);
NNG_DECL int mqtt_property_value_copy(property *dst, const property *src);
NNG_DECL property *mqtt_property_alloc(void);
NNG_DECL property *mqtt_property_set_value_u8(uint8_t prop_id, uint8_t value);
NNG_DECL property *mqtt_property_set_value_u16(uint8_t prop_id, uint16_t value);
NNG_DECL property *mqtt_property_set_value_u32(uint8_t prop_id, uint32_t value);
NNG_DECL property *mqtt_property_set_value_varint(uint8_t prop_id, uint32_t value);
NNG_DECL property *mqtt_property_set_value_binary(uint8_t prop_id, uint8_t *value, uint32_t len, bool copy_value);
NNG_DECL property *mqtt_property_set_value_str( uint8_t prop_id, const char *value, uint32_t len, bool copy_value);
NNG_DECL property *mqtt_property_set_value_strpair(uint8_t prop_id, const char *key, uint32_t key_len, const char *value, uint32_t value_len, bool copy_value);
NNG_DECL property_type_enum mqtt_property_get_value_type(uint8_t prop_id);
NNG_DECL property_data *mqtt_property_get_value(property *prop, uint8_t prop_id);
NNG_DECL void mqtt_property_append(property *prop_list, property *last);
// Note that MQTT sockets can be connected to at most a single server.
// Creating the client does not connect it.
NNG_DECL int nng_mqtt_client_open(nng_socket *);
NNG_DECL int nng_mqttv5_client_open(nng_socket *);
// Note that there is a single implicit dialer for the client,
// and options may be set on the socket to configure dial options.
// Those options should be set before doing nng_dial().
// close done via nng_close().
// Question: session resumption. Should we resume sessions under the hood
// as part of reconnection, or do we want to expose this to the API user?
// My inclination is not to expose.
// nng_dial or nng_dialer_create can be used, but this protocol only
// allows a single dialer to be created on the socket.
// Subscriptions are normally run synchronously from the view of the
// caller. Because there is a round-trip message involved, we use
// a separate method instead of merely relying upon socket options.
// TODO: shared subscriptions. Subscription options (retain, QoS)
typedef struct nng_mqtt_client nng_mqtt_client;
typedef void(nng_mqtt_send_cb)(nng_mqtt_client *client, nng_msg *msg, void *);
struct nng_mqtt_client{
nng_socket sock;
nng_aio *send_aio;
nng_aio *recv_aio;
void *msgq;
void *obj; // user defined callback obj
bool async;
nng_mqtt_send_cb *cb;
};
NNG_DECL nng_mqtt_client *nng_mqtt_client_alloc(nng_socket, nng_mqtt_send_cb, bool);
NNG_DECL void nng_mqtt_client_free(nng_mqtt_client*, bool);
NNG_DECL int nng_mqtt_subscribe(nng_socket, nng_mqtt_topic_qos *, uint32_t, property *);
NNG_DECL int nng_mqtt_subscribe_async(nng_mqtt_client *, nng_mqtt_topic_qos *, size_t, property *);
NNG_DECL int nng_mqtt_unsubscribe(nng_socket, nng_mqtt_topic *, size_t, property *);
NNG_DECL int nng_mqtt_unsubscribe_async(nng_mqtt_client *, nng_mqtt_topic *, size_t, property *);
// as with other ctx based methods, we use the aio form exclusively
NNG_DECL int nng_mqtt_ctx_subscribe(nng_ctx *, const char *, nng_aio *, ...);
NNG_DECL int nng_mqtt_disconnect(nng_socket *, uint8_t, property *);
typedef struct nng_mqtt_sqlite_option nng_mqtt_sqlite_option;
#if defined(NNG_SUPP_SQLITE)
NNG_DECL int nng_mqtt_alloc_sqlite_opt(nng_mqtt_sqlite_option **);
NNG_DECL int nng_mqtt_free_sqlite_opt(nng_mqtt_sqlite_option *);
NNG_DECL void nng_mqtt_set_sqlite_conf(
nng_mqtt_sqlite_option *sqlite, void *config);
NNG_DECL void nng_mqtt_sqlite_db_init(nng_mqtt_sqlite_option *, const char *);
NNG_DECL void nng_mqtt_sqlite_db_fini(nng_mqtt_sqlite_option *);
#endif
#ifdef __cplusplus
}
#endif
#endif // NNG_MQTT_CLIENT_H

View File

@ -1,40 +0,0 @@
//
// Copyright 2022 NanoMQ Team, Inc. <jaylin@emqx.io>
//
// This software is supplied under the terms of the MIT License, a
// copy of which should be located in the distribution where this
// file was obtained (LICENSE.txt). A copy of the license may also be
// found online at https://opensource.org/licenses/MIT.
//
#ifndef NNG_MQTT_QUIC_CLIENT_H
#define NNG_MQTT_QUIC_CLIENT_H
#include <nng/nng.h>
#include <stdbool.h>
#include <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif
#if defined(SUPP_QUIC)
NNG_DECL int nng_mqttv5_quic_client_open(nng_socket *);
NNG_DECL int nng_mqtt_quic_client_open(nng_socket *);
NNG_DECL int nng_mqtt_quic_set_connect_cb(nng_socket *sock, int (*cb)(void *, void *), void *arg);
NNG_DECL int nng_mqtt_quic_set_msg_send_cb(nng_socket *sock, int (*cb)(void *, void *), void *arg);
NNG_DECL int nng_mqtt_quic_set_msg_recv_cb(nng_socket *sock, int (*cb)(void *, void *), void *arg);
NNG_DECL int nng_mqtt_quic_set_disconnect_cb(nng_socket *sock, int (*cb)(void *, void *), void *arg);
NNG_DECL int nng_mqttv5_quic_set_connect_cb(nng_socket *sock, int (*cb)(void *, void *), void *arg);
NNG_DECL int nng_mqttv5_quic_set_msg_send_cb(nng_socket *sock, int (*cb)(void *, void *), void *arg);
NNG_DECL int nng_mqttv5_quic_set_msg_recv_cb(nng_socket *sock, int (*cb)(void *, void *), void *arg);
NNG_DECL int nng_mqttv5_quic_set_disconnect_cb(nng_socket *sock, int (*cb)(void *, void *), void *arg);
#endif
#ifdef __cplusplus
}
#endif
#endif // NNG_MQTT_QUIC_CLIENT_H

View File

@ -1,87 +0,0 @@
// This software is supplied under the terms of the MIT License, a
// copy of which should be located in the distribution where this
// file was obtained (LICENSE.txt). A copy of the license may also be
// found online at https://opensource.org/licenses/MIT.
//
//
// The Struct to store mqtt_packet.
#ifndef NNG_MQTT_PACKET_H
#define NNG_MQTT_PACKET_H
#include "nng/nng.h"
#include "nng/mqtt/mqtt_client.h"
#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#define UPDATE_FIELD_INT(field, new_obj, old_obj) \
do { \
new_obj->field = old_obj->field; \
} while (0)
#define UPDATE_FIELD_MQTT_STRING(field, sub_field, new_obj, old_obj) \
do { \
if (new_obj->field.sub_field == NULL && \
old_obj->field.sub_field != NULL) { \
new_obj->field = old_obj->field; \
new_obj->field.sub_field = \
strdup((char *) old_obj->field.sub_field); \
} \
} while (0)
#define UPDATE_FIELD_MQTT_STRING_PAIR( \
field, sub_field1, sub_field2, new_obj, old_obj) \
do { \
if ((new_obj->field.sub_field1 == NULL && \
old_obj->field.sub_field1 != NULL) || \
(new_obj->field.sub_field2 == NULL && \
old_obj->field.sub_field2 != NULL)) { \
new_obj->field = old_obj->field; \
new_obj->field.sub_field1 = \
strdup((char *) old_obj->field.sub_field1); \
new_obj->field.sub_field2 = \
strdup((char *) old_obj->field.sub_field2); \
} \
} while (0)
struct mqtt_msg_info {
uint32_t pipe;
};
typedef struct mqtt_msg_info mqtt_msg_info;
struct topic_node {
uint8_t qos : 2;
uint8_t no_local : 1;
uint8_t rap : 1;
uint8_t retain_handling : 2;
struct {
char *body;
int len;
} topic;
uint8_t reason_code;
struct topic_node *next;
};
typedef struct topic_node topic_node;
struct packet_subscribe {
uint16_t packet_id;
uint32_t prop_len;
property *properties;
topic_node *node; // stored topic and option
};
typedef struct packet_subscribe packet_subscribe;
struct packet_unsubscribe {
uint16_t packet_id;
uint32_t prop_len;
property *properties;
topic_node *node; // stored topic and option
};
typedef struct packet_unsubscribe packet_unsubscribe;
#endif

View File

@ -1,30 +0,0 @@
//
// Copyright 2021 Staysail Systems, Inc. <info@staysail.tech>
// Copyright 2017 Capitar IT Group BV <info@capitar.com>
//
// This software is supplied under the terms of the MIT License, a
// copy of which should be located in the distribution where this
// file was obtained (LICENSE.txt). A copy of the license may also be
// found online at https://opensource.org/licenses/MIT.
//
#ifndef NNG_TRANSPORT_MQTT_QUIC_H
#define NNG_TRANSPORT_MQTT_QUIC_H
#include <nng/nng.h>
#ifdef __cplusplus
extern "C" {
#endif
// QUIC transport. This is used for communication over QUIC/UDP/IP.
#ifndef NNG_ELIDE_DEPRECATED
NNG_DECL int nng_mqtt_quic_register(void);
#endif
#ifdef __cplusplus
}
#endif
#endif // NNG_TRANSPORT_MQTT_QUIC_H

View File

@ -1,30 +0,0 @@
//
// Copyright 2021 Staysail Systems, Inc. <info@staysail.tech>
// Copyright 2017 Capitar IT Group BV <info@capitar.com>
//
// This software is supplied under the terms of the MIT License, a
// copy of which should be located in the distribution where this
// file was obtained (LICENSE.txt). A copy of the license may also be
// found online at https://opensource.org/licenses/MIT.
//
#ifndef NNG_TRANSPORT_MQTT_TCP_TCP_H
#define NNG_TRANSPORT_MQTT_TCP_TCP_H
#include <nng/nng.h>
#ifdef __cplusplus
extern "C" {
#endif
// TCP transport. This is used for communication over TCP/IP.
#ifndef NNG_ELIDE_DEPRECATED
NNG_DECL int nng_mqtt_tcp_register(void);
#endif
#ifdef __cplusplus
}
#endif
#endif // NNG_TRANSPORT_MQTT_TCP_TCP_H

View File

@ -1,30 +0,0 @@
//
// Copyright 2021 Staysail Systems, Inc. <info@staysail.tech>
// Copyright 2017 Capitar IT Group BV <info@capitar.com>
//
// This software is supplied under the terms of the MIT License, a
// copy of which should be located in the distribution where this
// file was obtained (LICENSE.txt). A copy of the license may also be
// found online at https://opensource.org/licenses/MIT.
//
#ifndef NNG_TRANSPORT_MQTT_TLS_TLS_H
#define NNG_TRANSPORT_MQTT_TLS_TLS_H
#include <nng/nng.h>
#ifdef __cplusplus
extern "C" {
#endif
// TCP transport. This is used for communication over TCP/IP.
#ifndef NNG_ELIDE_DEPRECATED
NNG_DECL int nng_mqtts_tcp_register(void);
#endif
#ifdef __cplusplus
}
#endif
#endif // NNG_TRANSPORT_MQTT_TLS_TLS_H

File diff suppressed because it is too large Load Diff

View File

@ -1,39 +0,0 @@
//
// Copyright 2021 Staysail Systems, Inc. <info@staysail.tech>
// Copyright 2018 Capitar IT Group BV <info@capitar.com>
//
// This software is supplied under the terms of the MIT License, a
// copy of which should be located in the distribution where this
// file was obtained (LICENSE.txt). A copy of the license may also be
// found online at https://opensource.org/licenses/MIT.
//
#ifndef NNG_PROTOCOL_BUS0_BUS_H
#define NNG_PROTOCOL_BUS0_BUS_H
#ifdef __cplusplus
extern "C" {
#endif
NNG_DECL int nng_bus0_open(nng_socket *);
NNG_DECL int nng_bus0_open_raw(nng_socket *);
#ifndef nng_bus_open
#define nng_bus_open nng_bus0_open
#endif
#ifndef nng_bus_open_raw
#define nng_bus_open_raw nng_bus0_open_raw
#endif
#define NNG_BUS0_SELF 0x70
#define NNG_BUS0_PEER 0x70
#define NNG_BUS0_SELF_NAME "bus"
#define NNG_BUS0_PEER_NAME "bus"
#ifdef __cplusplus
}
#endif
#endif // NNG_PROTOCOL_BUS0_BUS_H

View File

@ -1,112 +0,0 @@
//
// Copyright 2022 NanoMQ Team, Inc. <jaylin@emqx.io>
//
// This software is supplied under the terms of the MIT License, a
// copy of which should be located in the distribution where this
// file was obtained (LICENSE.txt). A copy of the license may also be
// found online at https://opensource.org/licenses/MIT.
//
#ifndef MQTT_PROTOCOL_H
#define MQTT_PROTOCOL_H
#define MQTT_PROTOCOL_NAME_v31 "MQIsdp"
#define MQTT_PROTOCOL_VERSION_v31 3
#define MQTT_PROTOCOL_NAME "MQTT"
#define MQTT_PROTOCOL_VERSION_v311 4
#define MQTT_PROTOCOL_VERSION_v5 5
/* NNG OPTs */
#define NANO_CONF "nano:conf"
/* Length defination */
// Maximum Packet Size of broker
#define NANO_MAX_RECV_PACKET_SIZE (2*1024*1024)
#define NANO_MIN_PACKET_LEN sizeof(uint8_t) * 8
#define NANO_CONNECT_PACKET_LEN sizeof(uint8_t) * 12
#define NANO_MIN_FIXED_HEADER_LEN sizeof(uint8_t) * 2
//flow control:how many QoS packet broker willing to process at same time.
#define NANO_MAX_QOS_PACKET 1024
#ifdef NANO_PACKET_SIZE
#define NNI_NANO_MAX_PACKET_SIZE sizeof(uint8_t) * NANO_PACKET_SIZE
#else
#define NNI_NANO_MAX_PACKET_SIZE sizeof(uint8_t) * 16
#endif
/* Error values */
enum err_t {
ERR_AUTH_CONTINUE = -4,
ERR_NO_SUBSCRIBERS = -3,
ERR_SUB_EXISTS = -2,
ERR_CONN_PENDING = -1,
ERR_SUCCESS = 0,
ERR_NOMEM = 1,
ERR_PROTOCOL = 2,
ERR_INVAL = 3,
ERR_NO_CONN = 4,
ERR_CONN_REFUSED = 5,
ERR_NOT_FOUND = 6,
ERR_CONN_LOST = 7,
ERR_TLS = 8,
ERR_PAYLOAD_SIZE = 9,
ERR_NOT_SUPPORTED = 10,
ERR_AUTH = 11,
ERR_ACL_DENIED = 12,
ERR_UNKNOWN = 13,
ERR_ERRNO = 14,
ERR_EAI = 15,
ERR_PROXY = 16,
ERR_PLUGIN_DEFER = 17,
ERR_MALFORMED_UTF8 = 18,
ERR_KEEPALIVE = 19,
ERR_LOOKUP = 20,
ERR_MALFORMED_PACKET = 21,
ERR_DUPLICATE_PROPERTY = 22,
ERR_TLS_HANDSHAKE = 23,
ERR_QOS_NOT_SUPPORTED = 24,
ERR_OVERSIZE_PACKET = 25,
ERR_OCSP = 26,
};
// mqtt5 macro
#define NMQ_RECEIVE_MAXIMUM_EXCEEDED 0X93
#define NMQ_PACKET_TOO_LARGE 0x95
#define NMQ_UNSEPECIFY_ERROR 0X80
#define NMQ_SERVER_UNAVAILABLE 0x88
#define NMQ_SERVER_BUSY 0x89
#define NMQ_SERVER_SHUTTING_DOWN 0x8B
#define NMQ_KEEP_ALIVE_TIMEOUT 0x8D
#define NMQ_AUTH_SUB_ERROR 0X87
// MQTT Control Packet types
typedef enum {
RESERVED = 0,
CONNECT = 1,
CONNACK = 2,
PUBLISH = 3,
PUBACK = 4,
PUBREC = 5,
PUBREL = 6,
PUBCOMP = 7,
SUBSCRIBE = 8,
SUBACK = 9,
UNSUBSCRIBE = 10,
UNSUBACK = 11,
PINGREQ = 12,
PINGRESP = 13,
DISCONNECT = 14,
AUTH = 15
} mqtt_control_packet_types;
//MQTTV5
typedef enum {
// 0 : V4 1: V5 5: V4 to V5 4: V5 to V4
MQTTV4 = 0,
MQTTV5 = 1,
MQTTV4_V5 = 2,
MQTTV5_V4 = 3,
} target_prover;
#endif

View File

@ -1,152 +0,0 @@
#ifndef NNG_MQTT_H
#define NNG_MQTT_H
#include "nng/supplemental/nanolib/conf.h"
#include "nng/supplemental/nanolib/hash_table.h"
#include "nng/mqtt/packet.h"
#include "mqtt.h"
#include "nng/supplemental/util/platform.h"
#include "nng/nng.h"
#include <stdlib.h>
#ifdef _WIN32
#define PRIu64 "I64u"
#define PRIu64_FORMAT "%I64u"
#else
#include <inttypes.h>
#define PRIu64_FORMAT "%" PRIu64
#endif
// Do not change to %lu! just suppress the warning of the compiler!
#define DISCONNECT_MSG \
"{\"username\":\"%s\"," \
"\"ts\":" PRIu64_FORMAT ",\"reason_code\":\"%x\",\"client_id\":\"%s\",\"IPv4\":\"%s\"}"
#define CONNECT_MSG \
"{\"username\":\"%s\", " \
"\"ts\":" PRIu64_FORMAT ",\"proto_name\":\"%s\",\"keepalive\":%d,\"return_code\":" \
"\"%x\",\"proto_ver\":%d,\"client_id\":\"%s\",\"clean_start\":%d, \"IPv4\":\"%s\"}"
#define DISCONNECT_TOPIC "$SYS/brokers/disconnected"
#define CONNECT_TOPIC "$SYS/brokers/connected"
//Strip off and return the QoS bits
#define NANO_NNI_LMQ_GET_QOS_BITS(msg) ((size_t) (msg) &0x03)
// strip off and return the msg pointer
#define NANO_NNI_LMQ_GET_MSG_POINTER(msg) \
((nng_msg *) ((size_t) (msg) & (~0x03)))
// packed QoS bits to the least two significant bits of msg pointer
#define NANO_NNI_LMQ_PACKED_MSG_QOS(msg, qos) \
((nng_msg *) ((size_t) (msg) | ((qos) &0x03)))
// Variables & Structs
typedef struct pub_extra pub_extra;
// int hex_to_oct(char *str);
// uint32_t htoi(char *str);
NNG_DECL pub_extra *pub_extra_alloc(pub_extra *);
NNG_DECL void pub_extra_free(pub_extra *);
NNG_DECL uint8_t pub_extra_get_qos(pub_extra *);
NNG_DECL uint16_t pub_extra_get_packet_id(pub_extra *);
NNG_DECL void pub_extra_set_qos(pub_extra *, uint8_t);
NNG_DECL void *pub_extra_get_msg(pub_extra *);
NNG_DECL void pub_extra_set_msg(pub_extra *, void *);
NNG_DECL void pub_extra_set_packet_id(pub_extra *, uint16_t);
// MQTT CONNECT
NNG_DECL int32_t conn_handler(uint8_t *packet, conn_param *conn_param, size_t max);
NNG_DECL int conn_param_alloc(conn_param **cparam);
NNG_DECL void conn_param_free(conn_param *cparam);
NNG_DECL void conn_param_clone(conn_param *cparam);
NNG_DECL int ws_msg_adaptor(uint8_t *packet, nng_msg *dst);
// parser
NNG_DECL uint8_t put_var_integer(uint8_t *dest, uint32_t value);
NNG_DECL uint32_t get_var_integer(const uint8_t *buf, uint8_t *pos);
NNG_DECL int32_t get_utf8_str(
char **dest, const uint8_t *src, uint32_t *pos, size_t max);
NNG_DECL uint8_t *copy_utf8_str(
const uint8_t *src, uint32_t *pos, int *str_len);
NNG_DECL uint8_t *copyn_utf8_str(
const uint8_t *src, uint32_t *pos, int *str_len, int limit);
// NNG_DECL char *convert_to_utf8(char *src, char *format, size_t *len);
NNG_DECL uint8_t *copyn_str(
const uint8_t *src, uint32_t *pos, int *str_len, int limit);
NNG_DECL int utf8_check(const char *str, size_t length);
NNG_DECL uint16_t get_variable_binary(uint8_t **dest, const uint8_t *src);
NNG_DECL uint32_t DJBHash(char *str);
NNG_DECL uint32_t DJBHashn(char *str, uint16_t len);
NNG_DECL uint64_t DJBHash64(char *str);
NNG_DECL uint64_t DJBHash64n(uint8_t* str, uint32_t len);
NNG_DECL uint32_t fnv1a_hashn(char *str, size_t n);
NNG_DECL uint8_t crc_hashn(char *str, size_t n);
NNG_DECL uint32_t crc32_hashn(char *str, size_t n);
NNG_DECL uint32_t crc32c_hashn(char *str, size_t n);
NNG_DECL uint8_t verify_connect(conn_param *cparam, conf *conf);
// repack
NNG_DECL void nano_msg_set_dup(nng_msg *msg);
NNG_DECL nng_msg *nano_pubmsg_composer(nng_msg **, uint8_t retain, uint8_t qos,
mqtt_string *payload, mqtt_string *topic, uint8_t proto_ver,
nng_time time);
NNG_DECL nng_msg *nano_dismsg_composer(
reason_code code, char *rstr, uint8_t *ref, property *prop);
NNG_DECL nng_msg *nano_msg_notify_disconnect(conn_param *cparam, uint8_t code);
NNG_DECL nng_msg *nano_msg_notify_connect(conn_param *cparam, uint8_t code);
NNG_DECL nano_pipe_db *nano_msg_get_subtopic(
nng_msg *msg, nano_pipe_db *root, conn_param *cparam);
NNG_DECL void nano_msg_free_pipedb(nano_pipe_db *db);
NNG_DECL void nano_msg_ubsub_free(nano_pipe_db *db);
NNG_DECL void nmq_connack_encode(
nng_msg *msg, conn_param *cparam, uint8_t reason);
NNG_DECL void nmq_connack_session(nng_msg *msg, bool session);
// TODO : check duplicated declaration
NNG_DECL reason_code check_properties(property *prop, nng_msg *msg);
NNG_DECL property *decode_buf_properties(uint8_t *packet, uint32_t packet_len,
uint32_t *pos, uint32_t *len, bool copy_value);
NNG_DECL property *decode_properties(
nng_msg *msg, uint32_t *pos, uint32_t *len, bool copy_value);
NNG_DECL int encode_properties(nng_msg *msg, property *prop, uint8_t cmd);
NNG_DECL int property_free(property *prop);
NNG_DECL property_data *property_get_value(property *prop, uint8_t prop_id);
NNG_DECL void property_foreach(property *prop, void (*cb)(property *));
NNG_DECL int property_dup(property **dup, const property *src);
NNG_DECL property *property_pub_by_will(property *will_prop);
NNG_DECL property *property_alloc(void);
NNG_DECL property_type_enum property_get_value_type(uint8_t prop_id);
NNG_DECL property *property_set_value_u8(uint8_t prop_id, uint8_t value);
NNG_DECL property *property_set_value_u16(uint8_t prop_id, uint16_t value);
NNG_DECL property *property_set_value_u32(uint8_t prop_id, uint32_t value);
NNG_DECL property *property_set_value_varint(uint8_t prop_id, uint32_t value);
NNG_DECL property *property_set_value_binary(
uint8_t prop_id, uint8_t *value, uint32_t len, bool copy_value);
NNG_DECL property *property_set_value_str(
uint8_t prop_id, const char *value, uint32_t len, bool copy_value);
NNG_DECL property *property_set_value_strpair(uint8_t prop_id, const char *key,
uint32_t key_len, const char *value, uint32_t value_len, bool copy_value);
NNG_DECL void property_append(property *prop_list, property *last);
NNG_DECL int nmq_subtopic_decode(nng_msg *msg, uint8_t ver, topic_queue **ptq);
NNG_DECL int nmq_subinfo_decode(nng_msg *msg, void *l, uint8_t ver);
NNG_DECL int nmq_unsubinfo_decode(nng_msg *msg, void *l, uint8_t ver);
NNG_DECL bool topic_filter(const char *origin, const char *input);
NNG_DECL bool topic_filtern(const char *origin, const char *input, size_t n);
NNG_DECL int nmq_auth_http_connect(conn_param *cparam, conf_auth_http *conf);
NNG_DECL int nmq_auth_http_sub_pub(
conn_param *cparam, bool is_sub, topic_queue *topics, conf_auth_http *conf);
#endif // NNG_MQTT_H

View File

@ -1,35 +0,0 @@
//
// Copyright 2020 NanoMQ Team, Inc. <jaylin@emqx.io>
//
// This software is supplied under the terms of the MIT License, a
// copy of which should be located in the distribution where this
// file was obtained (LICENSE.txt). A copy of the license may also be
// found online at https://opensource.org/licenses/MIT.
//
#ifndef NNG_PROTOCOL_MQTT_BROKER_H
#define NNG_PROTOCOL_MQTT_BROKER_H
#ifdef __cplusplus
extern "C" {
#endif
NNG_DECL int nng_nmq_tcp0_open(nng_socket *);
#ifndef nng_nmq_tcp_open
#define nng_nmq_tcp_open nng_nmq_tcp0_open
#endif
#define NNG_NMQ_TCP_SELF 0x31
#define NNG_NMQ_TCP_PEER 0x30
#define NNG_NMQ_TCP_SELF_NAME "nmq_broker"
#define NNG_NMQ_TCP_PEER_NAME "nmq_client"
#define NMQ_OPT_MQTT_PIPES "mqtt-clients-pipes"
#define NMQ_OPT_MQTT_QOS_DB "mqtt-clients-qos-db"
#ifdef __cplusplus
}
#endif
#endif // NNG_PROTOCOL_MQTT_BROKER_H

View File

@ -1,34 +0,0 @@
//
// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech>
// Copyright 2018 Capitar IT Group BV <info@capitar.com>
//
// This software is supplied under the terms of the MIT License, a
// copy of which should be located in the distribution where this
// file was obtained (LICENSE.txt). A copy of the license may also be
// found online at https://opensource.org/licenses/MIT.
//
#ifndef NNG_PROTOCOL_PAIR0_PAIR_H
#define NNG_PROTOCOL_PAIR0_PAIR_H
#ifdef __cplusplus
extern "C" {
#endif
NNG_DECL int nng_pair0_open(nng_socket *);
NNG_DECL int nng_pair0_open_raw(nng_socket *);
#ifndef nng_pair_open
#define nng_pair_open nng_pair0_open
#endif
#ifndef nng_pair_open_raw
#define nng_pair_open_raw nng_pair0_open_raw
#endif
#ifdef __cplusplus
}
#endif
#endif // NNG_PROTOCOL_PAIR0_PAIR_H

View File

@ -1,40 +0,0 @@
//
// Copyright 2020 Staysail Systems, Inc. <info@staysail.tech>
// Copyright 2018 Capitar IT Group BV <info@capitar.com>
//
// This software is supplied under the terms of the MIT License, a
// copy of which should be located in the distribution where this
// file was obtained (LICENSE.txt). A copy of the license may also be
// found online at https://opensource.org/licenses/MIT.
//
#ifndef NNG_PROTOCOL_PAIR1_PAIR_H
#define NNG_PROTOCOL_PAIR1_PAIR_H
#ifdef __cplusplus
extern "C" {
#endif
NNG_DECL int nng_pair1_open(nng_socket *);
NNG_DECL int nng_pair1_open_raw(nng_socket *);
NNG_DECL int nng_pair1_open_poly(nng_socket *);
#ifndef nng_pair_open
#define nng_pair_open nng_pair1_open
#endif
#ifndef nng_pair_open_raw
#define nng_pair_open_raw nng_pair1_open_raw
#endif
#define NNG_OPT_PAIR1_POLY "pair1:polyamorous"
#define NNG_PAIR1_SELF 0x11
#define NNG_PAIR1_PEER 0x11
#define NNG_PAIR1_SELF_NAME "pair1"
#define NNG_PAIR1_PEER_NAME "pair1"
#ifdef __cplusplus
}
#endif
#endif // NNG_PROTOCOL_PAIR1_PAIR_H

View File

@ -1,33 +0,0 @@
//
// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech>
// Copyright 2018 Capitar IT Group BV <info@capitar.com>
//
// This software is supplied under the terms of the MIT License, a
// copy of which should be located in the distribution where this
// file was obtained (LICENSE.txt). A copy of the license may also be
// found online at https://opensource.org/licenses/MIT.
//
#ifndef NNG_PROTOCOL_PIPELINE0_PULL_H
#define NNG_PROTOCOL_PIPELINE0_PULL_H
#ifdef __cplusplus
extern "C" {
#endif
NNG_DECL int nng_pull0_open(nng_socket *);
NNG_DECL int nng_pull0_open_raw(nng_socket *);
#ifndef nng_pull_open
#define nng_pull_open nng_pull0_open
#endif
#ifndef nng_pull_open_raw
#define nng_pull_open_raw nng_pull0_open_raw
#endif
#ifdef __cplusplus
}
#endif
#endif // NNG_PROTOCOL_PIPELINE0_PULL_H

View File

@ -1,33 +0,0 @@
//
// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech>
// Copyright 2018 Capitar IT Group BV <info@capitar.com>
//
// This software is supplied under the terms of the MIT License, a
// copy of which should be located in the distribution where this
// file was obtained (LICENSE.txt). A copy of the license may also be
// found online at https://opensource.org/licenses/MIT.
//
#ifndef NNG_PROTOCOL_PIPELINE0_PUSH_H
#define NNG_PROTOCOL_PIPELINE0_PUSH_H
#ifdef __cplusplus
extern "C" {
#endif
NNG_DECL int nng_push0_open(nng_socket *);
NNG_DECL int nng_push0_open_raw(nng_socket *);
#ifndef nng_push_open
#define nng_push_open nng_push0_open
#endif
#ifndef nng_push_open_raw
#define nng_push_open_raw nng_push0_open_raw
#endif
#ifdef __cplusplus
}
#endif
#endif // NNG_PROTOCOL_PIPELINE0_PUSH_H

View File

@ -1,33 +0,0 @@
//
// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech>
// Copyright 2018 Capitar IT Group BV <info@capitar.com>
//
// This software is supplied under the terms of the MIT License, a
// copy of which should be located in the distribution where this
// file was obtained (LICENSE.txt). A copy of the license may also be
// found online at https://opensource.org/licenses/MIT.
//
#ifndef NNG_PROTOCOL_PUBSUB0_PUB_H
#define NNG_PROTOCOL_PUBSUB0_PUB_H
#ifdef __cplusplus
extern "C" {
#endif
NNG_DECL int nng_pub0_open(nng_socket *);
NNG_DECL int nng_pub0_open_raw(nng_socket *);
#ifndef nng_pub_open
#define nng_pub_open nng_pub0_open
#endif
#ifndef nng_pub_open_raw
#define nng_pub_open_raw nng_pub0_open_raw
#endif
#ifdef __cplusplus
}
#endif
#endif // NNG_PROTOCOL_PUBSUB0_PUB_H

View File

@ -1,39 +0,0 @@
//
// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech>
// Copyright 2018 Capitar IT Group BV <info@capitar.com>
//
// This software is supplied under the terms of the MIT License, a
// copy of which should be located in the distribution where this
// file was obtained (LICENSE.txt). A copy of the license may also be
// found online at https://opensource.org/licenses/MIT.
//
#ifndef NNG_PROTOCOL_PUBSUB0_SUB_H
#define NNG_PROTOCOL_PUBSUB0_SUB_H
#ifdef __cplusplus
extern "C" {
#endif
NNG_DECL int nng_sub0_open(nng_socket *);
NNG_DECL int nng_sub0_open_raw(nng_socket *);
#ifndef nng_sub_open
#define nng_sub_open nng_sub0_open
#endif
#ifndef nng_sub_open_raw
#define nng_sub_open_raw nng_sub0_open_raw
#endif
#define NNG_OPT_SUB_SUBSCRIBE "sub:subscribe"
#define NNG_OPT_SUB_UNSUBSCRIBE "sub:unsubscribe"
#define NNG_OPT_SUB_PREFNEW "sub:prefnew"
#ifdef __cplusplus
}
#endif
#endif // NNG_PROTOCOL_PUBSUB0_SUB_H

View File

@ -1,38 +0,0 @@
//
// Copyright 2020 Staysail Systems, Inc. <info@staysail.tech>
// Copyright 2018 Capitar IT Group BV <info@capitar.com>
//
// This software is supplied under the terms of the MIT License, a
// copy of which should be located in the distribution where this
// file was obtained (LICENSE.txt). A copy of the license may also be
// found online at https://opensource.org/licenses/MIT.
//
#ifndef NNG_PROTOCOL_REQREP0_REP_H
#define NNG_PROTOCOL_REQREP0_REP_H
#ifdef __cplusplus
extern "C" {
#endif
NNG_DECL int nng_rep0_open(nng_socket *);
NNG_DECL int nng_rep0_open_raw(nng_socket *);
#ifndef nng_rep_open
#define nng_rep_open nng_rep0_open
#endif
#ifndef nng_rep_open_raw
#define nng_rep_open_raw nng_rep0_open_raw
#endif
#define NNG_REP0_SELF 0x31
#define NNG_REP0_PEER 0x30
#define NNG_REP0_SELF_NAME "rep"
#define NNG_REP0_PEER_NAME "req"
#ifdef __cplusplus
}
#endif
#endif // NNG_PROTOCOL_REQREP0_REP_H

View File

@ -1,40 +0,0 @@
//
// Copyright 2020 Staysail Systems, Inc. <info@staysail.tech>
// Copyright 2018 Capitar IT Group BV <info@capitar.com>
//
// This software is supplied under the terms of the MIT License, a
// copy of which should be located in the distribution where this
// file was obtained (LICENSE.txt). A copy of the license may also be
// found online at https://opensource.org/licenses/MIT.
//
#ifndef NNG_PROTOCOL_REQREP0_REQ_H
#define NNG_PROTOCOL_REQREP0_REQ_H
#ifdef __cplusplus
extern "C" {
#endif
NNG_DECL int nng_req0_open(nng_socket *);
NNG_DECL int nng_req0_open_raw(nng_socket *);
#ifndef nng_req_open
#define nng_req_open nng_req0_open
#endif
#ifndef nng_req_open_raw
#define nng_req_open_raw nng_req0_open_raw
#endif
#define NNG_REQ0_SELF 0x30
#define NNG_REQ0_PEER 0x31
#define NNG_REQ0_SELF_NAME "req"
#define NNG_REQ0_PEER_NAME "rep"
#define NNG_OPT_REQ_RESENDTIME "req:resend-time"
#define NNG_OPT_REQ_RESENDTICK "req:resend-tick"
#ifdef __cplusplus
}
#endif
#endif // NNG_PROTOCOL_REQREP0_REQ_H

View File

@ -1,38 +0,0 @@
//
// Copyright 2020 Staysail Systems, Inc. <info@staysail.tech>
// Copyright 2018 Capitar IT Group BV <info@capitar.com>
//
// This software is supplied under the terms of the MIT License, a
// copy of which should be located in the distribution where this
// file was obtained (LICENSE.txt). A copy of the license may also be
// found online at https://opensource.org/licenses/MIT.
//
#ifndef NNG_PROTOCOL_SURVEY0_RESPOND_H
#define NNG_PROTOCOL_SURVEY0_RESPOND_H
#ifdef __cplusplus
extern "C" {
#endif
NNG_DECL int nng_respondent0_open(nng_socket *);
NNG_DECL int nng_respondent0_open_raw(nng_socket *);
#ifndef nng_respondent_open
#define nng_respondent_open nng_respondent0_open
#endif
#ifndef nng_respondent_open_raw
#define nng_respondent_open_raw nng_respondent0_open_raw
#endif
#define NNG_RESPONDENT0_SELF 0x63
#define NNG_RESPONDENT0_PEER 0x62
#define NNG_RESPONDENT0_SELF_NAME "respondent"
#define NNG_RESPONDENT0_PEER_NAME "surveyor"
#ifdef __cplusplus
}
#endif
#endif // NNG_PROTOCOL_SURVEY0_RESPOND_H

View File

@ -1,40 +0,0 @@
//
// Copyright 2020 Staysail Systems, Inc. <info@staysail.tech>
// Copyright 2018 Capitar IT Group BV <info@capitar.com>
//
// This software is supplied under the terms of the MIT License, a
// copy of which should be located in the distribution where this
// file was obtained (LICENSE.txt). A copy of the license may also be
// found online at https://opensource.org/licenses/MIT.
//
#ifndef NNG_PROTOCOL_SURVEY0_SURVEY_H
#define NNG_PROTOCOL_SURVEY0_SURVEY_H
#ifdef __cplusplus
extern "C" {
#endif
NNG_DECL int nng_surveyor0_open(nng_socket *);
NNG_DECL int nng_surveyor0_open_raw(nng_socket *);
#ifndef nng_surveyor_open
#define nng_surveyor_open nng_surveyor0_open
#endif
#ifndef nng_surveyor_open_raw
#define nng_surveyor_open_raw nng_surveyor0_open_raw
#endif
#define NNG_SURVEYOR0_SELF 0x62
#define NNG_SURVEYOR0_PEER 0x63
#define NNG_SURVEYOR0_SELF_NAME "surveyor"
#define NNG_SURVEYOR0_PEER_NAME "respondent"
#define NNG_OPT_SURVEYOR_SURVEYTIME "surveyor:survey-time"
#ifdef __cplusplus
}
#endif
#endif // NNG_PROTOCOL_SURVEY0_SURVEY_H

View File

@ -1,539 +0,0 @@
//
// Copyright 2020 Staysail Systems, Inc. <info@staysail.tech>
// Copyright 2018 Capitar IT Group BV <info@capitar.com>
// Copyright 2020 Dirac Research <robert.bielik@dirac.com>
//
// This software is supplied under the terms of the MIT License, a
// copy of which should be located in the distribution where this
// file was obtained (LICENSE.txt). A copy of the license may also be
// found online at https://opensource.org/licenses/MIT.
//
#ifndef NNG_SUPPLEMENTAL_HTTP_HTTP_H
#define NNG_SUPPLEMENTAL_HTTP_HTTP_H
// HTTP API. Only present if HTTP support compiled into the library.
// Functions will return NNG_ENOTSUP (or NULL or 0 as appropriate)
// if the library lacks support for HTTP.
#ifdef __cplusplus
extern "C" {
#endif
#include <stdint.h>
struct nng_tls_config;
// HTTP status codes. This list is not exhaustive.
enum nng_http_status {
NNG_HTTP_STATUS_CONTINUE = 100,
NNG_HTTP_STATUS_SWITCHING = 101,
NNG_HTTP_STATUS_PROCESSING = 102,
NNG_HTTP_STATUS_OK = 200,
NNG_HTTP_STATUS_CREATED = 201,
NNG_HTTP_STATUS_ACCEPTED = 202,
NNG_HTTP_STATUS_NOT_AUTHORITATIVE = 203,
NNG_HTTP_STATUS_NO_CONTENT = 204,
NNG_HTTP_STATUS_RESET_CONTENT = 205,
NNG_HTTP_STATUS_PARTIAL_CONTENT = 206,
NNG_HTTP_STATUS_MULTI_STATUS = 207,
NNG_HTTP_STATUS_ALREADY_REPORTED = 208,
NNG_HTTP_STATUS_IM_USED = 226,
NNG_HTTP_STATUS_MULTIPLE_CHOICES = 300,
NNG_HTTP_STATUS_STATUS_MOVED_PERMANENTLY = 301,
NNG_HTTP_STATUS_FOUND = 302,
NNG_HTTP_STATUS_SEE_OTHER = 303,
NNG_HTTP_STATUS_NOT_MODIFIED = 304,
NNG_HTTP_STATUS_USE_PROXY = 305,
NNG_HTTP_STATUS_TEMPORARY_REDIRECT = 307,
NNG_HTTP_STATUS_PERMANENT_REDIRECT = 308,
NNG_HTTP_STATUS_BAD_REQUEST = 400,
NNG_HTTP_STATUS_UNAUTHORIZED = 401,
NNG_HTTP_STATUS_PAYMENT_REQUIRED = 402,
NNG_HTTP_STATUS_FORBIDDEN = 403,
NNG_HTTP_STATUS_NOT_FOUND = 404,
NNG_HTTP_STATUS_METHOD_NOT_ALLOWED = 405,
NNG_HTTP_STATUS_NOT_ACCEPTABLE = 406,
NNG_HTTP_STATUS_PROXY_AUTH_REQUIRED = 407,
NNG_HTTP_STATUS_REQUEST_TIMEOUT = 408,
NNG_HTTP_STATUS_CONFLICT = 409,
NNG_HTTP_STATUS_GONE = 410,
NNG_HTTP_STATUS_LENGTH_REQUIRED = 411,
NNG_HTTP_STATUS_PRECONDITION_FAILED = 412,
NNG_HTTP_STATUS_PAYLOAD_TOO_LARGE = 413,
NNG_HTTP_STATUS_ENTITY_TOO_LONG = 414,
NNG_HTTP_STATUS_UNSUPPORTED_MEDIA_TYPE = 415,
NNG_HTTP_STATUS_RANGE_NOT_SATISFIABLE = 416,
NNG_HTTP_STATUS_EXPECTATION_FAILED = 417,
NNG_HTTP_STATUS_TEAPOT = 418,
NNG_HTTP_STATUS_UNPROCESSABLE_ENTITY = 422,
NNG_HTTP_STATUS_LOCKED = 423,
NNG_HTTP_STATUS_FAILED_DEPENDENCY = 424,
NNG_HTTP_STATUS_UPGRADE_REQUIRED = 426,
NNG_HTTP_STATUS_PRECONDITION_REQUIRED = 428,
NNG_HTTP_STATUS_TOO_MANY_REQUESTS = 429,
NNG_HTTP_STATUS_HEADERS_TOO_LARGE = 431,
NNG_HTTP_STATUS_UNAVAIL_LEGAL_REASONS = 451,
NNG_HTTP_STATUS_INTERNAL_SERVER_ERROR = 500,
NNG_HTTP_STATUS_NOT_IMPLEMENTED = 501,
NNG_HTTP_STATUS_BAD_GATEWAY = 502,
NNG_HTTP_STATUS_SERVICE_UNAVAILABLE = 503,
NNG_HTTP_STATUS_GATEWAY_TIMEOUT = 504,
NNG_HTTP_STATUS_HTTP_VERSION_NOT_SUPP = 505,
NNG_HTTP_STATUS_VARIANT_ALSO_NEGOTIATES = 506,
NNG_HTTP_STATUS_INSUFFICIENT_STORAGE = 507,
NNG_HTTP_STATUS_LOOP_DETECTED = 508,
NNG_HTTP_STATUS_NOT_EXTENDED = 510,
NNG_HTTP_STATUS_NETWORK_AUTH_REQUIRED = 511,
};
// nng_http_req represents an HTTP request.
typedef struct nng_http_req nng_http_req;
// nng_http_req_alloc creates a vanilla HTTP request object. The object is
// initialized with the given URL object for an HTTP/1.1 GET request by
// default. It also adds the Host: header required for HTTP/1.1. If the
// url is NULL, then the uri and Host: header are uninitialized, and will
// need to be set explicitly.
NNG_DECL int nng_http_req_alloc(nng_http_req **, const nng_url *);
// nng_http_req_free frees an HTTP request object.
NNG_DECL void nng_http_req_free(nng_http_req *);
// nng_http_req_get_method returns the method.
NNG_DECL const char *nng_http_req_get_method(nng_http_req *);
// nng_http_req_get_version returns the version, usually HTTP/1.1.
NNG_DECL const char *nng_http_req_get_version(nng_http_req *);
// nng_http_req_get_uri returns the "abs-uri", which is URL without
// the scheme, host, or port.
NNG_DECL const char *nng_http_req_get_uri(nng_http_req *);
// nng_http_req_set_header sets an HTTP header, replacing any previous value
// that might have been present.
NNG_DECL int nng_http_req_set_header(
nng_http_req *, const char *, const char *);
// nng_http_req_add_header adds an HTTP header, without disrupting any other
// with the same name that might have been present.
NNG_DECL int nng_http_req_add_header(
nng_http_req *, const char *, const char *);
// nng_http_req_del_header deletes all occurrences of a named header.
NNG_DECL int nng_http_req_del_header(nng_http_req *, const char *);
// nng_http_req_get_header looks up a header with the named, returns NULL
// if not found.
NNG_DECL const char *nng_http_req_get_header(nng_http_req *, const char *);
// nng_http_req_set_method is used to change the method of a request.
// The method should be an upper case HTTP method, like POST, or DELETE.
// Null sets the default ("GET").
NNG_DECL int nng_http_req_set_method(nng_http_req *, const char *);
// nng_http_req_set_version is used to change the version of a request.
// Normally the version is "HTTP/1.1". Note that the framework does
// not support HTTP/2 at all. Null sets the default ("HTTP/1.1").
NNG_DECL int nng_http_req_set_version(nng_http_req *, const char *);
// nng_http_req_set_uri is used to change the URI of a request. This
// should be an "abs-uri", that is a path, plus query and fragment if
// needed. The scheme, host, and port don't belong here. The URI should
// start with a leading '/' per HTTP.
NNG_DECL int nng_http_req_set_uri(nng_http_req *, const char *);
// nng_http_req_set_data adds entity data to the request. The
// data object must persist (so only really useful for static data).
// The content-length header is updated as well, but the caller should
// probably set the content-type header.
NNG_DECL int nng_http_req_set_data(nng_http_req *, const void *, size_t);
// nng_http_req_copy_data adds entity data to the response. A private
// copy of the data is made (will be freed with the request).
// The content-length header is updated as well, but the caller should
// probably set the content-type header.
NNG_DECL int nng_http_req_copy_data(nng_http_req *, const void *, size_t);
// nng_http_req_get_data gets the data for the response.
NNG_DECL void nng_http_req_get_data(nng_http_req *, void **, size_t *);
// nng_http_res represents an HTTP response.
typedef struct nng_http_res nng_http_res;
// nng_http_res_alloc creates a vanilla HTTP response object. The object is
// initialized for an HTTP/1.1 200 OK response by default.
NNG_DECL int nng_http_res_alloc(nng_http_res **);
// nng_http_res_alloc_error creates an error HTTP response object. The object
// is initialized for an HTTP/1.1 response, and contains an associated
// generic HTML error page.
NNG_DECL int nng_http_res_alloc_error(nng_http_res **, uint16_t);
// nng_http_res_free frees an HTTP response object.
NNG_DECL void nng_http_res_free(nng_http_res *);
// nng_http_res_get_status returns the HTTP status code from the server.
NNG_DECL uint16_t nng_http_res_get_status(nng_http_res *);
// nng_http_res_set_status sets the HTTP status code.
NNG_DECL int nng_http_res_set_status(nng_http_res *, uint16_t);
// nng_http_res_get_reason returns the human readable status message
// that the server responds (or responded) with.
NNG_DECL const char *nng_http_res_get_reason(nng_http_res *);
// nng_http_res_set_reason sets the human readable status message.
// NULL means that a default reason is used based on the status code.
NNG_DECL int nng_http_res_set_reason(nng_http_res *, const char *);
// nng_http_res_set_header sets an HTTP header, replacing any previous value
// that might have been present.
NNG_DECL int nng_http_res_set_header(
nng_http_res *, const char *, const char *);
// nng_http_res_add_header adds an HTTP header, without disrupting any other
// with the same name that might have been present.
NNG_DECL int nng_http_res_add_header(
nng_http_res *, const char *, const char *);
// nng_http_res_del_header deletes all occurrences of a named header.
NNG_DECL int nng_http_res_del_header(nng_http_res *, const char *);
// nng_http_res_get_header looks up a header with the named, returns NULL
// if not found.
NNG_DECL const char *nng_http_res_get_header(nng_http_res *, const char *);
// nng_http_res_set_version is used to change the version of a response.
// Normally the version is "HTTP/1.1". Note that the framework does
// not support HTTP/2 at all. NULL sets the default ("HTTP/1.1").
NNG_DECL int nng_http_res_set_version(nng_http_res *, const char *);
// nng_http_res_get_version returns the version, usually HTTP/1.1.
NNG_DECL const char *nng_http_res_get_version(nng_http_res *);
// nng_http_res_get_data gets the data for the response.
NNG_DECL void nng_http_res_get_data(nng_http_res *, void **, size_t *);
// nng_http_res_set_data adds entity data to the response. The
// data object must persist (so only really useful for static data).
// The content-length header is updated as well, but the caller should
// probably set the content-type header.
NNG_DECL int nng_http_res_set_data(nng_http_res *, const void *, size_t);
// nng_http_res_copy_data adds entity data to the response. A private
// copy of the data is made (will be freed with the request).
// The content-length header is updated as well, but the caller should
// probably set the content-type header.
NNG_DECL int nng_http_res_copy_data(nng_http_res *, const void *, size_t);
// An nng_http_conn represents an underlying "connection". It may be
// a TCP channel, or a TLS channel, but the main thing is that this is
// normally only used for exchanging HTTP requests and responses.
typedef struct nng_http_conn nng_http_conn;
// nng_http_conn_close closes the underlying channel. Applications should
// not use this channel after this operation is performed.
NNG_DECL void nng_http_conn_close(nng_http_conn *);
// nng_http_conn_read attempts to read data from the connection. This
// completes as soon as at least one byte is read; it does not wait
// for the entire aio to be filled.
NNG_DECL void nng_http_conn_read(nng_http_conn *, nng_aio *);
// nng_http_conn_read_all is like nng_http_conn_read, but it does not
// finish until either all the requested data is read, or an error occurs.
NNG_DECL void nng_http_conn_read_all(nng_http_conn *, nng_aio *);
// nng_http_conn_write attempts to write data, but it can write less
// than the amount requested. (It completes as soon as at least one
// byte is written.)
NNG_DECL void nng_http_conn_write(nng_http_conn *, nng_aio *);
// nng_http_conn_write_all is like nng_http_conn_write, but it does not
// finish until either all the requested data is written, or an error occurs.
NNG_DECL void nng_http_conn_write_all(nng_http_conn *, nng_aio *);
// nng_http_conn_write_req writes the entire request. It will also write any
// data that has been attached.
NNG_DECL void nng_http_conn_write_req(
nng_http_conn *, nng_http_req *, nng_aio *);
// nng_http_conn_write_res writes the entire response. It will also write any
// data that has been attached.
NNG_DECL void nng_http_conn_write_res(
nng_http_conn *, nng_http_res *, nng_aio *);
// nng_http_conn_read_req reads an entire request, EXCEPT for any entity
// data. The caller is responsible for processing the headers in the request
// and reading any submitted entity data itself.
NNG_DECL void nng_http_conn_read_req(
nng_http_conn *, nng_http_req *, nng_aio *);
// nng_http_conn_read_res reads an entire response, EXCEPT for any entity
// data. The caller is responsible for processing the headers in the response
// and reading any submitted entity data itself.
NNG_DECL void nng_http_conn_read_res(
nng_http_conn *, nng_http_res *, nng_aio *);
// nng_http_req_reset resets the request to an initially allocated state.
NNG_DECL void nng_http_req_reset(nng_http_req *);
// nng_http_res_reset resets the response to an initially allocated state.
NNG_DECL void nng_http_res_reset(nng_http_res *);
// nng_http_handler is a handler used on the server side to handle HTTP
// requests coming into a specific URL.
typedef struct nng_http_handler nng_http_handler;
// nng_http_handler_alloc creates a server handler object, for the supplied
// absolute URI (path only) with the callback. By default the handler
// is assumed to handle only GET requests (and implictly HEAD requests
// as well.)
//
// Note that methods which modify a handler cannot be called while the handler
// is registered with the server, and that a handler can only be registered
// once per server.
//
// The callback function will receive the following arguments (via
// nng_aio_get_input(): nng_http_request *, nng_http_handler *, and
// nng_http_conn *. The first is a request object, for convenience.
// The second is the handler, from which the callback can obtain any other
// data it has set. The final is the http connection, which can be used
// to hijack the session.
//
// Upon completion, the handler should store an nng_http_res * as the
// first output using nng_aio_set_output. If it does not do so, or supplies
// NULL, then it must send a response itself.
//
// The callback should complete with a result of 0 in most circumstances.
// If it completes with an error, then the connection is terminated, after
// possibly sending a 500 error response to the client.
NNG_DECL int nng_http_handler_alloc(
nng_http_handler **, const char *, void (*)(nng_aio *));
// nng_http_handler_free frees the handler. This actually just drops a
// reference count on the handler, as it may be in use by an existing
// server. The server will also call this when it is destroyed.
NNG_DECL void nng_http_handler_free(nng_http_handler *);
// nng_http_handler_alloc_file creates a "file" based handler, that
// serves up static content from the given file path. The content-type
// supplied is determined from the file name using a simple built-in map.
NNG_DECL int nng_http_handler_alloc_file(
nng_http_handler **, const char *, const char *);
// nng_http_handler_alloc_static creates a static-content handler.
// The last argument is the content-type, which may be NULL (in which case
// "application/octet-stream" is assumed.)
NNG_DECL int nng_http_handler_alloc_static(
nng_http_handler **, const char *, const void *, size_t, const char *);
// nng_http_handler_alloc_redirect creates an HTTP redirect handler.
// The status is given, along with the new URL. If the status is 0,
// then 301 will be used instead.
NNG_DECL int nng_http_handler_alloc_redirect(
nng_http_handler **, const char *, uint16_t, const char *);
// nng_http_handler_alloc_file creates a "directory" based handler, that
// serves up static content from the given directory tree. Directories
// that contain an index.html or index.htm file use that file for the
// directory content, otherwise a suitable error page is returned (the server
// does not generate index pages automatically.) The content-type for
// files is determined from the file name using a simple built-in map.
NNG_DECL int nng_http_handler_alloc_directory(
nng_http_handler **, const char *, const char *);
// nng_http_handler_set_method sets the method that the handler will be
// called for. By default this is GET. If NULL is supplied for the
// method, then the handler is executed regardless of method, and must
// inspect the method itself.
NNG_DECL int nng_http_handler_set_method(nng_http_handler *, const char *);
// nng_http_handler_set_host sets the Host: that the handler will be
// called for (to allow for virtual hosts). If the value is NULL (the
// default, then the Host: header is not considered when matching the
// handler.) Note that the Host: header must match *exactly* (except
// that case is not considered.)
NNG_DECL int nng_http_handler_set_host(nng_http_handler *, const char *);
// nng_http_handler_collect_body is used to indicate the server should
// check for, and process, data sent by the client, which will be attached
// to the request. If this is false, then the handler will need to check
// for and process any content data. By default the server will accept
// up to 1MB. If the client attempts to send more data than requested,
// then a 400 Bad Request will be sent back to the client. To set an
// unlimited value, use (size_t)-1. To preclude the client from sending
// *any* data, use 0. (The static and file handlers use 0 by default.)
NNG_DECL int nng_http_handler_collect_body(nng_http_handler *, bool, size_t);
// nng_http_handler_set_tree indicates that the handler is being registered
// for a hierarchical tree, rather than just a single path, so it will be
// called for all child paths supplied. By default the handler is only
// called for an exact path match.
NNG_DECL int nng_http_handler_set_tree(nng_http_handler *);
// nng_http_handler_set_tree_exclusive indicates that the handler is being
// registered for a heirarchical tree *exclusively*, rather than just a single
// path, so it will be called for all child paths supplied. By default the
// handler is only called for an exact path match. Exclusive means that any
// other handler on a conflicting path will induce an address conflict error
// when added to a server.
NNG_DECL int nng_http_handler_set_tree_exclusive(nng_http_handler *);
// nng_http_handler_set_data is used to store additional data, along with
// a possible clean up routine. (The clean up is a custom de-allocator and
// will be called with the supplied data as an argument, when the handler
// is being de-allocated.)
NNG_DECL int nng_http_handler_set_data(
nng_http_handler *, void *, void (*)(void *));
// nng_http_handler_get_data returns the data that was previously stored.
NNG_DECL void *nng_http_handler_get_data(nng_http_handler *);
// nng_http_server is a handle to an HTTP server instance. Servers
// only serve a single port / address at this time.
typedef struct nng_http_server nng_http_server;
// nng_http_server_hold gets a server structure, using the address determined
// from the URL. If a server already exists, then a hold is placed on it, and
// that instance is returned. If no such server exists, then a new instance
// is created.
NNG_DECL int nng_http_server_hold(nng_http_server **, const nng_url *);
// nng_http_server_release releases the hold on the server. If this is the
// last instance of the server, then it is shutdown and resources are freed.
NNG_DECL void nng_http_server_release(nng_http_server *);
// nng_http_server_start starts the server handling HTTP. Once this is
// called, it will not be possible to change certain parameters (such as
// any TLS configuration).
NNG_DECL int nng_http_server_start(nng_http_server *);
// nng_http_server_stop stops the server. No new client connections are
// accepted after this returns. Once a server is stopped fully, the
// instance will no longer be returned by nng_http_server_hold, as the
// server may not be reused.
NNG_DECL void nng_http_server_stop(nng_http_server *);
// nng_http_server_add_handler registers a handler on the server.
// This function will return NNG_EADDRINUSE if a conflicting handler
// is already registered (i.e. a handler with the same value for Host,
// Method, and URL.)
NNG_DECL int nng_http_server_add_handler(
nng_http_server *, nng_http_handler *);
// nni_http_del_handler removes the given handler. The caller is
// responsible for finalizing it afterwards. If the handler was not found
// (not registered), NNG_ENOENT is returned. In this case it is unsafe
// to make assumptions about the validity of the handler.
NNG_DECL int nng_http_server_del_handler(
nng_http_server *, nng_http_handler *);
// nng_http_server_set_tls adds a TLS configuration to the server,
// and enables the use of it. This returns NNG_EBUSY if the server is
// already started. This wipes out the entire TLS configuration on the
// server client, so the caller must have configured it reasonably.
// This API is not recommended unless the caller needs complete control
// over the TLS configuration.
NNG_DECL int nng_http_server_set_tls(
nng_http_server *, struct nng_tls_config *);
// nng_http_server_get_tls obtains the TLS configuration if one is present,
// or returns NNG_EINVAL. The TLS configuration is invalidated if the
// nng_http_server_set_tls function is called, so be careful.
NNG_DECL int nng_http_server_get_tls(
nng_http_server *, struct nng_tls_config **);
// nng_http_server_get_addr obtains the address with which the server was
// initialized or returns NNG_EINVAL. Useful for instance when the port has
// been automatically assigned.
NNG_DECL int nng_http_server_get_addr(nng_http_server *, nng_sockaddr *);
// nng_http_server_set_error_page sets a custom error page (HTML) content
// to be sent for the given error code. This is used when the error is
// generated internally by the framework, or when the application returns
// the response back to the server via the handler's aio, and the response
// was allocated with nng_http_res_alloc_error. If the response was not
// allocated this way, or the application writes the response itself instead
// of letting the server do so, then this setting will be ignored.
NNG_DECL int nng_http_server_set_error_page(
nng_http_server *, uint16_t, const char *);
// nng_http_server_set_error_file works like nng_http_server_error_page,
// except that the content is loaded from the named file path. The contents
// are loaded at the time this function is called, so this function should be
// called anytime the contents of the named file have changed.
NNG_DECL int nng_http_server_set_error_file(
nng_http_server *, uint16_t, const char *);
// nng_http_server_res_error takes replaces the body of the response with
// a custom error page previously set for the server, using the status
// of the response. The response must have the status set first using
// nng_http_res_set_status or implicitly via nng_http_res_alloc_error.
NNG_DECL int nng_http_server_res_error(nng_http_server *, nng_http_res *);
// nng_http_hijack is intended to be called by a handler that wishes to
// take over the processing of the HTTP session -- usually to change protocols
// (such as in the case of websocket). The caller is responsible for the
// final disposal of the associated nng_http_conn. Also, this completely
// disassociates the http session from the server, so the server may be
// stopped or destroyed without affecting the hijacked session. Note also
// that the hijacker will need to issue any HTTP reply itself. Finally,
// when a session is hijacked, the caller is also responsible for disposing
// of the request structure. (Some hijackers may keep the request for
// further processing.)
NNG_DECL int nng_http_hijack(nng_http_conn *);
// nng_http_client represents a "client" object. Clients can be used
// to create HTTP connections. At present, connections are not cached
// or reused, but that could change in the future.
typedef struct nng_http_client nng_http_client;
// nng_http_client_alloc allocates a client object, associated with
// the given URL.
NNG_DECL int nng_http_client_alloc(nng_http_client **, const nng_url *);
// nng_http_client_free frees the client. Connections created by the
// the client are not necessarily closed.
NNG_DECL void nng_http_client_free(nng_http_client *);
// nng_http_client_set_tls sets the TLS configuration. This wipes out
// the entire TLS configuration on the client, so the caller must have
// configured it reasonably. This API is not recommended unless the
// caller needs complete control over the TLS configuration.
NNG_DECL int nng_http_client_set_tls(
nng_http_client *, struct nng_tls_config *);
// nng_http_client_get_tls obtains the TLS configuration if one is present,
// or returns NNG_EINVAL. The supplied TLS configuration object may
// be invalidated by any future calls to nni_http_client_set_tls.
NNG_DECL int nng_http_client_get_tls(
nng_http_client *, struct nng_tls_config **);
// nng_http_client_connect establishes a new connection with the server
// named in the URL used when the client was created. Once the connection
// is established, the associated nng_http_conn object pointer is returned
// in the first (index 0) output for the aio.
NNG_DECL void nng_http_client_connect(nng_http_client *, nng_aio *);
// nng_http_conn_transact is used to perform a round-trip exchange (i.e. a
// single HTTP transaction). It will not automatically close the connection,
// unless some kind of significant error occurs. The caller should close
// the connection if the aio does not complete successfully.
NNG_DECL void nng_http_conn_transact(
nng_http_conn *, nng_http_req *, nng_http_res *, nng_aio *);
// nng_http_client_transact is used to execute a single transaction to a
// server. The connection is opened, and will be closed when the transaction is
// complete.
NNG_DECL void nng_http_client_transact(
nng_http_client *, nng_http_req *, nng_http_res *, nng_aio *);
#ifdef __cplusplus
}
#endif
#endif // NNG_H

View File

@ -1,80 +0,0 @@
#ifndef NANOLIB_ACL_CONF_H
#define NANOLIB_ACL_CONF_H
#include <string.h>
#include "nng/nng.h"
#include "nng/supplemental/nanolib/cJSON.h"
typedef enum {
ACL_ALLOW,
ACL_DENY,
} acl_permit;
typedef enum {
ACL_USERNAME,
ACL_CLIENTID,
ACL_IPADDR,
ACL_AND,
ACL_OR,
ACL_NONE,
} acl_rule_type;
typedef enum {
ACL_PUB,
ACL_SUB,
ACL_ALL,
} acl_action_type;
typedef enum {
ACL_RULE_SINGLE_STRING,
ACL_RULE_STRING_ARRAY,
ACL_RULE_INT_ARRAY,
ACL_RULE_ALL,
} acl_value_type;
typedef struct acl_rule_ct {
acl_value_type type;
size_t count;
union {
char * str;
char **str_array;
int * int_array;
} value;
} acl_rule_ct;
typedef struct {
acl_rule_type rule_type;
acl_rule_ct rule_ct;
} acl_sub_rule;
typedef struct {
size_t count;
acl_sub_rule **rules;
} acl_sub_rules_array;
typedef struct acl_rule {
size_t id;
acl_permit permit;
acl_rule_type rule_type;
union {
acl_rule_ct ct;
acl_sub_rules_array array;
} rule_ct;
acl_action_type action;
size_t topic_count;
char ** topics;
} acl_rule;
typedef struct {
bool enable;
size_t rule_count;
acl_rule **rules;
} conf_acl;
extern void conf_acl_parse(conf_acl *acl, const char *path);
extern void conf_acl_init(conf_acl *acl);
extern void conf_acl_destroy(conf_acl *acl);
extern bool acl_parse_json_rule(cJSON *obj, size_t id, acl_rule **rule);
extern void print_acl_conf(conf_acl *acl);
#endif /* NANOLIB_ACL_CONF_H */

View File

@ -1,21 +0,0 @@
#ifndef BASE64_H
#define BASE64_H
#include "nng/nng.h"
#define BASE64_ENCODE_OUT_SIZE(s) ((unsigned int)((((s) + 2) / 3) * 4 + 1))
#define BASE64_DECODE_OUT_SIZE(s) ((unsigned int)(((s) / 4) * 3))
/*
* out is null-terminated encode string.
* return values is out length, exclusive terminating `\0'
*/
NNG_DECL unsigned int
base64_encode(const unsigned char *in, unsigned int inlen, char *out);
/*
* return values is out length
*/
NNG_DECL unsigned int
base64_decode(const char *in, unsigned int inlen, unsigned char *out);
#endif /* BASE64_H */

View File

@ -1,116 +0,0 @@
# ifndef BINARY_SEARCH_H
# define BINARY_SEARCH_H
#include "cvector.h"
#include <stdint.h>
#include <stdbool.h>
/**
* @brief binary_search - vec is an dynamic array
* @param l - it is the left boundry of the vec
* @param index - index is the result we search
* @param e - e contain message we want to search
* @param cmp - cmp is a compare method
* @return true or false, if we find or not
*/
static inline bool
_binary_search(
void **vec, int l, size_t *index, void *e, int (*cmp)(void *x, void *y))
{
int r = cvector_size(vec) - 1;
int m = 0;
// if we do not find the element
// vec = [0, 1, 3, 4], e = 2 ,
// m will be 2, index = 2 ok
// vec = [0, 1, 2, 4], e = 3 ,
// m will be 2, index = 2 error,
// index = 2 + add(1) ok
int add = 0;
// log_info("l: %d", l);
// log_info("r: %d", r);
while ( l <= r) {
m = l + (r - l) / 2;
// Check if x is present at mid
if (cmp(vec[m], e) == 0) {
*index = m;
return true;
}
// log_info("m: %d", m);
// If x greater, ignore left half
if (cmp(vec[m], e) < 0) {
l = m + 1;
add = 1;
// If x is smaller, ignore right half
} else {
r = m - 1;
add = 0;
}
}
// log_info("m: %d", m);
// if we reach here, then element was
// not present
*index = m + add;
return false;
}
static inline bool
_binary_search_uint32(uint32_t *vec, int l, size_t *index, uint32_t e,
int (*cmp)(uint32_t x, uint32_t y))
{
int r = cvector_size(vec) - 1;
int m = 0;
// if we do not find the element
// vec = [0, 1, 3, 4], e = 2 ,
// m will be 2, index = 2 ok
// vec = [0, 1, 2, 4], e = 3 ,
// m will be 2, index = 2 error,
// index = 2 + add(1) ok
int add = 0;
// log_info("l: %d", l);
// log_info("r: %d", r);
while ( l <= r) {
m = l + (r - l) / 2;
// Check if x is present at mid
if (cmp(vec[m], e) == 0) {
*index = m;
return true;
}
// log_info("m: %d", m);
// If x greater, ignore left half
if (cmp(vec[m], e) < 0) {
l = m + 1;
add = 1;
// If x is smaller, ignore right half
} else {
r = m - 1;
add = 0;
}
}
// log_info("m: %d", m);
// if we reach here, then element was
// not present
*index = m + add;
return false;
}
#define binary_search(vec, l, index, e, cmp) \
_binary_search(vec, l, index, e, cmp)
#define binary_search_uint32(vec, l, index, e, cmp) \
_binary_search_uint32(vec, l, index, e, cmp)
#endif

View File

@ -1,62 +0,0 @@
#ifndef BLF_H
#define BLF_H
#include "nng/nng.h"
#include "nng/supplemental/nanolib/conf.h"
#include <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif
typedef struct blf_object blf_object;
typedef void (*blf_cb)(blf_object *arg);
typedef enum {
WRITE_TO_NORMAL1,
WRITE_TO_TEMP1,
} blf_write_type;
typedef struct {
uint32_t start_idx;
uint32_t end_idx;
char *filename;
} blf_file_range;
typedef struct {
blf_file_range **range;
int size;
int start; // file range start index
} blf_file_ranges;
typedef struct {
uint8_t *data;
uint32_t size;
} blf_data_packet;
struct blf_object {
uint64_t *keys;
uint8_t **darray;
uint32_t *dsize;
uint32_t size;
nng_aio *aio;
void *arg;
blf_file_ranges *ranges;
blf_write_type type;
};
blf_object *blf_object_alloc(uint64_t *keys, uint8_t **darray, uint32_t *dsize,
uint32_t size, nng_aio *aio, void *arg);
void blf_object_free(blf_object *elem);
int blf_write_batch_async(blf_object *elem);
int blf_write_launcher(conf_blf *conf);
const char *blf_find(uint64_t key);
const char **blf_find_span(
uint64_t start_key, uint64_t end_key, uint32_t *size);
#ifdef __cplusplus
}
#endif
#endif

View File

@ -1,294 +0,0 @@
/*
Copyright (c) 2009-2017 Dave Gamble and cJSON contributors
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
*/
#ifndef cJSON__h
#define cJSON__h
#ifdef __cplusplus
extern "C"
{
#endif
#if !defined(__WINDOWS__) && (defined(WIN32) || defined(WIN64) || defined(_MSC_VER) || defined(_WIN32))
#define __WINDOWS__
#endif
#ifdef __WINDOWS__
/* When compiling for windows, we specify a specific calling convention to avoid issues where we are being called from a project with a different default calling convention. For windows you have 3 define options:
CJSON_HIDE_SYMBOLS - Define this in the case where you don't want to ever dllexport symbols
CJSON_EXPORT_SYMBOLS - Define this on library build when you want to dllexport symbols (default)
CJSON_IMPORT_SYMBOLS - Define this if you want to dllimport symbol
For *nix builds that support visibility attribute, you can define similar behavior by
setting default visibility to hidden by adding
-fvisibility=hidden (for gcc)
or
-xldscope=hidden (for sun cc)
to CFLAGS
then using the CJSON_API_VISIBILITY flag to "export" the same symbols the way CJSON_EXPORT_SYMBOLS does
*/
#define CJSON_CDECL __cdecl
#define CJSON_STDCALL __stdcall
/* export symbols by default, this is necessary for copy pasting the C and header file */
#if !defined(CJSON_HIDE_SYMBOLS) && !defined(CJSON_IMPORT_SYMBOLS) && !defined(CJSON_EXPORT_SYMBOLS)
#define CJSON_EXPORT_SYMBOLS
#endif
#if defined(CJSON_HIDE_SYMBOLS)
#define CJSON_PUBLIC(type) type CJSON_STDCALL
#elif defined(CJSON_EXPORT_SYMBOLS)
#define CJSON_PUBLIC(type) __declspec(dllexport) type CJSON_STDCALL
#elif defined(CJSON_IMPORT_SYMBOLS)
#define CJSON_PUBLIC(type) __declspec(dllimport) type CJSON_STDCALL
#endif
#else /* !__WINDOWS__ */
#define CJSON_CDECL
#define CJSON_STDCALL
#if defined(NNG_SHARED_LIB) && defined(NNG_HIDDEN_VISIBILITY)
#define CJSON_PUBLIC(type) __attribute__((visibility("default"))) type
#else
#define CJSON_PUBLIC(type) type
#endif
#endif
/* project version */
#define CJSON_VERSION_MAJOR 1
#define CJSON_VERSION_MINOR 7
#define CJSON_VERSION_PATCH 15
#include <stddef.h>
/* cJSON Types: */
#define cJSON_Invalid (0)
#define cJSON_False (1 << 0)
#define cJSON_True (1 << 1)
#define cJSON_NULL (1 << 2)
#define cJSON_Number (1 << 3)
#define cJSON_String (1 << 4)
#define cJSON_Array (1 << 5)
#define cJSON_Object (1 << 6)
#define cJSON_Raw (1 << 7) /* raw json */
#define cJSON_IsReference 256
#define cJSON_StringIsConst 512
/* The cJSON structure: */
typedef struct cJSON
{
/* next/prev allow you to walk array/object chains. Alternatively, use GetArraySize/GetArrayItem/GetObjectItem */
struct cJSON *next;
struct cJSON *prev;
/* An array or object item will have a child pointer pointing to a chain of the items in the array/object. */
struct cJSON *child;
/* The type of the item, as above. */
int type;
/* The item's string, if type==cJSON_String and type == cJSON_Raw */
char *valuestring;
/* writing to valueint is DEPRECATED, use cJSON_SetNumberValue instead */
int valueint;
/* The item's number, if type==cJSON_Number */
double valuedouble;
/* The item's name string, if this item is the child of, or is in the list of subitems of an object. */
char *string;
} cJSON;
typedef struct cJSON_Hooks
{
/* malloc/free are CDECL on Windows regardless of the default calling convention of the compiler, so ensure the hooks allow passing those functions directly. */
void *(CJSON_CDECL *malloc_fn)(size_t sz);
void (CJSON_CDECL *free_fn)(void *ptr);
} cJSON_Hooks;
typedef int cJSON_bool;
/* Limits how deeply nested arrays/objects can be before cJSON rejects to parse them.
* This is to prevent stack overflows. */
#ifndef CJSON_NESTING_LIMIT
#define CJSON_NESTING_LIMIT 1000
#endif
/* returns the version of cJSON as a string */
CJSON_PUBLIC(const char*) cJSON_Version(void);
/* Supply malloc, realloc and free functions to cJSON */
CJSON_PUBLIC(void) cJSON_InitHooks(cJSON_Hooks* hooks);
/* Memory Management: the caller is always responsible to free the results from all variants of cJSON_Parse (with cJSON_Delete) and cJSON_Print (with stdlib free, cJSON_Hooks.free_fn, or cJSON_free as appropriate). The exception is cJSON_PrintPreallocated, where the caller has full responsibility of the buffer. */
/* Supply a block of JSON, and this returns a cJSON object you can interrogate. */
CJSON_PUBLIC(cJSON *) cJSON_Parse(const char *value);
CJSON_PUBLIC(cJSON *) cJSON_ParseWithLength(const char *value, size_t buffer_length);
/* ParseWithOpts allows you to require (and check) that the JSON is null terminated, and to retrieve the pointer to the final byte parsed. */
/* If you supply a ptr in return_parse_end and parsing fails, then return_parse_end will contain a pointer to the error so will match cJSON_GetErrorPtr(). */
CJSON_PUBLIC(cJSON *) cJSON_ParseWithOpts(const char *value, const char **return_parse_end, cJSON_bool require_null_terminated);
CJSON_PUBLIC(cJSON *) cJSON_ParseWithLengthOpts(const char *value, size_t buffer_length, const char **return_parse_end, cJSON_bool require_null_terminated);
/* Render a cJSON entity to text for transfer/storage. */
CJSON_PUBLIC(char *) cJSON_Print(const cJSON *item);
/* Render a cJSON entity to text for transfer/storage without any formatting. */
CJSON_PUBLIC(char *) cJSON_PrintUnformatted(const cJSON *item);
/* Render a cJSON entity to text using a buffered strategy. prebuffer is a guess at the final size. guessing well reduces reallocation. fmt=0 gives unformatted, =1 gives formatted */
CJSON_PUBLIC(char *) cJSON_PrintBuffered(const cJSON *item, int prebuffer, cJSON_bool fmt);
/* Render a cJSON entity to text using a buffer already allocated in memory with given length. Returns 1 on success and 0 on failure. */
/* NOTE: cJSON is not always 100% accurate in estimating how much memory it will use, so to be safe allocate 5 bytes more than you actually need */
CJSON_PUBLIC(cJSON_bool) cJSON_PrintPreallocated(cJSON *item, char *buffer, const int length, const cJSON_bool format);
/* Delete a cJSON entity and all subentities. */
CJSON_PUBLIC(void) cJSON_Delete(cJSON *item);
/* Returns the number of items in an array (or object). */
CJSON_PUBLIC(int) cJSON_GetArraySize(const cJSON *array);
/* Retrieve item number "index" from array "array". Returns NULL if unsuccessful. */
CJSON_PUBLIC(cJSON *) cJSON_GetArrayItem(const cJSON *array, int index);
/* Get item "string" from object. Case insensitive. */
CJSON_PUBLIC(cJSON *) cJSON_GetObjectItem(const cJSON * const object, const char * const string);
CJSON_PUBLIC(cJSON *) cJSON_GetObjectItemCaseSensitive(const cJSON * const object, const char * const string);
CJSON_PUBLIC(cJSON_bool) cJSON_HasObjectItem(const cJSON *object, const char *string);
/* For analysing failed parses. This returns a pointer to the parse error. You'll probably need to look a few chars back to make sense of it. Defined when cJSON_Parse() returns 0. 0 when cJSON_Parse() succeeds. */
CJSON_PUBLIC(const char *) cJSON_GetErrorPtr(void);
/* Check item type and return its value */
CJSON_PUBLIC(char *) cJSON_GetStringValue(const cJSON * const item);
CJSON_PUBLIC(double) cJSON_GetNumberValue(const cJSON * const item);
/* These functions check the type of an item */
CJSON_PUBLIC(cJSON_bool) cJSON_IsInvalid(const cJSON * const item);
CJSON_PUBLIC(cJSON_bool) cJSON_IsFalse(const cJSON * const item);
CJSON_PUBLIC(cJSON_bool) cJSON_IsTrue(const cJSON * const item);
CJSON_PUBLIC(cJSON_bool) cJSON_IsBool(const cJSON * const item);
CJSON_PUBLIC(cJSON_bool) cJSON_IsNull(const cJSON * const item);
CJSON_PUBLIC(cJSON_bool) cJSON_IsNumber(const cJSON * const item);
CJSON_PUBLIC(cJSON_bool) cJSON_IsString(const cJSON * const item);
CJSON_PUBLIC(cJSON_bool) cJSON_IsArray(const cJSON * const item);
CJSON_PUBLIC(cJSON_bool) cJSON_IsObject(const cJSON * const item);
CJSON_PUBLIC(cJSON_bool) cJSON_IsRaw(const cJSON * const item);
/* These calls create a cJSON item of the appropriate type. */
CJSON_PUBLIC(cJSON *) cJSON_CreateNull(void);
CJSON_PUBLIC(cJSON *) cJSON_CreateTrue(void);
CJSON_PUBLIC(cJSON *) cJSON_CreateFalse(void);
CJSON_PUBLIC(cJSON *) cJSON_CreateBool(cJSON_bool boolean);
CJSON_PUBLIC(cJSON *) cJSON_CreateNumber(double num);
CJSON_PUBLIC(cJSON *) cJSON_CreateString(const char *string);
/* raw json */
CJSON_PUBLIC(cJSON *) cJSON_CreateRaw(const char *raw);
CJSON_PUBLIC(cJSON *) cJSON_CreateArray(void);
CJSON_PUBLIC(cJSON *) cJSON_CreateObject(void);
/* Create a string where valuestring references a string so
* it will not be freed by cJSON_Delete */
CJSON_PUBLIC(cJSON *) cJSON_CreateStringReference(const char *string);
/* Create an object/array that only references it's elements so
* they will not be freed by cJSON_Delete */
CJSON_PUBLIC(cJSON *) cJSON_CreateObjectReference(const cJSON *child);
CJSON_PUBLIC(cJSON *) cJSON_CreateArrayReference(const cJSON *child);
/* These utilities create an Array of count items.
* The parameter count cannot be greater than the number of elements in the number array, otherwise array access will be out of bounds.*/
CJSON_PUBLIC(cJSON *) cJSON_CreateIntArray(const int *numbers, int count);
CJSON_PUBLIC(cJSON *) cJSON_CreateFloatArray(const float *numbers, int count);
CJSON_PUBLIC(cJSON *) cJSON_CreateDoubleArray(const double *numbers, int count);
CJSON_PUBLIC(cJSON *) cJSON_CreateStringArray(const char *const *strings, int count);
/* Append item to the specified array/object. */
CJSON_PUBLIC(cJSON_bool) cJSON_AddItemToArray(cJSON *array, cJSON *item);
CJSON_PUBLIC(cJSON_bool) cJSON_AddItemToObject(cJSON *object, const char *string, cJSON *item);
/* Use this when string is definitely const (i.e. a literal, or as good as), and will definitely survive the cJSON object.
* WARNING: When this function was used, make sure to always check that (item->type & cJSON_StringIsConst) is zero before
* writing to `item->string` */
CJSON_PUBLIC(cJSON_bool) cJSON_AddItemToObjectCS(cJSON *object, const char *string, cJSON *item);
/* Append reference to item to the specified array/object. Use this when you want to add an existing cJSON to a new cJSON, but don't want to corrupt your existing cJSON. */
CJSON_PUBLIC(cJSON_bool) cJSON_AddItemReferenceToArray(cJSON *array, cJSON *item);
CJSON_PUBLIC(cJSON_bool) cJSON_AddItemReferenceToObject(cJSON *object, const char *string, cJSON *item);
/* Remove/Detach items from Arrays/Objects. */
CJSON_PUBLIC(cJSON *) cJSON_DetachItemViaPointer(cJSON *parent, cJSON * const item);
CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromArray(cJSON *array, int which);
CJSON_PUBLIC(void) cJSON_DeleteItemFromArray(cJSON *array, int which);
CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromObject(cJSON *object, const char *string);
CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromObjectCaseSensitive(cJSON *object, const char *string);
CJSON_PUBLIC(void) cJSON_DeleteItemFromObject(cJSON *object, const char *string);
CJSON_PUBLIC(void) cJSON_DeleteItemFromObjectCaseSensitive(cJSON *object, const char *string);
/* Update array items. */
CJSON_PUBLIC(cJSON_bool) cJSON_InsertItemInArray(cJSON *array, int which, cJSON *newitem); /* Shifts pre-existing items to the right. */
CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemViaPointer(cJSON * const parent, cJSON * const item, cJSON * replacement);
CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemInArray(cJSON *array, int which, cJSON *newitem);
CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemInObject(cJSON *object,const char *string,cJSON *newitem);
CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemInObjectCaseSensitive(cJSON *object,const char *string,cJSON *newitem);
/* Duplicate a cJSON item */
CJSON_PUBLIC(cJSON *) cJSON_Duplicate(const cJSON *item, cJSON_bool recurse);
/* Duplicate will create a new, identical cJSON item to the one you pass, in new memory that will
* need to be released. With recurse!=0, it will duplicate any children connected to the item.
* The item->next and ->prev pointers are always zero on return from Duplicate. */
/* Recursively compare two cJSON items for equality. If either a or b is NULL or invalid, they will be considered unequal.
* case_sensitive determines if object keys are treated case sensitive (1) or case insensitive (0) */
CJSON_PUBLIC(cJSON_bool) cJSON_Compare(const cJSON * const a, const cJSON * const b, const cJSON_bool case_sensitive);
/* Minify a strings, remove blank characters(such as ' ', '\t', '\r', '\n') from strings.
* The input pointer json cannot point to a read-only address area, such as a string constant,
* but should point to a readable and writable address area. */
CJSON_PUBLIC(void) cJSON_Minify(char *json);
/* Helper functions for creating and adding items to an object at the same time.
* They return the added item or NULL on failure. */
CJSON_PUBLIC(cJSON*) cJSON_AddNullToObject(cJSON * const object, const char * const name);
CJSON_PUBLIC(cJSON*) cJSON_AddTrueToObject(cJSON * const object, const char * const name);
CJSON_PUBLIC(cJSON*) cJSON_AddFalseToObject(cJSON * const object, const char * const name);
CJSON_PUBLIC(cJSON*) cJSON_AddBoolToObject(cJSON * const object, const char * const name, const cJSON_bool boolean);
CJSON_PUBLIC(cJSON*) cJSON_AddNumberToObject(cJSON * const object, const char * const name, const double number);
CJSON_PUBLIC(cJSON*) cJSON_AddStringToObject(cJSON * const object, const char * const name, const char * const string);
CJSON_PUBLIC(cJSON*) cJSON_AddRawToObject(cJSON * const object, const char * const name, const char * const raw);
CJSON_PUBLIC(cJSON*) cJSON_AddObjectToObject(cJSON * const object, const char * const name);
CJSON_PUBLIC(cJSON*) cJSON_AddArrayToObject(cJSON * const object, const char * const name);
/* When assigning an integer value, it needs to be propagated to valuedouble too. */
#define cJSON_SetIntValue(object, number) ((object) ? (object)->valueint = (object)->valuedouble = (number) : (number))
/* helper for the cJSON_SetNumberValue macro */
CJSON_PUBLIC(double) cJSON_SetNumberHelper(cJSON *object, double number);
#define cJSON_SetNumberValue(object, number) ((object != NULL) ? cJSON_SetNumberHelper(object, (double)number) : (number))
/* Change the valuestring of a cJSON_String object, only takes effect when type of object is cJSON_String */
CJSON_PUBLIC(char*) cJSON_SetValuestring(cJSON *object, const char *valuestring);
/* Macro for iterating over an array or object */
#define cJSON_ArrayForEach(element, array) for(element = (array != NULL) ? (array)->child : NULL; element != NULL; element = element->next)
/* malloc/free objects using the malloc/free functions that have been set with cJSON_InitHooks */
CJSON_PUBLIC(void *) cJSON_malloc(size_t size);
CJSON_PUBLIC(void) cJSON_free(void *object);
#ifdef __cplusplus
}
#endif
#endif

View File

@ -1,37 +0,0 @@
//
// Copyright 2020 NanoMQ Team, Inc. <jaylin@emqx.io>
//
// This software is supplied under the terms of the MIT License, a
// copy of which should be located in the distribution where this
// file was obtained (LICENSE.txt). A copy of the license may also be
// found online at https://opensource.org/licenses/MIT.
//
#include <sys/types.h>
#define CMD_BUFF_LEN 1024
extern char *cmd_output_buff;
extern int cmd_output_len;
#ifndef NNG_PLATFORM_WINDOWS
#define CMD_RUN(cmd) \
do { \
ret = cmd_run(cmd); \
if (ret < 0) \
goto err; \
} while (0)
#define CMD_FRUN(fcmd, ...) \
do { \
ret = nano_cmd_frun(fcmd, __VA_ARGS__); \
if (ret < 0) \
goto err; \
} while (0)
extern int nano_cmd_run(const char *cmd);
extern int nano_cmd_run_status(const char *cmd);
extern int nano_cmd_frun(const char *format, ...);
#endif
extern void nano_cmd_cleanup(void);

View File

@ -1,691 +0,0 @@
#ifndef CONF_H
#define CONF_H
#include <ctype.h>
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "nng/nng.h"
#include "rule.h"
#include "acl_conf.h"
#include "log.h"
#include "ringbuffer.h"
#include "nng/supplemental/util/platform.h"
#define PID_PATH_NAME "/tmp/nanomq/nanomq.pid"
#define CONF_PATH_NAME "/etc/nanomq.conf"
#define CONF_ZMQ_GATEWAY_PATH_NAME "/etc/nanomq_zmq_gateway.conf"
#define CONF_VSOMEIP_GATEWAY_PATH_NAME "/etc/nanomq_vsomeip_gateway.conf"
#define CONF_DDS_GATEWAY_PATH_NAME "/etc/nanomq_dds_gateway.conf"
#define CONF_TCP_URL_DEFAULT "nmq-tcp://0.0.0.0:1883"
#define CONF_TLS_URL_DEFAULT "tls+nmq-tcp://0.0.0.0:8883"
#define CONF_WS_URL_DEFAULT "nmq-ws://0.0.0.0:8083/mqtt"
#define CONF_WSS_URL_DEFAULT "nmq-wss://0.0.0.0:8086/mqtt"
#define BROKER_NMQ_TCP_URL_PREFIX "nmq-tcp"
#define BROKER_NMQ_TCP_TLS_URL_PREFIX "tls+nmq-tcp"
#define BROKER_NMQ_WS_URL_PREFIX "nmq-ws"
#define BROKER_NMQ_WSS_URL_PREFIX "nmq-wss"
#define BROKER_TCP_URL_PREFIX "broker+tcp"
#define BROKER_WS_URL_PREFIX "nmq+ws"
#define BROKER_WSS_URL_PREFIX "nmq+wss"
#define RULE_ENG_OFF 0
#define RULE_ENG_SDB 1
#define RULE_ENG_FDB (1 << 1)
#define RULE_ENG_MDB (1 << 2)
#define RULE_ENG_RPB (1 << 3)
#define FREE_NONULL(p) \
if (p) { \
free(p); \
p = NULL; \
}
struct conf_auth {
bool enable;
size_t count;
char **usernames;
char **passwords;
};
typedef struct conf_auth conf_auth;
struct conf_tls {
bool enable;
char *url; // "tls+nmq-tcp://addr:port"
char *cafile;
char *certfile;
char *keyfile;
char *ca;
char *cert;
char *key;
char *key_password;
bool verify_peer;
bool set_fail; // fail_if_no_peer_cert
};
typedef struct conf_tls conf_tls;
// TODO: params for one single tcp node should be in here.
typedef struct {
bool enable;
char *url;
uint8_t nodelay;
uint8_t keepalive;
uint8_t quickack;
uint16_t keepidle;
uint16_t keepintvl;
uint16_t keepcnt;
uint16_t sendtimeo;
uint16_t recvtimeo;
} conf_tcp;
typedef struct {
size_t count;
conf_tls **nodes;
} conf_tls_list;
typedef struct {
size_t count;
conf_tcp **nodes;
} conf_tcp_list;
struct conf_sqlite {
bool enable;
size_t disk_cache_size; // specify the max rows of sqlite table
char * mounted_file_path; // specify the db file path
size_t
flush_mem_threshold; // flush to sqlite table when count of message
// is equal or greater than this value
uint64_t resend_interval; // resend caching message interval (ms)
};
typedef struct conf_sqlite conf_sqlite;
struct conf_http_header {
char *key;
char *value;
};
typedef struct conf_http_header conf_http_header;
typedef enum {
ACCESS,
USERNAME,
CLIENTID,
IPADDRESS,
PROTOCOL,
PASSWORD,
SOCKPORT, // sockport of server accepted
COMMON_NAME, // common name of client TLS cert
SUBJECT, // subject of client TLS cert
TOPIC,
MOUNTPOINT,
} http_param_type;
struct conf_http_param {
char * name;
http_param_type type;
};
typedef struct conf_http_param conf_http_param;
struct conf_auth_http_req {
char *url;
char *method;
size_t header_count;
conf_http_header **headers;
size_t param_count;
conf_http_param **params;
// TODO not support yet
conf_tls tls;
};
typedef struct conf_auth_http_req conf_auth_http_req;
struct conf_auth_http {
bool enable;
conf_auth_http_req auth_req;
conf_auth_http_req super_req;
conf_auth_http_req acl_req;
uint64_t timeout; // seconds
uint64_t connect_timeout; // seconds
size_t pool_size;
};
typedef struct conf_auth_http conf_auth_http;
struct conf_jwt {
char *iss;
char *public_keyfile;
char *private_keyfile;
char *public_key;
char *private_key;
size_t public_key_len;
size_t private_key_len;
};
typedef struct conf_jwt conf_jwt;
typedef enum {
BASIC,
JWT,
NONE_AUTH,
} auth_type_t;
struct conf_http_server {
bool enable;
uint16_t port;
char *username;
char *password;
size_t parallel;
auth_type_t auth_type;
conf_jwt jwt;
nng_socket *broker_sock;
};
typedef struct conf_http_server conf_http_server;
struct conf_websocket {
bool enable;
char *url; // "nmq-ws://addr:port/path"
char *tls_url; // "nmq-wss://addr:port/path"
};
typedef struct conf_websocket conf_websocket;
#define NO_RETAIN 2 // default retain flag value, none 0, 1
#define NO_QOS 3 // default QoS level value for forwarding bridge msg, 3 = keep old qos
typedef struct {
char *remote_topic;
uint32_t remote_topic_len;
char *local_topic;
uint32_t local_topic_len;
char *prefix;
uint32_t prefix_len;
char *suffix;
uint32_t suffix_len;
uint8_t nolocal;
uint8_t retain; // override for retain
uint8_t qos; // override for QoS
uint8_t retain_as_published;
uint8_t retain_handling;
uint32_t stream_id; // only effective when multi_stream is enabled
} topics;
typedef struct {
char *key;
char *value;
}conf_user_property;
typedef struct {
uint32_t session_expiry_interval;
uint8_t request_problem_info;
uint8_t request_response_info;
uint16_t receive_maximum;
uint16_t topic_alias_maximum;
uint32_t maximum_packet_size;
size_t user_property_size;
conf_user_property **user_property;
} conf_bridge_conn_properties;
typedef struct {
uint8_t payload_format_indicator;
uint32_t message_expiry_interval;
char * content_type;
char * response_topic;
char * correlation_data;
uint32_t will_delay_interval;
size_t user_property_size;
conf_user_property **user_property;
} conf_bridge_conn_will_properties;
typedef struct {
uint32_t identifier;
size_t user_property_size;
conf_user_property **user_property;
} conf_bridge_sub_properties;
struct conf_bridge_node {
bool enable;
bool dynamic;
bool clean_start;
bool transparent;
bool will_flag;
bool will_retain;
void *sock;
void *bridge_arg; // for reloading bridge case
char *name;
char *address;
char *host;
char *clientid;
char *username;
char *password;
char *will_payload;
char *will_topic;
uint8_t proto_ver;
uint8_t will_qos;
uint16_t port;
uint16_t keepalive;
uint16_t backoff_max;
uint64_t cancel_timeout;
uint64_t resend_interval; // resend caching message interval (ms)
uint64_t resend_wait;
size_t sub_count;
size_t forwards_count;
size_t max_recv_queue_len;
size_t max_send_queue_len;
topics **forwards_list;
uint64_t parallel;
topics **sub_list;
conf_tls tls;
conf_tcp tcp;
conf_sqlite *sqlite;
nng_aio **bridge_aio;
nng_mtx *mtx;
bool hybrid; // enable/disable hybrid bridging
char **hybrid_servers;
// MQTT v5 property
conf_bridge_conn_properties * conn_properties;
conf_bridge_conn_will_properties *will_properties;
conf_bridge_sub_properties * sub_properties;
#if defined(SUPP_QUIC)
// config params for QUIC only
bool multi_stream;
bool stream_auto_genid; // generate stream id automatically for each stream
bool qos_first; // send QoS msg in high priority
uint64_t qkeepalive; //keepalive timeout interval of QUIC transport
uint64_t qconnect_timeout; // HandshakeIdleTimeoutMs of QUIC
uint32_t qdiscon_timeout; // DisconnectTimeoutMs
uint32_t qidle_timeout; // Disconnect after idle
uint32_t qsend_idle_timeout; // SendIdleTimeoutMs
uint32_t qinitial_rtt_ms; // Initial RTT estimate.
uint32_t qmax_ack_delay_ms; // MaxAckDelayMs How long to wait after receiving data before sending an ACK.
uint8_t qcongestion_control; // congestion control algorithm 1: bbr 0: cubic
bool quic_0rtt; // 0RTT.
#endif
};
typedef struct conf_bridge_node conf_bridge_node;
typedef struct ringBuffer_node ringBuffer_node;
struct ringBuffer_node {
char *name;
uint32_t fullOp;
uint64_t cap;
};
typedef struct conf_exchange_node conf_exchange_node;
struct conf_exchange_node {
char *name;
char *topic;
ringBuffer_node **rbufs;
size_t rbufs_sz;
nng_socket *sock;
nng_mtx *mtx;
char *exchange_url;
};
typedef struct conf_exchange_encryption conf_exchange_encryption;
struct conf_exchange_encryption {
bool enable;
char *key;
};
typedef struct conf_exchange conf_exchange;
struct conf_exchange {
size_t count;
conf_exchange_node **nodes;
conf_exchange_encryption *encryption;
};
#if defined(SUPP_PLUGIN)
typedef struct conf_plugin_lib conf_plugin_lib;
struct conf_plugin_lib {
char *path;
};
typedef struct conf_plugin conf_plugin;
struct conf_plugin {
struct conf_plugin_lib **libs;
size_t path_sz;
};
#endif
typedef enum {
UNCOMPRESSED,
SNAPPY,
GZIP,
BROTLI,
ZSTD,
LZ4
} compression_type;
typedef enum { AES_GCM_V1 = 0, AES_GCM_CTR_V1 = 1 } cipher_type;
struct conf_parquet_encryption {
bool enable;
char *key_id;
char *key;
cipher_type type;
};
typedef struct conf_parquet_encryption conf_parquet_encryption;
struct conf_parquet {
bool enable;
char *dir;
char *file_name_prefix;
uint8_t file_count;
uint32_t limit_frequency;
uint8_t file_index;
int32_t file_size;
compression_type comp_type;
conf_parquet_encryption encryption;
};
typedef struct conf_parquet conf_parquet;
struct conf_blf {
bool enable;
char *dir;
char *file_name_prefix;
uint8_t file_count;
uint8_t file_index;
int32_t file_size;
compression_type comp_type;
};
typedef struct conf_blf conf_blf;
struct conf_bridge {
size_t count;
conf_bridge_node **nodes;
conf_sqlite sqlite;
};
typedef struct conf_bridge conf_bridge;
typedef struct {
char *zmq_sub_url;
char *zmq_pub_url;
char *mqtt_url;
char *sub_topic;
char *pub_topic;
char *zmq_sub_pre;
char *zmq_pub_pre;
char *path;
char *username;
char *password;
void *zmq_sender;
int proto_ver;
int keepalive;
bool clean_start;
int parallel;
enum { PUB_SUB, REQ_REP } type;
conf_http_server http_server;
} zmq_gateway_conf;
typedef struct {
nng_socket *sock;
char *mqtt_url;
char *sub_topic;
char *pub_topic;
char *username;
char *password;
char *clientid;
char *path;
int proto_ver;
int keepalive;
bool clean_start;
uint8_t sub_qos;
int parallel;
conf_http_server http_server;
// vsomeip parameter
uint16_t service_id;
uint16_t service_instance_id;
uint16_t service_method_id;
uint16_t service_event_id;
uint16_t service_eventgroup_id;
char *conf_path;
} vsomeip_gateway_conf;
typedef struct {
char *from;
char *to;
char *struct_name;
} dds_gateway_topic;
typedef struct {
dds_gateway_topic **dds2mqtt;
size_t dds2mqtt_sz;
dds_gateway_topic **mqtt2dds;
size_t mqtt2dds_sz;
} dds_gateway_forward;
typedef struct {
nng_socket *sock;
bool clean_start;
uint8_t proto_ver;
uint16_t port;
uint16_t keepalive;
char * address;
char * clientid;
char * username;
char * password;
conf_tls tls;
} dds_gateway_mqtt;
typedef struct {
char * idl_type;
size_t domain_id;
char * subscriber_partition;
char * publisher_partition;
bool shm_mode;
char * shm_log_level;
} dds_gateway_dds;
typedef struct {
char * path;
dds_gateway_mqtt mqtt;
dds_gateway_dds dds;
dds_gateway_forward forward;
conf_http_server http_server;
} dds_gateway_conf;
typedef enum {
CLIENT_CONNECT,
CLIENT_CONNACK,
CLIENT_CONNECTED,
CLIENT_DISCONNECTED,
CLIENT_SUBSCRIBE,
CLIENT_UNSUBSCRIBE,
SESSION_SUBSCRIBED,
SESSION_UNSUBSCRIBED,
SESSION_TERMINATED,
MESSAGE_PUBLISH,
MESSAGE_DELIVERED,
MESSAGE_ACKED,
UNKNOWN_EVENT,
} webhook_event;
typedef enum {
plain,
base64,
base62
} hook_payload_type;
struct conf_web_hook_rule {
uint16_t rule_num;
webhook_event event;
char * action;
char * topic;
};
typedef struct conf_web_hook_rule conf_web_hook_rule;
struct conf_web_hook {
bool enable;
char * url;
size_t pool_size;
hook_payload_type encode_payload;
size_t header_count;
conf_http_header **headers;
uint16_t rule_count;
conf_web_hook_rule **rules;
nng_mtx *ex_mtx; // mutex for saios
nng_aio *ex_aio; // Await flush
nng_aio **saios; // Aios for sending message
// TODO not support yet
conf_tls tls;
};
typedef struct conf_web_hook conf_web_hook;
typedef enum {
memory,
sqlite,
} persistence_type;
struct conf {
char *vin;
char *cmd_ipc_url;
char *hook_ipc_url;
char *conf_file;
char *url;
bool enable;
int property_size;
int msq_len;
uint32_t num_taskq_thread;
uint32_t max_taskq_thread;
uint32_t parallel; // broker ctx
uint64_t total_ctx; // Total ctx of work (bridge + AWS + broker + HTTP)
uint64_t max_packet_size; // byte
uint32_t client_max_packet_size; // byte
uint32_t max_inflight_window;
uint32_t max_awaiting_rel;
uint32_t await_rel_timeout;
uint32_t qos_duration;
float backoff;
void *db_root;
bool allow_anonymous;
bool daemon;
bool ipc_internal;
bool bridge_mode;
conf_tcp_list tcp_list;
conf_tls_list tls_list;
conf_sqlite sqlite;
conf_tls tls;
conf_http_server http_server;
conf_websocket websocket;
conf_bridge bridge; //standard MQTT
conf_bridge aws_bridge; // AWS IoT Core
conf_exchange exchange;
conf_parquet parquet;
conf_blf blf;
#if defined(SUPP_PLUGIN)
conf_plugin plugin;
#endif
conf_web_hook web_hook;
#if defined(ENABLE_LOG)
conf_log log;
#endif
#if defined(SUPP_RULE_ENGINE)
conf_rule rule_eng;
#endif
#ifdef ACL_SUPP
conf_acl acl;
acl_permit acl_nomatch;
bool enable_acl_cache;
size_t acl_cache_max_size;
size_t acl_cache_ttl;
enum { ACL_IGNORE, ACL_DISCONNECT } acl_deny_action;
#endif
conf_auth auths;
conf_auth_http auth_http;
struct hashmap_s *cid_table;
};
typedef struct conf conf;
webhook_event get_webhook_event(const char *hook_type, const char *hook_name);
NNG_DECL int get_size(const char *str, uint64_t *size);
NNG_DECL int get_time(const char *str, uint64_t *second);
NNG_DECL void conf_parse(conf *nanomq_conf);
NNG_DECL void conf_parse_ver2(conf *nanomq_conf);
NNG_DECL void conf_gateway_parse_ver2(zmq_gateway_conf *gateway);
NNG_DECL void conf_vsomeip_gateway_parse_ver2(vsomeip_gateway_conf *config);
NNG_DECL void conf_dds_gateway_init(dds_gateway_conf *config);
NNG_DECL void conf_dds_gateway_parse_ver2(dds_gateway_conf *config);
NNG_DECL void conf_dds_gateway_destory(dds_gateway_conf *config);
NNG_DECL void conf_init(conf *nanomq_conf);
NNG_DECL void print_conf(conf *nanomq_conf);
NNG_DECL void conf_set_threads(conf *nanomq_conf);
NNG_DECL void conf_fini(conf *nanomq_conf);
NNG_DECL void conf_update(const char *fpath, const char *key, char *value);
NNG_DECL void conf_update2(const char *fpath, const char *key1,
const char *key2, const char *key3, char *value);
NNG_DECL void
conf_bridge_node_parse(
conf_bridge_node *node, conf_sqlite *bridge_sqlite, cJSON *obj);
NNG_DECL void conf_bridge_node_destroy(conf_bridge_node *node);
NNG_DECL void conf_update_var(
const char *fpath, const char *key, uint8_t type, void *var);
NNG_DECL void conf_update_var2(const char *fpath, const char *key1,
const char *key2, const char *key3, uint8_t type, void *var);
NNG_DECL const char* conf_get_vin(void);
NNG_DECL void conf_free_vin();
#define conf_update_int(path, key, var) \
conf_update_var(path, key, 0, (void *) &(var))
#define conf_update_u8(path, key, var) \
conf_update_var(path, key, 1, (void *) &(var))
#define conf_update_u16(path, key, var) \
conf_update_var(path, key, 2, (void *) &(var))
#define conf_update_u32(path, key, var) \
conf_update_var(path, key, 3, (void *) &(var))
#define conf_update_u64(path, key, var) \
conf_update_var(path, key, 4, (void *) &(var))
#define conf_update_long(path, key, var) \
conf_update_var(path, key, 5, (void *) &(var))
#define conf_update_double(path, key, var) \
conf_update_var(path, key, 6, (void *) &(var))
#define conf_update_bool(path, key, var) \
conf_update_var(path, key, 7, (void *) &(var))
#define conf_update2_int(path, key1, key2, key3, var) \
conf_update_var2(path, key1, key2, key3, 0, (void *) &(var))
#define conf_update2_u8(path, key1, key2, key3, var) \
conf_update_var2(path, key1, key2, key3, 1, (void *) &(var))
#define conf_update2_u16(path, key1, key2, key3, var) \
conf_update_var2(path, key1, key2, key3, 2, (void *) &(var))
#define conf_update2_u32(path, key1, key2, key3, var) \
conf_update_var2(path, key1, key2, key3, 3, (void *) &(var))
#define conf_update2_u64(path, key1, key2, key3, var) \
conf_update_var2(path, key1, key2, key3, 4, (void *) &(var))
#define conf_update2_long(path, key1, key2, key3, var) \
conf_update_var2(path, key1, key2, key3, 5, (void *) &(var))
#define conf_update2_double(path, key1, key2, key3, var) \
conf_update_var2(path, key1, key2, key3, 6, (void *) &(var))
#define conf_update2_bool(path, key1, key2, key3, var) \
conf_update_var2(path, key1, key2, key3, 7, (void *) &(var))
#endif

View File

@ -1,228 +0,0 @@
#ifndef CVECTOR_H_
#define CVECTOR_H_
#include <assert.h> /* for assert */
#include <stdlib.h> /* for malloc/realloc/free */
/**
* @brief cvector_vector_type - The vector type used in this library
*/
#define cvector(type) type *
/**
* @brief cvector_set_capacity - For internal use, sets the capacity variable
* of the vector
* @param vec - the vector
* @param size - the new capacity to set
* @return void
*/
#define cvector_set_capacity(vec, size) \
do { \
if (vec) { \
((size_t *) (vec))[-1] = (size); \
} \
} while (0)
/**
* @brief cvector_set_size - For internal use, sets the size variable of the
* vector
* @param vec - the vector
* @param size - the new capacity to set
* @return void
*/
#define cvector_set_size(vec, size) \
do { \
if (vec) { \
((size_t *) (vec))[-2] = (size); \
} \
} while (0)
/**
* @brief cvector_capacity - gets the current capacity of the vector
* @param vec - the vector
* @return the capacity as a size_t
*/
#define cvector_capacity(vec) ((vec) ? ((size_t *) (vec))[-1] : (size_t) 0)
/**
* @brief cvector_size - gets the current size of the vector
* @param vec - the vector
* @return the size as a size_t
*/
#define cvector_size(vec) ((vec) ? ((size_t *) (vec))[-2] : (size_t) 0)
/**
* @brief cvector_empty - returns non-zero if the vector is empty
* @param vec - the vector
* @return non-zero if empty, zero if non-empty
*/
#define cvector_empty(vec) (cvector_size(vec) == 0)
/**
* @brief cvector_grow - For internal use, ensures that the vector is at least
* <count> elements big
* @param vec - the vector
* @param count - the new capacity to set
* @return void
*/
#define cvector_grow(vec, count) \
do { \
const size_t cv_sz = \
(count) * sizeof(*(vec)) + (sizeof(size_t) * 2); \
if (!(vec)) { \
size_t *cv_p = malloc(cv_sz); \
assert(cv_p); \
(vec) = (void *) (&cv_p[2]); \
cvector_set_capacity((vec), (count)); \
cvector_set_size((vec), 0); \
} else { \
size_t *cv_p1 = &((size_t *) (vec))[-2]; \
size_t *cv_p2 = realloc(cv_p1, (cv_sz)); \
assert(cv_p2); \
(vec) = (void *) (&cv_p2[2]); \
cvector_set_capacity((vec), (count)); \
} \
} while (0)
/**
* @brief cvector_pop_back - removes the last element from the vector
* @param vec - the vector
* @return void
*/
#define cvector_pop_back(vec) \
do { \
cvector_set_size((vec), cvector_size(vec) - 1); \
} while (0)
/**
* @brief cvector_erase - removes the element at index i from the vector
* @param vec - the vector
* @param i - index of element to remove
* @return void
*/
#define cvector_erase(vec, i) \
do { \
if (vec) { \
const size_t cv_sz = cvector_size(vec); \
if ((i) < cv_sz) { \
cvector_set_size((vec), cv_sz - 1); \
size_t cv_x; \
for (cv_x = (i); cv_x < (cv_sz - 1); \
++cv_x) { \
(vec)[cv_x] = (vec)[cv_x + 1]; \
} \
} \
} \
} while (0)
/**
* @brief cvector_free - frees all memory associated with the vector
* @param vec - the vector
* @return void
*/
#define cvector_free(vec) \
do { \
if (vec) { \
size_t *p1 = &((size_t *) (vec))[-2]; \
free(p1); \
} \
} while (0)
/**
* @brief cvector_begin - returns an iterator to first element of the vector
* @param vec - the vector
* @return a pointer to the first element (or NULL)
*/
#define cvector_begin(vec) (vec)
/**
* @brief cvector_end - returns an iterator to one past the last element of the
* vector
* @param vec - the vector
* @return a pointer to one past the last element (or NULL)
*/
#define cvector_end(vec) ((vec) ? &((vec)[cvector_size(vec)]) : NULL)
/* user request to use logarithmic growth algorithm */
#ifdef CVECTOR_LOGARITHMIC_GROWTH
/**
* @brief cvector_push_back - adds an element to the end of the vector
* @param vec - the vector
* @param value - the value to add
* @return void
*/
#define cvector_push_back(vec, value) \
do { \
size_t cv_cap = cvector_capacity(vec); \
if (cv_cap <= cvector_size(vec)) { \
cvector_grow( \
(vec), !cv_cap ? cv_cap + 1 : cv_cap * 2); \
} \
vec[cvector_size(vec)] = (value); \
cvector_set_size((vec), cvector_size(vec) + 1); \
} while (0)
#else
/**
* @brief cvector_push_back - adds an element to the end of the vector
* @param vec - the vector
* @param value - the value to add
* @return void
*/
#define cvector_push_back(vec, value) \
do { \
size_t cv_cap = cvector_capacity(vec); \
if (cv_cap <= cvector_size(vec)) { \
cvector_grow((vec), cv_cap + 1); \
} \
vec[cvector_size(vec)] = (value); \
cvector_set_size((vec), cvector_size(vec) + 1); \
} while (0)
#endif /* CVECTOR_LOGARITHMIC_GROWTH */
/**
* @brief cvector_copy - copy a vector
* @param from - the original vector
* @param to - destination to which the function copy to
* @return void
*/
#define cvector_copy(from, to) \
do { \
for (size_t i = 0; i < cvector_size(from); i++) { \
cvector_push_back(to, from[i]); \
} \
} while (0)
#endif /* CVECTOR_H_ */
/**
* @brief cvector_insert - insert the element at index i to the vector
* @param vec - the vector
* @param i - index of element to insert
* @param value - value to insert
* @return void
*/
#define cvector_insert(vec, i, value) \
do { \
if (cvector_empty(vec)) { \
cvector_push_back(vec, value); \
} else { \
size_t cv_cap = cvector_capacity(vec); \
if (cv_cap <= cvector_size(vec)) { \
cvector_grow((vec), \
!cv_cap ? cv_cap + 1 : cv_cap * 2); \
} \
const size_t cv_sz = cvector_size(vec); \
if ((i) < cv_sz) { \
cvector_set_size((vec), cv_sz + 1); \
size_t cv_x; \
for (cv_x = (cv_sz); cv_x > (i); cv_x--) { \
(vec)[cv_x] = (vec)[cv_x - 1]; \
} \
vec[i] = (value); \
} \
} \
} while (0)

View File

@ -1,63 +0,0 @@
#ifndef NANOLIB_ENV_H
#define NANOLIB_ENV_H
#include "conf.h"
#include "nng/nng.h"
#define NANOMQ_BROKER_URL "NANOMQ_BROKER_URL"
#define NANOMQ_EXCHANGER_URL "NANOMQ_EXCHANGER_URL"
#define NANOMQ_DAEMON "NANOMQ_DAEMON"
#define NANOMQ_TCP_ENABLE "NANOMQ_TCP_ENABLE"
#define NANOMQ_NUM_TASKQ_THREAD "NANOMQ_MAX_TASKQ_THREAD"
#define NANOMQ_MAX_TASKQ_THREAD "NANOMQ_MAX_TASKQ_THREAD"
#define NANOMQ_PARALLEL "NANOMQ_PARALLEL"
#define NANOMQ_PROPERTY_SIZE "NANOMQ_PROPERTY_SIZE"
#define NANOMQ_MAX_PACKET_SIZE "NANOMQ_MAX_PACKET_SIZE"
#define NANOMQ_CLIENT_MAX_PACKET_SIZE "NANOMQ_CLIENT_MAX_PACKET_SIZE"
#define NANOMQ_MSQ_LEN "NANOMQ_MSQ_LEN"
#define NANOMQ_QOS_DURATION "NANOMQ_QOS_DURATION"
#define NANOMQ_ALLOW_ANONYMOUS "NANOMQ_ALLOW_ANONYMOUS"
#define NANOMQ_MSG_PERSISTENCE "NANOMQ_MSG_PERSISTENCE"
#define NANOMQ_WEBSOCKET_ENABLE "NANOMQ_WEBSOCKET_ENABLE"
#define NANOMQ_WEBSOCKET_URL "NANOMQ_WEBSOCKET_URL"
#define NANOMQ_WEBSOCKET_TLS_URL "NANOMQ_WEBSOCKET_TLS_URL"
#define NANOMQ_HTTP_SERVER_ENABLE "NANOMQ_HTTP_SERVER_ENABLE"
#define NANOMQ_HTTP_SERVER_PORT "NANOMQ_HTTP_SERVER_PORT"
#define NANOMQ_HTTP_SERVER_PARALLEL "NANOMQ_HTTP_SERVER_PARALLEL"
#define NANOMQ_HTTP_SERVER_USERNAME "NANOMQ_HTTP_SERVER_USERNAME"
#define NANOMQ_HTTP_SERVER_PASSWORD "NANOMQ_HTTP_SERVER_PASSWORD"
#define NANOMQ_HTTP_SERVER_AUTH_TYPE "NANOMQ_HTTP_SERVER_AUTH_TYPE"
#define NANOMQ_HTTP_SERVER_JWT_PUBLIC_KEYFILE \
"NANOMQ_HTTP_SERVER_JWT_PUBLIC_KEYFILE"
#define NANOMQ_HTTP_SERVER_JWT_PRIVATE_KEYFILE \
"NANOMQ_HTTP_SERVER_JWT_PRIVATE_KEYFILE"
#define NANOMQ_TLS_ENABLE "NANOMQ_TLS_ENABLE"
#define NANOMQ_TLS_URL "NANOMQ_TLS_URL"
#define NANOMQ_TLS_CA_CERT_PATH "NANOMQ_TLS_CA_CERT_PATH"
#define NANOMQ_TLS_CERT_PATH "NANOMQ_TLS_CERT_PATH"
#define NANOMQ_TLS_KEY_PATH "NANOMQ_TLS_KEY_PATH"
#define NANOMQ_TLS_KEY_PASSWORD "NANOMQ_TLS_KEY_PASSWORD"
#define NANOMQ_TLS_VERIFY_PEER "NANOMQ_TLS_VERIFY_PEER"
#define NANOMQ_TLS_FAIL_IF_NO_PEER_CERT "NANOMQ_TLS_FAIL_IF_NO_PEER_CERT"
#define NANOMQ_LOG_LEVEL "NANOMQ_LOG_LEVEL"
#define NANOMQ_LOG_TO "NANOMQ_LOG_TO"
#define NANOMQ_LOG_UDS_ADDR "NANOMQ_LOG_UDS_ADDR"
#define NANOMQ_LOG_DIR "NANOMQ_LOG_DIR"
#define NANOMQ_LOG_FILE "NANOMQ_LOG_FILE"
#define NANOMQ_LOG_ROTATION_SIZE "NANOMQ_LOG_ROTATION_SIZE"
#define NANOMQ_LOG_ROTATION_COUNT "NANOMQ_LOG_ROTATION_COUNT"
#define NANOMQ_CONF_PATH "NANOMQ_CONF_PATH"
#define NANOMQ_VIN "NANOMQ_VIN"
#define NANOMQ_PID_FILE "NANOMQ_PID_FILE"
NNG_DECL void read_env_conf(conf *config);
NNG_DECL char *read_env_vin();
NNG_DECL char *read_env_pid_file();
#endif

View File

@ -1,18 +0,0 @@
#ifndef NANO_FILE_H
#define NANO_FILE_H
#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>
#include "nng/nng.h"
NNG_DECL bool nano_file_exists(const char *fpath);
NNG_DECL char * nano_getcwd(char *buf, size_t size);
NNG_DECL int64_t nano_getline(
char **restrict line, size_t *restrict len, FILE *restrict fp);
NNG_DECL char * nano_concat_path(const char *dir, const char *file_name);
NNG_DECL int file_write_string(const char *fpath, const char *string);
NNG_DECL int file_create_dir(const char *fpath);
NNG_DECL size_t file_load_data(const char *filepath, void **data);
#endif

View File

@ -1,121 +0,0 @@
#ifndef HASH_TABLE_H
#define HASH_TABLE_H
#include "cvector.h"
#include <stdbool.h>
#include <stdint.h>
#include "nng/nng.h"
#include "nng/mqtt/packet.h"
struct topic_queue {
uint8_t qos;
char *topic;
struct topic_queue *next;
};
typedef struct topic_queue topic_queue;
struct msg_queue {
char * msg;
struct msg_queue *next;
};
typedef struct msg_queue msg_queue;
// atpair is alias topic pair
typedef struct dbhash_atpair_s dbhash_atpair_t;
struct dbhash_atpair_s {
uint32_t alias;
char * topic;
};
typedef struct dbhash_ptpair_s dbhash_ptpair_t;
// ptpair is pipe topic pair
struct dbhash_ptpair_s {
uint32_t pipe;
char * topic;
};
/**
* @brief alias_cmp - A callback to compare different alias
* @param x - normally x is pointer of dbhash_atpair_t
* @param y - normally y is pointer of alias
* @return 0, minus or plus
*/
static inline int
alias_cmp(void *x_, void *y_)
{
uint32_t * alias = (uint32_t *) y_;
dbhash_atpair_t *ele_x = (dbhash_atpair_t *) x_;
return *alias - ele_x->alias;
}
NNG_DECL void dbhash_init_alias_table(void);
NNG_DECL void dbhash_destroy_alias_table(void);
// This function do not verify value of alias and topic,
// therefore you should make sure alias and topic is
// not illegal.
NNG_DECL void dbhash_insert_atpair(uint32_t pipe_id, uint32_t alias, const char *topic);
NNG_DECL const char *dbhash_find_atpair(uint32_t pipe_id, uint32_t alias);
NNG_DECL void dbhash_del_atpair_queue(uint32_t pipe_id);
NNG_DECL void dbhash_init_pipe_table(void);
NNG_DECL void dbhash_destroy_pipe_table(void);
NNG_DECL void dbhash_insert_topic(uint32_t id, char *val, uint8_t qos);
NNG_DECL bool dbhash_check_topic(uint32_t id, char *val);
NNG_DECL char *dbhash_get_first_topic(uint32_t id);
NNG_DECL topic_queue *topic_queue_init(char *topic, int topic_len);
NNG_DECL void topic_queue_release(topic_queue *tq);
NNG_DECL topic_queue *init_topic_queue_with_topic_node(topic_node *tn);
NNG_DECL struct topic_queue *dbhash_get_topic_queue(uint32_t id);
NNG_DECL struct topic_queue *dbhash_copy_topic_queue(uint32_t id);
NNG_DECL void dbhash_del_topic(uint32_t id, char *topic);
NNG_DECL void *dbhash_del_topic_queue(
uint32_t id, void *(*cb)(void *, char *), void *args);
NNG_DECL bool dbhash_check_id(uint32_t id);
NNG_DECL void *dbhash_check_id_and_do(uint32_t id, void *(*cb)(void *), void *arg);
NNG_DECL void dbhash_print_topic_queue(uint32_t id);
NNG_DECL topic_queue **dbhash_get_topic_queue_all(size_t *sz);
NNG_DECL dbhash_ptpair_t *dbhash_ptpair_alloc(uint32_t p, char *t);
NNG_DECL void dbhash_ptpair_free(dbhash_ptpair_t *pt);
NNG_DECL dbhash_ptpair_t **dbhash_get_ptpair_all(void);
NNG_DECL size_t dbhash_get_pipe_cnt(void);
NNG_DECL void dbhash_init_cached_table(void);
NNG_DECL void dbhash_destroy_cached_table(void);
NNG_DECL void dbhash_cache_topic_all(uint32_t pid, uint32_t cid);
NNG_DECL void dbhash_restore_topic_all(uint32_t cid, uint32_t pid);
NNG_DECL struct topic_queue *dbhash_get_cached_topic(uint32_t cid);
NNG_DECL void dbhash_del_cached_topic_all(uint32_t key);
NNG_DECL bool dbhash_cached_check_id(uint32_t key);
#endif

View File

@ -1,9 +0,0 @@
#ifndef HOCON_H
#define HOCON_H
#include "cJSON.h"
cJSON *hocon_parse_file(const char *file);
cJSON *hocon_parse_str(char *str, size_t len);
#endif

View File

@ -1,627 +0,0 @@
/* The MIT License
Copyright (c) 2008, 2009, 2011 by Attractive Chaos <attractor@live.co.uk>
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
*/
/*
An example:
#include "khash.h"
KHASH_MAP_INIT_INT(32, char)
int main() {
int ret, is_missing;
khiter_t k;
khash_t(32) *h = kh_init(32);
k = kh_put(32, h, 5, &ret);
kh_value(h, k) = 10;
k = kh_get(32, h, 10);
is_missing = (k == kh_end(h));
k = kh_get(32, h, 5);
kh_del(32, h, k);
for (k = kh_begin(h); k != kh_end(h); ++k)
if (kh_exist(h, k)) kh_value(h, k) = 1;
kh_destroy(32, h);
return 0;
}
*/
/*
2013-05-02 (0.2.8):
* Use quadratic probing. When the capacity is power of 2, stepping function
i*(i+1)/2 guarantees to traverse each bucket. It is better than double
hashing on cache performance and is more robust than linear probing.
In theory, double hashing should be more robust than quadratic probing.
However, my implementation is probably not for large hash tables, because
the second hash function is closely tied to the first hash function,
which reduce the effectiveness of double hashing.
Reference: http://research.cs.vt.edu/AVresearch/hashing/quadratic.php
2011-12-29 (0.2.7):
* Minor code clean up; no actual effect.
2011-09-16 (0.2.6):
* The capacity is a power of 2. This seems to dramatically improve the
speed for simple keys. Thank Zilong Tan for the suggestion. Reference:
- http://code.google.com/p/ulib/
- http://nothings.org/computer/judy/
* Allow to optionally use linear probing which usually has better
performance for random input. Double hashing is still the default as it
is more robust to certain non-random input.
* Added Wang's integer hash function (not used by default). This hash
function is more robust to certain non-random input.
2011-02-14 (0.2.5):
* Allow to declare global functions.
2009-09-26 (0.2.4):
* Improve portability
2008-09-19 (0.2.3):
* Corrected the example
* Improved interfaces
2008-09-11 (0.2.2):
* Improved speed a little in kh_put()
2008-09-10 (0.2.1):
* Added kh_clear()
* Fixed a compiling error
2008-09-02 (0.2.0):
* Changed to token concatenation which increases flexibility.
2008-08-31 (0.1.2):
* Fixed a bug in kh_get(), which has not been tested previously.
2008-08-31 (0.1.1):
* Added destructor
*/
#ifndef __AC_KHASH_H
#define __AC_KHASH_H
/*!
@header
Generic hash table library.
*/
#define AC_VERSION_KHASH_H "0.2.8"
#include <stdlib.h>
#include <string.h>
#include <limits.h>
/* compiler specific configuration */
#if UINT_MAX == 0xffffffffu
typedef unsigned int khint32_t;
#elif ULONG_MAX == 0xffffffffu
typedef unsigned long khint32_t;
#endif
#if ULONG_MAX == ULLONG_MAX
typedef unsigned long khint64_t;
#else
typedef unsigned long long khint64_t;
#endif
#ifndef kh_inline
#ifdef _MSC_VER
#define kh_inline __inline
#else
#define kh_inline inline
#endif
#endif /* kh_inline */
#ifndef klib_unused
#if (defined __clang__ && __clang_major__ >= 3) || (defined __GNUC__ && __GNUC__ >= 3)
#define klib_unused __attribute__ ((__unused__))
#else
#define klib_unused
#endif
#endif /* klib_unused */
typedef khint32_t khint_t;
typedef khint_t khiter_t;
#define __ac_isempty(flag, i) ((flag[i>>4]>>((i&0xfU)<<1))&2)
#define __ac_isdel(flag, i) ((flag[i>>4]>>((i&0xfU)<<1))&1)
#define __ac_iseither(flag, i) ((flag[i>>4]>>((i&0xfU)<<1))&3)
#define __ac_set_isdel_false(flag, i) (flag[i>>4]&=~(1ul<<((i&0xfU)<<1)))
#define __ac_set_isempty_false(flag, i) (flag[i>>4]&=~(2ul<<((i&0xfU)<<1)))
#define __ac_set_isboth_false(flag, i) (flag[i>>4]&=~(3ul<<((i&0xfU)<<1)))
#define __ac_set_isdel_true(flag, i) (flag[i>>4]|=1ul<<((i&0xfU)<<1))
#define __ac_fsize(m) ((m) < 16? 1 : (m)>>4)
#ifndef kroundup32
#define kroundup32(x) (--(x), (x)|=(x)>>1, (x)|=(x)>>2, (x)|=(x)>>4, (x)|=(x)>>8, (x)|=(x)>>16, ++(x))
#endif
#ifndef kcalloc
#define kcalloc(N,Z) calloc(N,Z)
#endif
#ifndef kmalloc
#define kmalloc(Z) malloc(Z)
#endif
#ifndef krealloc
#define krealloc(P,Z) realloc(P,Z)
#endif
#ifndef kfree
#define kfree(P) free(P)
#endif
static const double __ac_HASH_UPPER = 0.77;
#define __KHASH_TYPE(name, khkey_t, khval_t) \
typedef struct kh_##name##_s { \
khint_t n_buckets, size, n_occupied, upper_bound; \
khint32_t *flags; \
khkey_t *keys; \
khval_t *vals; \
} kh_##name##_t;
#define __KHASH_PROTOTYPES(name, khkey_t, khval_t) \
extern kh_##name##_t *kh_init_##name(void); \
extern void kh_destroy_##name(kh_##name##_t *h); \
extern void kh_clear_##name(kh_##name##_t *h); \
extern khint_t kh_get_##name(const kh_##name##_t *h, khkey_t key); \
extern int kh_resize_##name(kh_##name##_t *h, khint_t new_n_buckets); \
extern khint_t kh_put_##name(kh_##name##_t *h, khkey_t key, int *ret); \
extern void kh_del_##name(kh_##name##_t *h, khint_t x);
#define __KHASH_IMPL(name, SCOPE, khkey_t, khval_t, kh_is_map, __hash_func, __hash_equal) \
SCOPE kh_##name##_t *kh_init_##name(void) { \
return (kh_##name##_t*)kcalloc(1, sizeof(kh_##name##_t)); \
} \
SCOPE void kh_destroy_##name(kh_##name##_t *h) \
{ \
if (h) { \
kfree((void *)h->keys); kfree(h->flags); \
kfree((void *)h->vals); \
kfree(h); \
} \
} \
SCOPE void kh_clear_##name(kh_##name##_t *h) \
{ \
if (h && h->flags) { \
memset(h->flags, 0xaa, __ac_fsize(h->n_buckets) * sizeof(khint32_t)); \
h->size = h->n_occupied = 0; \
} \
} \
SCOPE khint_t kh_get_##name(const kh_##name##_t *h, khkey_t key) \
{ \
if (h->n_buckets) { \
khint_t k, i, last, mask, step = 0; \
mask = h->n_buckets - 1; \
k = __hash_func(key); i = k & mask; \
last = i; \
while (!__ac_isempty(h->flags, i) && (__ac_isdel(h->flags, i) || !__hash_equal(h->keys[i], key))) { \
i = (i + (++step)) & mask; \
if (i == last) return h->n_buckets; \
} \
return __ac_iseither(h->flags, i)? h->n_buckets : i; \
} else return 0; \
} \
SCOPE int kh_resize_##name(kh_##name##_t *h, khint_t new_n_buckets) \
{ /* This function uses 0.25*n_buckets bytes of working space instead of [sizeof(key_t+val_t)+.25]*n_buckets. */ \
khint32_t *new_flags = 0; \
khint_t j = 1; \
{ \
kroundup32(new_n_buckets); \
if (new_n_buckets < 4) new_n_buckets = 4; \
if (h->size >= (khint_t)(new_n_buckets * __ac_HASH_UPPER + 0.5)) j = 0; /* requested size is too small */ \
else { /* hash table size to be changed (shrink or expand); rehash */ \
new_flags = (khint32_t*)kmalloc(__ac_fsize(new_n_buckets) * sizeof(khint32_t)); \
if (!new_flags) return -1; \
memset(new_flags, 0xaa, __ac_fsize(new_n_buckets) * sizeof(khint32_t)); \
if (h->n_buckets < new_n_buckets) { /* expand */ \
khkey_t *new_keys = (khkey_t*)krealloc((void *)h->keys, new_n_buckets * sizeof(khkey_t)); \
if (!new_keys) { kfree(new_flags); return -1; } \
h->keys = new_keys; \
if (kh_is_map) { \
khval_t *new_vals = (khval_t*)krealloc((void *)h->vals, new_n_buckets * sizeof(khval_t)); \
if (!new_vals) { kfree(new_flags); return -1; } \
h->vals = new_vals; \
} \
} /* otherwise shrink */ \
} \
} \
if (j) { /* rehashing is needed */ \
for (j = 0; j != h->n_buckets; ++j) { \
if (__ac_iseither(h->flags, j) == 0) { \
khkey_t key = h->keys[j]; \
khval_t val; \
khint_t new_mask; \
new_mask = new_n_buckets - 1; \
if (kh_is_map) val = h->vals[j]; \
__ac_set_isdel_true(h->flags, j); \
while (1) { /* kick-out process; sort of like in Cuckoo hashing */ \
khint_t k, i, step = 0; \
k = __hash_func(key); \
i = k & new_mask; \
while (!__ac_isempty(new_flags, i)) i = (i + (++step)) & new_mask; \
__ac_set_isempty_false(new_flags, i); \
if (i < h->n_buckets && __ac_iseither(h->flags, i) == 0) { /* kick out the existing element */ \
{ khkey_t tmp = h->keys[i]; h->keys[i] = key; key = tmp; } \
if (kh_is_map) { khval_t tmp = h->vals[i]; h->vals[i] = val; val = tmp; } \
__ac_set_isdel_true(h->flags, i); /* mark it as deleted in the old hash table */ \
} else { /* write the element and jump out of the loop */ \
h->keys[i] = key; \
if (kh_is_map) h->vals[i] = val; \
break; \
} \
} \
} \
} \
if (h->n_buckets > new_n_buckets) { /* shrink the hash table */ \
h->keys = (khkey_t*)krealloc((void *)h->keys, new_n_buckets * sizeof(khkey_t)); \
if (kh_is_map) h->vals = (khval_t*)krealloc((void *)h->vals, new_n_buckets * sizeof(khval_t)); \
} \
kfree(h->flags); /* free the working space */ \
h->flags = new_flags; \
h->n_buckets = new_n_buckets; \
h->n_occupied = h->size; \
h->upper_bound = (khint_t)(h->n_buckets * __ac_HASH_UPPER + 0.5); \
} \
return 0; \
} \
SCOPE khint_t kh_put_##name(kh_##name##_t *h, khkey_t key, int *ret) \
{ \
khint_t x; \
if (h->n_occupied >= h->upper_bound) { /* update the hash table */ \
if (h->n_buckets > (h->size<<1)) { \
if (kh_resize_##name(h, h->n_buckets - 1) < 0) { /* clear "deleted" elements */ \
*ret = -1; return h->n_buckets; \
} \
} else if (kh_resize_##name(h, h->n_buckets + 1) < 0) { /* expand the hash table */ \
*ret = -1; return h->n_buckets; \
} \
} /* TODO: to implement automatically shrinking; resize() already support shrinking */ \
{ \
khint_t k, i, site, last, mask = h->n_buckets - 1, step = 0; \
x = site = h->n_buckets; k = __hash_func(key); i = k & mask; \
if (__ac_isempty(h->flags, i)) x = i; /* for speed up */ \
else { \
last = i; \
while (!__ac_isempty(h->flags, i) && (__ac_isdel(h->flags, i) || !__hash_equal(h->keys[i], key))) { \
if (__ac_isdel(h->flags, i)) site = i; \
i = (i + (++step)) & mask; \
if (i == last) { x = site; break; } \
} \
if (x == h->n_buckets) { \
if (__ac_isempty(h->flags, i) && site != h->n_buckets) x = site; \
else x = i; \
} \
} \
} \
if (__ac_isempty(h->flags, x)) { /* not present at all */ \
h->keys[x] = key; \
__ac_set_isboth_false(h->flags, x); \
++h->size; ++h->n_occupied; \
*ret = 1; \
} else if (__ac_isdel(h->flags, x)) { /* deleted */ \
h->keys[x] = key; \
__ac_set_isboth_false(h->flags, x); \
++h->size; \
*ret = 2; \
} else *ret = 0; /* Don't touch h->keys[x] if present and not deleted */ \
return x; \
} \
SCOPE void kh_del_##name(kh_##name##_t *h, khint_t x) \
{ \
if (x != h->n_buckets && !__ac_iseither(h->flags, x)) { \
__ac_set_isdel_true(h->flags, x); \
--h->size; \
} \
}
#define KHASH_DECLARE(name, khkey_t, khval_t) \
__KHASH_TYPE(name, khkey_t, khval_t) \
__KHASH_PROTOTYPES(name, khkey_t, khval_t)
#define KHASH_INIT2(name, SCOPE, khkey_t, khval_t, kh_is_map, __hash_func, __hash_equal) \
__KHASH_TYPE(name, khkey_t, khval_t) \
__KHASH_IMPL(name, SCOPE, khkey_t, khval_t, kh_is_map, __hash_func, __hash_equal)
#define KHASH_INIT(name, khkey_t, khval_t, kh_is_map, __hash_func, __hash_equal) \
KHASH_INIT2(name, static kh_inline klib_unused, khkey_t, khval_t, kh_is_map, __hash_func, __hash_equal)
/* --- BEGIN OF HASH FUNCTIONS --- */
/*! @function
@abstract Integer hash function
@param key The integer [khint32_t]
@return The hash value [khint_t]
*/
#define kh_int_hash_func(key) (khint32_t)(key)
/*! @function
@abstract Integer comparison function
*/
#define kh_int_hash_equal(a, b) ((a) == (b))
/*! @function
@abstract 64-bit integer hash function
@param key The integer [khint64_t]
@return The hash value [khint_t]
*/
#define kh_int64_hash_func(key) (khint32_t)((key)>>33^(key)^(key)<<11)
/*! @function
@abstract 64-bit integer comparison function
*/
#define kh_int64_hash_equal(a, b) ((a) == (b))
/*! @function
@abstract const char* hash function
@param s Pointer to a null terminated string
@return The hash value
*/
static kh_inline khint_t __ac_X31_hash_string(const char *s)
{
khint_t h = (khint_t)*s;
if (h) for (++s ; *s; ++s) h = (h << 5) - h + (khint_t)*s;
return h;
}
/*! @function
@abstract Another interface to const char* hash function
@param key Pointer to a null terminated string [const char*]
@return The hash value [khint_t]
*/
#define kh_str_hash_func(key) __ac_X31_hash_string(key)
/*! @function
@abstract Const char* comparison function
*/
#define kh_str_hash_equal(a, b) (strcmp(a, b) == 0)
static kh_inline khint_t __ac_Wang_hash(khint_t key)
{
key += ~(key << 15);
key ^= (key >> 10);
key += (key << 3);
key ^= (key >> 6);
key += ~(key << 11);
key ^= (key >> 16);
return key;
}
#define kh_int_hash_func2(key) __ac_Wang_hash((khint_t)key)
/* --- END OF HASH FUNCTIONS --- */
/* Other convenient macros... */
/*!
@abstract Type of the hash table.
@param name Name of the hash table [symbol]
*/
#define khash_t(name) kh_##name##_t
/*! @function
@abstract Initiate a hash table.
@param name Name of the hash table [symbol]
@return Pointer to the hash table [khash_t(name)*]
*/
#define kh_init(name) kh_init_##name()
/*! @function
@abstract Destroy a hash table.
@param name Name of the hash table [symbol]
@param h Pointer to the hash table [khash_t(name)*]
*/
#define kh_destroy(name, h) kh_destroy_##name(h)
/*! @function
@abstract Reset a hash table without deallocating memory.
@param name Name of the hash table [symbol]
@param h Pointer to the hash table [khash_t(name)*]
*/
#define kh_clear(name, h) kh_clear_##name(h)
/*! @function
@abstract Resize a hash table.
@param name Name of the hash table [symbol]
@param h Pointer to the hash table [khash_t(name)*]
@param s New size [khint_t]
*/
#define kh_resize(name, h, s) kh_resize_##name(h, s)
/*! @function
@abstract Insert a key to the hash table.
@param name Name of the hash table [symbol]
@param h Pointer to the hash table [khash_t(name)*]
@param k Key [type of keys]
@param r Extra return code: -1 if the operation failed;
0 if the key is present in the hash table;
1 if the bucket is empty (never used); 2 if the element in
the bucket has been deleted [int*]
@return Iterator to the inserted element [khint_t]
*/
#define kh_put(name, h, k, r) kh_put_##name(h, k, r)
/*! @function
@abstract Retrieve a key from the hash table.
@param name Name of the hash table [symbol]
@param h Pointer to the hash table [khash_t(name)*]
@param k Key [type of keys]
@return Iterator to the found element, or kh_end(h) if the element is absent [khint_t]
*/
#define kh_get(name, h, k) kh_get_##name(h, k)
/*! @function
@abstract Remove a key from the hash table.
@param name Name of the hash table [symbol]
@param h Pointer to the hash table [khash_t(name)*]
@param k Iterator to the element to be deleted [khint_t]
*/
#define kh_del(name, h, k) kh_del_##name(h, k)
/*! @function
@abstract Test whether a bucket contains data.
@param h Pointer to the hash table [khash_t(name)*]
@param x Iterator to the bucket [khint_t]
@return 1 if containing data; 0 otherwise [int]
*/
#define kh_exist(h, x) (!__ac_iseither((h)->flags, (x)))
/*! @function
@abstract Get key given an iterator
@param h Pointer to the hash table [khash_t(name)*]
@param x Iterator to the bucket [khint_t]
@return Key [type of keys]
*/
#define kh_key(h, x) ((h)->keys[x])
/*! @function
@abstract Get value given an iterator
@param h Pointer to the hash table [khash_t(name)*]
@param x Iterator to the bucket [khint_t]
@return Value [type of values]
@discussion For hash sets, calling this results in segfault.
*/
#define kh_val(h, x) ((h)->vals[x])
/*! @function
@abstract Alias of kh_val()
*/
#define kh_value(h, x) ((h)->vals[x])
/*! @function
@abstract Get the start iterator
@param h Pointer to the hash table [khash_t(name)*]
@return The start iterator [khint_t]
*/
#define kh_begin(h) (khint_t)(0)
/*! @function
@abstract Get the end iterator
@param h Pointer to the hash table [khash_t(name)*]
@return The end iterator [khint_t]
*/
#define kh_end(h) ((h)->n_buckets)
/*! @function
@abstract Get the number of elements in the hash table
@param h Pointer to the hash table [khash_t(name)*]
@return Number of elements in the hash table [khint_t]
*/
#define kh_size(h) ((h)->size)
/*! @function
@abstract Get the number of buckets in the hash table
@param h Pointer to the hash table [khash_t(name)*]
@return Number of buckets in the hash table [khint_t]
*/
#define kh_n_buckets(h) ((h)->n_buckets)
/*! @function
@abstract Iterate over the entries in the hash table
@param h Pointer to the hash table [khash_t(name)*]
@param kvar Variable to which key will be assigned
@param vvar Variable to which value will be assigned
@param code Block of code to execute
*/
#define kh_foreach(h, kvar, vvar, code) { khint_t __i; \
for (__i = kh_begin(h); __i != kh_end(h); ++__i) { \
if (!kh_exist(h,__i)) continue; \
(kvar) = kh_key(h,__i); \
(vvar) = kh_val(h,__i); \
code; \
} }
/*! @function
@abstract Iterate over the values in the hash table
@param h Pointer to the hash table [khash_t(name)*]
@param vvar Variable to which value will be assigned
@param code Block of code to execute
*/
#define kh_foreach_value(h, vvar, code) { khint_t __i; \
for (__i = kh_begin(h); __i != kh_end(h); ++__i) { \
if (!kh_exist(h,__i)) continue; \
(vvar) = kh_val(h,__i); \
code; \
} }
/* More convenient interfaces */
/*! @function
@abstract Instantiate a hash set containing integer keys
@param name Name of the hash table [symbol]
*/
#define KHASH_SET_INIT_INT(name) \
KHASH_INIT(name, khint32_t, char, 0, kh_int_hash_func, kh_int_hash_equal)
/*! @function
@abstract Instantiate a hash map containing integer keys
@param name Name of the hash table [symbol]
@param khval_t Type of values [type]
*/
#define KHASH_MAP_INIT_INT(name, khval_t) \
KHASH_INIT(name, khint32_t, khval_t, 1, kh_int_hash_func, kh_int_hash_equal)
/*! @function
@abstract Instantiate a hash set containing 64-bit integer keys
@param name Name of the hash table [symbol]
*/
#define KHASH_SET_INIT_INT64(name) \
KHASH_INIT(name, khint64_t, char, 0, kh_int64_hash_func, kh_int64_hash_equal)
/*! @function
@abstract Instantiate a hash map containing 64-bit integer keys
@param name Name of the hash table [symbol]
@param khval_t Type of values [type]
*/
#define KHASH_MAP_INIT_INT64(name, khval_t) \
KHASH_INIT(name, khint64_t, khval_t, 1, kh_int64_hash_func, kh_int64_hash_equal)
typedef const char *kh_cstr_t;
/*! @function
@abstract Instantiate a hash map containing const char* keys
@param name Name of the hash table [symbol]
*/
#define KHASH_SET_INIT_STR(name) \
KHASH_INIT(name, kh_cstr_t, char, 0, kh_str_hash_func, kh_str_hash_equal)
/*! @function
@abstract Instantiate a hash map containing const char* keys
@param name Name of the hash table [symbol]
@param khval_t Type of values [type]
*/
#define KHASH_MAP_INIT_STR(name, khval_t) \
KHASH_INIT(name, kh_cstr_t, khval_t, 1, kh_str_hash_func, kh_str_hash_equal)
#endif /* __AC_KHASH_H */

View File

@ -1,33 +0,0 @@
#include <stdio.h>
#include <stdlib.h>
struct linkedListNode {
void *data;
unsigned long long expiredAt;
struct linkedListNode *next;
struct linkedListNode *prev;
};
struct linkedList {
unsigned int cap;
unsigned int size;
unsigned int overWrite;
unsigned long long expiredAt;
struct linkedListNode *head;
struct linkedListNode *tail;
};
int linkedList_replace_head(struct linkedList *list,
void *data,
unsigned long long expiredAt);
int linkedList_init(struct linkedList **list,
unsigned int cap,
unsigned int overWrite,
unsigned long long expiredAt);
int linkedList_enqueue(struct linkedList *list,
void *data,
unsigned long long expiredAt);
int linkedList_dequeue(struct linkedList *list,
void **data);
int linkedList_release(struct linkedList *list);

View File

@ -1,111 +0,0 @@
#ifndef NNG_NANOLIB_LOG_H
#define NNG_NANOLIB_LOG_H
#ifdef __cplusplus
extern "C" {
#endif
#include <stdarg.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdint.h>
#include <time.h>
#include "nng/nng.h"
#define LOG_VERSION "0.2.1"
/**
* 2023-12-08 move conf_log to log.h
*/
// log type
#define LOG_TO_FILE (1 << 0)
#define LOG_TO_CONSOLE (1 << 1)
#define LOG_TO_SYSLOG (1 << 2)
#define LOG_TO_UDS (1 << 3)
typedef struct conf_log conf_log;
struct conf_log {
uint8_t type;
int level;
char *dir;
char *file;
char *uds_addr;
FILE *fp;
char *abs_path; // absolut path of log file
char *rotation_sz_str; // 1000KB, 100MB, 10GB
uint64_t rotation_sz; // unit: byte
size_t rotation_count; // rotation count
};
typedef struct {
va_list ap;
const char *fmt;
const char *file;
const char *func;
struct tm time;
void * udata;
int line;
int level;
conf_log * config;
} log_event;
typedef void (*log_func)(log_event *ev);
enum {
NNG_LOG_FATAL = 0,
NNG_LOG_ERROR,
NNG_LOG_WARN,
NNG_LOG_INFO,
NNG_LOG_DEBUG,
NNG_LOG_TRACE,
};
NNG_DECL const char *log_level_string(int level);
NNG_DECL int log_level_num(const char *level);
NNG_DECL void log_set_level(int level);
NNG_DECL int log_add_callback(
log_func fn, void *udata, int level, void *mtx, conf_log *config);
NNG_DECL void log_add_console(int level, void *mtx);
NNG_DECL int log_add_fp(FILE *fp, int level, void *mtx, conf_log *config);
NNG_DECL void log_add_syslog(const char *log_name, uint8_t level, void *mtx);
NNG_DECL void log_add_uds(const char *uds_path, const char *log_name, uint8_t level, void *mtx);
NNG_DECL void uds_closelog(void);
NNG_DECL void log_log(int level, const char *file, int line, const char *func,
const char *fmt, ...);
NNG_DECL void log_clear_callback();
#ifdef ENABLE_LOG
#define log_trace(...) \
log_log(NNG_LOG_TRACE, __FILE__, __LINE__, __FUNCTION__, __VA_ARGS__)
#define log_debug(...) \
log_log(NNG_LOG_DEBUG, __FILE__, __LINE__, __FUNCTION__, __VA_ARGS__)
#define log_info(...) \
log_log(NNG_LOG_INFO, __FILE__, __LINE__, __FUNCTION__, __VA_ARGS__)
#define log_warn(...) \
log_log(NNG_LOG_WARN, __FILE__, __LINE__, __FUNCTION__, __VA_ARGS__)
#define log_error(...) \
log_log(NNG_LOG_ERROR, __FILE__, __LINE__, __FUNCTION__, __VA_ARGS__)
#define log_fatal(...) \
log_log(NNG_LOG_FATAL, __FILE__, __LINE__, __FUNCTION__, __VA_ARGS__)
#else
static inline void dummy_log_function(const char *fmt, ...) { (void)fmt; }
#define log_trace(...) dummy_log_function(__VA_ARGS__)
#define log_debug(...) dummy_log_function(__VA_ARGS__)
#define log_info(...) dummy_log_function(__VA_ARGS__)
#define log_warn(...) dummy_log_function(__VA_ARGS__)
#define log_error(...) dummy_log_function(__VA_ARGS__)
#define log_fatal(...) dummy_log_function(__VA_ARGS__)
#endif
#ifdef __cplusplus
}
#endif
#endif

View File

@ -1,77 +0,0 @@
#ifndef NANOLIB_MD5_H
#define NANOLIB_MD5_H
#ifdef __cplusplus
extern "C" {
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#if defined(__WINDOWS__) || defined(WIN32) || defined(WIN64) || defined(_MSC_VER) || defined(_WIN32)
#else
#include <unistd.h>
#endif
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#define READ_DATA_SIZE 1024
#define MD5_SIZE 16
#define MD5_STR_LEN (MD5_SIZE * 2)
#define MD5_LEN 32
typedef struct
{
unsigned int count[2];
unsigned int state[4];
unsigned char buffer[64];
} MD5_CTX;
#define F(x,y,z) ((x & y) | (~x & z))
#define G(x,y,z) ((x & z) | (y & ~z))
#define H(x,y,z) (x^y^z)
#define I(x,y,z) (y ^ (x | ~z))
#define ROTATE_LEFT(x,n) ((x << n) | (x >> (32-n)))
#define FF(a,b,c,d,x,s,ac) \
{ \
a += F(b,c,d) + x + ac; \
a = ROTATE_LEFT(a,s); \
a += b; \
}
#define GG(a,b,c,d,x,s,ac) \
{ \
a += G(b,c,d) + x + ac; \
a = ROTATE_LEFT(a,s); \
a += b; \
}
#define HH(a,b,c,d,x,s,ac) \
{ \
a += H(b,c,d) + x + ac; \
a = ROTATE_LEFT(a,s); \
a += b; \
}
#define II(a,b,c,d,x,s,ac) \
{ \
a += I(b,c,d) + x + ac; \
a = ROTATE_LEFT(a,s); \
a += b; \
}
int ComputeStringMD5(unsigned char *dest_str, unsigned int dest_len, char *md5_str);
int ComputeFileMD5(const char *file_path, char *md5_str);
void MD5Init(MD5_CTX *context);
void MD5Update(MD5_CTX *context, unsigned char *input, unsigned int inputlen);
void MD5Final(MD5_CTX *context, unsigned char digest[16]);
void MD5Transform(unsigned int state[4], unsigned char block[64]);
void MD5Encode(unsigned char *output, unsigned int *input, unsigned int len);
void MD5Decode(unsigned int *output, unsigned char *input, unsigned int len);
#ifdef __cplusplus
}
#endif
#endif

View File

@ -1,138 +0,0 @@
#ifndef MQTT_DB_H
#define MQTT_DB_H
#include "cvector.h"
#include <stdbool.h>
#include <stdint.h>
#include <string.h>
#include "nng/nng.h"
typedef enum {
MQTT_VERSION_V311 = 4,
MQTT_VERSION_V5 = 5,
} mqtt_version_t;
typedef struct dbtree dbtree;
typedef struct {
char * topic;
char **clients;
int cld_cnt;
} dbtree_info;
/**
* @brief dbtree_create - Create a dbtree.
* @param dbtree - dbtree
* @return void
*/
NNG_DECL void dbtree_create(dbtree **db);
/**
* @brief dbtree_destory - Destory dbtree tree
* @param dbtree - dbtree
* @return void
*/
NNG_DECL void dbtree_destory(dbtree *db);
/**
* @brief dbtree_print - Print dbtree for debug.
* @param dbtree - dbtree
* @return void
*/
NNG_DECL void dbtree_print(dbtree *db);
/**
* @brief dbtree_insert_client - check if this
* topic and pipe id is exist on the tree, if
* there is not exist, this func will insert node
* recursively until find all topic then insert
* client on the node.
* @param dbtree - dbtree_node
* @param topic - topic
* @param pipe_id - pipe id
* @return
*/
NNG_DECL void *dbtree_insert_client(
dbtree *db, char *topic, uint32_t pipe_id);
/**
* @brief dbtree_find_client - check if this
* topic and pipe id is exist on the tree, if
* there is not exist, return it.
* @param dbtree - dbtree_node
* @param topic - topic
* @param ctxt - data related with pipe_id
* @param pipe_id - pipe id
* @return
*/
// void *dbtree_find_client(dbtree *db, char *topic, uint32_t pipe_id);
/**
* @brief dbtree_delete_client - This function will
* be called when disconnection and cleansession = 1.
* check if this topic and client id is exist on the
* tree, if there is exist, this func will delete
* related node and client on the tree
* @param dbtree - dbtree
* @param topic - topic
* @param pipe_id - pipe id
* @return
*/
NNG_DECL void *dbtree_delete_client(
dbtree *db, char *topic, uint32_t pipe_id);
/**
* @brief dbtree_find_clients_and_cache_msg - Get all
* subscribers online to this topic
* @param dbtree - dbtree
* @param topic - topic
* @return pipe id array
*/
NNG_DECL uint32_t *dbtree_find_clients(dbtree *db, char *topic);
/**
* @brief dbtree_insert_retain - Insert retain message to this topic.
* @param db - dbtree
* @param topic - topic
* @param ret_msg - dbtree_retain_msg
* @return
*/
NNG_DECL nng_msg *dbtree_insert_retain(
dbtree *db, char *topic, nng_msg *ret_msg);
/**
* @brief dbtree_delete_retain - Delete all retain message to this topic.
* @param db - dbtree
* @param topic - topic
* @return ctxt or NULL, if client can be delete or not
*/
NNG_DECL nng_msg *dbtree_delete_retain(dbtree *db, char *topic);
/**
* @brief dbtree_find_retain - Get all retain message to this topic.
* @param db - dbtree
* @param topic - topic
* @return dbtree_retain_msg pointer vector
*/
NNG_DECL nng_msg **dbtree_find_retain(dbtree *db, char *topic);
/**
* @brief dbtree_find_shared_clients - This function
* will Find shared subscribe client.
* @param dbtree - dbtree
* @param topic - topic
* @return pipe id array
*/
NNG_DECL uint32_t *dbtree_find_shared_clients(dbtree *db, char *topic);
/**
* @brief dbtree_get_tree - This function will
* get all info about this tree.
* @param dbtree - dbtree
* @param cb - a callback function
* @return all info about this tree
*/
NNG_DECL void ***dbtree_get_tree(dbtree *db, void *(*cb)(uint32_t pipe_id));
#endif

View File

@ -1,10 +0,0 @@
#ifndef NANOLIB_H
#define NANOLIB_H
#include "hash_table.h"
#include "mqtt_db.h"
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#endif

View File

@ -1,76 +0,0 @@
#ifndef PARQUET_H
#define PARQUET_H
#include "nng/nng.h"
#include "nng/supplemental/nanolib/conf.h"
#include <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif
typedef struct parquet_object parquet_object;
typedef void (*parquet_cb)(parquet_object *arg);
typedef enum {
WRITE_TO_NORMAL,
WRITE_TO_TEMP,
} parquet_write_type;
typedef struct {
uint32_t start_idx;
uint32_t end_idx;
char *filename;
} parquet_file_range;
typedef struct {
parquet_file_range **range;
int size;
int start; // file range start index
} parquet_file_ranges;
typedef struct {
uint8_t *data;
uint32_t size;
} parquet_data_packet;
struct parquet_object {
uint64_t *keys;
uint8_t **darray;
uint32_t *dsize;
uint32_t size;
nng_aio *aio;
void *arg;
parquet_file_ranges *ranges;
parquet_write_type type;
char *topic;
};
parquet_object *parquet_object_alloc(uint64_t *keys, uint8_t **darray,
uint32_t *dsize, uint32_t size, nng_aio *aio, void *arg);
void parquet_object_free(parquet_object *elem);
parquet_file_range *parquet_file_range_alloc(uint32_t start_idx, uint32_t end_idx, char *filename);
void parquet_file_range_free(parquet_file_range *range);
void parquet_object_set_cb(parquet_object *obj, parquet_cb cb);
int parquet_write_batch_async(parquet_object *elem);
// Write a batch to a temporary Parquet file, utilize it in scenarios where a single
// file is sufficient for writing, sending, and subsequent deletion.
int parquet_write_batch_tmp_async(parquet_object *elem);
int parquet_write_launcher(conf_parquet *conf);
const char *parquet_find(uint64_t key);
const char **parquet_find_span(
uint64_t start_key, uint64_t end_key, uint32_t *size);
parquet_data_packet *parquet_find_data_packet(conf_parquet *conf, char *filename, uint64_t key);
parquet_data_packet **parquet_find_data_packets(conf_parquet *conf, char **filenames, uint64_t *keys, uint32_t len);
parquet_data_packet **parquet_find_data_span_packets(conf_parquet *conf, uint64_t start_key, uint64_t end_key, uint32_t *size, char *topic);
#ifdef __cplusplus
}
#endif
#endif

View File

@ -1,105 +0,0 @@
/* A Bison parser, made by GNU Bison 3.8.2. */
/* Bison interface for Yacc-like parsers in C
Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2021 Free Software Foundation,
Inc.
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
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. */
/* As a special exception, you may create a larger work that contains
part or all of the Bison parser skeleton and distribute that work
under terms of your choice, so long as that work isn't itself a
parser generator using the skeleton or a modified version thereof
as a parser skeleton. Alternatively, if you modify or redistribute
the parser skeleton itself, you may (at your option) remove this
special exception, which will cause the skeleton and the resulting
Bison output files to be licensed under the GNU General Public
License without this special exception.
This special exception was added by the Free Software Foundation in
version 2.2 of Bison. */
/* DO NOT RELY ON FEATURES THAT ARE NOT DOCUMENTED in the manual,
especially those whose name start with YY_ or yy_. They are
private implementation details that can be changed or removed. */
#ifndef YY_YY_NANOMQ_NNG_SRC_SUPPLEMENTAL_NANOLIB_PARSER_H_INCLUDED
# define YY_YY_NANOMQ_NNG_SRC_SUPPLEMENTAL_NANOLIB_PARSER_H_INCLUDED
/* Debug traces. */
#ifndef YYDEBUG
# define YYDEBUG 0
#endif
#if YYDEBUG
extern int yydebug;
#endif
/* Token kinds. */
#ifndef YYTOKENTYPE
# define YYTOKENTYPE
enum yytokentype
{
YYEMPTY = -2,
YYEOF = 0, /* "end of file" */
YYerror = 256, /* error */
YYUNDEF = 257, /* "invalid token" */
LCURLY = 258, /* LCURLY */
RCURLY = 259, /* RCURLY */
LBRAC = 260, /* LBRAC */
RBRAC = 261, /* RBRAC */
COMMA = 262, /* COMMA */
PUNCT = 263, /* PUNCT */
VTRUE = 264, /* VTRUE */
VFALSE = 265, /* VFALSE */
VNULL = 266, /* VNULL */
STRING = 267, /* STRING */
USTRING = 268, /* USTRING */
RSTRING = 269, /* RSTRING */
BYTESIZE = 270, /* BYTESIZE */
PERCENT = 271, /* PERCENT */
DURATION = 272, /* DURATION */
DECIMAL = 273, /* DECIMAL */
INTEGER = 274 /* INTEGER */
};
typedef enum yytokentype yytoken_kind_t;
#endif
/* Value type. */
#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
union YYSTYPE
{
#line 25 "parser.y"
double intval;
double floatval;
char *strval;
struct cJSON *jsonval;
struct jso_kv *jkval;
#line 91 "nng/src/supplemental/nanolib/parser.h"
};
typedef union YYSTYPE YYSTYPE;
# define YYSTYPE_IS_TRIVIAL 1
# define YYSTYPE_IS_DECLARED 1
#endif
extern YYSTYPE yylval;
int yyparse (struct cJSON **jso);
#endif /* !YY_YY_NANOMQ_NNG_SRC_SUPPLEMENTAL_NANOLIB_PARSER_H_INCLUDED */

View File

@ -1,87 +0,0 @@
#ifndef QUEUE_H
#define QUEUE_H
#include <stdio.h>
#include <stdlib.h>
#define INITIAL_SIZE 5
typedef struct {
void** array;
int front;
int rear;
int size;
int capacity;
} CircularQueue;
#define INIT_QUEUE(queue) \
do { \
(queue).array = (void**)malloc(INITIAL_SIZE * sizeof(void*)); \
(queue).front = -1; \
(queue).rear = -1; \
(queue).size = 0; \
(queue).capacity = INITIAL_SIZE; \
} while(0)
#define NEXT_INDEX(index, size) (((index) + 1) % (size))
#define IS_EMPTY(queue) ((queue).size == 0)
#define QUEUE_SIZE(queue) ((queue).size)
#define ENQUEUE(queue, element) \
do { \
if ((queue).size == (queue).capacity) { \
int new_capacity = (queue).capacity * 2; \
void** new_array = (void**)malloc(new_capacity * sizeof(void*)); \
int i = 0; \
int j = (queue).front; \
while (i < (queue).size) { \
new_array[i] = (queue).array[j]; \
i++; \
j = NEXT_INDEX(j, (queue).capacity); \
} \
free((queue).array); \
(queue).array = new_array; \
(queue).front = 0; \
(queue).rear = (queue).size - 1; \
(queue).capacity = new_capacity; \
} \
if (IS_EMPTY(queue)) { \
(queue).front = 0; \
} \
(queue).rear = NEXT_INDEX((queue).rear, (queue).capacity); \
(queue).array[(queue).rear] = (element); \
(queue).size++; \
} while(0)
#define DEQUEUE(queue) \
({ \
void* dequeued_element = NULL; \
if (IS_EMPTY(queue)) { \
printf("Queue is empty. Cannot dequeue.\n"); \
} else { \
dequeued_element = (queue).array[(queue).front]; \
(queue).front = NEXT_INDEX((queue).front, (queue).capacity); \
(queue).size--; \
if (IS_EMPTY(queue)) { \
(queue).front = -1; \
(queue).rear = -1; \
} \
} \
dequeued_element; \
})
#define FOREACH_QUEUE(queue, elem) \
for (int i = (queue).front, _count = 0; \
(queue).size != 0 && _count < (queue).size; \
i = NEXT_INDEX(i, (queue).capacity), _count++) \
\
for (elem = (queue).array[i]; \
elem != NULL; \
elem = NULL)
#define DESTROY_QUEUE(queue) free((queue).array)
#endif

View File

@ -1,138 +0,0 @@
//
// Copyright 2023 NanoMQ Team, Inc. <jaylin@emqx.io>
//
// This software is supplied under the terms of the MIT License, a
// copy of which should be located in the distribution where this
// file was obtained (LICENSE.txt). A copy of the license may also be
// found online at https://opensource.org/licenses/MIT.
//
#ifndef RINGBUFFER_H
#define RINGBUFFER_H
#include <stdio.h>
#include <stdlib.h>
#include "nng/nng.h"
#include "nng/supplemental/util/platform.h"
#include "nng/supplemental/nanolib/cvector.h"
#define RBNAME_LEN 100
#define RINGBUFFER_MAX_SIZE 0xffffffff
#define RBRULELIST_MAX_SIZE 0xff
#define ENQUEUE_IN_HOOK 0x0001
#define ENQUEUE_OUT_HOOK 0x0010
#define DEQUEUE_IN_HOOK 0x0100
#define DEQUEUE_OUT_HOOK 0x1000
#define HOOK_MASK ((ENQUEUE_IN_HOOK) | (ENQUEUE_OUT_HOOK) | (DEQUEUE_IN_HOOK) | (DEQUEUE_OUT_HOOK))
typedef struct ringBuffer_s ringBuffer_t;
typedef struct ringBufferMsg_s ringBufferMsg_t;
typedef struct ringBufferRule_s ringBufferRule_t;
/* For RB_FULL_FILE */
typedef struct ringBufferFile_s ringBufferFile_t;
typedef struct ringBufferFileRange_s ringBufferFileRange_t;
struct ringBufferMsg_s {
uint64_t key;
void *data;
/* TTL of each message */
unsigned long long expiredAt;
};
enum fullOption {
RB_FULL_NONE,
RB_FULL_DROP,
RB_FULL_RETURN,
RB_FULL_FILE,
RB_FULL_MAX
};
struct ringBufferFileRange_s {
uint64_t startidx;
uint64_t endidx;
char *filename;
};
struct ringBufferFile_s {
uint64_t *keys;
nng_aio *aio;
ringBufferFileRange_t **ranges;
};
struct ringBuffer_s {
char name[RBNAME_LEN];
unsigned int head;
unsigned int tail;
unsigned int size;
unsigned int cap;
/* TTL of all messages in ringbuffer */
unsigned long long expiredAt;
unsigned int enqinRuleListLen;
unsigned int enqoutRuleListLen;
unsigned int deqinRuleListLen;
unsigned int deqoutRuleListLen;
ringBufferRule_t *enqinRuleList[RBRULELIST_MAX_SIZE];
ringBufferRule_t *enqoutRuleList[RBRULELIST_MAX_SIZE];
ringBufferRule_t *deqinRuleList[RBRULELIST_MAX_SIZE];
ringBufferRule_t *deqoutRuleList[RBRULELIST_MAX_SIZE];
enum fullOption fullOp;
/* FOR RB_FULL_FILE */
ringBufferFile_t **files;
nng_mtx *ring_lock;
ringBufferMsg_t *msgs;
};
struct ringBufferRule_s {
/*
* flag: ENQUEUE_IN_HOOK/ENQUEUE_OUT_HOOK/DEQUEUE_IN_HOOK/DEQUEUE_OUT_HOOK
* return: 0: success, -1: failed
*/
int (*match)(ringBuffer_t *rb, void *data, int flag);
/*
* return: 0: continue, -1: stop and return
*/
int (*target)(ringBuffer_t *rb, void *data, int flag);
};
int ringBuffer_add_rule(ringBuffer_t *rb,
int (*match)(ringBuffer_t *rb, void *data, int flag),
int (*target)(ringBuffer_t *rb, void *data, int flag),
int flag);
int ringBuffer_init(ringBuffer_t **rb,
unsigned int cap,
enum fullOption fullOp,
unsigned long long expiredAt);
int ringBuffer_enqueue(ringBuffer_t *rb,
uint64_t key,
void *data,
unsigned long long expiredAt,
nng_aio *aio);
int ringBuffer_dequeue(ringBuffer_t *rb, void **data);
int ringBuffer_release(ringBuffer_t *rb);
int ringBuffer_search_msg_by_key(ringBuffer_t *rb, uint64_t key, nng_msg **msg);
int ringBuffer_search_msgs_by_key(ringBuffer_t *rb, uint64_t key, uint32_t count, nng_msg ***list);
int ringBuffer_search_msgs_fuzz(ringBuffer_t *rb,
uint64_t start,
uint64_t end,
uint32_t *count,
nng_msg ***list);
int ringBuffer_get_and_clean_msgs(ringBuffer_t *rb,
unsigned int *count, nng_msg ***list);
int ringBuffer_set_fullOp(ringBuffer_t *rb, enum fullOption fullOp);
#ifdef SUPP_PARQUET
int ringBuffer_get_msgs_from_file(ringBuffer_t *rb, void ***msgs, int **msgLen);
int ringBuffer_get_msgs_from_file_by_keys(ringBuffer_t *rb, uint64_t *keys, uint32_t count,
void ***msgs, int **msgLen);
#endif
#endif

View File

@ -1,138 +0,0 @@
#ifndef RULE_H
#define RULE_H
#include <stdint.h>
#include "nng/nng.h"
#include "nng/supplemental/util/platform.h"
typedef enum {
RULE_QOS,
RULE_ID,
RULE_TOPIC,
RULE_CLIENTID,
RULE_USERNAME,
RULE_PASSWORD,
RULE_TIMESTAMP,
RULE_PAYLOAD_ALL,
RULE_PAYLOAD_FIELD,
} rule_type;
typedef enum {
RULE_CMP_NONE, // compare type init value
RULE_CMP_EQUAL, // compare symbol '='
RULE_CMP_UNEQUAL, // compare symbol '!=' or '<>'
RULE_CMP_GREATER, // compare symbol '>'
RULE_CMP_LESS, // compare symbol '<'
RULE_CMP_GREATER_AND_EQUAL, // compare symbol '>='
RULE_CMP_LESS_AND_EQUAL, // compare symbol '<='
} rule_cmp_type;
typedef enum {
RULE_FORWORD_SQLITE,
RULE_FORWORD_FDB,
RULE_FORWORD_MYSQL,
RULE_FORWORD_REPUB
} rule_forword_type;
typedef struct {
char **psa; // payload string array, for multi level json
char *pas; // payload field string or alias
char *filter; // payload field related filter
rule_cmp_type cmp_type; // payload field compare type
bool is_store; // payload value is store or not
uint8_t type; // payload field value type
void *value; // payload field value
} rule_payload;
typedef struct {
bool flag[9];
bool auto_inc;
uint8_t type;
void *value;
char **key_arr;
} rule_key;
typedef struct {
char *address;
uint8_t proto_ver;
char *clientid;
bool clean_start;
char *username;
char *password;
uint16_t keepalive;
char *topic;
void *sock;
} repub_t;
typedef struct {
char *table;
char *host;
char *username;
char *password;
void *conn;
} rule_mysql;
typedef struct {
/*
** flag[0] == RULE_QOS,
** flag[1] == RULE_ID,
** flag[2] == RULE_TOPIC,
** flag[3] == RULE_CLIENTID,
** flag[4] == RULE_USERNAME,
** flag[5] == RULE_PASSWORD,
** flag[6] == RULE_TIMESTAMP,
** flag[7] == RULE_PAYLOAD_ALL,
** flag[8] == RULE_PAYLOAD_FIELD,
*/
bool flag[9]; // if this field need to store
bool enabled; // if this rule is enabled
rule_cmp_type cmp_type[8]; // filter compare type
rule_forword_type forword_type; // forword type
char *topic; // topic parse from sql 'from'
char *as[8]; // if field string as a new string
rule_payload **payload; // this is for payload info
char **filter; // filter parse from sql 'where'
char *sqlite_table;
char *raw_sql;
uint32_t rule_id;
rule_key *key;
repub_t *repub;
rule_mysql *mysql;
} rule;
typedef struct {
/*
** 00000000 == OFF,
** 00000001 == Sqlite ON,
** 00000010 == Fdb ON,
** 00000100 == MySOL ON
** 00001000 == Repub ON
** 00010000
** 00100000
** 01000000
*/
uint8_t option;
/*
** rdb[0] == Sqlite
** rdb[1] == Fdb
** rdb[2] == MySOL
** rdb[3] == RePub
*/
void *rdb[3];
rule *rules;
char *sqlite_db;
char *mysql_db;
nng_mtx *rule_mutex;
} conf_rule;
int rule_find_key(const char *str, size_t len);
uint32_t rule_generate_rule_id(void);
char *rule_get_key_arr(char *p, rule_key *key);
bool rule_sql_parse(conf_rule *cr, char *sql);
repub_t *rule_repub_init(void);
void rule_repub_free(repub_t *repub);
void rule_free(rule *r);
bool rule_mysql_check(rule_mysql *mysql);
void rule_mysql_free(rule_mysql *mysql);
rule_mysql *rule_mysql_init(void);
#endif

Some files were not shown because too many files have changed in this diff Show More