#include <stdio.h>

#include <sys/stat.h>
#include <errno.h>
#include <string.h>

#include "sms.h"


extern char phone[256];
extern char smsserver[256];
extern unsigned short smsserverport;
extern char program[256];
extern char run[256];
extern char progargs[256];

char port[32];

struct Run {
  char *name;
  char *value;
};

/*
 * Prepend the escape character before all non-alpha or digit characters.
 */
static char *escape(char *input)
{
  struct Push buf;
  char *string=NULL;

  INIT_PUSH(buf);
  while (input && *input) {
    if((*input != ' ') && !isalnum((int)*input) )
      PushByte(&buf, '\\');
    string = PushByte(&buf, *input);
    input++;
  };
  return string;
};

int smsit(char *message)
{
  if(strlen(run)) {
    struct Push buf;
    char *out;
    int i;
    FILE *runit;

    struct Run vars[]={
      {"program", program},
      {"server", smsserver},
      {"port", port},
      {"phone", phone},
      {"progargs", progargs},
      {"message", message},
    };      

    INIT_PUSH(buf);

    sprintf(port, "%d", smsserverport);

    out = run;
    while(*out) {
      if('$' == *out) {
	out++;
	for(i=0; i<sizeof(vars)/sizeof(vars[0]); i++) {
	  if(!strncasecmp(vars[i].name, 
			  out,
			  strlen(vars[i].name))) {
            /* escape all characters possibly sensitive when sent to popen() */
            char *str = escape(vars[i].value);
	    PushString(&buf, str);
	    out+= strlen(vars[i].name);
	    i=0;
	    break;
	  }
	}
	if(i)
	  PushByte(&buf, '$');
      }
      else
	PushByte(&buf, *out++);
    }

    out = PUSH_STRING(buf);

    runit = popen(out, "w");
    if(runit) {
      fwrite(message, strlen(message), 1, runit);
      pclose(runit); /* close program again */

      logf(LOGF_DEBUG, "(cmd in): %s\n", run);
      logf(LOGF_DEBUG, "(cmd run): %s\n", out);
    }
    else
      logf(LOGF_ERROR, "can't run command: \"%s\"\n", run);

  }
  return 0;
}


syntax highlighted by Code2HTML, v. 0.9.1