Jabber WindowGram Client (JWGC)

Introduction Screenshots Installation Downloads
Documentation Browse Source Resources Project Site

Stable Version
-none-

Latest Version
beta5



Main Page | Alphabetical List | Data Structures | Directories | File List | Data Fields | Globals

port.c File Reference

#include "mit-copyright.h"
#include "main.h"
#include "new_string.h"
#include "port_dictionary.h"
#include "port.h"
#include "notice.h"
#include "variables.h"

Go to the source code of this file.

Functions

void init_ports ()
string read_from_port (string name)
void write_on_port (string name, char *text, int length)
void close_port_input (string name)
void close_port_output (string name)
void create_port_from_files (string name, FILE *input, FILE *output)
void create_subprocess_port (string name, char **argv)
void create_file_append_port (string name, string filename)
void create_file_input_port (string name, string filename)
void create_file_output_port (string name, string filename)
void create_port_from_filter (string name, string(*)() filter)
void create_port_from_output_proc (string name, char *(*)() output)


Function Documentation

void close_port_input string  name  ) 
 

Definition at line 285 of file port.c.

References port_dictionary_binding, port_dictionary_Delete(), port_dictionary_Lookup(), port::status, and _port_dictionary_binding::value.

00287 {
00288         port_dictionary_binding *binding;
00289 
00290         binding = port_dictionary_Lookup(port_dict, name);
00291         if (!binding)
00292                 return;
00293 
00294         port_close_input(&(binding->value));
00295         if (binding->value.status == PORT_CLOSED)
00296                 port_dictionary_Delete(port_dict, binding);
00297 }

void close_port_output string  name  ) 
 

Definition at line 312 of file port.c.

References port_dictionary_binding, port_dictionary_Delete(), port_dictionary_Lookup(), port::status, and _port_dictionary_binding::value.

00314 {
00315         port_dictionary_binding *binding;
00316 
00317         binding = port_dictionary_Lookup(port_dict, name);
00318         if (!binding)
00319                 return;
00320 
00321         port_close_output(&(binding->value));
00322         if (binding->value.status == PORT_CLOSED)
00323                 port_dictionary_Delete(port_dict, binding);
00324 }

void create_file_append_port string  name,
string  filename
 

Definition at line 491 of file port.c.

References create_port_from_files(), errno, and var_set_variable().

00494 {
00495         FILE *out;
00496         int oumask;
00497 
00498         errno = 0;
00499 
00500         oumask = umask(077);    /* allow read/write for us only */
00501         out = fopen(filename, "a");
00502         (void) umask(oumask);
00503         if (out == NULL) {
00504                 var_set_variable("error", strerror(errno));
00505                 return;
00506         }
00507 
00508         create_port_from_files(name, 0, out);
00509 }

void create_file_input_port string  name,
string  filename
 

Definition at line 512 of file port.c.

References create_port_from_files(), errno, and var_set_variable().

00515 {
00516         FILE *in;
00517 
00518         errno = 0;
00519         in = fopen(filename, "r");
00520         if (in == NULL) {
00521                 var_set_variable("error", strerror(errno));
00522                 return;
00523         }
00524 
00525         create_port_from_files(name, in, 0);
00526 }

void create_file_output_port string  name,
string  filename
 

Definition at line 529 of file port.c.

References create_port_from_files(), errno, and var_set_variable().

00532 {
00533         FILE *out;
00534         int oumask;
00535 
00536         errno = 0;
00537 
00538         oumask = umask(077);    /* allow read/write for us only */
00539         out = fopen(filename, "w");
00540         (void) umask(oumask);
00541         if (out == NULL) {
00542                 var_set_variable("error", strerror(errno));
00543                 return;
00544         }
00545 
00546         create_port_from_files(name, 0, out);
00547 }

void create_port_from_files string  name,
FILE *  input,
FILE *  output
 

Definition at line 411 of file port.c.

References port::close_input, port::close_output, port::data, port__data::file, port::get, port__data::input_connector, port__data::output_connector, port::put, and port::status.

00415 {
00416         port *p = create_named_port(name);
00417 
00418 #if !defined(__HIGHC__)
00419         p->get = input ? get_file : NULL;
00420         p->put = output ? put_file : NULL;
00421 #else
00422         /* RT compiler (hc2.1y) bug workaround */
00423         if (input)
00424                 p->get = get_file;
00425         else
00426                 p->get = NULL;
00427         if (output)
00428                 p->put = put_file;
00429         else
00430                 p->put = NULL;
00431 #endif
00432         p->close_input = close_file_input;
00433         p->close_output = close_file_output;
00434         p->status = 0;
00435         p->data.file.input_connector = input;
00436         p->data.file.output_connector = output;
00437 }

