Segmentation fault...Posting with source code.

From: Sridhar Sundararaman <sundara_at_essex.ecn.uoknor.edu>
Date: 4 Sep 1993 21:18:34 GMT
Message-ID: <26b0na$epj_at_constellation.ecn.uoknor.edu>


hai

I have a Pro*C program that handles our small library. Everytime this program is run, it first connects to Oracle with the command

        "EXEC SQL CONNECT :userid IDENTIFIED BY :password"

But a weird problem occurs even before the program reaches this stage. It is giving a "Segmentation fault" even before trying to connect. Infact the CONNECT is the first EXEC SQL command in the program only after the EXEC SQL DECLARE and EXEC SQL INCLUDE statements.

Oracle has been installed on the DEC3000/200 on Ultrix. About 20 of us use this program, but not more than 3 or 4 at a time.

What is weird about this problem is that it does not happen to all the users, and even among the users who get it, it happens only once in a while. Could the shell in which the user is, cause any problems??

Any help in this regard would be appreciated.

Thanks in advance,


The above is a posting I did yesterday. But I had suggestions saying that it would be helpful if I included the source code also. SO here it is..

  • Code starts here ***************************
#include <stdio.h>
#include <pwd.h>
#include <string.h>

EXEC SQL BEGIN DECLARE SECTION;
	VARCHAR userid[30];
	VARCHAR password[15];
	
	int manual_no;
	VARCHAR title[60];
	VARCHAR version[10];
	char status;
	VARCHAR location[8];
	VARCHAR sa[10];
	VARCHAR username[8];
	VARCHAR usertype[20];
	VARCHAR dateout[10];
	VARCHAR duedate[10];
	VARCHAR string[20];

EXEC SQL END DECLARE SECTION; EXEC SQL INCLUDE SQLCA;
EXEC SQL INCLUDE ORACA; EXEC ORACLE OPTION (ORACA=YES);
EXEC ORACLE OPTION (RELEASE_CURSOR=YES); void logoff_database();

void main()
{

    check_host();
    oraca.orastxtf = ORASTFERR;
    logon_database(); /* The problem occurs in this function I guess. */

    EXEC SQL WHENEVER NOT FOUND GOTO notfound;     for(;;)
    {

    	system("clear");
	switch(Menu_Select())

{
case 1: system("clear"); checkin(); break; case 2: system("clear"); checkout(); break; case 3: system("clear"); check_book_status(); break; case 4: system("clear"); check_user_status(); break; case 5: system("clear"); string_search(); break; case 6: system("clear"); Manual_No_search(); break; case 7: system("clear"); overdue_report(); break; case 8: Admin_Route(); break; case 9: EXEC SQL COMMIT WORK; logoff_database(); exit(0); }

    }
}

Menu_Select()
{

    char s[5];
    int Selection;     

    printf("\t\t\t    OnLine Manual Manager\n");
    printf("\t\t\t\t(CIRC)v3.0\n\n\n");
    printf("\t1. Check in Manual\t\t");
    printf("2. Check out Manual\n");
    printf("\t3. Check Book Status\t\t");
    printf("4. Check User Status\n");
    printf("\t5. String Search on Manuals\t");
    printf("6. Manual Number Search\n");
    printf("\t7. Report Overdue Books\t");
    printf("\t8. Database Administration\n");
    printf("\t9. Quit Circ\n");
    

    do
    {

	printf("\nEnter your choice: ");
	gets(s);
	Selection = atoi(s);

    }while(Selection<0 || Selection>9);
 return Selection;
}

Admin_Route()
{

    int menu=0;

	if(check_validity()==1)

{
while(menu!=5) { system("clear"); switch(menu=Admin_Menu()) { case 1: system("clear"); add_entry(); break; case 2: system("clear"); delete_entry(); break; case 4: system("clear"); display_entry(); break; case 3: system("clear"); modify_entry(); break; case 5: break; } } } else
{
printf("Not a valid user for Administration\n"); pause(); }

}

Admin_Menu()
{

    char s[5];
    int Selection;

    printf("\t\tOnLine Manual Manager - Administration\n");
    printf("\t\t\t\t(CIRC)v3.0\n\n\n");
    printf("\t1. Add Manual\t\t");
    printf("2. Delete Manual\n");
    printf("\t3. Modify Entry\t\t");
    printf("4. Display Entry\n");
    printf("\t5. Exit Administration Module\n\n");
    

    do
    {

	printf("\nEnter your choice: ");
	gets(s);
	Selection = atoi(s);

    }while(Selection<1 || Selection>5);
 return Selection;
}

