Ultrix-3.1/src/cmd/uucp/uucompact.c

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


/**********************************************************************
 *   Copyright (c) Digital Equipment Corporation 1984, 1985, 1986.    *
 *   All Rights Reserved. 					      *
 *   Reference "/usr/src/COPYRIGHT" for applicable restrictions.      *
 **********************************************************************/

static char Sccsid[] = "@(#)uucompact.c	3.0	4/22/86";

/*
 * uucompact.c
 *
 *	Program to compact the uucp spool directories
 *
 *					
 */

#include	"uucp.h"
#include	<sys/types.h>
#ifdef NDIR
#include "ndir.h"
#else
#include <sys/dir.h>
#endif
#include	<time.h>
#include	<pwd.h>
#include	<errno.h>
#include	<sys/stat.h>

extern int errno;
int uuid, ugid;
#define SYS 	"/usr/spool/uucp/sys"
char *getsubdirs();
#define FIND 	0
#define UPDATE	1
#define DONE	2
#define BEGIN	1
#define CURRENT	0
#define TRUE 	0
#define FALSE	-1

main(argc, argv)
int argc; char *argv[];
{
struct direct *dirp, *Cdirp;
	struct passwd *pwd;
	DIR *ufd, *Cfd;
	struct stat statbuff;
	char newname[MAXFULLNAME];
	char oldname[MAXFULLNAME];
	char directory[MAXFULLNAME];
	FILE *dirlist;
	char compdir[MAXFULLNAME];
	char thissys[50];
	char *csys;
	char *subd;
	int ret;
	

	if ((pwd=getpwnam("uucp"))==NULL)
		ASSERT(pwd != NULL, "could not get passwd entry for uucp", "", errno);
	uuid = pwd->pw_uid;
	ugid = pwd->pw_gid;
	umask(WFMASK);

	csys = "ALL";
	uucpname(thissys);  /* init subdir stuff */

	while (argc>1 && argv[1][0] == '-') {
		switch (argv[1][1]) {
		case 's':  /* system to compact */
			csys = &argv[1][2];
			break;
		case 'x':
			Debug = atoi(&argv[1][2]);
			break;
		default:
			printf("unknown flag %s\n", argv[1]); break;
		}
		--argc;  argv++;
	}


	DEBUG(3, "START\n\n","");
	if (strcmp(csys,"ALL") != SAME) {
		sprintf(compdir,"%s/%s",SYS, csys);
		if (stat(compdir, &statbuff)) {
			fprintf(stderr, "sys directory does not exist: %s\n",
					compdir);
			exit(1);
		}
		DEBUG(3, "compact system: %s\n", csys);
		chdir(compdir);
		while((subd=getsubdirs())!=CNULL) 
			compact(subd);
		exit(0);
	}
		
	if ((Cfd = opendir(SYS,"r"))==NULL) 
		ASSERT(Cfd != NULL, "Can no open directory", SYS, errno);

	DEBUG(4, "try to compact all systems\n","");
	/* process all systems in SYS */
	while ((Cdirp=readdir(Cfd)) != NULL) {
		if(Cdirp->d_ino==(ino_t)0 || strncmp(".",Cdirp->d_name,1)==0)
			continue;

		/* if system has not been processed then proceed */

		ret = process(Cdirp->d_name, FIND);
		if (ret) /* update progress file if not found */
			process(Cdirp->d_name, UPDATE);
		sprintf(compdir,"%s/%s",SYS,Cdirp->d_name);
		DEBUG(3,"compact system dir: %s\n", compdir);
		chdir(compdir);
		while((subd=getsubdirs())!=CNULL) {

			/* if subdirectory has not been processed then
			 * proceed.
			 */

			if (ret) { 
				/* we have not processed this system yet
				 * therefore we did not process any of
				 * its subdirectories.  So dont
				 * check to see if they have been
			  	 * processed.
				 */
				compact(subd);
				process(subd, UPDATE);
			}
			else 
				/* this system has been processed previously */
				/* check to see if all subdirs have been 
				 * processed.
				 */
				if (process(subd, FIND)==FALSE) {
					/* not processed yet */
					DEBUG(3,"compact subdir: %s\n",subd);
					compact(subd);
					process(subd, UPDATE);
				}
		}
	}
	closedir(Cfd);

	chdir(SPOOL);
	if (process("TM.", FIND)==FALSE) {
		compact("TM.");
		process("TM.",UPDATE);
		DEBUG(3,"have compacted TM.\n","");
	}

	if (process("STST.", FIND)==FALSE) {
		compact("STST.");
		process("STAT.", UPDATE);
		DEBUG(3,"have compacted STST.\n","");
	}

	process("", DONE);  /* remove logging file */
}

