initial version
This commit is contained in:
@@ -1,6 +1,10 @@
|
||||
/*
|
||||
* apCreateShadow.c
|
||||
* - todo
|
||||
|
||||
changed appLoc to appList ...
|
||||
|
||||
|
||||
* complete rework ??? to EPICS area tools - templates etc.
|
||||
*
|
||||
*
|
||||
@@ -28,29 +32,25 @@
|
||||
#define BUFLEN 256
|
||||
#define SAME 0
|
||||
|
||||
void procNoTopDirs();
|
||||
void procNoAppDirs();
|
||||
int doTopNoDirs();
|
||||
void Usage();
|
||||
void procDirEntries();
|
||||
void createLink();
|
||||
int procLink();
|
||||
int processFile();
|
||||
int dirwalk();
|
||||
static void Usage();
|
||||
static void procDirEntries();
|
||||
static void createLink();
|
||||
static void procLink();
|
||||
static void processFile();
|
||||
static void dirwalk();
|
||||
static void startFromHere();
|
||||
static void init_setup();
|
||||
|
||||
int errno;
|
||||
int status;
|
||||
int len;
|
||||
struct stat stbuf;
|
||||
char buffer[BUFLEN];
|
||||
char command[80]; /* system command */
|
||||
char dest_base[80]; /* dest base (root of shadow node) */
|
||||
char src_base[80]; /* current source descend root node */
|
||||
char dpath[80]; /* dest/subdir... */
|
||||
char spath[80]; /* src/subdir... */
|
||||
char xname[30]; /* program name */
|
||||
char appl_base[80]; /* root node */
|
||||
char appLocName[80];/* pathname of master appLoc file */
|
||||
static struct stat stbuf;
|
||||
static char buffer[BUFLEN];
|
||||
static char dest_base[80]; /* dest base (root of shadow node) */
|
||||
static char src_base[80]; /* current source descend root node */
|
||||
static char dpath[80]; /* dest/subdir... */
|
||||
static char spath[80]; /* src/subdir... */
|
||||
static char progName[30]; /* program name */
|
||||
static char sys_top[80]; /* root node */
|
||||
static char topAppl[80];/* pathname of master appLoc file */
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
@@ -65,70 +65,129 @@ main(argc, argv)
|
||||
int argc;
|
||||
char **argv;
|
||||
{
|
||||
#if 0
|
||||
char *ptr;
|
||||
char top_node[30];
|
||||
FILE *appLoc_fp; /* user version of appLoc file */
|
||||
char comLocName[80]; /* refs to all application common
|
||||
* nodes */
|
||||
#endif
|
||||
/*
|
||||
* intial setup
|
||||
*/
|
||||
init_setup(argc, argv);
|
||||
|
||||
/*
|
||||
* At this point skip all top directories
|
||||
* just process files and links in the top node
|
||||
*/
|
||||
chdir(appl_base);
|
||||
doTopNoDirs();
|
||||
|
||||
/*
|
||||
* descend top directories not in appList
|
||||
*/
|
||||
chdir(appl_base);
|
||||
doTopDirsNoAppDirs();
|
||||
|
||||
/*
|
||||
* Now process the application directories specified by the User's
|
||||
* modified copy of the appLoc file
|
||||
*/
|
||||
chdir(dest_base);
|
||||
if ((appLoc_fp = fopen("appLoc", "r")) == NULL) {
|
||||
fprintf(stdout, "%: can't fopen %s in dest_base area\n", xname, "appLoc");
|
||||
exit(1);
|
||||
if (chdir(sys_top)!=0) {
|
||||
fprintf(stderr, "%s: Can't chdir\n", progName);
|
||||
exit(1);
|
||||
}
|
||||
/* descend each directory in the dest_base/appLoc file */
|
||||
while ((fgets(buffer, sizeof(buffer) + 2, appLoc_fp)) != NULL) {
|
||||
len = strlen(buffer);
|
||||
/* remove the N/L from input line */
|
||||
if (buffer[len - 1] == '\n') {
|
||||
buffer[len - 1] = 0;
|
||||
}
|
||||
ptr = (char *) strrchr(buffer, '/');
|
||||
*ptr = NULL;
|
||||
strcpy(top_node, "./");
|
||||
strcat(top_node, ++ptr);
|
||||
strcpy(src_base, buffer);
|
||||
status = chdir(src_base);
|
||||
procDirEntries(top_node, src_base);
|
||||
}
|
||||
fclose(appLoc_fp);
|
||||
sprintf(stderr, "makeApplShadow completed\n");
|
||||
/* TODO */
|
||||
/*fprintf(stderr,"%s: Creating a shadow node attached to %s",progName, xxx);*/
|
||||
/* TODO */
|
||||
startFromHere();
|
||||
|
||||
fprintf(stderr, "makeApplShadow %s\n", "completed");
|
||||
return (0);
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
PROCLINK
|
||||
****************************************************************************/
|
||||
void
|
||||
procLink(name)
|
||||
char *name;
|
||||
{
|
||||
|
||||
char buff[MAXPATHLEN];
|
||||
int num_chars;
|
||||
|
||||
/* always skip appLoc */
|
||||
if ((strcmp("./appLoc", name)) == SAME) {
|
||||
printf("procLink: compare ./appLoc and %s\n",name);
|
||||
exit(1);
|
||||
}
|
||||
if ((num_chars = readlink(name, buff, MAXPATHLEN)) < 0) {
|
||||
fprintf(stderr, "procLink: FATAL ERROR - errno=%d name=%s\n", errno, name);
|
||||
exit(1);
|
||||
}
|
||||
buff[num_chars] = NULL;
|
||||
|
||||
if ((buff[0] == '/') || ((buff[0] == '.') && (buff[1] == '/'))) {
|
||||
strcpy(spath, src_base);
|
||||
strcat(spath, "/");
|
||||
strcat(spath, name);
|
||||
} else {
|
||||
strcpy(spath, buff);
|
||||
}
|
||||
strcpy(dpath, dest_base);
|
||||
strcat(dpath, "/");
|
||||
strcat(dpath, name);
|
||||
createLink();
|
||||
}
|
||||
/****************************************************************************
|
||||
CREATELINK
|
||||
****************************************************************************/
|
||||
void
|
||||
createLink()
|
||||
{
|
||||
/*
|
||||
A symbolic link name2 is created to name1 (name2 is the name
|
||||
of the file created, name1 is the string used in creating
|
||||
the symbolic link). Either name may be an arbitrary path
|
||||
name; the files need not be on the same file system.
|
||||
*/
|
||||
if ((symlink(spath, dpath)) != 0) {
|
||||
printf("\n####################################################\n");
|
||||
printf("createLink: symlink failure: errno=%d\nspath=%s\n\tdpath=%s\n"
|
||||
,errno, spath, dpath);
|
||||
printf("####################################################\n");
|
||||
}
|
||||
}
|
||||
/****************************************************************************
|
||||
DIRWALK applies a function to each file in a directory
|
||||
****************************************************************************/
|
||||
void
|
||||
dirwalk(dir, fcn)
|
||||
char *dir;
|
||||
void (*fcn) ();
|
||||
{
|
||||
char name[MAXNAMLEN];
|
||||
struct dirent *dp;
|
||||
DIR *dfd;
|
||||
if ((dfd = opendir(dir)) == NULL) {
|
||||
fprintf(stderr, "dirwalk: can't open %s\n", dir);
|
||||
exit(1);
|
||||
}
|
||||
while ((dp = readdir(dfd)) != NULL) {
|
||||
if (strcmp(dp->d_name, ".") == 0
|
||||
|| strcmp(dp->d_name, "..") == 0)
|
||||
continue; /* skip self and parent */
|
||||
if (strlen(dir) + strlen(dp->d_name) + 2 > sizeof(name))
|
||||
fprintf(stderr, "dirwalk: name %s/%s too long\n",
|
||||
dir, dp->d_name);
|
||||
else {
|
||||
sprintf(name, "%s/%s", dir, dp->d_name);
|
||||
(*fcn) (name, dir);
|
||||
}
|
||||
}
|
||||
closedir(dfd);
|
||||
}
|
||||
void
|
||||
Usage()
|
||||
{
|
||||
printf("\nUsage:\t%s <appSystemTop>\n", progName);
|
||||
printf("\tor\n");
|
||||
printf("\t%s <appReleaseTop>\n", progName);
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
PROCESSFILE
|
||||
create a soft link and return
|
||||
****************************************************************************/
|
||||
int
|
||||
processFile(name, dir)
|
||||
void
|
||||
processFile(name)
|
||||
char *name; /* regular file */
|
||||
char *dir; /* current directory */
|
||||
{
|
||||
/* always skip appLoc */
|
||||
if ((strcmp("./appLoc", name)) == SAME) {
|
||||
return;
|
||||
}
|
||||
strcpy(spath, src_base);
|
||||
strcat(spath, "/");
|
||||
strcat(spath, name);
|
||||
@@ -137,29 +196,182 @@ processFile(name, dir)
|
||||
strcat(dpath, "/");
|
||||
strcat(dpath, name);
|
||||
createLink();
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
init_setup(argc, argv)
|
||||
int argc;
|
||||
char **argv;
|
||||
{
|
||||
char *ptr;
|
||||
int len;
|
||||
FILE *origin_fp;
|
||||
ptr = (char *) strrchr(argv[0], '/');
|
||||
if (ptr == 0) {
|
||||
strcpy(progName, argv[0]);
|
||||
} else {
|
||||
strcpy(progName, ptr+1);
|
||||
}
|
||||
if ( argc != 2 ) {
|
||||
printf("####################################################\n");
|
||||
Usage();
|
||||
printf("####################################################\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
|
||||
if (*argv[1] != '/') {
|
||||
printf("####################################################\n");
|
||||
printf("%s: ERROR - arg#1 must be a full pathname\n", progName);
|
||||
Usage();
|
||||
printf("####################################################\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
/* check to see if path points to app system area - file .topAppl exists*/
|
||||
/* application base is argv[1] */
|
||||
len = strlen(argv[1]);
|
||||
strncpy(sys_top, argv[1], len);
|
||||
sys_top[len] = NULL;
|
||||
|
||||
strcpy(topAppl, sys_top);
|
||||
strcat(topAppl, "/.topAppl");
|
||||
if ((stat(topAppl, &stbuf)) != 0) {
|
||||
fprintf(stderr, "####################################################\n");
|
||||
fprintf(stderr, "%s: Can't stat file: %s\n", progName, topAppl);
|
||||
fprintf(stderr, "####################################################\n");
|
||||
Usage();
|
||||
exit(1);
|
||||
}
|
||||
/* get shadow base */
|
||||
if ((getcwd(dest_base, 78)) == NULL) {
|
||||
fprintf(stderr, "getcwd failed\n");
|
||||
exit(1);
|
||||
}
|
||||
strcpy(src_base, sys_top);
|
||||
|
||||
/* if .applShadow doesn't exist - require touch .applShadow */
|
||||
if ((stat("./.applShadow", &stbuf)) != 0) {
|
||||
fprintf(stderr, "\n");
|
||||
fprintf(stderr, "####################################################\n");
|
||||
fprintf(stderr, "%s: Can't stat file: './applShadow'\n", progName);
|
||||
fprintf(stderr, "####################################################\n");
|
||||
fprintf(stderr, "If this is NOT the root of your application shadow directory,\n");
|
||||
fprintf(stderr, "then please cd to the appropriate place and try again.\n");
|
||||
fprintf(stderr, "If this IS the root your shadow directory, then create .applShadow\n");
|
||||
fprintf(stderr, "with the following command and then run %s again.\n", progName);
|
||||
fprintf(stderr, " %%\n touch .applShadow\n");
|
||||
fprintf(stderr, "####################################################\n");
|
||||
exit(1);
|
||||
}
|
||||
/*********************** create/check an invocation marker *******************/
|
||||
/*rz*/
|
||||
if ((stat("./.applShadowOrgin", &stbuf)) != 0) {
|
||||
if ((origin_fp = fopen("./.applShadowOrgin", "w")) == NULL) {
|
||||
fprintf(stderr, "%s: can't fopen %s in dest_base area\n",
|
||||
progName, ".applShadowOrgin");
|
||||
exit(1);
|
||||
}
|
||||
fprintf(origin_fp, "%s\n", sys_top);
|
||||
} else {
|
||||
if ((origin_fp = fopen("./.applShadowOrgin", "r")) == NULL) {
|
||||
fprintf(stderr, "%s: can't fopen %s in dest_base area\n",
|
||||
progName, ".applShadowOrgin");
|
||||
exit(1);
|
||||
}
|
||||
/* compare sys_top with buffer */
|
||||
while ((fgets(buffer, sizeof(buffer) + 2, origin_fp)) != NULL) {
|
||||
len = strlen(buffer);
|
||||
/* remove the N/L from input line */
|
||||
if (buffer[len - 1] == '\n') {
|
||||
buffer[len - 1] = 0;
|
||||
}
|
||||
if ((strcmp(buffer, sys_top)) != SAME) {
|
||||
fprintf(stderr, "%s: FATAL ERROR - Illegal invocation\n", progName);
|
||||
fprintf(stderr,
|
||||
"Your last system area was %s\n", buffer);
|
||||
fprintf(stderr,
|
||||
"Your new (arg1) system area is %s\n",sys_top);
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
#if 0 /* DEBUG */
|
||||
fprintf(stderr, "%s: WARNING - This is NOT the first run!\n",progName );
|
||||
#endif
|
||||
}
|
||||
fclose(origin_fp);
|
||||
|
||||
|
||||
#if 0 /* RZ COMMENT OUT */
|
||||
/*********************** create a marker *******************/
|
||||
/* if appLoc doesn't exist - provide one */
|
||||
if ((stat("./appLoc", &stbuf)) != 0) {
|
||||
/* make a copy of topAppl */
|
||||
sprintf(command, "cp %s %s\n", topAppl, "appLoc");
|
||||
status = system(command);
|
||||
fprintf(stderr, "####################################################\n");
|
||||
fprintf(stderr, "I am providing you with a copy of the appLoc file\n");
|
||||
fprintf(stderr, "The appLoc file determines how many shadow applications\n");
|
||||
fprintf(stderr, "will be created in your shadow node\n");
|
||||
fprintf(stderr, "You may/should edit your copy of the appLoc file\n");
|
||||
fprintf(stderr, "\n");
|
||||
fprintf(stderr, "Once you are satisfied with the contents of your appLoc file,\n");
|
||||
fprintf(stderr, "Please invoke this program again:\n");
|
||||
fprintf(stderr, " %%\n %s/bin/%s\n", sys_top, progName);
|
||||
fprintf(stderr, "####################################################\n");
|
||||
exit(1);
|
||||
}
|
||||
#endif /* ENDIF RZ COMMENT OUT */
|
||||
}
|
||||
|
||||
/*********************************************/
|
||||
void
|
||||
startFromHere()
|
||||
{
|
||||
char *dir = ".";
|
||||
char name[MAXNAMLEN];
|
||||
struct dirent *dp;
|
||||
DIR *dfd;
|
||||
if ((dfd = opendir(dir)) == NULL) {
|
||||
fprintf(stderr, "dirwalk: can't open %s\n", dir);
|
||||
exit(1);
|
||||
}
|
||||
while ((dp = readdir(dfd)) != NULL) {
|
||||
if (strcmp(dp->d_name, ".") == 0
|
||||
|| strcmp(dp->d_name, "..") == 0)
|
||||
continue; /* skip self and parent */
|
||||
if (strlen(dir) + strlen(dp->d_name) + 2 > sizeof(name))
|
||||
fprintf(stderr, "dirwalk: name %s/%s too long\n",
|
||||
dir, dp->d_name);
|
||||
else {
|
||||
sprintf(name, "%s/%s", dir, dp->d_name);
|
||||
procDirEntries(name);
|
||||
}
|
||||
}
|
||||
closedir(dfd);
|
||||
|
||||
}
|
||||
/****************************************************************************
|
||||
PROCDIRENTRIES
|
||||
process directory entries
|
||||
****************************************************************************/
|
||||
void
|
||||
procDirEntries(name, dir)
|
||||
procDirEntries(name)
|
||||
char *name; /* entry name */
|
||||
char *dir; /* current directory */
|
||||
{
|
||||
char *ptr;
|
||||
struct stat stbuf;
|
||||
if (lstat(name, &stbuf) == -1) {
|
||||
fprintf(stdout, "procDirEntries: can't access %s\n", name);
|
||||
return;
|
||||
fprintf(stderr, "procDirEntries: can't access %s\n", name);
|
||||
exit(1);
|
||||
}
|
||||
if ((stbuf.st_mode & S_IFMT) == S_IFLNK) {
|
||||
procLink(name);
|
||||
return;
|
||||
}
|
||||
if ((stbuf.st_mode & S_IFMT) == S_IFREG) {
|
||||
processFile(name, dir);
|
||||
processFile(name);
|
||||
return;
|
||||
}
|
||||
if ((stbuf.st_mode & S_IFMT) == S_IFDIR) {
|
||||
@@ -184,337 +396,9 @@ procDirEntries(name, dir)
|
||||
printf("####################################################\n");
|
||||
printf("procDirEntries: Can't mkdir %s\n", dpath);
|
||||
printf("####################################################\n");
|
||||
exit(1);
|
||||
}
|
||||
dirwalk(name, procDirEntries);
|
||||
}
|
||||
return;
|
||||
}
|
||||
/****************************************************************************
|
||||
PROCLINK
|
||||
****************************************************************************/
|
||||
int
|
||||
procLink(name)
|
||||
char *name;
|
||||
{
|
||||
|
||||
char buff[MAXPATHLEN];
|
||||
int num_chars;
|
||||
|
||||
/* always skip appLoc */
|
||||
if ((strcmp("./appLoc", name)) == SAME) {
|
||||
printf("procLink: compare ./appLoc and %s\n",name);
|
||||
return;
|
||||
}
|
||||
if ((num_chars = readlink(name, buff, MAXPATHLEN)) < 0) {
|
||||
fprintf(stdout, "procLink: FATAL ERROR - errno=%d name=%s\n", errno, name);
|
||||
return;
|
||||
}
|
||||
buff[num_chars] = NULL;
|
||||
|
||||
if ((buff[0] == '/') || ((buff[0] == '.') && (buff[1] == '/'))) {
|
||||
strcpy(spath, src_base);
|
||||
strcat(spath, "/");
|
||||
strcat(spath, name);
|
||||
} else {
|
||||
strcpy(spath, buff);
|
||||
}
|
||||
strcpy(dpath, dest_base);
|
||||
strcat(dpath, "/");
|
||||
strcat(dpath, name);
|
||||
createLink();
|
||||
return;
|
||||
}
|
||||
/****************************************************************************
|
||||
CREATELINK
|
||||
****************************************************************************/
|
||||
void
|
||||
createLink()
|
||||
{
|
||||
/*
|
||||
A symbolic link name2 is created to name1 (name2 is the name
|
||||
of the file created, name1 is the string used in creating
|
||||
the symbolic link). Either name may be an arbitrary path
|
||||
name; the files need not be on the same file system.
|
||||
*/
|
||||
if ((symlink(spath, dpath)) != 0) {
|
||||
printf("\n####################################################\n");
|
||||
printf("createLink: symlink failure: errno=%d\nspath=%s\n\tdpath=%s\n"
|
||||
,errno, spath, dpath);
|
||||
printf("####################################################\n");
|
||||
}
|
||||
return;
|
||||
}
|
||||
/****************************************************************************
|
||||
DIRWALK applies a function to each file in a directory
|
||||
****************************************************************************/
|
||||
int
|
||||
dirwalk(dir, fcn)
|
||||
char *dir;
|
||||
void (*fcn) ();
|
||||
{
|
||||
char name[MAXNAMLEN];
|
||||
struct dirent *dp;
|
||||
DIR *dfd;
|
||||
if ((dfd = opendir(dir)) == NULL) {
|
||||
fprintf(stdout, "dirwalk: can't open %s\n", dir);
|
||||
return;
|
||||
}
|
||||
while ((dp = readdir(dfd)) != NULL) {
|
||||
if (strcmp(dp->d_name, ".") == 0
|
||||
|| strcmp(dp->d_name, "..") == 0)
|
||||
continue; /* skip self and parent */
|
||||
if (strlen(dir) + strlen(dp->d_name) + 2 > sizeof(name))
|
||||
fprintf(stdout, "dirwalk: name %s/%s too long\n",
|
||||
dir, dp->d_name);
|
||||
else {
|
||||
sprintf(name, "%s/%s", dir, dp->d_name);
|
||||
(*fcn) (name, dir);
|
||||
}
|
||||
}
|
||||
closedir(dfd);
|
||||
}
|
||||
void
|
||||
Usage()
|
||||
{
|
||||
printf("\nUsage: %s <app_release_base>\n", xname);
|
||||
printf("ex: %s <path_to_AppMgr_release>/<Rx.x>\n", xname);
|
||||
}
|
||||
|
||||
int
|
||||
doTopNoDirs()
|
||||
{
|
||||
char *dir = ".";
|
||||
char name[MAXNAMLEN];
|
||||
struct dirent *dp;
|
||||
DIR *dfd;
|
||||
if ((dfd = opendir(dir)) == NULL) {
|
||||
fprintf(stdout, "dirwalk: can't open %s\n", dir);
|
||||
return;
|
||||
}
|
||||
while ((dp = readdir(dfd)) != NULL) {
|
||||
if (strcmp(dp->d_name, ".") == 0
|
||||
|| strcmp(dp->d_name, "..") == 0)
|
||||
continue; /* skip self and parent */
|
||||
if (strlen(dir) + strlen(dp->d_name) + 2 > sizeof(name))
|
||||
fprintf(stdout, "dirwalk: name %s/%s too long\n",
|
||||
dir, dp->d_name);
|
||||
else {
|
||||
sprintf(name, "%s/%s", dir, dp->d_name);
|
||||
procNoTopDirs(name, dir);
|
||||
}
|
||||
}
|
||||
closedir(dfd);
|
||||
|
||||
}
|
||||
int
|
||||
doTopDirsNoAppDirs()
|
||||
{
|
||||
char *dir = ".";
|
||||
char name[MAXNAMLEN];
|
||||
struct dirent *dp;
|
||||
DIR *dfd;
|
||||
if ((dfd = opendir(dir)) == NULL) {
|
||||
fprintf(stdout, "dirwalk: can't open %s\n", dir);
|
||||
return;
|
||||
}
|
||||
while ((dp = readdir(dfd)) != NULL) {
|
||||
if (strcmp(dp->d_name, ".") == 0
|
||||
|| strcmp(dp->d_name, "..") == 0)
|
||||
continue; /* skip self and parent */
|
||||
if (strlen(dir) + strlen(dp->d_name) + 2 > sizeof(name))
|
||||
fprintf(stdout, "dirwalk: name %s/%s too long\n",
|
||||
dir, dp->d_name);
|
||||
else {
|
||||
sprintf(name, "%s/%s", dir, dp->d_name);
|
||||
procNoAppDirs(name, dir);
|
||||
}
|
||||
}
|
||||
closedir(dfd);
|
||||
|
||||
}
|
||||
void
|
||||
procNoTopDirs(name, dir)
|
||||
char *name; /* entry name */
|
||||
char *dir; /* current directory */
|
||||
{
|
||||
struct stat stbuf;
|
||||
if (lstat(name, &stbuf) == -1) {
|
||||
fprintf(stdout, "procNoTopDirs: can't access %s\n", name);
|
||||
return;
|
||||
}
|
||||
if ((stbuf.st_mode & S_IFMT) == S_IFLNK) {
|
||||
procLink(name);
|
||||
return;
|
||||
}
|
||||
if ((stbuf.st_mode & S_IFMT) == S_IFREG) {
|
||||
processFile(name, dir);
|
||||
return;
|
||||
}
|
||||
if ((stbuf.st_mode & S_IFMT) == S_IFDIR) {
|
||||
return;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
void procNoAppDirs(name, dir)
|
||||
char *name; /* entry name */
|
||||
char *dir; /* current directory */
|
||||
{
|
||||
FILE *appList;
|
||||
char *ptr;
|
||||
struct stat stbuf;
|
||||
char appname[30];
|
||||
if (lstat(name, &stbuf) == -1) {
|
||||
fprintf(stdout, "procNoAppDirs: can't access %s\n", name);
|
||||
return;
|
||||
}
|
||||
if ((stbuf.st_mode & S_IFMT) == S_IFLNK) {
|
||||
return;
|
||||
}
|
||||
if ((stbuf.st_mode & S_IFMT) == S_IFREG) {
|
||||
return;
|
||||
}
|
||||
if ((stbuf.st_mode & S_IFMT) == S_IFDIR) {
|
||||
chdir(appl_base);
|
||||
if ((appList = fopen("appList", "r")) == NULL) {
|
||||
fprintf(stdout, "%: can't fopen %s in appl_base area\n", xname, "appList");
|
||||
exit(1);
|
||||
}
|
||||
/* check for match */
|
||||
while ((fgets(buffer, sizeof(buffer) + 2, appList)) != NULL) {
|
||||
len = strlen(buffer);
|
||||
/* remove the N/L from input line */
|
||||
if (buffer[len - 1] == '\n') {
|
||||
buffer[len - 1] = 0;
|
||||
}
|
||||
strcpy(appname, "./");
|
||||
strcat(appname, buffer);
|
||||
if ((strcmp(appname, name)) == SAME) {
|
||||
fclose(appList);
|
||||
return;
|
||||
}
|
||||
}
|
||||
fclose(appList);
|
||||
/* descend the directories not listed in the appl_base/appList file */
|
||||
procDirEntries(name, dir);
|
||||
return;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
int
|
||||
init_setup(argc, argv)
|
||||
int argc;
|
||||
char **argv;
|
||||
{
|
||||
char *ptr;
|
||||
int len;
|
||||
FILE *origin_fp;
|
||||
ptr = (char *) strrchr(argv[0], '/');
|
||||
if (ptr == 0) {
|
||||
/* no slash in program pathname */
|
||||
strcpy(xname, argv[0]);
|
||||
} else {
|
||||
strcpy(xname, ++ptr);
|
||||
--ptr;
|
||||
}
|
||||
if (*argv[0] != '/') {
|
||||
printf("####################################################\n");
|
||||
printf("%s: ERROR - You must invoke %s with a full pathname\n", xname, xname);
|
||||
printf("####################################################\n");
|
||||
exit(1);
|
||||
}
|
||||
/* derive application base from argv[0] */
|
||||
*ptr = NULL;
|
||||
/* remove /bin from invocation */
|
||||
ptr = (char *) strrchr(argv[0], '/');
|
||||
*ptr = NULL;
|
||||
len = strlen(argv[0]);
|
||||
strncpy(appl_base, argv[0], len);
|
||||
appl_base[len] = NULL;
|
||||
|
||||
strcpy(appLocName, appl_base);
|
||||
strcat(appLocName, "/appLoc");
|
||||
if ((stat(appLocName, &stbuf)) != 0) {
|
||||
fprintf(stdout, "####################################################\n");
|
||||
fprintf(stdout, "%s: Can't stat file: %s\n", xname, appLocName);
|
||||
fprintf(stdout, "####################################################\n");
|
||||
Usage();
|
||||
exit(1);
|
||||
}
|
||||
/* get shadow base */
|
||||
if ((getcwd(dest_base, 78)) == NULL) {
|
||||
fprintf(stdout, "getcwd failed\n");
|
||||
return;
|
||||
}
|
||||
strcpy(src_base, appl_base);
|
||||
|
||||
/* if .applShadow doesn't exist - require touch .applShadow */
|
||||
if ((stat("./.applShadow", &stbuf)) != 0) {
|
||||
fprintf(stdout, "\n");
|
||||
fprintf(stdout, "####################################################\n");
|
||||
fprintf(stdout, "%s: Can't stat file: './applShadow'\n", xname);
|
||||
fprintf(stdout, "####################################################\n");
|
||||
fprintf(stdout, "If this is NOT the root of your application shadow directory,\n");
|
||||
fprintf(stdout, "then please cd to the appropriate place and try again.\n");
|
||||
fprintf(stdout, "If this IS the root your shadow directory, then create .applShadow\n");
|
||||
fprintf(stdout, "with the following command and then run %s again.\n", xname);
|
||||
fprintf(stdout, " %%\n touch .applShadow\n");
|
||||
fprintf(stdout, "####################################################\n");
|
||||
exit(1);
|
||||
}
|
||||
/*********************** create/check an invocation marker *******************/
|
||||
if ((stat("./.applShadowOrgin", &stbuf)) != 0) {
|
||||
if ((origin_fp = fopen("./.applShadowOrgin", "w")) == NULL) {
|
||||
fprintf(stdout, "%s: can't fopen %s in dest_base area\n",
|
||||
xname, ".applShadowOrgin");
|
||||
exit(1);
|
||||
}
|
||||
fprintf(origin_fp, "%s\n", appl_base);
|
||||
} else {
|
||||
if ((origin_fp = fopen("./.applShadowOrgin", "r")) == NULL) {
|
||||
fprintf(stdout, "%s: can't fopen %s in dest_base area\n",
|
||||
xname, ".applShadowOrgin");
|
||||
exit(1);
|
||||
}
|
||||
/* compare appl_base with buffer */
|
||||
while ((fgets(buffer, sizeof(buffer) + 2, origin_fp)) != NULL) {
|
||||
len = strlen(buffer);
|
||||
/* remove the N/L from input line */
|
||||
if (buffer[len - 1] == '\n') {
|
||||
buffer[len - 1] = 0;
|
||||
}
|
||||
if ((strcmp(buffer, appl_base)) != SAME) {
|
||||
fprintf(stdout, "%s: FATAL ERROR - Illegal invocation\n", xname);
|
||||
fprintf(stdout,
|
||||
"Your last invocation was from %s/bin\n", buffer);
|
||||
fprintf(stdout,
|
||||
"Your current invocation is from %s/bin\n",appl_base);
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
#if 0 /* DEBUG */
|
||||
fprintf(stdout, "%s: WARNING - This is NOT the first run!\n",xname );
|
||||
#endif
|
||||
}
|
||||
fclose(origin_fp);
|
||||
/*********************** create a marker *******************/
|
||||
/* if appLoc doesn't exist - provide one */
|
||||
if ((stat("./appLoc", &stbuf)) != 0) {
|
||||
/* make a copy of appLocName */
|
||||
sprintf(command, "cp %s %s\n", appLocName, "appLoc");
|
||||
status = system(command);
|
||||
fprintf(stdout, "####################################################\n");
|
||||
fprintf(stdout, "I am providing you with a copy of the appLoc file\n");
|
||||
fprintf(stdout, "The appLoc file determines how many shadow applications\n");
|
||||
fprintf(stdout, "will be created in your shadow node\n");
|
||||
fprintf(stdout, "You may/should edit your copy of the appLoc file\n");
|
||||
fprintf(stdout, "\n");
|
||||
fprintf(stdout, "Once you are satisfied with the contents of your appLoc file,\n");
|
||||
fprintf(stdout, "Please invoke this program again:\n");
|
||||
fprintf(stdout, " %%\n %s/bin/%s\n", appl_base, xname);
|
||||
fprintf(stdout, "####################################################\n");
|
||||
exit(1);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user