long env_init (char *user,char *home) { if (may_need_server_init) { /* maybe need to do server init cruft? */ may_need_server_init = NIL; /* not any more we don't */ if (!getuid ()) { /* if root, we're most likely a server */ t_sync (0); /* PTX inetd is stupid, stupid, stupid */ ioctl (0,I_PUSH,"tirdwr");/* it needs this cruft, else servers won't */ dup2 (0,1); /* work. How obnoxious!!! */ } } ENV_INIT (user,home); /* call the real routine */ }
static XtransConnInfo TRANS(TLIReopen)(char *device, int fd, char *port) { XtransConnInfo ciptr; prmsg(3,"TLIReopen(%s,%d, %s)\n", device, fd, port ); if (t_sync (fd) < 0) { prmsg(1, "TLIReopen: t_sync failed\n"); return NULL; } if( (ciptr = calloc(1,sizeof(struct _XtransConnInfo))) == NULL ) { prmsg(1, "TLIReopen: calloc failed\n"); return NULL; } ciptr->fd = fd; return ciptr; }
/*ARGSUSED*/ int main(int argc, char *argv[]) { register SVCXPRT *transp; load_libzfs(); /* * If stdin looks like a TLI endpoint, we assume * that we were started by a port monitor. If * t_getstate fails with TBADF, this is not a * TLI endpoint. */ if (t_getstate(0) != -1 || t_errno != TBADF) { char *netid; struct netconfig *nconf = NULL; openlog("rquotad", LOG_PID, LOG_DAEMON); if ((netid = getenv("NLSPROVIDER")) == NULL) { struct t_info tinfo; if (t_sync(0) == -1) { syslog(LOG_ERR, "could not do t_sync"); zexit(1); } if (t_getinfo(0, &tinfo) == -1) { syslog(LOG_ERR, "t_getinfo failed"); zexit(1); } if (tinfo.servtype == T_CLTS) { if (tinfo.addr == INET_ADDRSTRLEN) netid = "udp"; else netid = "udp6"; } else { syslog(LOG_ERR, "wrong transport"); zexit(1); } } if ((nconf = getnetconfigent(netid)) == NULL) { syslog(LOG_ERR, "cannot get transport info"); } if ((transp = svc_tli_create(0, nconf, NULL, 0, 0)) == NULL) { syslog(LOG_ERR, "cannot create server handle"); zexit(1); } if (nconf) freenetconfigent(nconf); if (!svc_reg(transp, RQUOTAPROG, RQUOTAVERS, dispatch, 0)) { syslog(LOG_ERR, "unable to register (RQUOTAPROG, RQUOTAVERS)."); zexit(1); } (void) sigset(SIGALRM, (void(*)(int)) closedown); (void) alarm(RPCSVC_CLOSEDOWN); svc_run(); zexit(1); /* NOTREACHED */ } /* * Started from a shell - fork the daemon. */ switch (fork()) { case 0: /* child */ break; case -1: perror("rquotad: can't fork"); zexit(1); default: /* parent */ zexit(0); } /* * Close existing file descriptors, open "/dev/null" as * standard input, output, and error, and detach from * controlling terminal. */ closefrom(0); (void) open("/dev/null", O_RDONLY); (void) open("/dev/null", O_WRONLY); (void) dup(1); (void) setsid(); openlog("rquotad", LOG_PID, LOG_DAEMON); /* * Create datagram service */ if (svc_create(dispatch, RQUOTAPROG, RQUOTAVERS, "datagram_v") == 0) { syslog(LOG_ERR, "couldn't register datagram_v service"); zexit(1); } /* * Start serving */ svc_run(); syslog(LOG_ERR, "Error: svc_run shouldn't have returned"); return (1); }
int server_init( char *machine, const char *cservice, /* usually a literal */ int port, char *text, size_t mlen) { # ifndef INET6 char temp[256]; char *service = strncpy(temp, cservice, 255); /* ...calls non-const funcs */ # endif /* !INET6 */ # ifndef VMS int sockt_rd, sockt_wr; # endif /* !VMS */ # ifdef M_AMIGA if (!s_init()) /* some initialisation ... */ return -1; # endif /* M_AMIGA */ # ifdef DECNET char *cp; cp = strchr(machine, ':'); if (cp && cp[1] == ':') { *cp = '\0'; sockt_rd = get_dnet_socket(machine, service); } else sockt_rd = get_tcp_socket(machine, service, port); # else # ifdef INET6 sockt_rd = get_tcp6_socket(machine, (unsigned short) port); # else sockt_rd = get_tcp_socket(machine, service, (unsigned short) port); # endif /* INET6 */ # endif /* DECNET */ if (sockt_rd < 0) return sockt_rd; # ifndef VMS /* * Now we'll make file pointers (i.e., buffered I/O) out of * the socket file descriptor. Note that we can't just * open a fp for reading and writing -- we have to open * up two separate fp's, one for reading, one for writing. */ if ((nntp_rd_fp = (TCP *) s_fdopen(sockt_rd, "r")) == NULL) { perror("server_init: fdopen() #1"); return -errno; } if ((sockt_wr = s_dup(sockt_rd)) < 0) { perror("server_init: dup()"); return -errno; } # ifdef TLI /* Transport Level Interface */ if (t_sync(sockt_rd) < 0) { /* Sync up new fd with TLI */ t_error("server_init: t_sync()"); nntp_rd_fp = NULL; return -EPROTO; } # else if ((nntp_wr_fp = (TCP *) s_fdopen(sockt_wr, "w")) == NULL) { perror("server_init: fdopen() #2"); nntp_rd_fp = NULL; return -errno; } # endif /* TLI */ # else sockt_wr = sockt_rd; # endif /* !VMS */ last_put[0] = '\0'; /* no retries in get_respcode */ /* * Now get the server's signon message */ return (get_respcode(text, mlen)); }