mirror of
https://github.com/mabam/CAP.git
synced 2026-01-23 04:16:01 +00:00
308 lines
4.8 KiB
C
308 lines
4.8 KiB
C
/*
|
|
* $Author: djh $ $Date: 1996/06/18 10:46:58 $
|
|
* $Header: /mac/src/cap60/lib/afp/RCS/afpidclnt.c,v 2.5 1996/06/18 10:46:58 djh Rel djh $
|
|
* $Revision: 2.5 $
|
|
*
|
|
*/
|
|
|
|
/*
|
|
* AUFS fixed directory IDs
|
|
*
|
|
* library functions used by client programs only
|
|
*
|
|
* John Forrest <jf@ap.co.umist.ac.uk>
|
|
*
|
|
*/
|
|
|
|
#ifdef FIXED_DIRIDS
|
|
|
|
#include <sys/types.h>
|
|
#include <sys/socket.h>
|
|
#include <sys/param.h>
|
|
#include <sys/stat.h>
|
|
#include <sys/un.h>
|
|
#include <netinet/in.h>
|
|
#include <netdb.h>
|
|
#include <errno.h>
|
|
#include <stdio.h>
|
|
#include <signal.h>
|
|
#include <fcntl.h>
|
|
#ifdef USE_GDBM
|
|
#include <gdbm.h>
|
|
#else /* USE_GDBM */
|
|
#include <ndbm.h>
|
|
#endif /* USE_GDBM */
|
|
#include <malloc.h>
|
|
#include <sys/time.h>
|
|
|
|
#include "afpidaufs.h"
|
|
|
|
static time_t openTime;
|
|
static char *pagFile = NULL;
|
|
|
|
int
|
|
connect_query(sock)
|
|
int sock;
|
|
{
|
|
struct sockaddr *addr;
|
|
int addrlen;
|
|
|
|
query_addr(&addr, &addrlen);
|
|
return(connect(sock, addr, addrlen));
|
|
}
|
|
|
|
time_t
|
|
getMtime(file)
|
|
char *file;
|
|
{
|
|
struct stat buf;
|
|
|
|
if (stat(file, &buf) < 0)
|
|
return(0);
|
|
|
|
return(buf.st_mtime);
|
|
}
|
|
|
|
void
|
|
setPagFile()
|
|
{
|
|
pagFile = (char *)malloc(strlen(aufsDbName)+4+1);
|
|
strcpy(pagFile, aufsDbName);
|
|
#ifndef USE_GDBM
|
|
strcat(pagFile, ".pag");
|
|
#endif /* USE_GDBM */
|
|
}
|
|
|
|
|
|
int
|
|
open_dbase(first)
|
|
int first;
|
|
{
|
|
datum initial_key, initial;
|
|
char *version;
|
|
|
|
if (db != NULL)
|
|
return(1);
|
|
|
|
if (pagFile == NULL)
|
|
setPagFile();
|
|
|
|
openTime = getMtime(pagFile); /* do before for safety! */
|
|
|
|
#ifdef USE_GDBM
|
|
{ int tries = 0;
|
|
while ((db = gdbm_open(aufsDbName, 2048, GDBM_READER, 0644, 0L)) == NULL) {
|
|
if (++tries > 60)
|
|
return(-1);
|
|
usleep(250000);
|
|
}
|
|
}
|
|
#else /* USE_GDBM */
|
|
if ((db = dbm_open(aufsDbName, O_RDONLY, 0644)) == NULL)
|
|
return(-1);
|
|
#endif /* USE_GDBM */
|
|
|
|
if (first) {
|
|
initial_key.dptr = "I";
|
|
initial_key.dsize = strlen(initial_key.dptr);
|
|
#ifdef USE_GDBM
|
|
initial = gdbm_fetch(db, initial_key);
|
|
#else /* USE_GDBM */
|
|
initial = dbm_fetch(db, initial_key);
|
|
#endif /* USE_GDBM */
|
|
if (initial.dptr == NULL) {
|
|
close_dbase();
|
|
return(-1);
|
|
}
|
|
if (extract_init(initial, &version, &rootEid) < 0) {
|
|
close_dbase();
|
|
return(-1);
|
|
}
|
|
if (strcmp(version, aufsDbVersion) != 0) {
|
|
close_dbase();
|
|
return(-2);
|
|
}
|
|
#ifdef USE_GDBM
|
|
if (initial.dptr != NULL)
|
|
free(initial.dptr);
|
|
#endif /* USE_GDBM */
|
|
}
|
|
return(1);
|
|
}
|
|
|
|
void
|
|
close_dbase()
|
|
{
|
|
if (db == NULL)
|
|
return;
|
|
#ifdef USE_GDBM
|
|
gdbm_close(db);
|
|
#else /* USE_GDBM */
|
|
dbm_close(db);
|
|
#endif /* USE_GDBM */
|
|
db = NULL;
|
|
return;
|
|
}
|
|
|
|
int
|
|
poll_db(force)
|
|
int force;
|
|
{
|
|
if (pagFile == NULL)
|
|
setPagFile();
|
|
|
|
if (force || getMtime(pagFile) > openTime) {
|
|
int res;
|
|
|
|
close_dbase();
|
|
res = open_dbase(FALSE);
|
|
return((res >= 0) ? 0 : res);
|
|
}
|
|
|
|
return(1);
|
|
}
|
|
|
|
static int
|
|
send_command(command)
|
|
char *command;
|
|
{
|
|
int sock;
|
|
int n;
|
|
|
|
if ((sock = query_socket()) < 0)
|
|
return(-2);
|
|
|
|
if (connect_query(sock) < 0) {
|
|
close(sock);
|
|
return(-3);
|
|
}
|
|
|
|
n = send(sock, command, strlen(command), 0);
|
|
close(sock);
|
|
|
|
return(n);
|
|
}
|
|
|
|
int
|
|
send_new(path)
|
|
char *path;
|
|
{
|
|
char command[MAXPATHLEN+3];
|
|
|
|
sprintf(command, "A%s\277", path);
|
|
return(send_command(command));
|
|
}
|
|
|
|
int
|
|
send_new_id(parent, remaining)
|
|
sdword parent;
|
|
char *remaining;
|
|
{
|
|
char command[MAXPATHLEN+32];
|
|
|
|
sprintf(command, "a%d\277%s\277", parent, remaining);
|
|
return(send_command(command));
|
|
}
|
|
|
|
int
|
|
send_new_fid(parent, remaining)
|
|
sdword parent;
|
|
char *remaining;
|
|
{
|
|
char command[MAXPATHLEN+32];
|
|
|
|
sprintf(command, "f%d\277%s\277", parent, remaining);
|
|
return(send_command(command));
|
|
}
|
|
|
|
int
|
|
send_delete(path)
|
|
char *path;
|
|
{
|
|
char command[MAXPATHLEN+3];
|
|
|
|
sprintf(command, "D%s\277", path);
|
|
return(send_command(command));
|
|
}
|
|
|
|
int
|
|
send_delete_id(id)
|
|
sdword id;
|
|
{
|
|
char command[32];
|
|
|
|
sprintf(command, "d%d\277", id);
|
|
return(send_command(command));
|
|
}
|
|
|
|
int
|
|
send_move(from, to)
|
|
char *from, *to;
|
|
{
|
|
char command[2*MAXPATHLEN+4];
|
|
|
|
sprintf(command, "M%s\277%s\277", from, to);
|
|
return(send_command(command));
|
|
}
|
|
|
|
int
|
|
send_move_id(from_parent, old_name, to_parent, new_name)
|
|
sdword from_parent, to_parent;
|
|
char *old_name, *new_name;
|
|
{
|
|
char command[2*MAXPATHLEN+32]; /* should be sufficient */
|
|
|
|
sprintf(command, "m%d\277%s\277%d\277%s\277", from_parent,
|
|
old_name, to_parent, new_name);
|
|
return(send_command(command));
|
|
}
|
|
|
|
int
|
|
send_rename(orig_path, new_name)
|
|
char *orig_path, *new_name;
|
|
{
|
|
char command[2*MAXPATHLEN+4];
|
|
|
|
sprintf(command, "R%s\277%s\277", orig_path, new_name);
|
|
return(send_command(command));
|
|
}
|
|
|
|
int
|
|
send_rename_id(id, new_name)
|
|
sdword id;
|
|
char *new_name;
|
|
{
|
|
char command[MAXPATHLEN+32];
|
|
|
|
sprintf(command, "r%d\277%s\277", id, new_name);
|
|
return(send_command(command));
|
|
}
|
|
|
|
int
|
|
send_clean()
|
|
{
|
|
char command[32];
|
|
|
|
sprintf(command, "C");
|
|
return(send_command(command));
|
|
}
|
|
|
|
int
|
|
amAufsExt()
|
|
{
|
|
return(0);
|
|
}
|
|
|
|
/*
|
|
* never called, but needed for linking
|
|
*
|
|
*/
|
|
|
|
void
|
|
flush_database()
|
|
{
|
|
}
|
|
#else FIXED_DIRIDS
|
|
int afpdid_dummy_2; /* keep loader happy */
|
|
#endif FIXED_DIRIDS
|