checkin()
{

        char man_no[10], login[10];

	printf("Enter the Manual number: ");
	gets(man_no);
	manual_no = atoi(man_no);

	EXEC SQL SELECT STATUS
	INTO :status
	FROM SUNDARA.MANUAL
	WHERE MANUAL_NO = :manual_no;

	strcpy(sa.arr, getlogin());
	sa.len = strlen(sa.arr);

	if(status=='O')

{
EXEC SQL UPDATE SUNDARA.MANUAL SET STATUS = 'I', DATEOUT = SYSDATE, DUEDATE = SYSDATE, SA = :sa WHERE MANUAL_NO = :manual_no; EXEC SQL COMMIT; EXEC SQL SELECT USERNAME, SA, DATEOUT INTO :username, :sa, :dateout FROM SUNDARA.MANUAL WHERE MANUAL_NO = :manual_no; sa.arr[sa.len] = '\0'; username.arr[username.len] = '\0'; dateout.arr[dateout.len] = '\0'; printf("%d has been checked in by %s from %s on %s\n", manual_no, sa.arr, username.arr, dateout.arr); } else
{
printf("The manual is already in.\n"); EXEC SQL SELECT USERNAME, SA, DATEOUT INTO :username, :sa, :dateout FROM SUNDARA.MANUAL WHERE MANUAL_NO = :manual_no; sa.arr[sa.len] = '\0'; username.arr[username.len] = '\0'; dateout.arr[dateout.len] = '\0'; printf("%d has already been checked in by %s from %s on %s\n", manual_no, sa.arr, username.arr, dateout.arr); } notfound: if(sqlca.sqlerrd[2]==0) printf("\nManual not found\n"); pause();

}         

checkout()
{

	char man_no[10];
	int check;

	printf("Enter the Username: ");
	gets(username.arr);
	username.len = strlen(username.arr);

	if(strcmp(username.arr, "root") == 0)

{
strcpy(usertype.arr, "System Account"); check = 1; } else
{
strcpy(usertype.arr, " "); check=check_user(username.arr, usertype.arr); } usertype.len = strlen(usertype.arr); strcpy(sa.arr, getlogin()); sa.len = strlen(sa.arr); if(check==0)
{
printf("The user's account is not currently active\n"); pause(); return; } else if(check==2)
{
printf("User not found...\n"); pause(); return; } else
{
username.len = strlen(username.arr); printf("Enter the Manual Number: "); gets(man_no); manual_no = atoi(man_no); EXEC SQL SELECT STATUS, LOCATION INTO :status, :location FROM SUNDARA.MANUAL WHERE MANUAL_NO = :manual_no; if(location.arr[location.len-1]=='*') { printf("\nThe Manual is non-circulating.\n"); pause(); return 0; } if(status=='I') { EXEC SQL UPDATE SUNDARA.MANUAL SET STATUS = 'O', DATEOUT = SYSDATE, DUEDATE = SYSDATE+1, SA = :sa, USERNAME = :username, USERTYPE = :usertype WHERE MANUAL_NO = :manual_no; EXEC SQL COMMIT; EXEC SQL SELECT USERNAME, SA, DATEOUT INTO :username, :sa, :dateout FROM SUNDARA.MANUAL WHERE MANUAL_NO = :manual_no; username.arr[username.len] = '\0'; sa.arr[sa.len] = '\0'; dateout.arr[dateout.len] = '\0'; printf("%d has been checked out by %s to %s on %s\n", manual_no, sa.arr, username.arr, dateout.arr); } else { printf("The manual is already out.\n"); EXEC SQL SELECT USERNAME, SA, DATEOUT INTO :username, :sa, :dateout FROM SUNDARA.MANUAL WHERE MANUAL_NO = :manual_no; username.arr[username.len] = '\0'; sa.arr[sa.len] = '\0'; dateout.arr[dateout.len] = '\0'; printf("%d has already been checked out by %s to %s on %s\n", manual_no, sa.arr, username.arr, dateout.arr); } } notfound: if(sqlca.sqlerrd[2]==0) printf("\nManual not found\n"); pause();

}

