shithub: masto9

Download patch

ref: 454703e94b801ebe25b61f964d52ad4fbb7bd3d9
parent: 22b180670881db7c4850e7fd9786ffcb70498057
author: Julien Blanchard <julien@typed-hole.org>
date: Fri Apr 7 07:11:58 EDT 2023

Some formatting

--- /dev/null
+++ b/.clang-format
@@ -1,0 +1,11 @@
+BasedOnStyle: LLVM
+IndentWidth: 4
+TabWidth: 4
+UseTab: Always
+AllowShortFunctionsOnASingleLine: InlineOnly
+AlwaysBreakAfterReturnType: TopLevelDefinitions
+BreakBeforeBraces: Allman
+SpaceBeforeParens: false
+PointerAlignment: Right
+AlignTrailingComments: true
+SortIncludes: false
\ No newline at end of file
--- a/http.c
+++ b/http.c
@@ -2,11 +2,10 @@
 #include <libc.h>
 #include <stdio.h>
 #include <json.h>
-#include <bio.h>
 
 #include "masto9.h"
 
-#define BOUNDARY "---------------------------328018649918767126933410246249"
+#define BOUNDARY "--------HJBOUNDARY"
 
 int
 webclone(int *c)
@@ -16,7 +15,7 @@
 
 	if((fd = open("/mnt/web/clone", ORDWR)) < 0)
 		sysfatal("couldn't open %s: %r", buf);
-	if((n = read(fd, buf, sizeof buf-1)) < 0)
+	if((n = read(fd, buf, sizeof buf - 1)) < 0)
 		sysfatal("reading clone: %r");
 	if(n == 0)
 		sysfatal("short read on clone");
@@ -29,34 +28,34 @@
 char *
 httpget(char *token, char *url)
 {
-	int	ctlfd, bodyfd, conn, n;
+	int ctlfd, bodyfd, conn, n;
 	char buf[1024];
 	char body[TLBUFSIZE];
-  char *bearer_token;
+	char *bearer_token;
 
-  ctlfd = webclone(&conn);
+	ctlfd = webclone(&conn);
 
 	snprint(buf, sizeof buf, "url %s", url);
 	if(write(ctlfd, buf, n = strlen(buf)) != n)
 		sysfatal("post: write: %r");
 
-  /* Request */
-  bearer_token = concat("Authorization: Bearer ", token);
-	if (fprint(ctlfd, "headers %s", bearer_token) <= 0)
+	/* Request */
+	bearer_token = concat("Authorization: Bearer ", token);
+	if(fprint(ctlfd, "headers %s", bearer_token) <= 0)
 		sysfatal("write ctl failed 'headers'");
 
 	snprint(buf, sizeof(buf), "/mnt/web/%d/body", conn);
 
-  /* Response */
-	if ((bodyfd = open(buf, OREAD)) < 0)
+	/* Response */
+	if((bodyfd = open(buf, OREAD)) < 0)
 		sysfatal("open %s: %r", buf);
-	if (readn(bodyfd, body, TLBUFSIZE) <= 0)
+	if(readn(bodyfd, body, TLBUFSIZE) <= 0)
 		sysfatal("readn: %r");
 
 	close(bodyfd);
 	close(ctlfd);
 
-  return body;
+	return body;
 }
 
 char *
@@ -64,54 +63,61 @@
 {
 	int n, ctlfd, bodyfd, conn;
 	char buf[TOOTBUFSIZE];
-  char *bearer_token;
+	char *bearer_token;
 
-  ctlfd = webclone(&conn);
+	ctlfd = webclone(&conn);
 
 	snprint(buf, sizeof buf, "url %s", url);
 	if(write(ctlfd, buf, n = strlen(buf)) != n)
 		sysfatal("post: write: %r");
 
-  /* Request */
-  bearer_token = concat("Authorization: Bearer ", token);
-	if (fprint(ctlfd, "headers %s", bearer_token) <= 0)
+	/* Request */
+	bearer_token = concat("Authorization: Bearer ", token);
+	if(fprint(ctlfd, "headers %s", bearer_token) <= 0)
 		sysfatal("write ctl failed 'headers'");
 
 	snprint(buf, TOOTBUFSIZE, "/mnt/web/%d/postbody", conn);
 	bodyfd = open(buf, OWRITE);
-	if (bodyfd < 0)
+	if(bodyfd < 0)
 		sysfatal("open bodyfd %s: %r", buf);
 
-  if (write(bodyfd, text, strlen(text)) < 0)
-    sysfatal("write: %r");
+	if(write(bodyfd, text, strlen(text)) < 0)
+		sysfatal("write: %r");
 
 	close(bodyfd);
 
-  /* Response */
-  snprint(buf, TOOTBUFSIZE, "/mnt/web/%d/body", conn);
+	/* Response */
+	snprint(buf, TOOTBUFSIZE, "/mnt/web/%d/body", conn);
 	if((bodyfd = open(buf, OREAD)) < 0)
 		sysfatal("post: opening body: %r");
-	if (readn(bodyfd, buf, TOOTBUFSIZE) <= 0)
+	if(readn(bodyfd, buf, TOOTBUFSIZE) <= 0)
 		sysfatal("readn: %r");
 
 	close(bodyfd);
 	close(ctlfd);
 
-  return buf;
+	return buf;
 }
 