/*
 * check to see if the directory corresponding to name has been
 * compacted yet.  
 */

#define PROGRESS "/usr/spool/uucp/UUCOMPLOG"

process(name, command)
int command;
char *name;
	{
	char buf[NAMESIZE];
	int namesiz;
	struct stat stbuf;
	static FILE *prog = NULL;
	if (prog == NULL)  /* create progress file if first time through */
		/* if progress file exists then a previous uucompact process
		 * was aborted - open the progress file and continue
		 * processing.
		 */
		if (stat(PROGRESS, &stbuf)) 
			prog = fopen(PROGRESS, "w+");
		else 
			/* create progress file */
			prog = fopen(PROGRESS, "r+");
	
	ASSERT(prog != NULL, "Could not open progress file", "", errno);

	switch(command) {
	case FIND:
		namesiz = strlen(name);
		while (fgets(buf,NAMESIZE,prog) != NULL) {
			if (strncmp(name,buf,namesiz) == SAME) {
				DEBUG(4," found name: %s\n", name);
				return(TRUE);
			}
		}
		DEBUG(4, "name not found: %s\n", name);
		return(FALSE);
		break;
	case UPDATE:
		DEBUG(4, "update : %s\n", name);
		fputs(name, prog);
		fputc('\n', prog);
		break;
	case DONE:
		DEBUG(4, "done : %s\n", "");
		unlink(PROGRESS);
		break;
	}
}

			

newdir(ndir, tempdir)
char *ndir, *tempdir;
{
#ifdef V7M11
	int ret;
	char cmd[MAXFULLNAME];
	sprintf(cmd, "rm -r %s", ndir);
	system(cmd);
	sprintf(cmd, "mv %s %s", tempdir, ndir);
	ret = system(cmd);
	ASSERT(ret==0, "can not rename", tempdir, errno);
#else
	ASSERT(rename(tempdir,ndir)==0, "can not rename", tempdir, errno);
#endif
	chown(ndir, uuid, ugid);
	chmod(ndir, 0755);
}

compact(directory)
char *directory;
{
	char oldname[MAXFULLNAME];
	char newname[MAXFULLNAME];
	char temp[MAXFULLNAME];
#ifdef V7M11
	char cmd[MAXFULLNAME];
#endif
	DIR *ufd;
	struct direct *dirp;
	errno = 0;
	if( (ufd=opendir(directory,"r")) == NULL )
		ASSERT(ufd != NULL, "can not open directory", directory, errno);
	sprintf(temp,"temp.%s", directory);
#ifdef V7M11
	sprintf(cmd,"mkdir %s", temp);
	system(cmd);
#else
	if (mkdir(temp) && errno != EEXIST) 
		ASSERT(0, "can not make temp", temp, errno);
#endif
	chmod(temp,0755);
	while( (dirp=readdir(ufd))!=NULL)
	{
		if( dirp->d_ino==(ino_t)0 || strncmp(".", dirp->d_name,1)==0)
			continue;
		sprintf(oldname,"%s/%s",directory,dirp->d_name);
		DEBUG(8,"oldname=[%s]",oldname);
		sprintf(newname,"%s/%s",temp, dirp->d_name);
		DEBUG(8,"  newname=[%s]\n",newname);

		/* if this is a restart of uucompact there may be file
		 * which has been linked to a temp file but has
		 * not been unlinked yet
		 */
		
		if (link(oldname, newname) < 0 && errno!=EEXIST)
			ASSERT(0,"can not link file to temp", newname, errno);
		ASSERT(unlink(oldname)==0,"can not unlink file ",
			oldname, errno);
	}
	closedir(ufd);
	newdir(directory, temp);
}

cleanup()
{
exit(1);
}