|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T p
Length: 16855 (0x41d7)
Types: TextFile
Names: »p2flatten.c«
└─⟦2d1937cfd⟧ Bits:30007241 EUUGD22: P.P 5.0
└─⟦dc59850a2⟧ »EurOpenD22/pp5.0/pp-5.tar.Z«
└─⟦e5a54fb17⟧
└─⟦this⟧ »pp-5.0/Format/p2flatten/p2flatten.c«
/* p2flatten: flatten a P2 directory structure into a message again */
# ifndef lint
static char Rcsid[] = "@(#)$Header: /cs/research/pp/hubris/pp-beta/Format/p2flatten/RCS/p2flatten.c,v 5.0 90/09/20 16:01:09 pp Exp Locker: pp $";
# endif
/*
* $Header: /cs/research/pp/hubris/pp-beta/Format/p2flatten/RCS/p2flatten.c,v 5.0 90/09/20 16:01:09 pp Exp Locker: pp $
*
* $Log: p2flatten.c,v $
* Revision 5.0 90/09/20 16:01:09 pp
* rcsforce : 5.0 public release
*
*/
#include "util.h"
#include <sys/stat.h>
#include <isode/psap.h>
#include <varargs.h>
#include "retcode.h"
#include <isode/cmd_srch.h>
#include "tb_bpt88.h"
#include "P2-types.h"
extern CMD_TABLE bptbl_body_parts88[/* x400 88 body_parts */];
extern char *quedfldir;
extern char *mquedir, *cont_p2, *cont_p22;
extern void err_abrt();
static char curdir[FILNSIZE]; /* directory stack */
static PE read_bp();
char curfile[FILNSIZE];
int curdepth = 0;
int more = TRUE;
int flatresult = OK;
void advise ();
void adios ();
#define ps_advise(ps, f) \
advise (NULLCP, "%s: %s", (f), ps_error ((ps) -> ps_errno))
flatten(old,new, x40084, perr)
char *old;
char *new;
int x40084;
char **perr;
{
PE pe = NULLPE;
struct type_P2_InformationObject *infoobj = NULL;
char buf[BUFSIZ];
curdepth = depth(old) + 1;
msg_rinit(old);
flatresult = OK;
if (getname(curfile) != OK) {
(void) sprintf (buf,
"Source directory '%s' is empty",
old);
*perr = strdup(buf);
PP_LOG(LLOG_EXCEPTIONS,
("No files in %s", old));
flatresult = NOTOK;
}
setname(old);
more = TRUE;
fillin_infoobj(&infoobj, x40084, perr);
msg_rend();
if (flatresult == OK) {
encode_P2_InformationObject (&pe, 1, 0, NULLCP, infoobj);
pe_fragment (pe, 128);
}
if (flatresult == OK) {
setname (new);
write_bp((x40084 == TRUE) ? cont_p2 : cont_p22, pe, perr);
if (flatresult == NOTOK) {
PP_LOG(LLOG_EXCEPTIONS,
("Chans/p2flatten : write_bp failed"));
*perr = strdup("Failed to write out p2 body part");
}
} else
PP_LOG(LLOG_EXCEPTIONS,
("Chans/p2flatten : encode_P2_UAPDU failed"));
free_P2_InformationObject(infoobj);
if (pe != NULLPE) pe_free (pe);
return flatresult;
}
extern errno;
/* pe_done: utility routine to do the right thing for pe errors */
int pe_done (pe, msg)
PE pe;
char *msg;
{
if (pe->pe_errno)
{
advise (LLOG_EXCEPTIONS,NULLCP,"%s: %s", msg, pe_error(pe->pe_errno));
pe_free (pe);
return 1;
}
else
{
pe_free (pe);
return 0;
}
}
/* \f
*/
int fillin_infoobj(pinfoobj, x40084, perr)
struct type_P2_InformationObject **pinfoobj;
int x40084;
char **perr;
{
char buf[BUFSIZ];
int type = bp_type(curfile);
*pinfoobj = (struct type_P2_InformationObject *) calloc(1,
sizeof(struct type_P2_InformationObject));
/* what to do about sr ? */
if (type == ((x40084 == TRUE) ? BPT_HDR_P2 : BPT_HDR_P22)) {
(*pinfoobj)->offset = type_P2_InformationObject_ipm;
fillin_ipm(&((*pinfoobj)->un.ipm), x40084, perr);
} else if (type == BPT_HDR_IPN) {
(*pinfoobj)->offset = type_P2_InformationObject_ipn;
fillin_ipn (&((*pinfoobj)->un.ipn), x40084, perr);
} else {
PP_LOG(LLOG_EXCEPTIONS,
("Expected p2 header got '%s'", curfile));
(void) sprintf(buf,
"Expected p2 header got '%s'",
curfile);
*perr = strdup(buf);
flatresult = NOTOK;
}
}
int fillin_ipn (pipn, x40084, perr)
struct type_P2_IPN **pipn;
int x40084;
char **perr;
{
PE pe;
char buf[BUFSIZ];
pe = read_bp(curfile);
PY_pepy[0] = 0;
if (decode_P2_IPN (pe, 1, NULLIP, NULLVP, pipn) == NOTOK) {
PP_LOG(LLOG_EXCEPTIONS,
("decode_P2_IPN failure [%s]",
PY_pepy));
(void) sprintf (buf,
"Failed to decode P2 IPN [%s]",
PY_pepy);
*perr = strdup(buf);
flatresult = NOTOK;
return;
}
if ((*pipn)->choice->offset == choice_P2_0_non__receipt__fields
&& getname(curfile) == OK)
fillin_ipm(&((*pipn) -> choice -> un.non__receipt__fields -> returned__ipm),
x40084, perr);
else
more = FALSE;
}
int fillin_ipm(pipm, x40084, perr)
struct type_P2_IPM **pipm;
int x40084;
char **perr;
{
*pipm = (struct type_P2_IPM *)
calloc(1, sizeof(struct type_P2_IPM));
fillin_heading(&((*pipm)->heading), x40084, perr);
if (flatresult == OK)
fillin_body(&((*pipm)->body), x40084, perr);
}
int fillin_heading(pheading, x40084, perr)
struct type_P2_Heading **pheading;
int x40084;
char **perr;
{
char buf[BUFSIZ];
extern char *hdr_p2_bp, *hdr_p22_bp;
int type = bp_type(curfile);
if (type == (x40084 == TRUE) ? BPT_HDR_P2 : BPT_HDR_P22) {
*pheading = read_bp(curfile);
if (getname(curfile) != OK)
more = FALSE;
} else {
PP_LOG(LLOG_EXCEPTIONS,
("Expected '%s' got '%s'",
(x40084 == TRUE) ? hdr_p2_bp : hdr_p22_bp,
curfile));
(void) sprintf(buf,
"Expected '%s' got '%s'",
(x40084 == TRUE) ? hdr_p2_bp : hdr_p22_bp,
curfile);
*perr = strdup(buf);
flatresult = NOTOK;
}
}
int fillin_body(pbody, x40084, perr)
struct type_P2_Body **pbody;
int x40084;
char **perr;
{
struct type_P2_Body *end = NULL, *list = NULL, *temp;
char buf[BUFSIZ];
while (more == TRUE
&& curfile != NULL
&& depth(curfile) >= curdepth
&& flatresult == OK) {
temp = (struct type_P2_Body *)
calloc(1, sizeof(struct type_P2_Body));
if (depth(curfile) > curdepth)
fillin_forwarded(&(temp->BodyPart), x40084, perr);
else {
temp->BodyPart = (struct type_P2_BodyPart *)
calloc(1, sizeof(struct type_P2_BodyPart));
switch (bp_type(curfile)) {
case BPT_HDR_P2:
case BPT_HDR_P22:
case BPT_HDR_IPN:
case BPT_P2_DLIV_TXT:
/* should not get these as dealt with by forwarded */
PP_LOG(LLOG_EXCEPTIONS,
("Unexpected p2 header or delivery text file '%s' ", curfile));
(void) sprintf (buf,
"Unexpected p2 header or delivery text file '%s'",
curfile);
*perr = strdup(buf);
flatresult = NOTOK;
break;
case BPT_HDR_822:
PP_LOG(LLOG_EXCEPTIONS,
("822 header in p2 message '%s'", curfile));
(void) sprintf (buf,
"822 header in p2 message '%s'",
curfile);
*perr = strdup(buf);
flatresult = NOTOK;
break;
case BPT_IA5:
temp->BodyPart->offset = type_P2_BodyPart_ia5__text;
fillin_ia5(&(temp->BodyPart->un.ia5__text));
break;
case BPT_TLX:
temp->BodyPart->offset = type_P2_BodyPart_tlx;
temp->BodyPart->un.tlx = read_bp(curfile);
break;
case BPT_VOICE:
temp->BodyPart->offset = type_P2_BodyPart_voice;
temp->BodyPart->un.voice = read_bp(curfile);
break;
case BPT_G3FAX:
temp->BodyPart->offset = type_P2_BodyPart_g3__facsimile;
temp->BodyPart->un.g3__facsimile = read_bp(curfile);
break;
case BPT_TIF0:
temp->BodyPart->offset = type_P2_BodyPart_g4__class1;
temp->BodyPart->un.g4__class1 = read_bp(curfile);
break;
case BPT_TTX:
temp->BodyPart->offset = type_P2_BodyPart_teletex;
temp->BodyPart->un.teletex = read_bp(curfile);
break;
case BPT_VIDEOTEX:
temp->BodyPart->offset = type_P2_BodyPart_videotex;
temp->BodyPart->un.videotex = read_bp(curfile);
break;
case BPT_NATIONAL:
temp->BodyPart->offset = type_P2_BodyPart_nationally__defined;
temp->BodyPart->un.nationally__defined = read_bp(curfile);
break;
case BPT_ENCRYPTED:
temp->BodyPart->offset = type_P2_BodyPart_encrypted;
temp->BodyPart->un.encrypted = read_bp(curfile);
break;
case BPT_SFD:
temp->BodyPart->offset = type_P2_BodyPart_sfd;
temp->BodyPart->un.sfd = read_bp(curfile);
break;
case BPT_TIF1:
temp->BodyPart->offset = type_P2_BodyPart_mixed__mode;
temp->BodyPart->un.mixed__mode = read_bp(curfile);
break;
case BPT_ODIF:
temp->BodyPart->offset = type_P2_BodyPart_odif;
fillin_odif(&(temp->BodyPart->un.odif));
break;
case BPT_ISO6937TEXT:
temp->BodyPart->offset = type_P2_BodyPart_iso6937Text;
temp->BodyPart->un.iso6937Text = read_bp(curfile);
break;
case BPT_BILATERAL:
if (x40084 == TRUE) {
PP_LOG(LLOG_EXCEPTIONS,
("Unknown p2 84 body part '%s'",
curfile));
(void) sprintf (buf,
"Unknown p2 84 body part '%s'",
curfile);
*perr = strdup (buf);
flatresult = NOTOK;
} else {
temp->BodyPart->offset = type_P2_BodyPart_bilaterally__defined;
temp->BodyPart->un.bilaterally__defined = read_bp(curfile);
}
break;
case BPT_EXTERNAL:
if (x40084 == TRUE) {
PP_LOG(LLOG_EXCEPTIONS,
("Unknown p2 84 body part '%s'",
curfile));
(void) sprintf (buf,
"Unknown p2 84 body part '%s'",
curfile);
*perr = strdup (buf);
flatresult = NOTOK;
} else {
temp->BodyPart->offset = type_P2_BodyPart_externally__defined;
temp->BodyPart->un.externally__defined = read_bp(curfile);
}
break;
default:
PP_LOG(LLOG_EXCEPTIONS,
("Unknown p2 body part '%s'", curfile));
(void) sprintf (buf,
"Unknown p2 body part '%s'",
curfile);
*perr = strdup (buf);
flatresult = NOTOK;
break;
}
}
if (flatresult == OK) {
if (list == NULL)
list = end = temp;
else {
end -> next = temp;
end = temp;
}
if (getname(curfile) != OK)
more = FALSE;
}
}
*pbody = list;
}
/* ps_done: like pe_done */
int ps_done (ps, msg)
PS ps;
char *msg;
{
if (ps->ps_errno)
{
ps_advise (ps, msg);
ps_free (ps);
return 1;
}
else
{
ps_free (ps);
return 0;
}
}
getname(str)
char *str;
{
/* msg_rfile returns full pathname need to split of curdir */
if (msg_rfile(str) != RP_OK) {
str = NULL;
return NOTOK;
}
return OK;
}
/* initialise name for above */
setname (name)
char *name;
{
(void) strcpy (curdir, name);
/* printf ("setname -> %s\n", curdir);*/
}
/*
* write_bp: write a body part contained in pe out to the file named
* name. name is converted into the correct place in the directory
* tree.
*/
write_bp(name, pe, perr)
char *name;
PE pe;
char **perr;
{
PS psout;
FILE *fp;
static char fullname[FILNSIZE];
char buf[BUFSIZ];
sprintf(fullname,"%s/%s", curdir, name);
PP_LOG(LLOG_TRACE,
("Chans/p2flatten : Writing %s", fullname));
if((fp = fopen(fullname, "w")) == NULL)
{
PP_SLOG(LLOG_EXCEPTIONS, fullname,
("Can't open file"));
(void) sprintf (buf,
"Unable to open output file '%s'",
fullname);
*perr = strdup(buf);
flatresult = NOTOK;
return NOTOK;
}
if ((psout = ps_alloc(std_open)) == NULLPS)
{
ps_advise (psout, "ps_alloc");
(void) fclose (fp);
flatresult = NOTOK;
return NOTOK;
}
if (std_setup (psout, fp) == NOTOK)
{
advise (NULLCP, "std_setup loses", fullname);
(void) fclose (fp);
flatresult = NOTOK;
return NOTOK;
}
if(pe2ps(psout, pe) == NOTOK)
{
ps_advise(psout, "pe2ps loses");
flatresult = NOTOK;
return NOTOK;
}
(void) fclose (fp);
ps_free(psout);
/* printf (" done\n");*/
return OK;
}
/*
* read_bp: read in a body part and stuff in pe.
*/
static PE read_bp(name)
char *name;
{
PS psout;
PE pe;
FILE *fp;
PP_LOG(LLOG_TRACE,
("Chans/p2flatten : Reading %s", name));
if((fp = fopen(name, "r")) == NULL)
{
PP_SLOG(LLOG_EXCEPTIONS, name,
("Can't open file"));
flatresult = NOTOK;
return NULLPE;
}
if ((psout = ps_alloc(std_open)) == NULLPS)
{
ps_advise (psout, "ps_alloc");
(void) fclose (fp);
flatresult = NOTOK;
return NULLPE;
}
if (std_setup (psout, fp) == NOTOK)
{
advise (NULLCP, "std_setup loses", name);
(void) fclose (fp);
flatresult = NOTOK;
return NULLPE;
}
if((pe = ps2pe(psout)) == NULLPE)
{
ps_advise(psout, "ps2pe loses");
flatresult = NOTOK;
return NULLPE;
}
(void) fclose (fp);
ps_free(psout);
/* printf (" done\n");*/
return pe;
}
bp_type (str)
char *str;
{
char *s, *ix;
int retval;
if ((s = rindex(str,'/')) == NULLCP)
s = str;
else
s++;
/* search for those files that aren't num.str */
if (strcmp(s,rcmd_srch(BPT_HDR_P2,bptbl_body_parts88)) == 0)
return BPT_HDR_P2;
if (strcmp(s,rcmd_srch(BPT_HDR_P22,bptbl_body_parts88)) == 0)
return BPT_HDR_P22;
if (strcmp(s,rcmd_srch(BPT_HDR_822,bptbl_body_parts88)) == 0)
return BPT_HDR_822;
if (strcmp(s,rcmd_srch(BPT_HDR_IPN,bptbl_body_parts88)) == 0)
return BPT_HDR_IPN;
if (strcmp(s,rcmd_srch(BPT_P2_DLIV_TXT,bptbl_body_parts88)) == 0)
return BPT_P2_DLIV_TXT;
/* not hdr so n.xxx where n is number and xxx bpt name */
if ((ix = index(s,'.')) == NULL) {
/* printf("cannot find '.' char in %s",s);*/
retval = -1;
} else {
ix++;
retval = (cmd_srch(ix, bptbl_body_parts88)); /* returns # defined number of bp type */
}
if (retval == -1) {
/* bomb out */
PP_LOG(LLOG_EXCEPTIONS,
("Chans/p2flatten : Unknown body type '%s'",str));
flatresult = NOTOK;
}
return retval;
}
depth (file)
char *file;
{
char *p;
int count = 0;
for (p = file; *p; p++)
if (*p == '/') {
count ++;
while(*p == '/') p++;
}
return count;
}
char *readoctet (file, len)
char *file;
int *len;
{
char *p;
int fd;
struct stat st;
PP_LOG(LLOG_TRACE,
("Chans/p2flatten reading octet %s",file));
if ((fd = open(file ,0)) == NOTOK)
{
PP_SLOG(LLOG_EXCEPTIONS, file,
("Can't open file"));
flatresult = NOTOK;
return NULLCP;
}
if (fstat (fd, &st) == NOTOK)
{
PP_SLOG(LLOG_EXCEPTIONS, file,
("Can't stat file"));
flatresult = NOTOK;
return NULLCP;
}
*len = st.st_size;
p = smalloc (*len + 1);
if (read (fd, p, *len) != *len) {
advise ("read", "Read failed");
flatresult = NOTOK;
}
close (fd);
/* printf ("done\n"); */
return p;
}
#define BUF_INC 128
char *readCRLFstring (file, plen)
char *file;
int *plen;
{
char *p;
FILE *fd;
unsigned int c,
len,
count;
PP_LOG(LLOG_TRACE,
("Chans/p2flatten reading CRLF string %s",file));
if ((fd = fopen(file ,"r")) == (FILE *) 0)
{
PP_SLOG(LLOG_EXCEPTIONS, file,
("Can't open file"));
flatresult = NOTOK;
return NULLCP;
}
len = BUF_INC;
p = smalloc (len);
count = 0;
while ((c = getc(fd)) != EOF) {
if (c == (int) ('\n')) {
if (count >= len) {
len += BUF_INC;
p = realloc(p, len);
}
p[count++] = '\r';
}
if (count >= len) {
len += BUF_INC;
p = realloc(p, len);
}
p[count++] = (char) c;
}
if (count >= len) {
len += 1;
p = realloc(p, len);
}
*plen = count;
fclose (fd);
/* printf ("done\n"); */
return p;
}
fillin_ia5(pia5text)
struct type_P2_IA5TextBodyPart **pia5text;
{
int len = 0;
char *str;
*pia5text = (struct type_P2_IA5TextBodyPart *)
calloc(1, sizeof(struct type_P2_IA5TextBodyPart));
(*pia5text)->parameters = (struct type_P2_IA5Parameters *)
calloc(1, sizeof(struct type_P2_IA5Parameters));
(*pia5text)->parameters->parm = int_P2_Repertoire_ia5;
str = readCRLFstring(curfile, &len);
(*pia5text)->data = str2qb(str, len, 1);
free(str);
}
fillin_odif(podif)
struct type_P2_ODIFBodyPart **podif;
{
int len = 0;
char *str;
str = readoctet(curfile, &len);
if (str != NULL) {
*podif = str2qb(str, len, 1);
free(str);
}
}
fillin_forwarded(pbp, x40084)
struct type_P2_BodyPart **pbp;
int x40084;
{
int oldepth = curdepth;
*pbp = (struct type_P2_BodyPart *)
calloc (1, sizeof(struct type_P2_BodyPart));
(*pbp)->offset = type_P2_BodyPart_message;
(*pbp)->un.message = (struct type_P2_MessageBodyPart *)
calloc(1, sizeof(struct type_P2_MessageBodyPart));
curdepth = depth(curfile);
PY_pepy[0] = 0;
if (bp_type(curfile) == BPT_P2_DLIV_TXT) {
PE pe;
pe = read_bp(curfile);
if (decode_P2_MessageParameters(pe, 1, NULLIP,
NULLVP,
&((*pbp)->un.message->parameters)) == NOTOK) {
PP_LOG(LLOG_EXCEPTIONS,
("decode_P2_MessageParameters failure [%s]",
PY_pepy));
flatresult = NOTOK;
return;
}
} else
(*pbp)->un.message->parameters = (struct type_P2_MessageParameters *) calloc (1, sizeof(struct type_P2_MessageParameters));
fillin_ipm(&((*pbp)->un.message->data), x40084);
curdepth = oldepth;
}
/* \f
ERRORS */
#ifndef lint
void adios (va_alist)
va_dcl
{
va_list ap;
va_start (ap);
_ll_log (pp_log_norm, LLOG_FATAL, ap);
va_end (ap);
_exit (1);
}
#else
/* VARARGS2 */
void adios (what, fmt)
char *what,
*fmt;
{
adios (what, fmt);
}
#endif
#ifndef lint
void advise (va_alist)
va_dcl
{
int code;
va_list ap;
va_start (ap);
code = va_arg (ap, int);
_ll_log (pp_log_norm, code, ap);
va_end (ap);
}
#else
/* VARARGS3 */
void advise (code, what, fmt)
char *what,
*fmt;
int code;
{
advise (code, what, fmt);
}
#endif