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