mirror of https://github.com/mabam/CAP.git
182 lines
3.9 KiB
C
182 lines
3.9 KiB
C
/*
|
|
* $Author: djh $ $Date: 91/02/15 23:04:00 $
|
|
* $Header: instappl.c,v 2.1 91/02/15 23:04:00 djh Rel $
|
|
* $Revision: 2.1 $
|
|
*/
|
|
|
|
/*
|
|
* instappl - install an unix generated resource file into a aufs volume
|
|
* no real need to do this for data forks since you can just copy the
|
|
* file in. (Would be nice to have something that diddles with finder
|
|
* information though).
|
|
*
|
|
*
|
|
* AppleTalk package for UNIX (4.2 BSD).
|
|
*
|
|
* Copyright (c) 1986, 1987, 1988 by The Trustees of Columbia
|
|
* University in the City of New York.
|
|
*
|
|
* Edit History:
|
|
*
|
|
* March 1987 CCKim Created.
|
|
*
|
|
*/
|
|
|
|
char copyright[] = "Copyright (c) 1986, 1987, 1988 by The Trustees of Columbia University in the City of New York";
|
|
|
|
#include <stdio.h>
|
|
#include <sys/types.h>
|
|
#include <sys/file.h>
|
|
#include <sys/time.h>
|
|
#include <netat/appletalk.h>
|
|
#include <netat/macfile.h>
|
|
#ifdef USESTRINGDOTH
|
|
# include <string.h>
|
|
#else
|
|
# include <strings.h>
|
|
#endif
|
|
#ifdef NEEDFCNTLDOTH
|
|
# include <fcntl.h>
|
|
#endif
|
|
|
|
usage()
|
|
{
|
|
fprintf(stderr, "Usage: instappl <flgs> <application> <directory> [dest]\n");
|
|
fprintf(stderr, " -c<Creator> -t<type> [note: truncated to 4 each]\n");
|
|
fprintf(stderr, " -l - locked\t-m multi-user\t-i invisibile\n");
|
|
exit(1);
|
|
}
|
|
|
|
main(argc, argv)
|
|
char **argv;
|
|
int argc;
|
|
{
|
|
char *name, *path, *dir;
|
|
char *creator = "????"; /* def creator unknown */
|
|
char *type = "APPL"; /* def file type is application */
|
|
FileInfo fi;
|
|
int c, ff;
|
|
struct timeval tvp[2];
|
|
struct timezone tzp;
|
|
extern char *optarg;
|
|
extern int optind;
|
|
|
|
if (argc < 3)
|
|
usage();
|
|
|
|
ff = 0;
|
|
while ((c = getopt(argc, argv, "c:t:lmir")) != EOF)
|
|
switch (c) {
|
|
case 'c':
|
|
creator = optarg;
|
|
break;
|
|
case 't':
|
|
type = optarg;
|
|
break;
|
|
case 'm':
|
|
ff |= FI_ATTR_MUSER; /* multiuser */
|
|
break;
|
|
case 'r':
|
|
case 'l':
|
|
ff |= FI_ATTR_READONLY; /* readonly */
|
|
break;
|
|
case 'i':
|
|
ff |= FI_ATTR_INVISIBLE; /* invisible */
|
|
break;
|
|
case '?':
|
|
usage();
|
|
break;
|
|
}
|
|
if (argc - optind < 2)
|
|
usage();
|
|
|
|
path = argv[optind++];
|
|
dir = argv[optind++];
|
|
name = NULL;
|
|
if (optind < argc)
|
|
name = argv[optind++];
|
|
if (optind != argc)
|
|
usage();
|
|
if (name == NULL) {
|
|
if ((name = rindex(path,'/')) == NULL)
|
|
name = path;
|
|
else name++;
|
|
}
|
|
#ifdef DEBUG
|
|
printf("copy %s to %s as %s, %s, %s\n",path,dir,name,creator,type);
|
|
#endif
|
|
bzero(&fi, sizeof(fi));
|
|
bcopy(type,fi.fi_fndr, 4);
|
|
bcopy(creator,fi.fi_fndr+4, 4);
|
|
fi.fi_attr = ff;
|
|
#define COMMENT "Installed via AppleShare by INSTAPPL"
|
|
fi.fi_comln = sizeof(COMMENT);
|
|
fi.fi_magic1 = FI_MAGIC1;
|
|
fi.fi_magic = FI_MAGIC;
|
|
fi.fi_version = FI_VERSION;
|
|
fi.fi_bitmap = FI_BM_MACINTOSHFILENAME;
|
|
strncpy((char *)fi.fi_macfilename, name, sizeof(fi.fi_macfilename)-1);
|
|
bcopy(COMMENT, fi.fi_comnt, sizeof(COMMENT));
|
|
writefinder(name, dir, &fi);
|
|
writedata(name, dir);
|
|
writeres(name, path, dir);
|
|
#ifndef NOUTIMES
|
|
gettimeofday(&tvp[0], &tzp);
|
|
tvp[1] = tvp[0];
|
|
utimes(dir, tvp);
|
|
#endif
|
|
}
|
|
|
|
char endup[1024];
|
|
|
|
writefinder(name, dir, fi)
|
|
char *name, *dir;
|
|
FileInfo *fi;
|
|
{
|
|
int fd;
|
|
|
|
sprintf(endup, "%s/.finderinfo/%s", dir, name);
|
|
if ((fd = open(endup, O_WRONLY|O_CREAT|O_TRUNC, 0662)) < 0) {
|
|
perror("writefinder: open");
|
|
exit(1);
|
|
}
|
|
write(fd, fi, sizeof(FileInfo));
|
|
close(fd);
|
|
}
|
|
|
|
writedata(name, dir)
|
|
char *name, *dir;
|
|
{
|
|
int fd;
|
|
sprintf(endup, "%s/%s", dir, name);
|
|
if ((fd = open(endup, O_WRONLY|O_CREAT|O_TRUNC, 0662)) < 0) {
|
|
perror("writedata: open");
|
|
exit(1);
|
|
}
|
|
close(fd);
|
|
}
|
|
|
|
char buf[1024];
|
|
writeres(name, path, dir)
|
|
char *name, *path, *dir;
|
|
{
|
|
int len, fd2, fd;
|
|
sprintf(endup, "%s/.resource/%s", dir, name);
|
|
if ((fd = open(endup, O_WRONLY|O_CREAT|O_TRUNC, 0662)) < 0) {
|
|
perror("writeres: open");
|
|
exit(1);
|
|
}
|
|
if ((fd2 = open(path, O_RDONLY)) < 0) {
|
|
perror("writeres: open");
|
|
exit(1);
|
|
}
|
|
do {
|
|
len = read(fd2, buf, sizeof(buf));
|
|
if (len > 0)
|
|
write(fd, buf, len);
|
|
} while (len > 0);
|
|
if (len < 0)
|
|
perror("read");
|
|
close(fd);
|
|
}
|