Not all polygons are drawn

I am a beginner with this library and have a problem that puzzles me a lot.
I am trying to make a 3D flag which I will set a light on and be able to rotate it. I do that by drawing 6 polygons, so the flag can have depth and two sides. But, whenever I rotate it, I see that only 4 of the 6 sides are drawn, and I can see the inside of the flag.

I have got this far, looking from examples:


#include <GL/glut.h>
#include <math.h>

int angle=0;
int angle2 = 0;
int angle3 = 0;
float svetloZ = 0.1;
float svetloY = 0.1;
float svetloX = 0.1;
float flagFrontZ = 0.6;
GLfloat gold[] = { 0.7f, 0.8f, 0.2f, 1.0f };
GLfloat red[] = { 1.0f, 0.0f, 0.0f, 1.0f };

void keyboard(unsigned char key, int x, int y)
{
   switch (key) {
      case 27:                 // ESC e pritisnat
         exit(0);            
         break;
      case 'A':
         angle+=5;
         glutPostRedisplay();  // obnovi go prikazot
         break;
      case 'S':
         angle-=5;
         glutPostRedisplay();  // obnovi go prikazot
         break;
      case 'H':
         angle2-=5;
         glutPostRedisplay();
         break;
      case 'J':
         angle2+=5;
         glutPostRedisplay();
         break;
      case 'U':
         angle3+=5;
         glutPostRedisplay();
         break;
      case 'I':
         angle3-=5;
         glutPostRedisplay();
         break;
      case 'M':
      if(svetloZ == 0.1) break;
      else {
         svetloZ-=0.05;
         glutPostRedisplay();
         break;
         }
      case 'N':
      if(svetloZ == 0.9) break;
      else {
         svetloZ+=0.05;
         glutPostRedisplay();
         break;
         }
      case 'V':
      if(svetloY == 0.9) break;
      else {
         svetloY+=0.05;
         glutPostRedisplay();
         break;
         }
      case 'B':
      if(svetloY == 0.1) break;
      else {
         svetloY-=0.05;
         glutPostRedisplay();
         break;
         }
      case 'X':
      if(svetloX == 0.9) break;
      else {
         svetloX+=0.05;
         glutPostRedisplay();
         break;
         }
      case 'C':
      if(svetloX == 0.1) break;
      else {
         svetloX-=0.05;
         glutPostRedisplay();
         break;
         }
   }
}

void star(float zcoor){
int i = 0;


for(i ; i < 12 ; i++){
  glRotatef(30,0,0,1);

  glBegin(GL_POLYGON);
  glColor3f (1.0, 1.0, 0.0);
  glNormal3f(0,0,-1);

              glVertex3f(0.05,0,zcoor);
              glVertex3f(0,0.05,zcoor);
              glVertex3f(0.1,0.1,zcoor);
  glEnd();              
   }
}

void circle(float zcoor){
float radius = 0.05;
  int i;
    
glBegin(GL_POLYGON);
glColor3f (1.0, 1.0, 0.0);
glNormal3f(0,0,-1);
   for (i=0; i < 360; i++)
   {
      float degInRad = i*3.14159/180;
      glVertex3f(cos(degInRad)*radius,sin(degInRad)*radius,zcoor);
   }
glEnd();
}


void kocka (void) // ova e objektot koj go pretstavuva svetloto
{
   int i, j;
   
   glFrontFace(GL_CW);

   glColor3f(1,1,1);
   glBegin(GL_QUAD_STRIP);
      glNormal3f(0,0,1); 
      glVertex3f(0.5,0.5,0);
      glVertex3f(0.5,0.6,0);
      glVertex3f(0.6,0.6,0);
      glVertex3f(0.6,0.5,0);
      
      glVertex3f(0.5,0.5,0.1);
      glVertex3f(0.5,0.6,0.1);
      glVertex3f(0.6,0.6,0.1);
      glVertex3f(0.6,0.5,0.1);
      
      glVertex3f(0.5,0.5,0);
      glVertex3f(0.5,0.5,0.1);
      glVertex3f(0.6,0.6,0.1);
      glVertex3f(0.6,0.6,0);
      
   glEnd();
}

