Skip to content

Commit fba338e

Browse files
committed
Use 'metadata' batch instead of RPL_METADATAEND
1 parent 37cb5fb commit fba338e

File tree

1 file changed

+63
-23
lines changed

1 file changed

+63
-23
lines changed

files/metadata2.c

Lines changed: 63 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ module
2727

2828
#define RPL_WHOISKEYVALUE 760
2929
#define RPL_KEYVALUE 761
30-
#define RPL_METADATAEND 762
3130
#define RPL_KEYNOTSET 766
3231
#define RPL_METADATASUBOK 770
3332
#define RPL_METADATAUNSUBOK 771
@@ -36,7 +35,6 @@ module
3635

3736
#define STR_RPL_WHOISKEYVALUE /* 760 */ "%s %s %s :%s"
3837
#define STR_RPL_KEYVALUE /* 761 */ "%s %s %s :%s"
39-
#define STR_RPL_METADATAEND /* 762 */ ":end of metadata"
4038
#define STR_RPL_KEYNOTSET /* 766 */ "%s %s :no matching key"
4139
#define STR_RPL_METADATASUBOK /* 770 */ ":%s"
4240
#define STR_RPL_METADATAUNSUBOK /* 771 */ ":%s"
@@ -113,6 +111,36 @@ module
113111
#define USER_METADATA(client) moddata_client(client, metadataUser).ptr
114112
#define CHANNEL_METADATA(channel) moddata_channel(channel, metadataChannel).ptr
115113

114+
115+
#if defined(__GNUC__)
116+
#define PUSH_IGNORE_ADDRESS \
117+
_Pragma("GCC diagnostic push") \
118+
_Pragma("GCC diagnostic ignored \"-Waddress\"")
119+
#define POP_IGNORE_ADDRESS \
120+
_Pragma("GCC diagnostic pop")
121+
#else
122+
#define PUSH_IGNORE_ADDRESS
123+
#define POP_IGNORE_ADDRESS
124+
#endif
125+
126+
#define batched(func, client, batch_id, ...) \
127+
{ \
128+
MessageTag *mtags = NULL; \
129+
MessageTag *m; \
130+
PUSH_IGNORE_ADDRESS /* -Waddress warns when batch_id is an array */ \
131+
if (!BadPtr(batch_id)) \
132+
POP_IGNORE_ADDRESS \
133+
{ \
134+
mtags = safe_alloc(sizeof(MessageTag)); \
135+
mtags->name = strdup("batch"); \
136+
mtags->value = strdup(batchid); \
137+
} \
138+
func(client, mtags, ##__VA_ARGS__); \
139+
if (mtags) \
140+
free_message_tags(mtags); \
141+
}
142+
143+
116144
struct metadata {
117145
char *name;
118146
char *value;
@@ -161,8 +189,8 @@ void metadata_free_list(struct metadata *metadata, const char *whose, Client *cl
161189
struct metadata_moddata_user *metadata_prepare_user_moddata(Client *user);
162190
void metadata_set_channel(Channel *channel, const char *key, const char *value, Client *client);
163191
void metadata_set_user(Client *user, const char *key, const char *value, Client *client);
164-
void metadata_send_channel(Channel *channel, const char *key, Client *client);
165-
void metadata_send_user(Client *user, const char *key, Client *client);
192+
void metadata_send_channel(Channel *channel, const char *key, Client *client, const char *batchid);
193+
void metadata_send_user(Client *user, const char *key, Client *client, const char *batchid);
166194
int metadata_subscribe(const char *key, Client *client, int remove);
167195
void metadata_clear_channel(Channel *channel, Client *client);
168196
void metadata_clear_user(Client *user, Client *client);
@@ -915,7 +943,7 @@ int metadata_subscribe(const char *key, Client *client, int remove)
915943
return 0;
916944
}
917945

918-
void metadata_send_channel(Channel *channel, const char *key, Client *client)
946+
void metadata_send_channel(Channel *channel, const char *key, Client *client, const char *batchid)
919947
{
920948
struct metadata *metadata;
921949
int found = 0;
@@ -924,15 +952,15 @@ void metadata_send_channel(Channel *channel, const char *key, Client *client)
924952
if (!strcasecmp(key, metadata->name))
925953
{
926954
found = 1;
927-
sendnumeric(client, RPL_KEYVALUE, channel->name, key, "*", metadata->value);
955+
batched(sendtaggednumeric, client, batchid, RPL_KEYVALUE, channel->name, key, "*", metadata->value);
928956
break;
929957
}
930958
}
931959
if (!found)
932-
sendnumeric(client, RPL_KEYNOTSET, channel->name, key);
960+
batched(sendtaggednumeric, client, batchid, RPL_KEYNOTSET, channel->name, key);
933961
}
934962

935-
void metadata_send_user(Client *user, const char *key, Client *client)
963+
void metadata_send_user(Client *user, const char *key, Client *client, const char *batchid)
936964
{
937965
if (!user)
938966
user = client;
@@ -946,12 +974,12 @@ void metadata_send_user(Client *user, const char *key, Client *client)
946974
if (!strcasecmp(key, metadata->name))
947975
{
948976
found = 1;
949-
sendnumeric(client, RPL_KEYVALUE, user->name, key, "*", metadata->value);
977+
batched(sendtaggednumeric, client, batchid, RPL_KEYVALUE, user->name, key, "*", metadata->value);
950978
break;
951979
}
952980
}
953981
if (!found)
954-
sendnumeric(client, RPL_KEYNOTSET, user->name, key);
982+
batched(sendtaggednumeric, client, batchid, RPL_KEYNOTSET, user->name, key);
955983
}
956984

