0

I'm trying to read a file and store its content in a variable, here's my code:

#define _BSD_SOURCE
#include <stdio.h>
#include <sys/stat.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>

// CEK ROUTER MODEL
char* router_model;
char* model() {
    char filename[] = "/tmp/cpuinfo";
    char* key = "system type";
    char* value;
    FILE *file = fopen(filename, "r");

    if (file != NULL) {
        char line[1000];

        while (fgets(line, sizeof line, file) != NULL) /* read a line from a file */ {
            //fprintf(stdout, "%s", line); //print the file contents on stdout.
            if (strncmp(line, key, strlen(key)) == 0) {
                char* value = strchr(line, ':');
                value += 2;
                router_model = strdup(value);
                break;   // once the key has been found we can stop reading
            }
        }
        fclose(file);
    }
    else {
        perror(filename); //print the error message on stderr.
    }
    return router_model;
}

// TULIS SERIAL NUMBER KE FILE
char tulis(char p[100]) {
    // Write a serial number to a file
    char sn[30];
    char encrypt_sn[300];
    printf("Serial Number:\n");
    scanf("%s", sn);
    FILE *f = fopen("/tmp/halo/fsn-55cfc8770b69cc07268fae7f25ee444c", "w");
    if (f == NULL) {
        printf("Error opening file!\n");
        exit(1);
    }
    fprintf(f,"Serial Number: %s", sn);
    fclose(f);
    sprintf(encrypt_sn, "ccrypt -e /tmp/halo/fsn-55cfc8770b69cc07268fae7f25ee444c -K %s", p);
    system(encrypt_sn);
    system("mv /tmp/halo/fsn-55cfc8770b69cc07268fae7f25ee444c.cpt /tmp/halo/fsn-55cfc8770b69cc07268fae7f25ee444c");
    printf("Serial number is saved in /tmp/halo/fsn-55cfc8770b69cc07268fae7f25ee444c\n");
    return 0;
}

// BACA SERIAL NUMBER & SIMPAN DALAM SEBUAH VARIABLE
char baca(char p[100]) {
    // Store the serial number from a file in a variable
    char line[50];
    char decrypt_sn[300];
    char key[30] = "Serial Number";
    char *serial_number;
    if( access( "/tmp/halo/fsn-55cfc8770b69cc07268fae7f25ee444c", F_OK ) != -1 ) {
        system("cp /tmp/halo/fsn-55cfc8770b69cc07268fae7f25ee444c /tmp/");
        system("mv /tmp/fsn-55cfc8770b69cc07268fae7f25ee444c /tmp/fsn-55cfc8770b69cc07268fae7f25ee444c.cpt");
        sprintf(decrypt_sn, "ccrypt -d /tmp/fsn-55cfc8770b69cc07268fae7f25ee444c.cpt -K %s", p);
        system(decrypt_sn);
        FILE *file = fopen("/tmp/fsn-55cfc8770b69cc07268fae7f25ee444c", "r");
        if (file == NULL) {
            printf("Error opening file!\n");
            exit(1);
        }
        while (fgets(line, sizeof line, file) != NULL) /* read a line from a file */ {
            //fprintf(stdout, "%s", line); //print the file contents on stdout.
            if (strncmp(line, key, strlen(key)) == 0) {
                char* value = strchr(line, ':');
                value += 2;
                serial_number = strdup(value);
                break;   // once the key has been found we can stop reading
            }
        }
        fclose(file);
        //printf("Your hardware serial number is: (%s)\n", serial_number);
        remove("/tmp/fsn-55cfc8770b69cc07268fae7f25ee444c");
    }
    else {
        printf("fsn not found\n");
        return -1;
    }
    return 0;
}

int main(int argc, char* argv[]) {
    char *r;
    char *del;
    char *decrypt;
    int ret;
    char input[30];
    char *p;
    char *original_sn;
    p = "MmI4MTUxM2FjMjRlMDkzYmRkZGQyMjcwMjQ4OWY3MDAwNGZiYTM0MWNkZGIxNTdlYzAxN2";
    //tulis(p);
    original_sn = baca(p);
    printf("SN: %s\n", original_sn);
    return 0;
}

