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.