12061Sjkh/*
238042Sbde * ----------------------------------------------------------------------------
32061Sjkh * "THE BEER-WARE LICENSE" (Revision 42):
433611Sjb * <phk@FreeBSD.org> wrote this file.  As long as you retain this notice you
532427Sjb * can do whatever you want with this stuff. If we meet some day, and you think
632427Sjb * this stuff is worth it, you can buy me a beer in return.   Poul-Henning Kamp
736111Sjb * ----------------------------------------------------------------------------
833611Sjb *
932427Sjb * $FreeBSD: releng/10.3/usr.sbin/ctm/ctm/ctm.h 113201 2003-04-07 08:09:53Z mckay $
1032427Sjb *
112061Sjkh */
1215603Smarkm
1330169Sjkh#include <ctype.h>
142061Sjkh#include <err.h>
1512483Speter#include <errno.h>
1634509Sbde#include <stdio.h>
172160Scsgr#include <stdlib.h>
182834Swollman#include <string.h>
192061Sjkh#include <time.h>
202061Sjkh#include <unistd.h>
212160Scsgr#include <md5.h>
2217308Speter#include <regex.h>
2319320Sadam#include <sys/types.h>
2427788Sasami#include <sys/stat.h>
2530169Sjkh#include <sys/file.h>
2625980Sasami#include <sys/time.h>
271594Srgrimes
2817308Speter#define VERSION "2.0"
2917308Speter
3027910Sasami#define SUBSUFF ".ctm"
3127910Sasami#define TMPSUFF ".ctmtmp"
3227910Sasami#define TARCMD  "tar -rf %s -T -"
3317308Speter
3417308Speter/* The fields... */
3517308Speter#define CTM_F_MASK		0xff
3619175Sbde#define CTM_F_Name		0x01
3719175Sbde#define CTM_F_Uid		0x02
3819175Sbde#define CTM_F_Gid		0x03
3919175Sbde#define CTM_F_Mode		0x04
4017308Speter#define CTM_F_MD5		0x05
4127910Sasami#define CTM_F_Count		0x06
4234509Sbde#define CTM_F_Bytes		0x07
4327910Sasami
4417308Speter/* The qualifiers... */
4538042Sbde#define CTM_Q_MASK		0xff00
4638042Sbde#define CTM_Q_Name_File		0x0100
4738042Sbde#define CTM_Q_Name_Dir		0x0200
4838042Sbde#define CTM_Q_Name_New		0x0400
4938042Sbde#define CTM_Q_Name_Subst	0x0800
5038042Sbde#define CTM_Q_MD5_After		0x0100
5138042Sbde#define CTM_Q_MD5_Before	0x0200
5238042Sbde#define CTM_Q_MD5_Chunk		0x0400
5338042Sbde#define CTM_Q_MD5_Force		0x0800
5438042Sbde
552061Sjkhstruct CTM_Syntax {
562061Sjkh    char	*Key;		/* CTM key for operation */
571594Srgrimes    int		*List;		/* List of operations */
5830169Sjkh    };
5930169Sjkh
6030169Sjkhextern struct CTM_Syntax Syntax[];
6130169Sjkh
6230169Sjkhstruct CTM_Filter {
6330169Sjkh    struct CTM_Filter	*Next;	/* next filter in the list */
6430169Sjkh    int 		Action;	/* enable or disable */
6530169Sjkh    regex_t 		CompiledRegex;	/* compiled regex */
667407Srgrimes};
677108Sphk
687108Sphk#define	CTM_FILTER_DISABLE	0
697108Sphk#define	CTM_FILTER_ENABLE	1
707407Srgrimes
717407Srgrimes#define Malloc malloc
727407Srgrimes#define Free free
737108Sphk#define Delete(foo) if (!foo) ; else {Free(foo); foo = 0; }
742061Sjkh#define String(foo) strdup(foo)
752061Sjkh
762061Sjkh#ifndef EXTERN
7717308Speter#  define EXTERN extern
782061Sjkh#endif
792061SjkhEXTERN u_char *Version;
802061SjkhEXTERN u_char *Name;
812061SjkhEXTERN u_char *Nbr;
822061SjkhEXTERN u_char *TimeStamp;
8335427SbdeEXTERN u_char *Prefix;
8435427SbdeEXTERN u_char *FileName;
8530169SjkhEXTERN u_char *TmpDir;
862626ScsgrEXTERN u_char *CatPtr;
872061SjkhEXTERN u_char *Buffer;
882061SjkhEXTERN u_char *BackupFile;
892061SjkhEXTERN u_char *TarCmd;
902061Sjkh
912061Sjkh/*
922061Sjkh * Paranoid -- Just in case they should be after us...
9319320Sadam *  0 not at all.
942061Sjkh *  1 normal.
952061Sjkh *  2 somewhat.
962061Sjkh *  3 you bet!.
972061Sjkh *
982061Sjkh * Verbose -- What to tell mom...
992061Sjkh *  0 Nothing which wouldn't surprise.
1002061Sjkh *  1 Normal.
1012061Sjkh *  2 Show progress '.'.
1022061Sjkh *  3 Show progress names, and actions.
1032061Sjkh *  4 even more...
1042061Sjkh *  and so on
1052834Swollman *
1062834Swollman * ExitCode -- our Epitaph
1072834Swollman *  0 Perfect, all input digested, no problems
1082834Swollman *  1 Bad input, no point in retrying.
1092834Swollman *  2 Pilot error, commandline problem &c
1102834Swollman *  4 Out of resources.
1111594Srgrimes *  8 Destination-tree not correct.
1124486Sphk * 16 Destination-tree not correct, can force.
1134486Sphk * 32 Internal problems.
1144486Sphk *
1154486Sphk */
1164486Sphk
1172061SjkhEXTERN int Paranoid;
1182061SjkhEXTERN int Verbose;
11925979SjkhEXTERN int Exit;
12025979SjkhEXTERN int Force;
12125979SjkhEXTERN int CheckIt;
12225979SjkhEXTERN int KeepIt;
1232061SjkhEXTERN int ListIt;
12425979SjkhEXTERN int SetTime;
1252061SjkhEXTERN struct timeval Times[2];
1262061SjkhEXTERN struct CTM_Filter	*FilterList;
12717308SpeterEXTERN struct CTM_Filter	*LastFilter;
1282061Sjkh
1292061Sjkh#define Exit_OK		0
1302061Sjkh#define Exit_Garbage	1
1312061Sjkh#define Exit_Pilot	2
1322061Sjkh#define Exit_Broke	4
13312483Speter#define Exit_NotOK	8
13412483Speter#define Exit_Forcible	16
13512483Speter#define Exit_Mess	32
13612483Speter#define Exit_Done	64
1372061Sjkh#define Exit_Version	128
13835479Sbde#define Exit_NoMatch	256
1398854Srgrimes
1402061Sjkhvoid Fatal_(int ln, char *fn, char *kind);
1412061Sjkh#define Fatal(foo) Fatal_(__LINE__,__FILE__,foo)
14212483Speter#define Assert() Fatal_(__LINE__,__FILE__,"Assert failed.")
1432061Sjkh#define WRONG {Assert(); return Exit_Mess;}
14435479Sbde
14535479Sbdeu_char * Ffield(FILE *fd, MD5_CTX *ctx,u_char term);
14635479Sbdeu_char * Fname(FILE *fd, MD5_CTX *ctx,u_char term,int qual, int verbose);
14735479Sbde
14835479Sbdeint Fbytecnt(FILE *fd, MD5_CTX *ctx, u_char term);
14935479Sbde
15035479Sbdeu_char * Fdata(FILE *fd, int u_chars, MD5_CTX *ctx);
15135479Sbde
15235479Sbde#define GETFIELD(p,q) if(!((p)=Ffield(fd,&ctx,(q)))) return BADREAD
15335462Sjkh#define GETFIELDCOPY(p,q) if(!((p)=Ffield(fd,&ctx,(q)))) return BADREAD; else p=String(p)
15435462Sjkh#define GETBYTECNT(p,q) if(0 >((p)= Fbytecnt(fd,&ctx,(q)))) return BADREAD
15518714Sache#define GETDATA(p,q) if(!((p) = Fdata(fd,(q),&ctx))) return BADREAD
15617308Speter#define GETNAMECOPY(p,q,r,v) if(!((p)=Fname(fd,&ctx,(q),(r),(v)))) return BADREAD; else p=String(p)
15734541Sbde
15834575Sbdeint Pass1(FILE *fd, unsigned applied);
15934575Sbdeint Pass2(FILE *fd);
16034575Sbdeint PassB(FILE *fd);
16134592Sbdeint Pass3(FILE *fd);
16217308Speter
16334575Sbdeint ctm_edit(u_char *script, int length, char *filein, char *fileout);
16435427Sbde