V10/ipc/libin/in_service.c

Compare this file to the similar file:
Show the results in this format:

#include <stdio.h>
#include <sys/inet/in.h>
#include "config.h"

/* imported */
extern char *in_getw();
extern char *strchr();
extern char *strcpy();

/*
 *	Look up the service matching the given parameters.
 */
struct in_service *
in_service(name, proto, port)
char *name;
char *proto;
unsigned long port;
{
	static struct in_service serv;
	static char sname[64], sproto[64];
	char buf[512], *p;
	FILE *fp;

	if((fp = fopen(SERVICES, "r")) == 0){
		perror(SERVICES);
		return(0);
	}
	while(fgets(buf, sizeof(buf), fp)){
		if(buf[0] == '\n' || buf[0] == '#')
			continue;
		if((p = in_getw(buf, sname)) == 0)
			continue;
		serv.name = sname;
		if(name != NULL && strcmp(name, serv.name) != 0)
			continue;
		if(in_getw(p, sproto)==0)
			continue;
		serv.port = atoi(sproto);
		if((port || name==NULL) && port != serv.port)
			continue;
		p = strchr(sproto, '/');
		serv.proto = p == NULL ? "tcp" : p+1;
		if(proto != NULL && strcmp(proto, serv.proto) != 0)
			continue;

		/* we've got a match */
		fclose(fp);
		return(&serv);
	}
	fclose(fp);
	if (name == NULL) {
		sprintf(sname, "tcp.%d", port);
		strcpy(sproto, proto!=NULL ? proto : "tcp");
		serv.proto = sproto;
		serv.name = sname;
		serv.port = port;
		return(&serv);
	}
		
	return(NULL);
}