check_book_status()
{

        char man_no[10];

	printf("Enter the Manual Number: ");
	gets(man_no);
	manual_no = atoi(man_no);

	EXEC SQL SELECT STATUS
	INTO :status
	FROM SUNDARA.MANUAL
	WHERE MANUAL_NO = :manual_no;
	
	if(status=='O')

{
EXEC SQL SELECT USERNAME, SA, DATEOUT, USERTYPE, LOCATION INTO :username, :sa, :dateout, :usertype, :location FROM SUNDARA.MANUAL WHERE MANUAL_NO = :manual_no; username.arr[username.len] = '\0'; sa.arr[sa.len] = '\0'; dateout.arr[dateout.len] = '\0'; usertype.arr[usertype.len] = '\0'; location.arr[location.len] = '\0'; printf("%d has been checked out by %s to %s, %s, on %s from %s\n", manual_no, sa.arr, username.arr, usertype.arr, dateout.arr , location.arr); } else
{
EXEC SQL SELECT USERNAME, SA, DATEOUT, LOCATION INTO :username, :sa, :dateout, :location FROM SUNDARA.MANUAL WHERE MANUAL_NO = :manual_no; username.arr[username.len] = '\0'; sa.arr[sa.len] = '\0'; dateout.arr[dateout.len] = '\0'; location.arr[location.len] = '\0'; printf("%d has been checked in by %s from %s on %s in %s\n", manual_no, sa.arr, username.arr, dateout.arr, location.arr); } notfound: if(sqlca.sqlerrd[2]==0) printf("\nManual not found\n"); pause();

}

check_user_status()
{

	EXEC SQL BEGIN DECLARE SECTION;
		VARCHAR sqlstmt[132];
	EXEC SQL END DECLARE SECTION;
	FILE *fp;
	char yorn[2], pr_name[10], prnstr[30];

	printf("Enter the User's Login name: ");
	gets(username.arr);
	username.len = strlen(username.arr);

	status = 'O';

	sqlstmt.len = sprintf(sqlstmt.arr, "SELECT MANUAL_NO,\
	TITLE, DATEOUT, DUEDATE FROM SUNDARA.MANUAL \
	WHERE USERNAME = :v1 AND STATUS = :v2");

	EXEC SQL PREPARE S FROM :sqlstmt;

	EXEC SQL DECLARE C CURSOR FOR S;

	EXEC SQL OPEN C USING :username, :status;

	if(!(fp = fopen("!_at_#$", "w")))

{
printf("Cannot open temporary file\n"); exit(0); } fprintf(fp, "User Status Report for login %s\n\n", username.arr); while(1)
{
EXEC SQL FETCH C INTO :manual_no, :title, :dateout, :duedate; title.arr[title.len] = '\0'; dateout.arr[dateout.len] = '\0'; duedate.arr[duedate.len] = '\0'; printf("%d, %s, checked out on %s and due on %s\n", manual_no, title.arr, dateout.arr, duedate.arr); fprintf(fp, "%d, %s, checked out on %s and due on %s\n", manual_no, title.arr, dateout.arr, duedate.arr); } notfound: printf("\n%d book%s lent to user\n", sqlca.sqlerrd[2],(sqlca.sqlerrd[2] ==1) ? "" : "s"); fclose(fp); if(sqlca.sqlerrd[2] != 0)
{
printf("\nDo you want a printout of the list <N>: "); gets(yorn); if(strcmp(yorn,"Y")==0 || strcmp(yorn,"y")==0) { printf("Enter the printer name: "); gets(pr_name); sprintf(prnstr, "lpr -P%s !_at_#$",pr_name); system(prnstr); } } else pause(); EXEC SQL CLOSE C; system("rm -f !_at_#$");

}