957985
void metadata_clear_channel(Channel *channel, Client *client)
@@ -987,20 +1015,33 @@ void metadata_send_subscribtions(Client *client)
9871015
void metadata_send_all_for_channel(Channel *channel, Client *client)
9881016
{
9891017
struct metadata *metadata;
1018+
char batchid[BATCHLEN+1];
1019+
1020+
generate_batch_id(batchid);
1021+
1022+
sendto_one(client, NULL, ":%s BATCH +%s metadata", me.name, batchid);
9901023
for (metadata = CHANNEL_METADATA(channel); metadata; metadata = metadata->next)
991-
sendnumeric(client, RPL_KEYVALUE, channel->name, metadata->name, "*", metadata->value);
1024+
batched(sendtaggednumeric, client, batchid, RPL_KEYVALUE, channel->name, metadata->name, "*", metadata->value);
1025+
sendto_one(client, NULL, ":%s BATCH -%s", me.name, batchid);
9921026
}
9931027

9941028
void metadata_send_all_for_user(Client *user, Client *client)
9951029
{
9961030
struct metadata *metadata;
1031+
char batchid[BATCHLEN+1];
1032+
1033+
generate_batch_id(batchid);
1034+
9971035
if (!user)
9981036
user = client;
9991037
struct metadata_moddata_user *moddata = USER_METADATA(user);
1000-
if (!moddata)
1001-
return;
1002-
for (metadata = moddata->metadata; metadata; metadata = metadata->next)
1003-
sendnumeric(client, RPL_KEYVALUE, user->name, metadata->name, "*", metadata->value);
1038+
1039+
sendto_one(client, NULL, ":%s BATCH +%s metadata", me.name, batchid);
1040+
if (moddata) {
1041+
for (metadata = moddata->metadata; metadata; metadata = metadata->next)
1042+
batched(sendtaggednumeric, client, batchid, RPL_KEYVALUE, user->name, metadata->name, "*", metadata->value);
1043+
}
1044+
sendto_one(client, NULL, ":%s BATCH -%s", me.name, batchid);
10041045
}
10051046

10061047
int metadata_key_valid(const char *key)
@@ -1065,6 +1106,7 @@ CMD_FUNC(cmd_metadata_local)
10651106
const char *value = NULL;
10661107
int keyindex = 3-1;
10671108
char *channame;
1109+
char batchid[BATCHLEN-1];
10681110

10691111
CHECKPARAMSCNT_OR_DIE(2, return);
10701112

@@ -1076,21 +1118,24 @@ CMD_FUNC(cmd_metadata_local)
10761118
CHECKREGISTERED_OR_DIE(client, return);
10771119
CHECKPARAMSCNT_OR_DIE(3, return);
10781120
PROCESS_TARGET_OR_DIE(target, user, channel, return);
1121+
generate_batch_id(batchid);
1122+
sendto_one(client, NULL, ":%s BATCH +%s metadata", me.name, batchid);
10791123
FOR_EACH_KEY(keyindex, parc, parv)
10801124
{
10811125
if (metadata_check_perms(user, channel, client, key, MODE_GET))
10821126
{
10831127
if (!metadata_key_valid(key))
10841128
{
1085-
sendto_one(client, NULL, STR_FAIL_INVALID_KEY, me.name, key);
1129+
batched(sendto_one, client, batchid, STR_FAIL_INVALID_KEY, me.name, key);
10861130
continue;
10871131
}
10881132
if (channel)
1089-
metadata_send_channel(channel, key, client);
1133+
metadata_send_channel(channel, key, client, batchid);
10901134
else
1091-
metadata_send_user(user, key, client);
1135+
metadata_send_user(user, key, client, batchid);
10921136
}
10931137
}
1138+
sendto_one(client, NULL, ":%s BATCH -%s", me.name, batchid);
10941139
} else if (!strcasecmp(cmd, "LIST"))
10951140
{ /* we're just not sending anything if there are no permissions */
10961141
CHECKREGISTERED_OR_DIE(client, return);
@@ -1102,7 +1147,6 @@ CMD_FUNC(cmd_metadata_local)
11021147
else
11031148
metadata_send_all_for_user(user, client);
11041149
}
1105-
sendnumeric(client, RPL_METADATAEND);
11061150
} else if (!strcasecmp(cmd, "SET"))
11071151
{
11081152
CHECKPARAMSCNT_OR_DIE(3, return);
@@ -1134,7 +1178,6 @@ CMD_FUNC(cmd_metadata_local)
11341178
else
11351179
metadata_clear_user(user, client);
11361180
}
1137-
sendnumeric(client, RPL_METADATAEND);
11381181
} else if (!strcasecmp(cmd, "SUB"))
11391182
{
11401183
PROCESS_TARGET_OR_DIE(target, user, channel, return);
@@ -1150,7 +1193,6 @@ CMD_FUNC(cmd_metadata_local)
11501193
continue;
11511194
}
11521195
}
1153-
sendnumeric(client, RPL_METADATAEND);
11541196
} else if (!strcasecmp(cmd, "UNSUB"))
11551197
{
11561198
CHECKREGISTERED_OR_DIE(client, return);
@@ -1167,12 +1209,10 @@ CMD_FUNC(cmd_metadata_local)
11671209
continue;
11681210
}
11691211
}
1170-
sendnumeric(client, RPL_METADATAEND);
11711212
} else if (!strcasecmp(cmd, "SUBS"))
11721213
{
11731214
CHECKREGISTERED_OR_DIE(client, return);
11741215
metadata_send_subscribtions(client);
1175-
sendnumeric(client, RPL_METADATAEND);
11761216
} else if (!strcasecmp(cmd, "SYNC"))
11771217
{ /* the SYNC command is ignored, as we're using events to send out the queue - only validate the params */
11781218
CHECKREGISTERED_OR_DIE(client, return);

0 commit comments

Comments
 (0)