callme.c

/** program służy do przygotowywania i umieszczania w odpowiednim katalogu plików
 *  wywołujących dzwonienie od asteriska
 *
 *  program powinien chodzić z SUID użytkownika na którym działa asterisk
 *  (prawa do plików w tym katalogu są restrykcyjnie sprawdzane, ponadto
 *  katalog nie powinien być globalnie zapisywalny)
 *
 *  program umożliwia dzwonienie do samego siebie w systemie kont opartych
 *  o UIDy użytkowników systemowych (opisanym szerzej w
 *  "Konfiguracja w ręce użytkowników") i może być wykorzystany np.
 *  do powiadamiania o nowej poczcie
 *
 *  wymaga to wcześniejszego przygotowania pliku dźwiękowego (np. przy pomocy
 *  text2wave) w oparciu o informacje o nowej poczcie (np. w wyniku przetwarzania
 *  ~/.procmailrc) oraz wykonania tego programu z argumentem będącym ścieżką do tego pliku
 *
 *  ponadto wymaga istnienia odpowiedniego kontekstu w pliku konfiguracyjnym asteriska
 *  (w ~/.asteris.cfg w [dial-in] extension new_mail zgodny z podanym w przykładzie)
 *
 *  użytkownik musi samodzielnie zadbać o usunięcie pliku dźwiękowego
 *  po odpowiednim czasie (np. po 0.5h)
 *
 *  działanie programu odpowiada mniej więcej wywołaniu
 *  asterisk -rx 'originate SIP/41-tel extension new_mail@user-dial-in'
 *  tyle że użytkownik może dzwonić tylko do siebie i wskazać plik do odtworzenia
 *
 *  Więcej informacji o wykorzystanym mechanizmie w
 *  http://www.voip-info.org/wiki-Asterisk+auto-dial+out
**/

#include <stdio.h>
int main (int argc, char *argv[]) {
  char fnameA[100], fnameB[130];
  int pid, uid, uid_prefix = 4;
  
  pid = getpid();
  uid = getuid();
  
  sprintf(fnameA, "/var/tmp/callme_%d_%d.txt", uid, pid);
  sprintf(fnameB, "/var/spool/asterisk/outgoing/callme_%d_%d.txt", uid, pid);
  
  uid = uid - 1000;
  
  FILE *plik;
  plik=fopen(fnameA, "w+");
  if (plik == NULL) {
    perror("Blad otwarcia pliku:");
    return -1;
  }
  
  fprintf(plik, "Channel: Local/%d%d\n", uid_prefix, uid);
  fprintf(plik, "CallerID: New Mail <NewMail>\n");
  fprintf(plik, "MaxRetries: 2\n");
  fprintf(plik, "RetryTime: 120\n");
  fprintf(plik, "WaitTime: 45\n");
  fprintf(plik, "Context: %d%d-dial-in\n", uid_prefix, uid);
  fprintf(plik, "Extension: new_mail\n");
  if (argc > 1)
    fprintf(plik, "Set: komunikat=%s\n", argv[1]);
  
  close(plik);
  if ( rename(fnameA, fnameB) ) {
    perror("Blad przenoszenia pliku:");
    return -1;
  }
}

XHTML generated by highlight (http://www.andre-simon.de/) from callme.c



Copyright (c) 1999-2015, Robert Paciorek (http://www.opcode.eu.org/), BSD/MIT-type license


Redystrybucja wersji źródłowych i wynikowych, po lub bez dokonywania modyfikacji JEST DOZWOLONA, pod warunkiem zachowania niniejszej informacji o prawach autorskich. Autor NIE ponosi JAKIEJKOLWIEK odpowiedzialności za skutki użytkowania tego dokumentu/programu oraz za wykorzystanie zawartych tu informacji.

This text/program is free document/software. Redistribution and use in source and binary forms, with or without modification, ARE PERMITTED provided save this copyright notice. This document/program is distributed WITHOUT any warranty, use at YOUR own risk.

Valid XHTML 1.1 Dokument ten (URL: http://www.opcode.eu.org/usage_and_config/network_services/user_config/callme.c) należy do serwisu OpCode. Autorem tej strony jest Robert Paciorek, wszelkie uwagi proszę kierować na adres e-mail serwisu: webmaster@opcode.eu.org.
Data ostatniej modyfikacji artykulu: '2014-01-07 19:27:43 (UTC)' (data ta może być zafałszowana niemerytorycznymi modyfikacjami artykułu).