string_search()
{

	EXEC SQL BEGIN DECLARE SECTION;
		VARCHAR sqlstmt[132];
	EXEC SQL END DECLARE SECTION;

	char str[20], yorn[2], pr_name[10], prnstr[30], errstr[80];
	int string_length, i=0, j=0;

	FILE *fp;

	printf("Enter the string to search: ");
	gets(str);

	if(!(fp = fopen("!_at_#$", "w")))

{
printf("Cannot open temporary file\n"); perror(errstr); exit(0); } string_length = strlen(str); string.arr[0] = '%'; for(i=1;i<=string_length;i++) string.arr[i] = tolower(str[i-1]); string.arr[string_length+1] = '%'; string.len = strlen(string.arr); sqlstmt.len = sprintf(sqlstmt.arr, "SELECT MANUAL_NO,\ TITLE, STATUS, LOCATION FROM SUNDARA.MANUAL \ WHERE LOWER(TITLE) LIKE :v1 \ ORDER BY MANUAL_NO"); EXEC SQL PREPARE T FROM :sqlstmt; EXEC SQL DECLARE D CURSOR FOR T; EXEC SQL OPEN D USING :string; fprintf(fp, "String search list for string '%s'\n\n", string.arr); while(1)
{
EXEC SQL FETCH D INTO :manual_no, :title, :status, :location; title.arr[title.len] = '\0'; location.arr[location.len] = '\0'; printf("%5d %55s %5s %c\n", manual_no, title.arr, location.arr, status); fprintf(fp, "%5d %55s %5s %c\n", manual_no, title.arr, location.arr, status); j+=1; if(j%20==0 && j!=0) { pause(); system("clear"); } } notfound: printf("\n%d book%s found...\n", sqlca.sqlerrd[2],(sqlca.sqlerrd[2]==1) ? "" : "s"); EXEC SQL CLOSE D; fclose(fp); if(sqlca.sqlerrd[2] != 0)
{
printf("\nDo you want to print the list <N>: "); gets(yorn); if(strcmp(yorn,"Y")==0 || strcmp(yorn,"y")==0) { printf("Enter the printer name: "); gets(pr_name); sprintf(prnstr, "lpr -P%s !_at_#$", pr_name); system(prnstr); } } else pause(); system("rm -f !_at_#$");

}

Manual_No_search()
{

	EXEC SQL BEGIN DECLARE SECTION;
		VARCHAR sqlstmt[132];
		int upper_bound;
		int lower_bound;
	EXEC SQL END DECLARE SECTION;

	char str[20], str1[20], yorn[2], pr_name[10], prnstr[30], errstr[80];
	int string_length, i=0, j=0;

	FILE *fp;

	printf("Enter the lower bound to search: ");
	gets(str);
	lower_bound = atoi(str);
	printf("Enter the upper bound to search: ");
	gets(str1);
	upper_bound = atoi(str1);

	if(!(fp = fopen("!_at_#$", "w")))

{
printf("Cannot open temporary file\n"); perror(errstr); exit(0); } sqlstmt.len = sprintf(sqlstmt.arr, "SELECT MANUAL_NO,\ TITLE, STATUS, LOCATION FROM SUNDARA.MANUAL \ WHERE MANUAL_NO > :v1-1 \ AND MANUAL_NO < :v2+1 \ ORDER BY MANUAL_NO"); EXEC SQL PREPARE X FROM :sqlstmt; EXEC SQL DECLARE G CURSOR FOR X; EXEC SQL OPEN G USING :lower_bound, :upper_bound; fprintf(fp, "Manual Number search list\n\n"); while(1)
{
EXEC SQL FETCH G INTO :manual_no, :title, :status, :location; title.arr[title.len] = '\0'; location.arr[location.len] = '\0'; printf("%5d %55s %5s %c\n", manual_no, title.arr, location.arr, status); fprintf(fp, "%5d %55s %5s %c\n", manual_no, title.arr, location.arr, status); j+=1; if(j%20==0 && j!=0) { pause(); system("clear"); } } notfound: printf("\n%d book%s found...\n", sqlca.sqlerrd[2],(sqlca.sqlerrd[2]==1) ? "" : "s"); EXEC SQL CLOSE G; fclose(fp); if(sqlca.sqlerrd[2] != 0)
{
printf("\nDo you want to print the list <N>: "); gets(yorn); if(strcmp(yorn,"Y")==0 || strcmp(yorn,"y")==0) { printf("Enter the printer name: "); gets(pr_name); sprintf(prnstr, "lpr -P%s !_at_#$", pr_name); system(prnstr); } } else pause(); system("rm -f !_at_#$");

}