-char
-*mime_type(char *filename)
+char *
+mime_type(char *filename)
 {
-    char *ext = strrchr(filename, '.');
-    if (!ext) return "application/octet-stream";
-    if (strcmp(ext, ".jpg") == 0 || strcmp(ext, ".jpeg") == 0) return "image/jpeg";
-    if (strcmp(ext, ".gif") == 0) return "image/gif";
-    if (strcmp(ext, ".png") == 0) return "image/png";
-    if (strcmp(ext, ".mp3") == 0) return "audio/mp3";
-    if (strcmp(ext, ".mp4") == 0) return "video/mp4";
-    if (strcmp(ext, ".webm") == 0) return "video/webm";
-    return "application/octet-stream";
+	char *ext = strrchr(filename, '.');
+	if(!ext)
+		return "application/octet-stream";
+	if(strcmp(ext, ".jpg") == 0 || strcmp(ext, ".jpeg") == 0)
+		return "image/jpeg";
+	if(strcmp(ext, ".gif") == 0)
+		return "image/gif";
+	if(strcmp(ext, ".png") == 0)
+		return "image/png";
+	if(strcmp(ext, ".mp3") == 0)
+		return "audio/mp3";
+	if(strcmp(ext, ".mp4") == 0)
+		return "video/mp4";
+	if(strcmp(ext, ".webm") == 0)
+		return "video/webm";
+	return "application/octet-stream";
 }
 
 char *
@@ -119,63 +125,65 @@
 {
 	char buf[BUFSIZE];
 	int n, conn, ctlfd, bodyfd;
-  char *bearer_token, *multipart_header;
-  FileAttachment *fa;
+	char *bearer_token, *multipart_header;
+	FileAttachment *fa;
 
 	ctlfd = open("/mnt/web/clone", ORDWR);
-	if (ctlfd < 0)
+	if(ctlfd < 0)
 		sysfatal("open: %r");
 	n = read(ctlfd, buf, sizeof(buf));
-	if (n < 0)
+	if(n < 0)
 		sysfatal("read: %r");
 	buf[n] = '\0';
 	conn = atoi(buf);
 
-  fa = readfile(filepath);
+	fa = readfile(filepath);
 
 	snprint(buf, sizeof buf, "url %s", url);
 	if(write(ctlfd, buf, n = strlen(buf)) != n)
 		sysfatal("post: write: %r");
-  bearer_token = esmprint("Authorization: Bearer %s", token);
+	bearer_token = esmprint("Authorization: Bearer %s", token);
 	snprint(buf, sizeof buf, "headers %s", bearer_token);
 	if(write(ctlfd, buf, n = strlen(buf)) != n)
 		sysfatal("post: write headers: %r");
-	snprint(buf, sizeof buf, "contenttype multipart/form-data; boundary=%s", BOUNDARY);
+	snprint(buf, sizeof buf, "contenttype multipart/form-data; boundary=%s",
+			BOUNDARY);
 	if(write(ctlfd, buf, n = strlen(buf)) != n)
 		sysfatal("post: write contenttype: %r");
 
-  snprint(buf, sizeof buf, "/mnt/web/%d/postbody", conn);
-	if ((bodyfd = open(buf, OWRITE)) < 0)
+	snprint(buf, sizeof buf, "/mnt/web/%d/postbody", conn);
+	if((bodyfd = open(buf, OWRITE)) < 0)
 		sysfatal("open bodyfd %s: %r", buf);
 
-  /* Write multipart body */
-  write(bodyfd, "--", 2);
-  write(bodyfd, BOUNDARY, strlen(BOUNDARY));
-  write(bodyfd, "\r\n", 2);
+	/* Write multipart body */
+	write(bodyfd, "--", 2);
+	write(bodyfd, BOUNDARY, strlen(BOUNDARY));
+	write(bodyfd, "\r\n", 2);
 
-  multipart_header = esmprint("Content-Disposition: form-data; \
+	multipart_header = esmprint("Content-Disposition: form-data; \
                                name=\"file\"; \
-                               filename=\"blob\"\r\nContent-Type: %s\r\n\r\n", mime_type(basename(filepath)));
-  write(bodyfd, multipart_header, strlen(multipart_header));
+                               filename=\"blob\"\r\nContent-Type: %s\r\n\r\n",
+								mime_type(basename(filepath)));
+	write(bodyfd, multipart_header, strlen(multipart_header));
 
