+void cmd_subs(char *cmdbuf) {
+ char cmd[20];
+ char roomname[ROOMNAMELEN];
+ char emailaddr[1024];
+ char options[256];
+ char url[1024];
+ char token[128];
+
+ extract_token(cmd, cmdbuf, 0, '|', sizeof cmd); // token 0 is the sub-command being sent
+ extract_token(roomname, cmdbuf, 1, '|', sizeof roomname); // token 1 is always a room name
+
+ // First confirm that the caller is referencing a room that actually exists.
+ if (CtdlGetRoom(&CC->room, roomname) != 0) {
+ cprintf("%d There is no list called '%s'\n", ERROR + ROOM_NOT_FOUND, roomname);
+ return;
+ }
+
+ if ((CC->room.QRflags2 & QR2_SELFLIST) == 0) {
+ cprintf("%d '%s' does not accept subscribe/unsubscribe requests.\n", ERROR + ROOM_NOT_FOUND, roomname);
+ return;
+ }
+
+ // Room confirmed, now parse the command.
+
+ if (!strcasecmp(cmd, "subscribe")) {
+ extract_token(emailaddr, cmdbuf, 2, '|', sizeof emailaddr); // token 2 is the subscriber's email address
+ extract_token(options, cmdbuf, 3, '|', sizeof options); // there are no options ... ignore this token
+ extract_token(url, cmdbuf, 4, '|', sizeof url); // token 3 is the URL at which we subscribed
+ do_subscribe_or_unsubscribe(SUBSCRIBE, emailaddr, url);
+ }
+
+ else if (!strcasecmp(cmd, "unsubscribe")) {
+ extract_token(emailaddr, cmdbuf, 2, '|', sizeof emailaddr); // token 2 is the subscriber's email address
+ extract_token(options, cmdbuf, 3, '|', sizeof options); // there are no options ... ignore this token
+ extract_token(url, cmdbuf, 4, '|', sizeof url); // token 3 is the URL at which we subscribed
+ do_subscribe_or_unsubscribe(UNSUBSCRIBE, emailaddr, url);
+ }
+
+ else if (!strcasecmp(cmd, "confirm")) {
+ extract_token(token, cmdbuf, 2, '|', sizeof token); // token 2 is the confirmation token
+ cprintf("%d not implemented\n", ERROR);
+ }
+
+ else { // sorry man, I can't deal with that
+ cprintf("%d Invalid command '%s'\n", ERROR + ILLEGAL_VALUE, cmd);
+ }