overdue_report()
{

	EXEC SQL BEGIN DECLARE SECTION;
		VARCHAR sqlstmt[132];
	EXEC SQL END DECLARE SECTION;

	FILE *fp;
	char yorn[2], pr_name[10], prnstr[30], tempusr[10];

	if(!(fp = fopen("!_at_#$", "w")))

{
printf("Cannot open temporary file\n"); exit(0); } sqlstmt.len = sprintf(sqlstmt.arr, "SELECT MANUAL_NO, \ TITLE, USERNAME, USERTYPE, DUEDATE FROM SUNDARA.MANUAL\ WHERE DUEDATE < SYSDATE \ AND STATUS = 'O' \ ORDER BY USERNAME"); EXEC SQL PREPARE U FROM :sqlstmt; EXEC SQL DECLARE E CURSOR FOR U; EXEC SQL OPEN E; strcpy(tempusr, ""); while(1)
{
EXEC SQL FETCH E INTO :manual_no, :title, :username, :usertype, :duedate; title.arr[title.len] = '\0'; username.arr[username.len] = '\0'; duedate.arr[duedate.len] = '\0'; usertype.arr[usertype.len] = '\0'; if(strcmp(tempusr, username.arr)!=0) { strcpy(tempusr, username.arr); printf("\nDefaulter: %s, %s\n", username.arr, usertype.arr); fprintf(fp, "\nDefaulter: %s, %s\n", username.arr, usertype.arr); } printf("%5d %55s due on %9s\n", manual_no, title.arr, duedate.arr); fprintf(fp, "%5d %55s due on %9s\n", manual_no, title.arr, duedate.arr); } notfound: printf("\n%d book%s found...\n", sqlca.sqlerrd[2],(sqlca.sqlerrd[2]==1) ? "" : "s"); fclose(fp); if(sqlca.sqlerrd[2] != 0)
{
printf("\nDo you want to printout the list <N>: "); gets(yorn); if(strcmp(yorn,"Y")==0 || strcmp(yorn,"y")==0) { printf("Enter the printer name: "); gets(pr_name); sprintf(prnstr, "lpr -P%s !_at_#$", pr_name); system(prnstr); } } else pause(); EXEC SQL CLOSE C; system("rm -f !_at_#$");

}

add_entry()
{

	EXEC SQL WHENEVER SQLERROR GOTO sqlerror;
	EXEC SQL BEGIN DECLARE SECTION;
		VARCHAR sqlstmt[300];
	EXEC SQL END DECLARE SECTION;

	int add_count=0;
	char man_no[10];

	sqlstmt.len = sprintf(sqlstmt.arr,"INSERT INTO SUNDARA.MANUAL \
	(MANUAL_NO, TITLE, VERSION, LOCATION, STATUS, SA, USERNAME, \
	USERTYPE, DATEOUT, DUEDATE) \
	VALUES (:v1, :v2, :v3, :v4, 'I', 'NULL', 'NULL', 'NULL', \
	SYSDATE, SYSDATE)");


	system("clear");
	do

{
EXEC SQL PREPARE S FROM :sqlstmt; printf("\nEnter the Manual Number (Not more than 5 digits) \ <Exit> : "); gets(man_no); manual_no = atoi(man_no); if(manual_no!=0) { printf("Enter the title of manual (MAX 55 CHAR) \ <No Title> : "); gets(title.arr); if(strcmp(title.arr, "")==0) strcpy(title.arr, "No Title"); title.len = strlen(title.arr); printf("Enter the version(MAX 8 CHAR) <None> : "); gets(version.arr); if(strcmp(version.arr, "")==0) strcpy(version.arr, "None"); version.len = strlen(version.arr); printf("Enter the location (MAX 5 CHAR) <F300> : "); gets(location.arr); if(strcmp(location.arr, "")==0) strcpy(location.arr, "F300"); location.len = strlen(location.arr); EXEC SQL EXECUTE S USING :manual_no, :title, :version, :location; EXEC SQL COMMIT; printf("\nOne row added to the database\n"); add_count+=1; strcpy(title.arr,""); strcpy(location.arr, ""); strcpy(version.arr, ""); } }while(manual_no!=0); printf("\n%d manual%s added during this session\n",add_count, (add_count==1) ? "" : "s"); sqlerror: if(manual_no!=0)
{
printf("Error occurred. Please check...\n"); sqlca.sqlerrm.sqlerrmc[sqlca.sqlerrm.sqlerrml]='\0'; oraca.orastxt.orastxtc[oraca.orastxt.orastxtl]='\0'; oraca.orasfnm.orasfnmc[oraca.orasfnm.orasfnml]='\0'; printf("\n%s\n", sqlca.sqlerrm.sqlerrmc); EXEC SQL WHENEVER SQLERROR CONTINUE; EXEC SQL ROLLBACK; }

 pause();
}