void create_port_from_filter string  name,
string(*) ()  filter
 

Definition at line 610 of file port.c.

References port::close_input, port::close_output, port::data, port__data::filter, port::get, port::put, port::status, string_stack_create, and port__data::waiting_packets.

00613 {
00614         port *p = create_named_port(name);
00615 
00616         p->get = get_filter;
00617         p->put = put_filter;
00618         p->close_input = close_filter_input;
00619         p->close_output = close_filter_output;
00620         p->status = 0;
00621         p->data.filter.waiting_packets = string_stack_create();
00622         p->data.filter.filter = filter;
00623 }

void create_port_from_output_proc string  name,
char *(*) ()  output
 

Definition at line 655 of file port.c.

References port::close_input, port::close_output, port::data, port::get, port__data::output, port::put, and port::status.

00658 {
00659 #ifdef SABER                    /* Yes, it's another ANSI incompatiblity */
00660         port *p;
00661 #else
00662         port *p = create_named_port(name);
00663 #endif
00664 
00665 #ifdef SABER
00666         p = create_named_port(name);
00667 #endif
00668 
00669         p->get = NULL;
00670         p->put = put_output;
00671         p->close_input = close_output;
00672         p->close_output = close_output;
00673         p->status = 0;
00674         p->data.output.output = output;
00675 }

void create_subprocess_port string  name,
char **  argv
 

Definition at line 446 of file port.c.

References create_port_from_files(), and errno.

00449 {
00450         int pid;
00451         int to_child_descriptors[2];
00452         int to_parent_descriptors[2];
00453         FILE *in = 0;
00454         FILE *out = 0;
00455 
00456         /* <<<>>> (file leak) */
00457         if (pipe(to_child_descriptors) != 0 || pipe(to_parent_descriptors) != 0)
00458                 return;
00459 
00460         pid = fork();
00461         if (pid == -1) {
00462                 fprintf(stderr, "jwgc: error while attempting to fork: ");
00463                 perror("");
00464                 return;         /* <<<>>> */
00465         }
00466         else if (pid == 0) {    /* in child */
00467                 close(0);
00468                 close(1);
00469                 dup2(to_child_descriptors[0], 0);
00470                 dup2(to_parent_descriptors[1], 1);
00471                 close(to_child_descriptors[1]);
00472                 close(to_parent_descriptors[0]);
00473 
00474                 execvp(argv[0], argv);
00475                 fprintf(stderr, "jwgc: unable to exec %s: ", argv[0]);
00476                 perror("");
00477                 _exit(errno);
00478         }
00479 
00480         fcntl(to_parent_descriptors[0], F_SETFD, 1);
00481         fcntl(to_child_descriptors[1], F_SETFD, 1);
00482         in = fdopen(to_parent_descriptors[0], "r");
00483         out = fdopen(to_child_descriptors[1], "w");
00484         close(to_child_descriptors[0]);
00485         close(to_parent_descriptors[1]);
00486 
00487         create_port_from_files(name, in, out);
00488 }

void init_ports  ) 
 

Definition at line 153 of file port.c.

References port_dictionary_Create(), port_dictionary_Destroy(), and port_dictionary_Enumerate().

Referenced by main().

00154 {
00155         if (port_dict) {
00156                 port_dictionary_Enumerate(port_dict, close_port_from_binding);
00157                 port_dictionary_Destroy(port_dict);
00158         }
00159 
00160         port_dict = port_dictionary_Create(31);
00161 }

string read_from_port string  name  ) 
 

Definition at line 233 of file port.c.

References string_Copy, and var_set_variable().

00235 {
00236         port *p;
00237 
00238         if (!(p = get_named_port(name))) {
00239                 var_set_variable("error", "No such port");
00240                 return (string_Copy(""));
00241         }
00242 
00243         return (port_get(p));
00244 }

void write_on_port string  name,
char *  text,
int  length
 

Definition at line 257 of file port.c.

References var_set_variable().

00261 {
00262         port *p;
00263 
00264         if (!(p = get_named_port(name))) {
00265                 var_set_variable("error", "No such port");
00266                 return;
00267         }
00268 
00269         port_put(p, text, length);
00270 }



Last updated at Tue Dec 18 21:07:42 PST 2007. This site and project hosted by...SourceForge.net Logo

Source Perspective by Fisheye