Style fixes. - sam - An updated version of the sam text editor.
(HTM) git clone git://vernunftzentrum.de/sam.git
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) LICENSE
---
(DIR) commit f1040f7de2a4570da1602e1cc13d4616b5b12405
(DIR) parent 901f92fa6d88a871b4c6581d874900b018aa3cdf
(HTM) Author: Rob King <jking@deadpixi.com>
Date: Tue, 30 Aug 2016 22:48:41 -0500
Style fixes.
Diffstat:
rsam/Makefile | 6 +-----
rsam/rsam.c | 210 ++++++++++++++-----------------
2 files changed, 94 insertions(+), 122 deletions(-)
---
(DIR) diff --git a/rsam/Makefile b/rsam/Makefile
@@ -1,16 +1,12 @@
-# Copyright (C) 2013-2015 Rob King <jking@deadpixi.com
+# Copyright (C) 2013-2015 Rob King <jking@deadpixi.com>
# This file may be redistributed and modified for any purpose.
# No warranty is expressed or implied; use at your own risk.
include ../config.mk
-LDFLAGS=
-CFLAGS=-D_POSIX_C_SOURCE=200809L
-
all: rsam
rsam: rsam.o
- $(CC) $(CFLAGS) -o rsam rsam.o
clean:
rm -f *.o rsam
(DIR) diff --git a/rsam/rsam.c b/rsam/rsam.c
@@ -3,8 +3,10 @@
* No warranty is expressed or implied; use at your own risk.
*/
+#define _POSIX_C_SOURCE 200809L
#include <fcntl.h>
#include <limits.h>
+#include <pwd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -15,134 +17,108 @@
#include "../config.h"
-#define PARENT_READ readpipe[0]
-#define CHILD_WRITE readpipe[1]
-#define CHILD_READ writepipe[0]
-#define PARENT_WRITE writepipe[1]
-#define MAX(x, y) ((x) > (y) ? (x) : (y))
+#define PARENT_READ readpipe[0]
+#define CHILD_WRITE readpipe[1]
+#define CHILD_READ writepipe[0]
+#define PARENT_WRITE writepipe[1]
+#define MAX(x, y) ((x) > (y) ? (x) : (y))
-char *fifopath = NULL;
+static int home = -1;
void
cleanup(void)
{
- if (fifopath)
- {
- unlink(fifopath);
- free(fifopath);
- }
+ unlinkat(home, ".sam.fifo", 0);
}
int
main(int argc, char **argv)
{
- const char *home = getenv("HOME") ? getenv("HOME") : TMPDIR;
- long pathmax = pathconf(home, _PC_PATH_MAX) != -1 ? pathconf(home, _PC_PATH_MAX) : PATH_MAX;
- int writepipe[2] = {-1};
- int readpipe[2] = {-1};
-
- fifopath = calloc(pathmax, sizeof(char));
- if (fifopath == NULL)
- {
- perror("fifopath");
- return EXIT_FAILURE;
- }
-
- if (pipe(writepipe) != 0 || pipe(readpipe) != 0)
- {
- perror("pipe");
- return EXIT_FAILURE;
- }
-
- snprintf(fifopath, pathmax, "%s/.sam.fifo", home);
- unlink(fifopath);
- if (mkfifo(fifopath, 0600) != 0)
- {
- perror("mkfifo");
- return EXIT_FAILURE;
- }
-
- fifopath = fifopath;
- atexit(cleanup);
-
- int fifofd = open(fifopath, O_RDWR);
- if (fifofd < 0)
- {
- perror("open");
- return EXIT_FAILURE;
- }
-
- pid_t child = fork();
- if (child == 0)
- {
- close(PARENT_WRITE);
- close(PARENT_READ);
-
- dup2(CHILD_READ, STDIN_FILENO); close(CHILD_READ);
- dup2(CHILD_WRITE, STDOUT_FILENO); close(CHILD_WRITE);
-
- execlp("sam", "sam", "-R", NULL);
- return EXIT_FAILURE;
- }
- else if (child < 0)
- {
- perror("fork");
- return EXIT_FAILURE;
- }
-
- close(CHILD_READ);
- close(CHILD_WRITE);
-
- fd_set readfds;
- fd_set writefds;
-
- FD_ZERO(&readfds);
- FD_SET(STDIN_FILENO, &readfds);
- FD_SET(fifofd, &readfds);
- FD_SET(PARENT_READ, &readfds);
-
- while (select(MAX(STDIN_FILENO, MAX(PARENT_READ, fifofd)) + 1, &readfds, NULL, NULL, NULL) >= 0)
- {
- ssize_t count = 0;
- char buf[8192];
-
- if (FD_ISSET(STDIN_FILENO, &readfds))
- {
- count = read(STDIN_FILENO, buf, 8192);
- if (count <= 0)
- {
- exit(EXIT_SUCCESS);
- }
- write(PARENT_WRITE, buf, count);
- }
-
- if (FD_ISSET(fifofd, &readfds))
- {
- memset(buf, 0, 256);
- count = read(fifofd, buf, 253);
- if (count <= 0)
- {
- exit(EXIT_SUCCESS);
- }
- write(STDOUT_FILENO, "\x19\xff\x00", 3);
- write(STDOUT_FILENO, buf, 255);
- }
-
- if (FD_ISSET(PARENT_READ, &readfds))
- {
- count = read(PARENT_READ, buf, 8192);
- if (count <= 0)
- {
+ int fifo = -1;
+ int nfd = 0;
+ int writepipe[2] = {-1};
+ int readpipe[2] = {-1};
+ struct passwd *pwent = NULL;
+ pid_t child = -1;
+ fd_set rfds;
+
+ pwent = getpwuid(getuid());
+ if (!pwent || !pwent->pw_dir)
+ return perror("pwent"), EXIT_FAILURE;
+
+ home = open(pwent->pw_dir, O_DIRECTORY | O_RDONLY);
+ if (home < 0)
+ return perror(pwent->pw_dir), EXIT_FAILURE;
+
+ if (pipe(writepipe) != 0 || pipe(readpipe) != 0)
+ return perror("pipe"), EXIT_FAILURE;
+
+ unlinkat(home, ".sam.fifo", 0);
+ if (mkfifoat(home, ".sam.fifo", 0600) != 0)
+ return perror("mkfifo"), EXIT_FAILURE;
+
+ atexit(cleanup);
+
+ fifo = openat(home, ".sam.fifo", O_RDWR);
+ if (fifo < 0)
+ return perror("open"), EXIT_FAILURE;
+
+ child = fork();
+ if (child == 0){
+ close(PARENT_WRITE);
+ close(PARENT_READ);
+
+ dup2(CHILD_READ, STDIN_FILENO); close(CHILD_READ);
+ dup2(CHILD_WRITE, STDOUT_FILENO); close(CHILD_WRITE);
+
+ execlp("sam", "sam", "-R", NULL);
+ return EXIT_FAILURE;
+ } else if (child < 0){
+ perror("fork");
+ return EXIT_FAILURE;
+ }
+
+ close(CHILD_READ);
+ close(CHILD_WRITE);
+
+ FD_ZERO(&rfds);
+ FD_SET(STDIN_FILENO, &rfds);
+ FD_SET(fifo, &rfds);
+ FD_SET(PARENT_READ, &rfds);
+
+ nfd = MAX(STDIN_FILENO, MAX(PARENT_READ, fifo)) + 1;
+ while ((nfd, &rfds, NULL, NULL, NULL) >= 0){
+ ssize_t count = 0;
+ char buf[8192];
+
+ if (FD_ISSET(STDIN_FILENO, &rfds)){
+ count = read(STDIN_FILENO, buf, 8192);
+ if (count <= 0)
exit(EXIT_SUCCESS);
- }
- write(STDOUT_FILENO, buf, count);
- }
+ write(PARENT_WRITE, buf, count);
+ }
- FD_ZERO(&readfds);
- FD_SET(STDIN_FILENO, &readfds);
- FD_SET(fifofd, &readfds);
- FD_SET(PARENT_READ, &readfds);
- }
+ if (FD_ISSET(fifo, &rfds)){
+ memset(buf, 0, 256);
+ count = read(fifo, buf, 253);
+ if (count <= 0)
+ exit(EXIT_SUCCESS);
+ write(STDOUT_FILENO, "\x19\xff\x00", 3);
+ write(STDOUT_FILENO, buf, 255);
+ }
+
+ if (FD_ISSET(PARENT_READ, &rfds)){
+ count = read(PARENT_READ, buf, 8192);
+ if (count <= 0)
+ exit(EXIT_SUCCESS);
+ write(STDOUT_FILENO, buf, count);
+ }
+
+ FD_ZERO(&rfds);
+ FD_SET(STDIN_FILENO, &rfds);
+ FD_SET(fifo, &rfds);
+ FD_SET(PARENT_READ, &rfds);
+ }
- return EXIT_SUCCESS;
+ return EXIT_SUCCESS;
}