delete_entry()
{

	EXEC SQL BEGIN DECLARE SECTION;
		VARCHAR sqlstmt[132];
	EXEC SQL END DECLARE SECTION;

	char man_no[10];

	sqlstmt.len = sprintf(sqlstmt.arr, "DELETE FROM SUNDARA.MANUAL \
	 WHERE MANUAL_NO = :manual_no");

	EXEC SQL PREPARE S FROM :sqlstmt;

	printf("Enter the Manual Number: ");
	gets(man_no);
	manual_no = atoi(man_no);

	EXEC SQL EXECUTE S USING :manual_no;
	

notfound:
	if(sqlca.sqlerrd[2]==0)
	printf("Manual not found...\n");
	else
	printf("\nManual deleted from database.\n");

	pause();
	EXEC SQL COMMIT;

}

display_entry()
{

        char man_no[10];

	printf("Enter the Manual Number: ");
	gets(man_no);
	manual_no = atoi(man_no);

	EXEC SQL SELECT TITLE, VERSION, LOCATION, STATUS, SA,
	USERNAME, USERTYPE, DATEOUT, DUEDATE
	INTO :title, :version, :location, :status, :sa,
	:username, :usertype, :dateout, :duedate
	FROM SUNDARA.MANUAL
	WHERE MANUAL_NO = :manual_no;

	title.arr[title.len] = '\0';
	version.arr[version.len] = '\0';
	location.arr[location.len] = '\0';
	sa.arr[sa.len] = '\0';
	username.arr[username.len] = '\0';
	usertype.arr[usertype.len] = '\0';
	dateout.arr[dateout.len] = '\0';
	duedate.arr[duedate.len] = '\0';

	printf("Manual Number: %d\n", manual_no);
	printf("Title: %s\n", title.arr);
	printf("Version: %s\n", version.arr);
	printf("Location: %s\n", location.arr);
	printf("SA Entry: %s\n", sa.arr);
	printf("User Name: %s\n", username.arr);
	printf("User Type: %s\n", usertype.arr);
	printf("Date Out: %s\n", dateout.arr);
	printf("Due Date: %s\n", duedate.arr);

notfound:
	if(sqlca.sqlerrd[2]==0)
	printf("\nManual not found...\n");
	pause();

}

Modify_Menu_Select()
{

    char s[5];
    int Selection;     

    printf("\t\t\t\tModify Module\n");
    printf("\t\t\t\t (CIRC)v3.0\n\n\n");
    printf("\t1. Title\t\t");
    printf("2. Version\n");
    printf("\t3. Location\t\t");
    printf("4. Duedate\n");
    printf("\t5. Quit Modify Module\n");
    

    do
    {

	printf("\nEnter your choice: ");
	gets(s);
	Selection = atoi(s);

    }while(Selection<0 || Selection>5);
 return Selection;
}

modify_entry()
{

	char man_no[6];
	int sel;

	EXEC SQL WHENEVER SQLERROR GOTO sqlerror;
	
	for(;;)

{
system("clear"); switch(sel = Modify_Menu_Select()) { case 1: do { printf("Enter the Manual Number: "); gets(man_no); manual_no = atoi(man_no); if(manual_no!=0) { printf("Enter the new title: "); gets(title.arr); title.len = strlen(title.arr); EXEC SQL UPDATE SUNDARA.MANUAL SET TITLE = :title WHERE MANUAL_NO = :manual_no; EXEC SQL COMMIT; strcpy(title.arr,""); strcpy(man_no, ""); } }while(manual_no!=0); break; case 2: do { printf("Enter the Manual Number: "); gets(man_no); manual_no = atoi(man_no); if(manual_no!=0) { printf("Enter the new version: "); gets(version.arr); version.len = strlen(version.arr); EXEC SQL UPDATE SUNDARA.MANUAL SET VERSION = :version WHERE MANUAL_NO = :manual_no; EXEC SQL COMMIT; strcpy(version.arr,""); strcpy(man_no, ""); } }while(manual_no!=0); break; case 3: do { printf("Enter the Manual Number: "); gets(man_no); manual_no = atoi(man_no); if(manual_no!=0) { printf("Enter the new location: "); gets(location.arr); location.len = strlen(location.arr); EXEC SQL UPDATE SUNDARA.MANUAL SET LOCATION = :location WHERE MANUAL_NO = :manual_no; EXEC SQL COMMIT; strcpy(location.arr,""); strcpy(man_no, ""); } }while(manual_no!=0); break; case 4: do { printf("Enter the Manual Number: "); gets(man_no); manual_no = atoi(man_no); if(manual_no!=0) { printf("Enter the new duedate: "); gets(duedate.arr); duedate.len = strlen(duedate.arr); EXEC SQL UPDATE SUNDARA.MANUAL SET DUEDATE = :duedate WHERE MANUAL_NO = :manual_no; EXEC SQL COMMIT; strcpy(duedate.arr,""); strcpy(man_no, ""); } }while(manual_no!=0); break; case 5: return 1; break; } } sqlerror: if(manual_no!=0)
{
printf("Error occurred. Please check...\n"); sqlca.sqlerrm.sqlerrmc[sqlca.sqlerrm.sqlerrml]='\0'; oraca.orastxt.orastxtc[oraca.orastxt.orastxtl]='\0'; oraca.orasfnm.orasfnmc[oraca.orasfnm.orasfnml]='\0'; printf("\n%s\n", sqlca.sqlerrm.sqlerrmc); EXEC SQL WHENEVER SQLERROR CONTINUE; EXEC SQL ROLLBACK; } notfound: if(sqlca.sqlerrd[2]==0) printf("Manual not found...\n"); else
{
printf("\nDatabase updated.\n"); pause(); }

}

