2017-08-18 2 views
0

Ich weiß, wie man es im Allgemeinen macht, aber ich habe eine bestimmte Situation.Wie kann man verschiedene in einer Funktion erstellte Dateien richtig benennen?

Ich entwickle eine Funktion, die Zertifikat von TLS in einer Datei speichert. Die Argumente der Funktion sind das Zertifikat (wie unsigned char *) und seine Länge.

Diese Funktion wird oft in sehr kurzer Zeit aufgerufen, daher besteht das Hauptproblem darin, jeder erstellten Datei einen anderen Namen zu geben.

Am Anfang habe ich die „Zeit“ verschiedene Namen

strftime(filename, sizeof(filename), "cert_%d-%m-%Y_%H:%M:%S.der", timeinfo);

aber das Problem ist, wenn zwei oder mehr Dateien in einem Zeitraum kürzer als eine Sekunde, die erstellt werden, geben neueste Datei überschrieb die alte.

Wie kann ich das richtig lösen? Irgendein Vorschlag ? Dies ist der Funktionscode:

static void save_certificate_FILE(const unsigned char * cert, u_int16_t cert_len) 
{ 
    FILE *fw; 
    X509 *x_cert; 
    char filename[cert_len]; 
    struct tm *timeinfo; 
    time_t rawtime; 

    x_cert = d2i_X509(NULL, &cert, cert_len); 
    if (!x_cert) { 
    fprintf(stderr, "Error on d21_X509 funtion\n"); 
    return; 
    } 

    // get the time 
    time(&rawtime); 
    timeinfo = localtime (&rawtime); 

    // save every file with the time certificate was catched 
    strftime(filename, sizeof(filename), "cert_%d-%m-%Y_%H:%M:%S.der", timeinfo); 

    if(!(fw = fopen(filename,"w"))) { 
    fprintf(stderr, "Error on opening file descriptor fw\n"); 
    return; 
    } 

// function to convert raw data (DER) to PEM certificate (good for parsing with openssl) 
    i2d_X509_fp(fw, x_cert); 

    // free cert e close file descriptor 
    X509_free(x_cert); 
    fclose(fw); 
} 
+2

Was ist 'mkstemp'? Siehe [hier] (https://linux.die.net/man/3/mkstemp) –

+4

Unrelated: Ich empfehle, 'cert_% Y-% m-% d% H-% M-% S ...' zu verwenden , da dies viel besser ist, und vermeidet es, sich mit ':' s in Dateinamen herumzuärgern. – alk

+1

Warum fügen Sie nicht einfach ein zufälliges Ziffernpaar hinzu? – jabujavi

Antwort

1

Wie @ Chris Turner schlagen mir auf den Kommentar, habe ich gettimeofday die Zeit zu halten für die Dateibenennung (besser nach dem Datum sortiert).

Dies ist der Code, den ich zu lösen verwendet, um:

gettimeofday(&tv, NULL); 
    millisec = lrint(tv.tv_usec/1000.0); // Round to nearest millisec 
    if(millisec>=1000) {     // Allow for rounding up to nearest second 
    millisec -=1000; 
    tv.tv_sec++; 
    } 

    timeinfo = localtime(&tv.tv_sec); 

    /* save every file with the time certificate was catched */ 
    strftime(filename, sizeof(filename), "cert_%Y-%m-%d_%H-%M-%S-%%03u.der", timeinfo); 
    snprintf(buff, sizeof(buff), filename, tv.tv_usec); 
Verwandte Themen