void flag(void){
float i; float j;   
      
  glColor3f(0,1,0);
      glBegin(GL_QUADS);
         glNormal3f(1,0,0);
         glVertex3f(0.7,0.3,0.6);
         glVertex3f(0.7,0.3,0.7);
         glVertex3f(0.7,0.7,0.7);
         glVertex3f(0.7,0.7,0.6);
      glEnd();
      
      glBegin(GL_QUADS);
         glNormal3f(-1,0,0);
         glVertex3f(0.3,0.3,0.6);
         glVertex3f(0.3,0.3,0.7);
         glVertex3f(0.3,0.7,0.7);
         glVertex3f(0.3,0.7,0.6);
      glEnd();
      
      glBegin(GL_QUADS);
         glNormal3f(0,1,0);
         glVertex3f(0.3,0.7,0.6);
         glVertex3f(0.3,0.7,0.7);
         glVertex3f(0.7,0.7,0.7);
         glVertex3f(0.7,0.7,0.6);
      glEnd();
      
      glBegin(GL_QUADS);
         glNormal3f(0,-1,0);
         glVertex3f(0.3,0.3,0.6);
         glVertex3f(0.3,0.3,0.7);
         glVertex3f(0.7,0.3,0.7);
         glVertex3f(0.7,0.3,0.6);
      glEnd();
      
     glBegin(GL_TRIANGLE_FAN);
      for(i = 0.30; i < 0.70; i +=0.05){
        for(j = 0.30 ; j < 0.70; j +=0.05){
        
         glColor3f(1,0,0);
          glNormal3f(0,0,1);
       
          glVertex3f(i,j,0.7);
          glVertex3f(i+0.05,j,0.7);
          glVertex3f(i+0.05,j+0.05,0.7);
          glVertex3f(i,j+0.05,0.7);        
          
        }
      }  
      glEnd();

     glBegin(GL_TRIANGLE_FAN);
      for(i = 0.30; i < 0.70; i +=0.05){
        for(j = 0.30 ; j < 0.70; j +=0.05){
        
          glNormal3f(0,0,-1);
           glColor3f(1,0,0);
       
          glVertex3f(i,j,flagFrontZ);
          glVertex3f(i+0.05,j,flagFrontZ);
          glVertex3f(i+0.05,j+0.05,flagFrontZ);
          glVertex3f(i,j+0.05,flagFrontZ);
          
        }
      } 
      glEnd();
        
      glPushMatrix();
       
       glTranslatef(0.5,0.5,0);
       circle(flagFrontZ);
        star(flagFrontZ);

        glPopMatrix();
 
}

void display(void)
{
   glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();

glScalef(0.5,0.5,0.5);
glFrontFace(GL_CCW);

    // Set Material properties to follow glColor values
    glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE);
    glTranslatef(0.5, 0.5, 0);
    glRotatef(angle3,1,0,0);
    glRotatef(angle2,0,1,0);
    glRotatef(angle,0,0,1);
    glTranslatef(-0.5, -0.5, 0);
   
   GLfloat lightPos[] = { svetloX, svetloY, svetloZ, 1.0f };
  glLightfv(GL_LIGHT0,GL_POSITION,lightPos);

  glPushMatrix();
     glTranslatef(svetloX,svetloY,svetloZ);
     kocka();
   glPopMatrix();
   
   flag();

   glFlush ();
   glutSwapBuffers();
}

void init (void) 
{
    glClearColor(0.1f, 0.1f, 0.1f, 0.0f);
     glMatrixMode(GL_PROJECTION);
     glLoadIdentity();
     glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0);
     
    glShadeModel(GL_SMOOTH);   
    glEnable(GL_LIGHTING);
    glEnable(GL_COLOR_MATERIAL);
    

    GLfloat  ambientLight[] = { 0.2f, 0.3f, 0.3f, 1.0f };
    GLfloat  diffuseLight[] = { 0.7f, 0.7f, 0.7f, 1.0f };
    GLfloat  specular[] = { 1.0f, 1.0f, 1.0f, 1.0f};
    
    
    // Setup and enable light 0
    GLfloat lightPos[] = { 0.f, 0.0f, svetloZ, 1.0f };
    glLightfv(GL_LIGHT0,GL_AMBIENT,ambientLight);
    glLightfv(GL_LIGHT0,GL_DIFFUSE,diffuseLight);
    glLightfv(GL_LIGHT0,GL_SPECULAR,specular);
    glLightfv(GL_LIGHT0,GL_POSITION,lightPos);
    
    glEnable(GL_LIGHT0);
}

int main(int argc, char** argv)
{
   glutInit(&argc, argv);
   glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB);
   
   glutInitWindowSize (450, 350); 
   glutInitWindowPosition (100, 100);
   glutCreateWindow ("Çäðàâî");
   init ();
   glutDisplayFunc(display); 
   glutKeyboardFunc(keyboard);
   glutMainLoop();
   return 0; 
}

Also, I compile it with this make file.


TARGETS = primer
LLDLIBS = -lglut32 -lopengl32 -lglu32
default: $(TARGETS)
all: default
.c.o:
	gcc -c $<
$(TARGETS): $(TARGETS).o
	gcc $@.o -L . $(LLDLIBS) -o $@
clean:  
	rm -f *.o $(TARGETS)

Does anyone has an idea where or what I am doing wrong?

Thank you,
Mike

Try adding to your init() call


glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);

also in main add GLUT_DEPTH


glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);