logon_database()
{

        EXEC SQL WHENEVER SQLERROR GOTO sqlerror;

	strcpy(userid.arr, getlogin());
	userid.len = strlen(userid.arr);
	strcpy(password.arr, "oracle");
	password.len = strlen(password.arr);

	EXEC SQL CONNECT :userid IDENTIFIED BY :password;
	return 0;

sqlerror:
		printf("Error occurred. Please check...\n");
	
		sqlca.sqlerrm.sqlerrmc[sqlca.sqlerrm.sqlerrml]='\0';
		oraca.orastxt.orastxtc[oraca.orastxt.orastxtl]='\0';
		oraca.orasfnm.orasfnmc[oraca.orasfnm.orasfnml]='\0';
		printf("\n%s\n", sqlca.sqlerrm.sqlerrmc);
		exit(0);
		
		EXEC SQL WHENEVER SQLERROR CONTINUE;

}         

void logoff_database()
{

	EXEC SQL COMMIT WORK RELEASE;
	return;

}

pause()
{

        char temp[2];

	printf("\nPress return to continue...\n");
	gets(temp);

}

check_user(char *usrname, char usrtype[20]) {

	FILE *fpu;
	char name_type[15], shell[15], temp;
	int i,comma,j;
	struct passwd *pwd;

	
	if(pwd = getpwnam(usrname))

{
if(strcmp(pwd->pw_shell,"/bin/csh") != 0) { return 0; } else { if(!(fpu = fopen("temp.str", "w"))) { printf("Cannot open temporary file\n"); exit(0); } fprintf(fpu, "%s", pwd->pw_gecos); fclose(fpu); if(!(fpu = fopen("temp.str", "r"))) { printf("Cannot open temporary file\n"); exit(0); } comma=0; j=0; do { fscanf(fpu, "%c", &temp); if(temp==',') comma+=1; if(comma==2) { usrtype[j] = temp; j+=1; } }while(comma<3); usrtype[0]=' '; fclose(fpu); /*system("rm -f temp.str");*/ return 1; } } else return 2;

}

check_host()
{

        char name[31];

        gethostname(name, 31);

	if(strcmp(name,"essex.ecn.uoknor.edu")!=0)

{
system("clear"); printf("\nYou have to be logged on to essex to run procirc\n"); pause(); system("clear"); exit(0); }

}

check_validity()
{

	FILE *fp;
	char valid[10], error[50];

	if(!(fp=fopen("/ecn/staff0/sundara/oracle/proc/.circrc",
	 "r")))

{
perror(error); puts(error); printf("Cannot find Validity check file. Contact Admin.\n"); return 2; } while(!(feof(fp)))
{
fscanf(fp, "%s", valid); if(strcmp(valid, getlogin())==0) { fclose(fp); return 1; } } fclose(fp); return 0;

}

check_len(char *var, int length)
{

	if(strlen(var) > length)

{
printf("String too long\n"); return 1; } else return 0;

} Received on Sat Sep 04 1993 - 23:18:34 CEST

Original text of this message