rohrpost

A commandline mail client to change the world as we see it.
git clone git://r-36.net/rohrpost
Log | Files | Refs | README | LICENSE

pager.c (1533B)


      1 /*
      2  * Copy me if you can.
      3  * by 20h
      4  */
      5 
      6 #include <unistd.h>
      7 #include <stdio.h>
      8 #include <stdlib.h>
      9 #include <string.h>
     10 #include <sys/types.h>
     11 #include <sys/wait.h>
     12 
     13 #include "ind.h"
     14 
     15 char *
     16 getpager(void)
     17 {
     18 	char *ret;
     19 
     20 	ret = getenv("PAGER");
     21 	if (ret == NULL)
     22 		ret = "less";
     23 	return ret;
     24 }
     25 
     26 char *
     27 geteditor(void)
     28 {
     29 	char *ret;
     30 
     31 	ret = getenv("EDITOR");
     32 	if (ret == NULL)
     33 		return "vim";
     34 	return ret;
     35 }
     36 
     37 void
     38 runfile(char *app, char *file)
     39 {
     40 	char *cmd;
     41 
     42 	cmd = smprintf("%s %s", app, file);
     43 	if (runcmd(cmd, NULL, NULL, NULL, 1) < 0)
     44 		edie("pagefile");
     45 	free(cmd);
     46 
     47 	wait(NULL);
     48 }
     49 
     50 void
     51 editfile(char *file)
     52 {
     53 	runfile(geteditor(), file);
     54 }
     55 
     56 void
     57 pagefile(char *file)
     58 {
     59 	runfile(getpager(), file);
     60 }
     61 
     62 char *
     63 runstring(void (*runner)(char *), char *str, char *ext, int docmp)
     64 {
     65 	char *tname, *nstr;
     66 	int tfd, len;
     67 
     68 
     69 	tname = mktmpfile("rohrpost", ext, &tfd);
     70 	if (writefile(tname, str, strlen(str), "w+"))
     71 		edie("runstring writefile");
     72 	runner(tname);
     73 
     74 	if (docmp) {
     75 		nstr = readfile(tname, &len);
     76 		if (nstr == NULL)
     77 			edie("runstring readfile");
     78 		if (strcmp(str, nstr)) {
     79 			close(tfd);
     80 			unlink(tname);
     81 			return nstr;
     82 		}
     83 		if (nstr != NULL)
     84 			free(nstr);
     85 	}
     86 	close(tfd);
     87 	unlink(tname);
     88 
     89 	return NULL;
     90 }
     91 
     92 char *
     93 editstring(char *str)
     94 {
     95 	return runstring(editfile, str, "", 1);
     96 }
     97 
     98 char *
     99 editstringext(char *str, char *ext)
    100 {
    101 	return runstring(editfile, str, ext, 1);
    102 }
    103 
    104 void
    105 pagestring(char *str)
    106 {
    107 	runstring(pagefile, str, "", 0);
    108 }
    109 
    110 void
    111 pagestringext(char *str, char *ext)
    112 {
    113 	runstring(pagefile, str, ext, 0);
    114 }
    115