Dont assume error if fgets returns NULL
[yaz-moved-to-github.git] / client / client.c
index c34d201..93741ca 100644 (file)
@@ -1,5 +1,5 @@
 /* This file is part of the YAZ toolkit.
- * Copyright (C) 1995-2008 Index Data
+ * Copyright (C) 1995-2009 Index Data
  * See the file LICENSE for details.
  */
 /** \file client.c
@@ -177,6 +177,8 @@ int cmd_querycharset(const char *arg);
 
 static void close_session(void);
 
+static void marc_file_write(const char *buf, size_t sz);
+
 ODR getODROutputStream(void)
 {
     return out;
@@ -195,14 +197,15 @@ const char* query_type_as_string(QueryType q)
     }
 }
 
-static void do_hex_dump(const char* buf, int len)
+static void do_hex_dump(const char* buf, size_t len)
 {
     if (hex_dump)
     {
-        int i,x;
+        size_t i;
+        int x;
         for (i = 0; i < len ; i = i+16 )
         {
-            printf(" %4.4d ",i);
+            printf(" %4.4ld ", (long) i);
             for(x=0 ; i+x<len && x<16; ++x)
             {
                 printf("%2.2X ",(unsigned int)((unsigned char)buf[i+x]));
@@ -220,9 +223,14 @@ static void do_hex_dump(const char* buf, int len)
             sprintf(fname, "%s.%03d.raw", dump_file_prefix, no);
             of = fopen(fname, "wb");
 
-            fwrite(buf, 1, len, of);
-
-            fclose(of);
+            if (fwrite(buf, 1, len, of) != len)
+            {
+                printf("write failed for %s", fname);
+            }
+            if (fclose(of))
+            {
+                printf("close failed for %s", fname);
+            }
         }
     }
 }
@@ -583,7 +591,7 @@ static int parse_cmd_doc(const char **arg, ODR out, char **buf, int *len)
     }
     else if ((*arg)[0] == '<')
     {
-        long fsize;
+        size_t fsize;
         FILE *inf;
         const char *fname;
         const char *arg_start = ++(*arg);
@@ -882,8 +890,8 @@ static void display_record(Z_External *r)
     {
         print_record((const unsigned char *) r->u.octet_aligned->buf,
                      r->u.octet_aligned->len);
-        if (marc_file)
-            fwrite(r->u.octet_aligned->buf, 1, r->u.octet_aligned->len, marc_file);
+        marc_file_write((const char *) r->u.octet_aligned->buf,
+                        r->u.octet_aligned->len);
     }
     else if (oid && r->which == Z_External_octet)
     {
@@ -943,7 +951,10 @@ static void display_record(Z_External *r)
                 if (yaz_marc_decode_buf(mt, octet_buf, r->u.octet_aligned->len,
                                         &result, &rlen)> 0)
                 {
-                    fwrite(result, rlen, 1, stdout);
+                    if (fwrite(result, rlen, 1, stdout) != 1)
+                    {
+                        printf("write to stdout failed\n");
+                    }
                 }
                 else
                 {
@@ -961,8 +972,7 @@ static void display_record(Z_External *r)
                              r->u.octet_aligned->len);
             }
         }
-        if (marc_file)
-            fwrite(octet_buf, 1, r->u.octet_aligned->len, marc_file);
+        marc_file_write(octet_buf, r->u.octet_aligned->len);
     }
     else if (oid && !oid_oidcmp(oid, yaz_oid_recsyn_sutrs))
     {
@@ -972,8 +982,7 @@ static void display_record(Z_External *r)
             return;
         }
         print_record(r->u.sutrs->buf, r->u.sutrs->len);
-        if (marc_file)
-            fwrite(r->u.sutrs->buf, 1, r->u.sutrs->len, marc_file);
+        marc_file_write((const char *) r->u.sutrs->buf, r->u.sutrs->len);
     }
     else if (oid && !oid_oidcmp(oid, yaz_oid_recsyn_grs_1))
     {
@@ -2136,8 +2145,10 @@ static int cmd_update0(const char *arg)
 static int cmd_update_Z3950(int version, int action_no, const char *recid,
                             char *rec_buf, int rec_len);
 
+#if YAZ_HAVE_XML2
 static int cmd_update_SRW(int action_no, const char *recid,
                           char *rec_buf, int rec_len);
+#endif
 
 static int cmd_update_common(const char *arg, int version)
 {
@@ -3267,23 +3278,29 @@ int cmd_format(const char *arg)
         printf("Usage: format <recordsyntax>\n");
         return 0;
     }
+    while (sscanf(cp, "%40s%n", form_str, &nor) >= 1 && nor > 0
+           && idx < RECORDSYNTAX_MAX)
+    {
+        if (strcmp(form_str, "none") && 
+            !yaz_string_to_oid_odr(yaz_oid_std(), CLASS_RECSYN, form_str, out))
+        {
+            printf("Bad format: %s\n", form_str);
+            return 0;
+        }
+        cp += nor;
+    }
     for (i = 0; i < recordsyntax_size; i++)
     {
         xfree(recordsyntax_list[i]);
         recordsyntax_list[i] = 0;
     }
-
+    
+    cp = arg;
     while (sscanf(cp, "%40s%n", form_str, &nor) >= 1 && nor > 0
            && idx < RECORDSYNTAX_MAX)
     {
         if (!strcmp(form_str, "none"))
             break;
-        if (!yaz_string_to_oid_odr(yaz_oid_std(), CLASS_RECSYN, form_str, out))
-        {
-            printf("Bad format: %s\n", form_str);
-            recordsyntax_size = 0;
-            return 0;
-        }
         recordsyntax_list[idx] = xstrdup(form_str);
         cp += nor;
         idx++;
@@ -3516,35 +3533,37 @@ int cmd_source(const char* arg, int echo )
     FILE* includeFile;
     char line[102400], *cp;
 
-    if(strlen(arg)<1) {
-        fprintf(stderr,"Error in source command use a filename\n");
+    if (strlen(arg) < 1)
+    {
+        fprintf(stderr, "Error in source command use a filename\n");
         return -1;
     }
 
     includeFile = fopen(arg, "r");
 
-    if(!includeFile) {
-        fprintf(stderr,"Unable to open file %s for reading\n",arg);
+    if (!includeFile)
+    {
+        fprintf(stderr, "Unable to open file %s for reading\n",arg);
         return -1;
     }
 
-    while(!feof(includeFile)) {
-        memset(line,0,sizeof(line));
-        fgets(line,sizeof(line),includeFile);
-
-        if(strlen(line) < 2) continue;
-        if(line[0] == '#') continue;
+    while (fgets(line, sizeof(line), includeFile)) 
+    {
+        if (strlen(line) < 2)
+            continue;
+        if (line[0] == '#')
+            continue;
 
         if ((cp = strrchr(line, '\n')))
             *cp = '\0';
 
-        if( echo ) {
-            printf( "processing line: %s\n",line );
-        };
+        if (echo)
+            printf("processing line: %s\n", line);
         process_cmd_line(line);
     }
 
-    if(fclose(includeFile)<0) {
+    if (fclose(includeFile))
+    {
         perror("unable to close include file");
         exit(1);
     }
@@ -3566,12 +3585,12 @@ int cmd_source_noecho(const char* arg)
 
 int cmd_subshell(const char* args)
 {
-    if(strlen(args))
-        system(args);
-    else
-        system(getenv("SHELL"));
-
+    int ret = system(strlen(args) ? args : getenv("SHELL"));
     printf("\n");
+    if (ret)
+    {
+        printf("Exit %d\n", ret);
+    }
     return 1;
 }
 
@@ -3702,6 +3721,16 @@ int cmd_set_marcdump(const char* arg)
     return 1;
 }
 
+static void marc_file_write(const char *buf, size_t sz)
+{
+    if (marc_file)
+    {
+        if (fwrite(buf, 1, sz, marc_file) != sz)
+        {
+            perror("marcfile write");
+        }
+    }
+}
 /*
    this command takes 3 arge {name class oid}
 */