The file is /tmp/halo/fsn-55cfc8770b69cc07268fae7f25ee444c and the content of that file is Serial Number: 1866203214226041 and original_sn should output 1866203214226041. However when I run that code I get:

test.c: In function ‘main’:
test.c:105:14: warning: assignment makes pointer from integer without a cast [-Wint-conversion]
  original_sn = baca(p);
              ^
SN: (null)

How do I fix it ?

3
  • Do you understand, that baca returns a value? This value has to be stored first, only then you can get its address in a safe way. Taking addresses from temporaries is always a bad idea. Commented Feb 14, 2017 at 10:24
  • It is pretty obvious what to do. The warning says original_sn is a pointer but you attempt to store something in it which is not a pointer. Which should make you suspect that baca returns the wrong type. Commented Feb 14, 2017 at 10:59
  • Please edit your code to reduce it to a minimal reproducible example of your problem. Your current code includes much that is peripheral to your problem - a minimal sample normally looks similar to a good unit test: only performing one task, with input values specified for reproducibility. Commented Feb 14, 2017 at 13:43

3 Answers 3

3

This happens because your baca function returns a char, whereas you are assigning its return value to a char *. Maybe you wanted to use a char variable.

Sign up to request clarification or add additional context in comments.

6 Comments

I'm sorry I'm still new in programming. I've changed char *original_sn; to char original_sn;, the error goes away but it still returns SN: (null)
I think you need to print the argument, not the return value of baca function, try printing the value of p. @Squidward
original_sn = baca(p);printf("SN: %s\n", p); it returns SN: MmI4MTUxM2FjMjRlMDkzYmRkZGQyMjcwMjQ4OWY3MDAwNGZiYTM0MWNkZGIxNTdlYzAxN2
No I want 1866203214226041
Then you need to return the serial_number variable from your function, change the return type of baca to char *, and see what happens.
|
1

If function baca can change the contents of the memory block pointed by the input argument:

Change this:

char* p = "MmI4MTUxM2FjMjRlMDkzYmRkZGQyMjcwMjQ4OWY3MDAwNGZiYTM0MWNkZGIxNTdlYzAxN2";

To this:

char p[] = "MmI4MTUxM2FjMjRlMDkzYmRkZGQyMjcwMjQ4OWY3MDAwNGZiYTM0MWNkZGIxNTdlYzAxN2";

If function baca cannot change the contents of the memory block pointed by the input argument:

Change this:

char baca(char p[])

To this:

char baca(const char* p)

Comments

0

In baca you are allocating initialised memory using strdup: serial_number = strdup(value); , then you do nothing with that. It is clear that you think that the function returns a pointer to that memory so you can print it's content. However, it is not what you are doing. Because all your baca function is doing is returning a value indecating if it sucseede (0) or not (-1). And you are jut ignoring that pointer and leaving some wasted unused memory allocated by your prog. Their are 2 methodes to fix your code:

Method1 : returning the serial_number

