ftp.nice.ch/Attic/openStep/unix/connectivity/communication/msend.3.3.m.I.bs.tgz#/msend-3.3/compat.c

This is compat.c in view mode; [Download] [Up]

/*
 * msave.c
 *
 * Copyright (c) 1993 Zik Saleeba <zik@zikzak.apana.org.au>
 *
 * This is portability code to allow msend to run on
 * as many systems as possible. All of this code is optional.
 * The parts which are compiled depends on the options
 * selected.
 */
	
/* $Id: compat.c,v 1.1 1997/10/26 07:31:23 lukeh Exp $ */


#include "common.h"

#ifdef USE_LOCKFILES
int
lock_file(fullpath)
	char *fullpath;
{
	char lockpath[PATH_MAX+1];
	char procnum[10];
	char readprocnum[10];
	int lock;
	int failcount;
	int nread;

	lockpath[PATH_MAX] = '\0';
	strcpy(lockpath, fullpath);
	strncat(lockpath, ".lock", PATH_MAX);
	failcount = 0;
	do {
		do  {
			lock = open(lockpath, O_CREAT | O_EXCL | O_WRONLY, 0644);
			if (lock < 0 && errno == EEXIST) {
				failcount++;
				if (failcount < MAX_LOCK_FAILS)
					sleep(1);	/* wait a bit and try again */
				else {
					lock = open(lockpath, O_CREAT, 0644);
					if (lock < 0)
						return -1;
				}
			}
			else {
				if (lock < 0 && errno != EEXIST)
					return -1;
			}
		} while (lock < 0);
	
		/* write our pid to it */
		sprintf(procnum, "%d\n", getpid());
		write(lock, procnum, strlen(procnum));
		close(lock);

		/* check if our pid is there */
		lock = open(lockpath, O_RDONLY);
		if (lock >= 0) {
			if ((nread = read(lock, readprocnum, 9)) <= 0 || strncmp(procnum, readprocnum, nread) != 0) {
				close(lock);
				lock = -1;
			}
			else 
				close(lock);
		}

		/* check failures */
		if (lock < 0) {
			failcount++;
			sleep(1);
			if (failcount >= MAX_LOCK_FAILS)
				return -1;
		}
	} while (lock < 0);

	return 0;
}


int
unlock_file(fullpath)
	char *fullpath;
{
	char lockpath[PATH_MAX+1];

	lockpath[PATH_MAX] = '\0';
	strcpy(lockpath, fullpath);
	strncat(lockpath, ".lock", PATH_MAX);
	return unlink(lockpath);
}
#endif /* USE_LOCKFILES */

#ifdef NO_POSIX_MEMFUNCS
void
compat_memset(dest, cchar, length)
	char *dest;
	char cchar;
	int length;
{
	register char *pos;
	register int count;

	for (pos = dest, count = length; length > 0; length--)
		*pos++ = cchar;
}
#endif /* NO_POSIX_MEMFUNCS */

#ifdef NO_STRCASECMP
char
compat_toupper(a)
	char a;
{
if (a >= 'a' && a <= 'z')
	return a - ('a'-'A');
else
	return a;
}

int
compat_strcasecmp(a, b)
	char *a, *b;
{
	register char *x, *y;
	register char i, j;

	for (x=a, y=b; i=compat_toupper(*x), j=compat_toupper(*y), i!=0 && j!=0; x++, y++) {
		if (i < j)
			return -1;
		else if (i > j)
			return 1;
	}

	if (i == 0) {
		if (j == 0)
			return 0;
		else
			return -1;
	}
	else
		return 1;
}


int
compat_strncasecmp(a, b, n)
	char *a, *b;
{
	register char *x, *y;
	register char i, j;

	for (x=a, y=b; i=compat_toupper(*x), j=compat_toupper(*y), i!=0 && j!=0 && n>0; x++, y++, n--) {
		if (i < j)
			return -1;
		else if (i > j)
			return 1;
	}

	if (n == 0)
		return 0;

	if (i == 0) {
		if (j == 0)
			return 0;
		else
			return -1;
	}
	else
		return 1;
}
#endif /* NO_STRCASECMP */

#ifdef USE_READLINE
void *xmalloc(int size)
{
	void *where;

	where = malloc(size);
	if (where == NULL) {
		fprintf(stderr, "Out of virtual memory\n");
		exit(2);
	}
	return where;
}

void *xrealloc(void *oldone, int size)
{
	void *where;

	where = realloc(oldone, size);
	if (where == NULL) {
		fprintf(stderr, "Out of virtual memory\n");
		exit(2);
	}
	return where;
}
#endif /* USE_READLINE */

#ifdef NO_POSIX_STRFUNCS
char *compat_strstr(d, s)
	char *d, *s;
{
	register char *dscan, *sscan;
	register char *pos;

	for (pos = d; *pos != 0; pos++) {
		for (dscan = pos, sscan = s; *dscan == *sscan && *dscan != '\0'; dscan++, sscan++);
		if (*sscan == '\0')
			return pos;
	}
	return NULL;
}
#endif /* NO_POSIX_STRFUNCS */

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.