@@ -3882,9 +3911,13 @@ static void handle_srw_record(Z_SRW_record *rec)
     printf("\n");
     if (rec->recordData_buf && rec->recordData_len)
     {
-        fwrite(rec->recordData_buf, 1, rec->recordData_len, stdout);
-        if (marc_file)
-            fwrite(rec->recordData_buf, 1, rec->recordData_len, marc_file);
+        if (fwrite(rec->recordData_buf, 1, rec->recordData_len, stdout) !=
+            (size_t) (rec->recordData_len))
+        {
+            printf("write to stdout failed\n");
+        }
+        printf("%.*s", rec->recordData_len, rec->recordData_buf);
+        marc_file_write(rec->recordData_buf, rec->recordData_len);
     }
     else
         printf("No data!");
@@ -4850,12 +4883,12 @@ static void client(void)
 
 static void show_version(void)
 {
-    char vstr[20];
+    char vstr[20], sha1_str[41];
 
-    yaz_version(vstr, 0);
-    printf("YAZ version: %s\n", YAZ_VERSION);
-    if (strcmp(vstr, YAZ_VERSION))
-        printf("YAZ DLL/SO: %s\n", vstr);
+    yaz_version(vstr, sha1_str);
+    printf("YAZ version: %s %s\n", YAZ_VERSION, YAZ_VERSION_SHA1);
+    if (strcmp(sha1_str, YAZ_VERSION_SHA1))
+        printf("YAZ DLL/SO: %s %s\n", vstr, sha1_str);
     exit(0);
 }
 
@@ -5017,6 +5050,7 @@ int main(int argc, char **argv)
 /*
  * Local variables:
  * c-basic-offset: 4
+ * c-file-style: "Stroustrup"
  * indent-tabs-mode: nil
  * End:
  * vim: shiftwidth=4 tabstop=8 expandtab