Annotation of 43BSDReno/contrib/emacs-18.55/dist-1.3/process.c, revision 1.1.1.1

1.1       root        1: 
                      2: /* open a TCP network connection to a given HOST/SERVICE.  Treated
                      3:    exactly like a normal process when reading and writing.  Only
                      4:    differences are in status display and process deletion.  A network
                      5:    connection has no PID; you cannot signal it.  All you can do is
                      6:    deactivate and close it via delete-process */
                      7: 
                      8: #ifdef HAVE_UNIX_DOMAIN
                      9: #include <sys/un.h>
                     10: #endif HAVE_UNIX_DOMAIN
                     11: 
                     12: DEFUN ("open-network-stream", Fopen_network_stream, Sopen_network_stream, 
                     13:        4, 4, 0,
                     14: #ifdef HAVE_UNIX_DOMAIN
                     15:   "Open a TCP connection for a service to a host.\n\
                     16: Returns a subprocess-object to represent the connection.\n\
                     17: Input and output work as for subprocesses; `delete-process' closes it.\n\
                     18: Args are NAME BUFFER HOST SERVICE.\n\
                     19: If SERVICE is 0, then HOST is taken to be the name of a socket file, and a\n\
                     20: Unix domain socket is opened.\n\
                     21: NAME is name for process.  It is modified if necessary to make it unique.\n\
                     22: BUFFER is the buffer (or buffer-name) to associate with the process.\n\
                     23:  Process output goes at end of that buffer, unless you specify\n\
                     24:  an output stream or filter function to handle the output.\n\
                     25:  BUFFER may be also nil, meaning that this process is not associated\n\
                     26:  with any buffer\n\
                     27: Third arg is name of the host to connect to.\n\
                     28: Fourth arg SERVICE is name of the service desired, or an integer\n\
                     29:  specifying a port number to connect to."
                     30: #else
                     31:   "Open a TCP connection for a service to a host.\n\
                     32: Returns a subprocess-object to represent the connection.\n\
                     33: Input and output work as for subprocesses; `delete-process' closes it.\n\
                     34: Args are NAME BUFFER HOST SERVICE.\n\
                     35: NAME is name for process.  It is modified if necessary to make it unique.\n\
                     36: BUFFER is the buffer (or buffer-name) to associate with the process.\n\
                     37:  Process output goes at end of that buffer, unless you specify\n\
                     38:  an output stream or filter function to handle the output.\n\
                     39:  BUFFER may be also nil, meaning that this process is not associated\n\
                     40:  with any buffer\n\
                     41: Third arg is name of the host to connect to.\n\
                     42: Fourth arg SERVICE is name of the service desired, or an integer\n\
                     43:  specifying a port number to connect to."
                     44: #endif HAVE_UNIX_DOMAIN
                     45:        )
                     46:    (name, buffer, host, service)
                     47:       Lisp_Object name, buffer, host, service;
                     48: {
                     49:   Lisp_Object proc;
                     50:   register int i;
                     51:   struct sockaddr_in address;
                     52: #ifdef HAVE_UNIX_DOMAIN
                     53:   struct sockaddr_un server;
                     54:   int unix_domain = 0;
                     55: #endif HAVE_UNIX_DOMAIN
                     56:   struct servent *svc_info;
                     57:   struct hostent *host_info;
                     58:   int s, outch, inch;
                     59:   char errstring[80];
                     60:   int port;
                     61: 
                     62:   CHECK_STRING (name, 0);
                     63:   CHECK_STRING (host, 0);
                     64:   if (XTYPE(service) == Lisp_Int)
                     65:     {
                     66: #ifdef HAVE_UNIX_DOMAIN
                     67:        if (XINT (service) == 0)
                     68:          unix_domain = 1;
                     69:        else
                     70: #endif HAVE_UNIX_DOMAIN
                     71:          port = htons ((unsigned short) XINT (service));
                     72:     }
                     73:   else
                     74:     {
                     75:       CHECK_STRING (service, 0);
                     76:       svc_info = getservbyname (XSTRING (service)->data, "tcp");
                     77:       if (svc_info == 0)
                     78:        error ("Unknown service \"%s\"", XSTRING (service)->data);
                     79:       port = svc_info->s_port;
                     80:     }
                     81: 
                     82: #ifdef HAVE_UNIX_DOMAIN
                     83:   if (unix_domain)
                     84:     {
                     85:        server.sun_family = AF_UNIX;
                     86:        strcpy (server.sun_path, XSTRING (host)->data);
                     87:     }
                     88:   else
                     89: #endif HAVE_UNIX_DOMAIN
                     90:     {
                     91:        host_info = gethostbyname (XSTRING (host)->data);
                     92:        if (host_info == 0)
                     93:          error ("Unknown host \"%s\"", XSTRING(host)->data);
                     94: 
                     95:        bzero (&address, sizeof address);
                     96:        bcopy (host_info->h_addr, (char *) &address.sin_addr, host_info->h_length);
                     97:        address.sin_family = host_info->h_addrtype;
                     98:        address.sin_port = port;
                     99:     }
                    100: 
                    101: #ifdef HAVE_UNIX_DOMAIN
                    102:   if (unix_domain)
                    103:     s = socket (AF_UNIX, SOCK_STREAM, 0);
                    104:   else
                    105: #endif HAVE_UNIX_DOMAIN
                    106:     s = socket (host_info->h_addrtype, SOCK_STREAM, 0);
                    107:   
                    108:   if (s < 0)
                    109:     report_file_error ("error creating socket", Fcons (name, Qnil));
                    110: 
                    111: #ifdef HAVE_UNIX_DOMAIN
                    112:   if (unix_domain)
                    113:     {
                    114:        if (connect (s, &server, strlen (server.sun_path) + 2) < 0)
                    115:          error ("connect failed for socket: \"%s\"", XSTRING (host)->data);
                    116:     }
                    117:   else
                    118: #endif HAVE_UNIX_DOMAIN
                    119:     {
                    120:        if (connect (s, &address, sizeof address) == -1)
                    121:          error ("Host \"%s\" not responding", XSTRING (host)->data);
                    122:     }
                    123: 
                    124:   inch = s;
                    125:   outch = dup (s);
                    126:   if (outch < 0) 
                    127:     report_file_error ("error duplicating socket", Fcons (name, Qnil));
                    128: 
                    129:   if (!NULL (buffer))
                    130:     buffer = Fget_buffer_create (buffer);
                    131:   proc = make_process (name);
                    132: 
                    133:   chan_process[inch] = proc;
                    134: 
                    135: #ifdef O_NDELAY
                    136:   fcntl (inch, F_SETFL, O_NDELAY);
                    137: #endif
                    138: 
                    139:   XPROCESS (proc)->childp = host;
                    140:   XPROCESS (proc)->command_channel_p = Qnil;
                    141:   XPROCESS (proc)->buffer = buffer;
                    142:   XPROCESS (proc)->sentinel = Qnil;
                    143:   XPROCESS (proc)->filter = Qnil;
                    144:   XPROCESS (proc)->command = Qnil;
                    145:   XPROCESS (proc)->pid = Qnil;
                    146:   XPROCESS (proc)->kill_without_query = Qt;
                    147:   XFASTINT (XPROCESS (proc)->infd) = s;
                    148:   XFASTINT (XPROCESS (proc)->outfd) = outch;
                    149:   XFASTINT (XPROCESS (proc)->flags) = RUNNING;
                    150:   input_wait_mask |= ChannelMask (inch);
                    151:   return proc;
                    152: }
                    153: 
                    154: 
                    155: DEFUN ("accept-process-output", Faccept_process_output, Saccept_process_output,
                    156:   0, 2, 0,
                    157:   "Allow any pending output from subprocesses to be read by Emacs.\n\
                    158: It is read into the process' buffers or given to their filter functions.\n\
                    159: Non-nil arg PROCESS means do not return until some output has been received\n\
                    160: from PROCESS.  Non-nil arg TIMEOUT means wait for that many seconds, -1\n\
                    161: return immediately.")
                    162:   (proc, timeout)
                    163:      register Lisp_Object proc, timeout;
                    164: {
                    165:   if (NULL (proc)) {
                    166:       if (XTYPE(timeout) == Lisp_Int)
                    167:         timeout = XINT(timeout);
                    168:       else
                    169:         timeout = -1;
                    170:       wait_reading_process_input (timeout, 0, 0);
                    171:     }
                    172:   else
                    173:     {
                    174:       if (XTYPE(timeout) == Lisp_Int)
                    175:         timeout = XINT(timeout);
                    176:       else
                    177:         timeout = 0;
                    178:       proc = get_process (proc);
                    179:       wait_reading_process_input (timeout, XPROCESS (proc), 0);
                    180:     }
                    181:   return Qnil;
                    182: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.