Show
Ignore:
Timestamp:
11/05/10 15:16:05 (2 years ago)
Author:
westram
Message:
  • stuffed all direct memory leaks in GB_open/GB_close
    • call gbcm_logout for main-user
    • free dates
    • gb_delete_main_entry -> gb_delete_dummy_father
    • free key data
    • free command hash
    • splitted up gb_delete_entry into GBDATA- and GBCONTAINER-version
    • destroy DB indices when destroying GBCONTAINER
Files:
1 modified

Legend:

Unmodified
Added
Removed
  • trunk/ARBDB/adcomm.cxx

    r6640 r6648  
    11911191} 
    11921192 
    1193 static GB_ERROR gbcm_logout(GBCONTAINER *gb_main, char *user) 
    1194 { 
    1195     long i; 
    1196     GB_MAIN_TYPE *Main = GBCONTAINER_MAIN(gb_main); 
    1197  
    1198     for (i = 0; i<GB_MAX_USERS; i++) { 
    1199         if (!Main->users[i]) continue; 
    1200         if (!strcmp(user, Main->users[i]->username)) { 
    1201             Main->users[i]->nusers--; 
    1202             if (Main->users[i]->nusers<=0) { // kill user and his projects 
    1203                 free(Main->users[i]->username); 
    1204                 freenull(Main->users[i]); 
    1205                 fprintf(stdout, "The User %s has logged out\n", user); 
    1206             } 
    1207             return 0; 
    1208         } 
    1209     } 
    1210     return GB_export_errorf("User '%s' not logged in", user); 
    1211 } 
    1212  
    12131193bool GBCMS_accept_calls(GBDATA *gbd, bool wait_extra_time) { 
    12141194    // returns true if served 
     
    13141294                } 
    13151295                if (si->username) { 
    1316                     gbcm_logout((GBCONTAINER *)hs->gb_main, si->username); 
     1296                    gbcm_logout(Main, si->username); 
    13171297                } 
    13181298                g_bcms_delete_Socinf(si); 
     
    19031883 
    19041884 
    1905 GB_ERROR gbcm_login(GBCONTAINER *gb_main, const char *user) 
     1885GB_ERROR gbcm_login(GBCONTAINER *gb_main, const char *loginname) { 
    19061886     // look for any free user and set this_user 
    1907 { 
    19081887    int i; 
    19091888    GB_MAIN_TYPE *Main = GBCONTAINER_MAIN(gb_main); 
    19101889 
    19111890    for (i = 0; i<GB_MAX_USERS; i++) { 
    1912         if (!Main->users[i]) continue; 
    1913         if (!strcmp(user, Main->users[i]->username)) { 
    1914             Main->this_user = Main->users[i]; 
    1915             Main->users[i]->nusers++; 
     1891        gb_user_struct *user = Main->users[i]; 
     1892        if (user && strcmp(loginname, user->username) == 0) { 
     1893            Main->this_user = user; 
     1894            user->nusers++; 
    19161895            return 0; 
    19171896        } 
    19181897    } 
    19191898    for (i = 0; i<GB_MAX_USERS; i++) { 
    1920         if (Main->users[i]) continue; 
    1921         Main->users[i] = (struct gb_user_struct *) GB_calloc(sizeof(struct gb_user_struct), 1); 
    1922         Main->users[i]->username = strdup(user); 
    1923         Main->users[i]->userid = i; 
    1924         Main->users[i]->userbit = 1<<i; 
    1925         Main->users[i]->nusers = 1; 
    1926         Main->this_user = Main->users[i]; 
    1927         return 0; 
    1928     } 
    1929     return GB_export_errorf("Too many users in this database: User '%s' ", user); 
     1899        gb_user_struct*& user = Main->users[i]; 
     1900        if (!user) { 
     1901            user = (gb_user_struct *) GB_calloc(sizeof(gb_user_struct), 1); 
     1902             
     1903            user->username = strdup(loginname); 
     1904            user->userid   = i; 
     1905            user->userbit  = 1<<i; 
     1906            user->nusers   = 1; 
     1907 
     1908            Main->this_user = user; 
     1909 
     1910            return 0; 
     1911        } 
     1912    } 
     1913    return GB_export_errorf("Too many users in this database: User '%s' ", loginname); 
    19301914} 
    19311915 
     
    19491933    return GBCM_SERVER_OK; 
    19501934} 
     1935 
     1936GB_ERROR gbcm_logout(GB_MAIN_TYPE *Main, const char *loginname) { 
     1937    // if 'loginname' is NULL, the first logged-in user will be logged out 
     1938 
     1939    if (!loginname) { 
     1940        loginname = Main->users[0]->username; 
     1941        gb_assert(loginname); 
     1942    } 
     1943 
     1944    for (long i = 0; i<GB_MAX_USERS; i++) { 
     1945        gb_user_struct*& user = Main->users[i]; 
     1946        if (user && strcmp(loginname, user->username) == 0) { 
     1947            user->nusers--; 
     1948            if (user->nusers<=0) { // kill user and his projects 
     1949                if (i) fprintf(stdout, "User '%s' has logged out\n", loginname); 
     1950                free(user->username); 
     1951                freenull(user); 
     1952            } 
     1953            return 0; 
     1954        } 
     1955    } 
     1956    return GB_export_errorf("User '%s' not logged in", loginname); 
     1957} 
     1958 
    19511959 
    19521960GB_CSTR GB_get_hostname() {