-  write(bodyfd, fa->buf, fa->size);
+	write(bodyfd, fa->buf, fa->size);
 
-  write(bodyfd, "\r\n", 2);
-  write(bodyfd, "--", 2);
-  write(bodyfd, BOUNDARY, strlen(BOUNDARY));
-  write(bodyfd, "--\r\n", 4);
+	write(bodyfd, "\r\n", 2);
+	write(bodyfd, "--", 2);
+	write(bodyfd, BOUNDARY, strlen(BOUNDARY));
+	write(bodyfd, "--\r\n", 4);
 
-  close(bodyfd);
+	close(bodyfd);
 
 	/* Response */
 	snprint(buf, sizeof buf, "/mnt/web/%d/body", conn);
 	if((bodyfd = open(buf, OREAD)) < 0)
 		sysfatal("post: opening body: %r");
-	if (readn(bodyfd, buf, BUFSIZE) <= 0)
+	if(readn(bodyfd, buf, BUFSIZE) <= 0)
 		sysfatal("readn: %r");
 
 	close(bodyfd);
 	close(ctlfd);
 
-  return buf;
+	return buf;
 }
--- a/masto9.c
+++ b/masto9.c
@@ -10,9 +10,10 @@
 UserPasswd *
 getcredentials(char *host)
 {
-	UserPasswd* p;
+	UserPasswd *p;
 
-	p = auth_getuserpasswd(auth_getkey, "proto=pass service=mastodon server=%s", host);
+	p = auth_getuserpasswd(auth_getkey, "proto=pass service=mastodon server=%s",
+						   host);
 	if(p == nil)
 		sysfatal("masto9: failed to retrieve token: %r");
 
@@ -22,21 +23,27 @@
 void
 gethome(char *token, char *host, Toot toots[], char *after)
 {
-	JSON *obj, *id, *content, *reblog_content, *account, *reblog_account, *handle, *reblog_handle, *display_name, *avatar, *reblog, *media_attachments, *type, *preview_url, *remote_url;
+	JSON *obj, *id, *content, *reblog_content, *account, *reblog_account,
+		*handle, *reblog_handle, *display_name, *avatar, *reblog,
+		*media_attachments, *type, *preview_url, *remote_url;
 	char *endpoint;
 	int i = 0;
 
-  if(after != nil) {
-    endpoint = esmprint("timelines/home?max_id=%s", after);
-  } else {
-    endpoint = "timelines/home";
-  }
+	if(after != nil)
+	{
+		endpoint = esmprint("timelines/home?max_id=%s", after);
+	}
+	else
+	{
+		endpoint = "timelines/home";
+	}
 
-  obj = mastodonget(token, host, endpoint);
-  if (obj->t != JSONArray)
+	obj = mastodonget(token, host, endpoint);
+	if(obj->t != JSONArray)
 		sysfatal("jsonparse: not an array");
 
-	for(JSONEl *p = obj->first; p != nil; p = p->next) {
+	for(JSONEl *p = obj->first; p != nil; p = p->next)
+	{
 		JSON *toot_json = p->val;
 
 		id = getjsonkey(toot_json, "id");
@@ -51,10 +58,13 @@
 		Toot *toot = emalloc(sizeof(Toot));
 		toot->id = estrdup((char *)id->s);
 
-		if(reblog->s == nil) {
+		if(reblog->s == nil)
+		{
 			toot->reblogged = 0;
 			toot->content = estrdup((char *)content->s);
-		} else {
+		}
+		else
+		{
 			reblog_content = getjsonkey(reblog, "content");
 			reblog_account = getjsonkey(reblog, "account");
 			reblog_handle = getjsonkey(reblog_account, "acct");
@@ -70,9 +80,11 @@
 		toot->avatar_url = estrdup((char *)avatar->s);
 		toot->attachments_count = 0;
 
-		if(media_attachments->s != nil) {
+		if(media_attachments->s != nil)
+		{
 			int j = 0;
-			for(JSONEl *at = media_attachments->first; at != nil; at = at->next) {
+			for(JSONEl *at = media_attachments->first; at != nil; at = at->next)
+			{
 				JSON *attachment_json = at->val;
 				Attachment *attachment = emalloc(sizeof(Attachment));
 				type = getjsonkey(attachment_json, "type");
@@ -80,11 +92,14 @@
 				remote_url = getjsonkey(attachment_json, "remote_url");
 				attachment->type = estrdup((char *)type->s);
 
-        if(strcmp(type->s, "image") == 0){
-          attachment->url = estrdup((char *)preview_url->s);
-        } else {
-          attachment->url = estrdup((char *)remote_url->s);
-        }
+				if(strcmp(type->s, "image") == 0)
+				{
+					attachment->url = estrdup((char *)preview_url->s);
+				}
+				else
+				{
+					attachment->url = estrdup((char *)remote_url->s);
+				}
 
 				toot->media_attachments[j] = attachment;
 				toot->attachments_count++;
@@ -103,33 +118,38 @@
 	JSON *obj, *id, *content, *display_name, *handle, *type, *account, *status;
 	int i = 0;
 
-	obj = mastodonget(token, host, "notifications");
+	obj = mastodonget(token, host, "notifications?types[]=mention");
 
-  if (obj->t != JSONArray)
+	if(obj->t != JSONArray)
 		sysfatal("jsonparse: not an array");
 
-	for(JSONEl *p = obj->first; p != nil; p = p->next) {
+	for(JSONEl *p = obj->first; p != nil; p = p->next)
+	{
 		JSON *notif_json = p->val;
 
 		id = getjsonkey(notif_json, "id");
 		type = getjsonkey(notif_json, "type");
-    if(strcmp(type->s, "follow") != 0) {
-      status = getjsonkey(notif_json, "status");
-      content = getjsonkey(status, "content");
-    } else {
-      content = jsonparse("");
-    }
-    account = getjsonkey(notif_json, "account");
-    display_name = getjsonkey(account, "display_name");
-    handle = getjsonkey(account, "acct");
+		if(strcmp(type->s, "follow") != 0)
+		{
+			status = getjsonkey(notif_json, "status");
+			content = getjsonkey(status, "content");
+		}
+		else
+		{
+			content = jsonparse("");
+		}
+		account = getjsonkey(notif_json, "account");
+		display_name = getjsonkey(account, "display_name");
+		handle = getjsonkey(account, "acct");
 
 		Notification *notif = emalloc(sizeof(Notification));
 		notif->id = estrdup((char *)id->s);
 
-    notif->type = estrdup((char *)type->s);
-    if(strcmp(type->s, "follow") != 0) {
-      notif->content = estrdup((char *)content->s);
-    }
+		notif->type = estrdup((char *)type->s);
+		if(strcmp(type->s, "follow") != 0)
+		{
+			notif->content = estrdup((char *)content->s);
+		}
 		notif->display_name = estrdup((char *)display_name->s);
 		notif->handle = estrdup((char *)handle->s);
 
@@ -142,136 +162,148 @@
 void
 posttoot(char *token, char *host, char *text)
 {
-  char *url;
-  url = esmprint("https://%s/api/v1/statuses", host);
+	char *url;
+	url = esmprint("https://%s/api/v1/statuses", host);
 
 	httppost(token, url, concat("status=", text));
-  print("Posted:\n %s\n", text);
+	print("Posted:\n %s\n", text);
 }
 
 char *
 tootauthor(char *token, char *host, char *id)
 {
-  JSON *obj, *account, *reblog;
-  char *endpoint, *response;
+	JSON *obj, *account, *reblog;
+	char *endpoint, *response;
 
-  endpoint = concat("statuses/", id);
+	endpoint = concat("statuses/", id);
 	obj = mastodonget(token, host, endpoint);
 
-  reblog = getjsonkey(obj, "reblog");
-  if(reblog->s != nil) {
-    account = getjsonkey(reblog, "account");
-  } else {
-    account = getjsonkey(obj, "account");
-  }
+	reblog = getjsonkey(obj, "reblog");
+	if(reblog->s != nil)
+	{
+		account = getjsonkey(reblog, "account");
+	}
+	else
+	{
+		account = getjsonkey(obj, "account");
+	}
 
-  response = estrdup((char *)getjsonkey(account, "acct")->s);
+	response = estrdup((char *)getjsonkey(account, "acct")->s);
 
-  free(account);
-  free(reblog);
-  free(obj);
+	free(account);
+	free(reblog);
+	free(obj);
 
-  return response;
+	return response;
 }
 
 void
 postattachment(char *token, char *host, char *text, char *filepath)
 {
-  JSON *obj, *id;
-  char *url, *response, *body;
+	JSON *obj, *id;
+	char *url, *response, *body;
 
 	url = esmprint("https://%s/api/v1/media", host);
 	response = upload(token, url, filepath);
 
-  obj = jsonparse(response);
-	if (obj == nil)
+	obj = jsonparse(response);
+	if(obj == nil)
 		sysfatal("jsonparse: not json");
 
-  print("%J\n", obj);
-  id = getjsonkey(obj, "id");
+	print("%J\n", obj);
+	id = getjsonkey(obj, "id");
 
-  url = esmprint("https://%s/api/v1/statuses", host);
+	url = esmprint("https://%s/api/v1/statuses", host);
 
-  if (strlen(text) >0) {
-    body = esmprint("status=%s&media_ids[]=%s", text, id->s);
-  } else {
-    body = esmprint("media_ids[]=%s", id->s);
-  }
+	if(strlen(text) > 0)
+	{
+		body = esmprint("status=%s&media_ids[]=%s", text, id->s);
+	}
+	else
+	{
+		body = esmprint("media_ids[]=%s", id->s);
+	}
 	httppost(token, url, body);
-  print("Posted toot\n");
+	print("Posted toot\n");
 }
 
 void
 perform(char *token, char *host, char *id, char *action)
 {
-  char *url;
-  url = esmprint("%s/api/v1/statuses/%s/%s", host, id, action);
-  httppost(token, url, "");
+	char *url;
+	url = esmprint("%s/api/v1/statuses/%s/%s", host, id, action);
+	httppost(token, url, "");
 }
 
 void
 boost(char *token, char *host, char *id)
 {
-  perform(token, host, id, "reblog");
-  print("Boosted toot.");
+	perform(token, host, id, "reblog");
+	print("Boosted toot.");
 }
 
 void
 unboost(char *token, char *host, char *id)
 {
-  perform(token, host, id, "unreblog");
-  print("Unboosted toot.");
+	perform(token, host, id, "unreblog");
+	print("Unboosted toot.");
 }
 
 void
 fav(char *token, char *host, char *id)
 {
-  perform(token, host, id, "favourite");
-  print("Favorited toot.");
+	perform(token, host, id, "favourite");
+	print("Favorited toot.");
 }
 
 void
 unfav(char *token, char *host, char *id)
 {
-  perform(token, host, id, "unfavourite");
-  print("Unfavorited toot.");
+	perform(token, host, id, "unfavourite");
+	print("Unfavorited toot.");
 }
 
 void
 reply(char *token, char *host, char *id)
 {
-  char *content;
-  int fd, wait;
-  char *s, *t, *u, *url;
-  Biobuf body;
+	char *content;
+	int fd, wait;
+	char *s, *t, *u, *url;
+	Biobuf body;
 
-  wait = 0;
-  t = nil;
+	wait = 0;
+	t = nil;
 
-  if(wait)
-    close(open("/dev/text", OWRITE|OTRUNC|OCEXEC));
-  if((fd = open("/dev/consctl", OWRITE|OCEXEC)) >= 0){
-    write(fd, "holdon", 6);
-    u = tootauthor(token, host, id);
-    print("Reply to %s\n", u);
-    Binit(&body, 0, OREAD);
-    if((s = Brdstr(&body, 0, 1)) != nil)
-      t = esmprint("%s", s);
-    free(s);
-    if(t != nil){
-      url = esmprint("%s/api/v1/statuses", host);
-      content = esmprint("in_reply_to_id=%s&status=@%s %s", id, u, t);
+	if(wait)
+		close(open("/dev/text", OWRITE | OTRUNC | OCEXEC));
+	if((fd = open("/dev/consctl", OWRITE | OCEXEC)) >= 0)
+	{
+		write(fd, "holdon", 6);
+		u = tootauthor(token, host, id);
+		print("Reply to %s\n", u);
+		Binit(&body, 0, OREAD);
+		if((s = Brdstr(&body, 0, 1)) != nil)
+			t = esmprint("%s", s);
+		free(s);
+		if(t != nil)
+		{
+			url = esmprint("%s/api/v1/statuses", host);
+			content = esmprint("in_reply_to_id=%s&status=@%s %s", id, u, t);
 
-      httppost(token, url, content);
-      print("\nReply sent.\n");
-      free(t);
-    }else{
-      fprint(2, "%r\n");
-    }
-    close(fd);
-  }else{
-    fprint(2, "%r\n");
-  }
+			httppost(token, url, content);
+			print("\nReply sent.\n");
+			free(t);
+		}
+		else
+		{
+			fprint(2, "%r\n");
+		}
+		close(fd);
+	}
+	else
+	{
+		fprint(2, "%r\n");
+	}
 }
 
 char *
@@ -282,7 +314,8 @@
 
 	if(pipe(wr) == -1 || pipe(rd) == -1)
 		sysfatal("pipe: %r");
-	switch(fork()){
+	switch(fork())
+	{
 	case -1:
 		sysfatal("fork: %r");
 		break;
@@ -328,155 +361,201 @@
 	response = httpget(token, url);
 
 	obj = jsonparse(response);
-	if (obj == nil)
+	if(obj == nil)
 		sysfatal("jsonparse: not json");
 
-	return(obj);
+	return (obj);
 }
 
 void
 usage(void)
 {
-  sysfatal("usage: masto9 url");
+	sysfatal("usage: masto9 url");
 }
 
 void
 displaytoots(Toot toots[], char *server)
 {
-  Biobuf out;
-  Binit(&out, 1, OWRITE);
+	Biobuf out;
+	Binit(&out, 1, OWRITE);
 
-  for (int i=0;i<TOOTSCOUNT;i++) {
-    Toot toot = toots[i];
-    char *username;
+	for(int i = 0; i < TOOTSCOUNT; i++)
+	{
+		Toot toot = toots[i];
+		char *username;
 
-    username = esmprint("%s (%s)", toot.display_name, toot.handle);
+		username = esmprint("%s (%s)", toot.display_name, toot.handle);
 
-    Bprint(&out, "\n\n——————————\n");
-    if(toot.reblogged == 1) {
-      Bprint(&out, "⊙ %s retooted %s:\n", username, toot.reblogged_handle);
-    } else {
-      Bprint(&out, "⊙ %s:\n", username);
-    }
-    Bprint(&out, "\n%s", fmthtml(cleanup(toot.content)));
-    if(toot.attachments_count>0) {
-      for (int j=0;j<toot.attachments_count;j++) {
-        Attachment *attachment = toot.media_attachments[j];
-        Bprint(&out, "\n[%s] %s", attachment->type, attachment->url);
-      }
-      Bprint(&out, "\n");
-    }
-    Bprint(&out, "\nReply[%s] | Boost[%s] | Favorite[%s]", toot.id, toot.id, toot.id);
-  }
-  Bprint(&out, "\n\n\n⇒ Send the next line to load more");
-  Bprint(&out, "\n6.out %s more %s\n\n", server, toots[19].id);
-  Bflush(&out);
+		Bprint(&out, "\n\n——————————\n");
+		if(toot.reblogged == 1)
+		{
+			Bprint(&out, "⊙ %s retooted %s:\n", username,
+				   toot.reblogged_handle);
+		}
+		else
+		{
+			Bprint(&out, "⊙ %s:\n", username);
+		}
+		Bprint(&out, "\n%s", fmthtml(cleanup(toot.content)));
+		if(toot.attachments_count > 0)
+		{
+			for(int j = 0; j < toot.attachments_count; j++)
+			{
+				Attachment *attachment = toot.media_attachments[j];
+				Bprint(&out, "\n[%s] %s", attachment->type, attachment->url);
+			}
+			Bprint(&out, "\n");
+		}
+		Bprint(&out, "\nReply[%s] | Boost[%s] | Favorite[%s]", toot.id, toot.id,
+			   toot.id);
+	}
+	Bprint(&out, "\n\n\n⇒ Send the next line to load more");
+	Bprint(&out, "\n6.out %s more %s\n\n", server, toots[19].id);
+	Bflush(&out);
 }
 
 void
 displaynotifications(Notification notifs[])
 {
-  Biobuf out;
-  Binit(&out, 1, OWRITE);
+	Biobuf out;
+	Binit(&out, 1, OWRITE);
 
-  for (int i=0;i<NOTIFSCOUNT;i++) {
-    Notification notif = notifs[i];
-    char *username;
+	for(int i = 0; i < NOTIFSCOUNT; i++)
+	{
+		Notification notif = notifs[i];
+		char *username;
 
-    username = esmprint("%s (%s)", notif.display_name, notif.handle);
+		username = esmprint("%s (%s)", notif.display_name, notif.handle);
 
-    if (strcmp(notif.type, "reblog") == 0) {
-      Bprint(&out, "\n⊙ %s retooted\n %s", username, fmthtml(cleanup(notif.content)));
-    } else if (strcmp(notif.type, "favourite") == 0) {
-      Bprint(&out, "\n⊙ %s favorited\n %s", username, fmthtml(cleanup(notif.content)));
-    } else if (strcmp(notif.type, "mention") == 0) {
-      Bprint(&out, "\n⊙ %s mentioned you\n %s", username, fmthtml(cleanup(notif.content)));
-    } else if (strcmp(notif.type, "follow") == 0) {
-      Bprint(&out, "\n⊙ %s followed you\n", username);
-    } else if (strcmp(notif.type, "poll") == 0) {
-      Bprint(&out, "\n⊙ %s poll ended\n %s", username, fmthtml(cleanup(notif.content)));
-    }
-  }
-  Bprint(&out, "\n");
-  Bflush(&out);
+		if(strcmp(notif.type, "reblog") == 0)
+		{
+			Bprint(&out, "\n⊙ %s retooted\n %s", username,
+				   fmthtml(cleanup(notif.content)));
+		}
+		else if(strcmp(notif.type, "favourite") == 0)
+		{
+			Bprint(&out, "\n⊙ %s favorited\n %s", username,
+				   fmthtml(cleanup(notif.content)));
+		}
+		else if(strcmp(notif.type, "mention") == 0)
+		{
+			Bprint(&out, "\n⊙ %s mentioned you\n %s", username,
+				   fmthtml(cleanup(notif.content)));
+		}
+		else if(strcmp(notif.type, "follow") == 0)
+		{
+			Bprint(&out, "\n⊙ %s followed you\n", username);
+		}
+		else if(strcmp(notif.type, "poll") == 0)
+		{
+			Bprint(&out, "\n⊙ %s poll ended\n %s", username,
+				   fmthtml(cleanup(notif.content)));
+		}
+	}
+	Bprint(&out, "\n");
+	Bflush(&out);
 }
 
 void
 debug(char *token, char *host, char *id)
 {
-  JSON *obj;
-  char *endpoint;
+	JSON *obj;
+	char *endpoint;
 
-  endpoint = esmprint("statuses/%s", id);
+	endpoint = esmprint("statuses/%s", id);
 	obj = mastodonget(token, host, endpoint);
-  print("%J\n", obj);
-  jsonfree(obj);
+	print("%J\n", obj);
+	jsonfree(obj);
 }
 
-
-//echo 'proto=pass service=mastodon server=instanceHostName pass=yourToken user=yourUsername' > /mnt/factotum/ctl
+// echo 'proto=pass service=mastodon server=instanceHostName pass=yourToken
+// user=yourUsername' > /mnt/factotum/ctl
 void
-main(int argc, char**argv)
+main(int argc, char **argv)
 {
-  UserPasswd *p;
-  char *token, *host, *command, *text, *id, *filepath;
+	UserPasswd *p;
+	char *token, *host, *command, *text, *id, *filepath;
 
-  if(argc < 2)
+	if(argc < 2)
 		usage();
 
-  JSONfmtinstall();
+	JSONfmtinstall();
 
-  host = argv[1];
-  command = argv[2];
+	host = argv[1];
+	command = argv[2];
 
-  p = getcredentials(host);
+	p = getcredentials(host);
 	token = p->passwd;
 
-  if(command == nil) {
-    Toot toots[TOOTSCOUNT];
-    gethome(token, host, toots, nil);
-    displaytoots(toots, host);
-  } else if(strcmp(command, "toot") == 0) {
-    text = argv[3];
-    posttoot(token, host, text);
-  } else if(strcmp(command, "tootfile") == 0) {
-    if (argc > 4) {
-      text = argv[3];
-      filepath = argv[4];
-    } else {
-      text = "";
-      filepath = argv[3];
-    }
-    postattachment(token, host, text, filepath);
-  } else if(strcmp(command, "fav") == 0) {
-    id = argv[3];
-    fav(token, host, id);
-  } else if(strcmp(command, "unfav") == 0) {
-    id = argv[3];
-    unfav(token, host, id);
-  } else if(strcmp(command, "boost") == 0) {
-    id = argv[3];
-    boost(token, host, id);
-  } else if(strcmp(command, "unboost") == 0) {
-    id = argv[3];
-    unboost(token, host, id);
-  } else if(strcmp(command, "reply") == 0) {
-    id = argv[3];
-    reply(token, host, id);
-  } else if(strcmp(command, "debug") == 0) {
-    id = argv[3];
-    debug(token, host, id);
-  } else if(strcmp(command, "more") == 0) {
-    id = argv[3];
-    Toot toots[TOOTSCOUNT];
-    gethome(token, host, toots, id);
-    displaytoots(toots, host);
-  } else if(strcmp(command, "notifications") == 0) {
-    Notification notifs[NOTIFSCOUNT];
-    getnotifications(token, host, notifs);
-    displaynotifications(notifs);
-  }
+	if(command == nil)
+	{
+		Toot toots[TOOTSCOUNT];
+		gethome(token, host, toots, nil);
+		displaytoots(toots, host);
+	}
+	else if(strcmp(command, "toot") == 0)
+	{
+		text = argv[3];
+		posttoot(token, host, text);
+	}
+	else if(strcmp(command, "tootfile") == 0)
+	{
+		if(argc > 4)
+		{
+			text = argv[3];
+			filepath = argv[4];
+		}
+		else
+		{
+			text = "";
+			filepath = argv[3];
+		}
+		postattachment(token, host, text, filepath);
+	}
+	else if(strcmp(command, "fav") == 0)
+	{
+		id = argv[3];
+		fav(token, host, id);
+	}
+	else if(strcmp(command, "unfav") == 0)
+	{
+		id = argv[3];
+		unfav(token, host, id);
+	}
+	else if(strcmp(command, "boost") == 0)
+	{
+		id = argv[3];
+		boost(token, host, id);
+	}
+	else if(strcmp(command, "unboost") == 0)
+	{
+		id = argv[3];
+		unboost(token, host, id);
+	}
+	else if(strcmp(command, "reply") == 0)
+	{
+		id = argv[3];
+		reply(token, host, id);
+	}
+	else if(strcmp(command, "debug") == 0)
+	{
+		id = argv[3];
+		debug(token, host, id);
+	}
+	else if(strcmp(command, "more") == 0)
+	{
+		id = argv[3];
+		Toot toots[TOOTSCOUNT];
+		gethome(token, host, toots, id);
+		displaytoots(toots, host);
+	}
+	else if(strcmp(command, "notifications") == 0)
+	{
+		Notification notifs[NOTIFSCOUNT];
+		getnotifications(token, host, notifs);
+		displaynotifications(notifs);
+	}
 
-  free(p);
+	free(p);
 	exits(nil);
 }
--- a/util.c
+++ b/util.c
@@ -31,7 +31,7 @@
 	return v;
 }
 
-char*
+char *
 estrdup(char *s)
 {
 	s = strdup(s);
@@ -44,15 +44,15 @@
 char *
 concat(char *s1, char *s2)
 {
-  char *result;
-  result = emalloc(strlen(s1) + strlen(s2) + 1); // +1 for the null-terminator
+	char *result;
+	result = emalloc(strlen(s1) + strlen(s2) + 1); // +1 for the null-terminator
 
-  strcpy(result, s1);
-  strcat(result, s2);
-  return result;
+	strcpy(result, s1);
+	strcat(result, s2);
+	return result;
 }
 
-char*
+char *
 esmprint(char *fmt, ...)
 {
 	char *s;
@@ -67,7 +67,7 @@
 	return s;
 }
 
-char*
+char *
 fslurp(int fd, int *nbuf)
 {
 	int n, sz, r;
@@ -76,7 +76,8 @@
 	n = 0;
 	sz = 128;
 	buf = emalloc(sz);
-	while(1){
+	while(1)
+	{
 		r = read(fd, buf + n, sz - n);
 		if(r == 0)
 			break;
@@ -83,8 +84,9 @@
 		if(r == -1)
 			goto error;
 		n += r;
-		if(n == sz){
-			sz += sz/2;
+		if(n == sz)
+		{
+			sz += sz / 2;
 			buf = erealloc(buf, sz);
 		}
 	}
@@ -100,30 +102,35 @@
 void
 removesubstring(char *str, char *sub)
 {
-  int len = strlen(sub);
+	int len = strlen(sub);
 
-  while ((str = strstr(str, sub))) {
-    memmove(str, str + len, strlen(str + len) + 1);
-  }
+	while((str = strstr(str, sub)))
+	{
+		memmove(str, str + len, strlen(str + len) + 1);
+	}
 }
 
 void
 removetag(char *str, char *tag)
 {
-  char *start = strstr(str, tag);
+	char *start = strstr(str, tag);
 
-  while (start) {
-    char *end = strchr(start, '>');
+	while(start)
+	{
+		char *end = strchr(start, '>');
 
-    if (end) {
-      memmove(start, end + 1, strlen(end + 1) + 1);
-    } else {
-      *start = '\0';
-      break;
-    }
+		if(end)
+		{
+			memmove(start, end + 1, strlen(end + 1) + 1);
+		}
+		else
+		{
+			*start = '\0';
+			break;
+		}
 
-    start = strstr(start, tag);
-  }
+		start = strstr(start, tag);
+	}
 }
 
 JSON *
@@ -130,7 +137,7 @@
 getjsonkey(JSON *obj, char *key)
 {
 	JSON *value = jsonbyname(obj, key);
-	if (value == nil)
+	if(value == nil)
 		sysfatal("jsonbyname: key %s not found in %J", key, obj);
 	return value;
 }
@@ -138,40 +145,42 @@
 FileAttachment *
 readfile(char *filename)
 {
-    int fd, nread, size = 0, bufsize = 1024;
-    FileAttachment *fa = emalloc(sizeof(FileAttachment));
-    char *buf = malloc(bufsize);
-    if (!buf)
-        sysfatal("malloc failed");
+	int fd, nread, size = 0, bufsize = 1024;
+	FileAttachment *fa = emalloc(sizeof(FileAttachment));
+	char *buf = malloc(bufsize);
+	if(!buf)
+		sysfatal("malloc failed");
 
-    fd = open(filename, OREAD);
-    if (fd < 0)
-        sysfatal("open %s: %r", filename);
+	fd = open(filename, OREAD);
+	if(fd < 0)
+		sysfatal("open %s: %r", filename);
 
-    while ((nread = read(fd, buf + size, bufsize - size)) > 0) {
-        size += nread;
-        if (size == bufsize) {
-            bufsize *= 2;
-            buf = realloc(buf, bufsize);
-            if (!buf)
-                sysfatal("realloc failed");
-        }
-    }
-    close(fd);
+	while((nread = read(fd, buf + size, bufsize - size)) > 0)
+	{
+		size += nread;
+		if(size == bufsize)
+		{
+			bufsize *= 2;
+			buf = realloc(buf, bufsize);
+			if(!buf)
+				sysfatal("realloc failed");
+		}
+	}
+	close(fd);
 
-    if (nread < 0)
-        sysfatal("read %s: %r", filename);
+	if(nread < 0)
+		sysfatal("read %s: %r", filename);
 
-    buf[size] = '\0';
+	buf[size] = '\0';
 
-    fa->buf = buf;
-    fa->size = size;
-    return fa;
+	fa->buf = buf;
+	fa->size = size;
+	return fa;
 }
 
 char *
 basename(char *path)
 {
-  char *base = strrchr(path, '/');
-  return base ? base + 1 : path;
+	char *base = strrchr(path, '/');
+	return base ? base + 1 : path;
 }