char* baca(const char* p) {
    // Store the serial number from a file in a variable
    char line[50];
    char decrypt_sn[300];
    char key[30] = "Serial Number";
    char *serial_number=NULL;
    if( access( "/tmp/halo/fsn-55cfc8770b69cc07268fae7f25ee444c", F_OK ) != -1 ) {
        system("cp /tmp/halo/fsn-55cfc8770b69cc07268fae7f25ee444c /tmp/");
        system("mv /tmp/fsn-55cfc8770b69cc07268fae7f25ee444c /tmp/fsn-55cfc8770b69cc07268fae7f25ee444c.cpt");
        sprintf(decrypt_sn, "ccrypt -d /tmp/fsn-55cfc8770b69cc07268fae7f25ee444c.cpt -K %s", p);
        system(decrypt_sn);
        FILE *file = fopen("/tmp/fsn-55cfc8770b69cc07268fae7f25ee444c", "r");
        if (file == NULL) {
            printf("Error opening file!\n");
            exit(1);
        }
        while (fgets(line, sizeof line, file) != NULL) /* read a line from a file */ {
            //fprintf(stdout, "%s", line); //print the file contents on stdout.
            if (strncmp(line, key, strlen(key)) == 0) {
                char* value = strchr(line, ':');
              if(value!=NULL){/*testing the return value for erros so you prog doesn't cruch*/
                value += 2;
                serial_number = strdup(value);
               }
              /*in case off erreor you can choose one of two options:*/
              /*optinon1: print an error mesage then kill your prog*/
              else{
                printf("Error: corrupted file!\n");
                exit(1);
              } 
              /*option 2: removing the else part your baca then will return NULL and the calling code should understand that an error has occured*/               
                break; 
            }
        }
        fclose(file);
        remove("/tmp/fsn-55cfc8770b69cc07268fae7f25ee444c");
    }
    else {
        printf("fsn not found\n");
    }
    return serial_number;
}
int main(int argc, char* argv[]) {
    char *r;
    char *del;
    char *decrypt;
    int ret;
    char input[30];
    char *p;
    char *original_sn;
    p = "MmI4MTUxM2FjMjRlMDkzYmRkZGQyMjcwMjQ4OWY3MDAwNGZiYTM0MWNkZGIxNTdlYzAxN2";
    //tulis(p);
    original_sn = baca(p);
    if(original_sn!=NULL){
      printf("SN: %s\n", original_sn);
      free(original_sn);/*you should free the memory allocated by strdup once you are done using it.*/
    }
    else{
     printf("An error has occured\n");
    }
    return 0;
}

Method2 : pass by reference

char baca(const char* p, char **serial_number) {
    // Store the serial number from a file in a variable
    char line[50];
    char decrypt_sn[300];
    char key[30] = "Serial Number";
    char ret = 0;/*the return value 0 means no error.*/
    if( access( "/tmp/halo/fsn-55cfc8770b69cc07268fae7f25ee444c", F_OK ) != -1 ) {
        system("cp /tmp/halo/fsn-55cfc8770b69cc07268fae7f25ee444c /tmp/");
        system("mv /tmp/fsn-55cfc8770b69cc07268fae7f25ee444c /tmp/fsn-55cfc8770b69cc07268fae7f25ee444c.cpt");
        sprintf(decrypt_sn, "ccrypt -d /tmp/fsn-55cfc8770b69cc07268fae7f25ee444c.cpt -K %s", p);
        system(decrypt_sn);
        FILE *file = fopen("/tmp/fsn-55cfc8770b69cc07268fae7f25ee444c", "r");
        if (file == NULL) {
            printf("Error opening file!\n");
            exit(1);
        }
        while (fgets(line, sizeof line, file) != NULL) /* read a line from a file */ {
            //fprintf(stdout, "%s", line); //print the file contents on stdout.
            if (strncmp(line, key, strlen(key)) == 0) {
                char* value = strchr(line, ':');
                if(value!=NULL){/*testing the return value for erros so you prog doesn't cruch*/
                value += 2;
                *serial_number = strdup(value);
               }
              /*in case off erreor you can choose one of two options:*/

              else{
                 /*optinon1: print an error mesage then kill your prog*/
                 /*option 2: making the return value non 0 and the calling code should understand that an error has occured*/
                #define OPTION1
                #ifdef  OPTION1
                printf("Error: corrupted file!\n");
                exit(1);
                #else
                ret=-2; //to used this option comment out #define OPTION1
                #endif  
              }            
                break; 
            }
        }
        fclose(file);
        remove("/tmp/fsn-55cfc8770b69cc07268fae7f25ee444c");
    }
    else {
        printf("fsn not found\n");
        ret=-1;
    }
    return ret;
}
int main(int argc, char* argv[]) {
    char *r;
    char *del;
    char *decrypt;
    int ret;
    char input[30];
    char *p;
    char *original_sn=NULL;
    p = "MmI4MTUxM2FjMjRlMDkzYmRkZGQyMjcwMjQ4OWY3MDAwNGZiYTM0MWNkZGIxNTdlYzAxN2";
    //tulis(p);
     switch(baca(p,&original_sn))
     {
        case 0: //evrything is fine
           printf("SN: %s\n", original_sn);
           free(original_sn);
           break;
       case -1:/* handle each error as you should*/
       case -2:
       default:
         printf("An error has occured\n");
     }
    return 0;
}

Hope this helps. :).

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.