Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /*
  2.  * Copyright (c) 2014 Lukasz Marek
  3.  *
  4.  * Permission is hereby granted, free of charge, to any person obtaining a copy
  5.  * of this software and associated documentation files (the "Software"), to deal
  6.  * in the Software without restriction, including without limitation the rights
  7.  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  8.  * copies of the Software, and to permit persons to whom the Software is
  9.  * furnished to do so, subject to the following conditions:
  10.  *
  11.  * The above copyright notice and this permission notice shall be included in
  12.  * all copies or substantial portions of the Software.
  13.  *
  14.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  15.  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  16.  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
  17.  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  18.  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  19.  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  20.  * THE SOFTWARE.
  21.  */
  22.  
  23. #include <libavcodec/avcodec.h>
  24. #include <libavformat/avformat.h>
  25. #include <libavformat/avio.h>
  26.  
  27. static const char *type_string(int type)
  28. {
  29.     switch (type) {
  30.     case AVIO_ENTRY_DIRECTORY:
  31.         return "<DIR>";
  32.     case AVIO_ENTRY_FILE:
  33.         return "<FILE>";
  34.     case AVIO_ENTRY_BLOCK_DEVICE:
  35.         return "<BLOCK DEVICE>";
  36.     case AVIO_ENTRY_CHARACTER_DEVICE:
  37.         return "<CHARACTER DEVICE>";
  38.     case AVIO_ENTRY_NAMED_PIPE:
  39.         return "<PIPE>";
  40.     case AVIO_ENTRY_SYMBOLIC_LINK:
  41.         return "<LINK>";
  42.     case AVIO_ENTRY_SOCKET:
  43.         return "<SOCKET>";
  44.     case AVIO_ENTRY_SERVER:
  45.         return "<SERVER>";
  46.     case AVIO_ENTRY_SHARE:
  47.         return "<SHARE>";
  48.     case AVIO_ENTRY_WORKGROUP:
  49.         return "<WORKGROUP>";
  50.     case AVIO_ENTRY_UNKNOWN:
  51.     default:
  52.         break;
  53.     }
  54.     return "<UNKNOWN>";
  55. }
  56.  
  57. static int list_op(const char *input_dir)
  58. {
  59.     AVIODirEntry *entry = NULL;
  60.     AVIODirContext *ctx = NULL;
  61.     int cnt, ret;
  62.     char filemode[4], uid_and_gid[20];
  63.  
  64.     if ((ret = avio_open_dir(&ctx, input_dir, NULL)) < 0) {
  65.         av_log(NULL, AV_LOG_ERROR, "Cannot open directory: %s.\n", av_err2str(ret));
  66.         goto fail;
  67.     }
  68.  
  69.     cnt = 0;
  70.     for (;;) {
  71.         if ((ret = avio_read_dir(ctx, &entry)) < 0) {
  72.             av_log(NULL, AV_LOG_ERROR, "Cannot list directory: %s.\n", av_err2str(ret));
  73.             goto fail;
  74.         }
  75.         if (!entry)
  76.             break;
  77.         if (entry->filemode == -1) {
  78.             snprintf(filemode, 4, "???");
  79.         } else {
  80.             snprintf(filemode, 4, "%3"PRIo64, entry->filemode);
  81.         }
  82.         snprintf(uid_and_gid, 20, "%"PRId64"(%"PRId64")", entry->user_id, entry->group_id);
  83.         if (cnt == 0)
  84.             av_log(NULL, AV_LOG_INFO, "%-9s %12s %30s %10s %s %16s %16s %16s\n",
  85.                    "TYPE", "SIZE", "NAME", "UID(GID)", "UGO", "MODIFIED",
  86.                    "ACCESSED", "STATUS_CHANGED");
  87.         av_log(NULL, AV_LOG_INFO, "%-9s %12"PRId64" %30s %10s %s %16"PRId64" %16"PRId64" %16"PRId64"\n",
  88.                type_string(entry->type),
  89.                entry->size,
  90.                entry->name,
  91.                uid_and_gid,
  92.                filemode,
  93.                entry->modification_timestamp,
  94.                entry->access_timestamp,
  95.                entry->status_change_timestamp);
  96.         avio_free_directory_entry(&entry);
  97.         cnt++;
  98.     };
  99.  
  100.   fail:
  101.     avio_close_dir(&ctx);
  102.     return ret;
  103. }
  104.  
  105. static int del_op(const char *url)
  106. {
  107.     int ret = avpriv_io_delete(url);
  108.     if (ret < 0)
  109.         av_log(NULL, AV_LOG_ERROR, "Cannot delete '%s': %s.\n", url, av_err2str(ret));
  110.     return ret;
  111. }
  112.  
  113. static int move_op(const char *src, const char *dst)
  114. {
  115.     int ret = avpriv_io_move(src, dst);
  116.     if (ret < 0)
  117.         av_log(NULL, AV_LOG_ERROR, "Cannot move '%s' into '%s': %s.\n", src, dst, av_err2str(ret));
  118.     return ret;
  119. }
  120.  
  121.  
  122. static void usage(const char *program_name)
  123. {
  124.     fprintf(stderr, "usage: %s OPERATION entry1 [entry2]\n"
  125.             "API example program to show how to manipulate resources "
  126.             "accessed through AVIOContext.\n"
  127.             "OPERATIONS:\n"
  128.             "list      list content of the directory\n"
  129.             "move      rename content in directory\n"
  130.             "del       delete content in directory\n",
  131.             program_name);
  132. }
  133.  
  134. int main(int argc, char *argv[])
  135. {
  136.     const char *op = NULL;
  137.     int ret;
  138.  
  139.     av_log_set_level(AV_LOG_DEBUG);
  140.  
  141.     if (argc < 2) {
  142.         usage(argv[0]);
  143.         return 1;
  144.     }
  145.  
  146.     /* register codecs and formats and other lavf/lavc components*/
  147.     av_register_all();
  148.     avformat_network_init();
  149.  
  150.     op = argv[1];
  151.     if (strcmp(op, "list") == 0) {
  152.         if (argc < 3) {
  153.             av_log(NULL, AV_LOG_INFO, "Missing argument for list operation.\n");
  154.             ret = AVERROR(EINVAL);
  155.         } else {
  156.             ret = list_op(argv[2]);
  157.         }
  158.     } else if (strcmp(op, "del") == 0) {
  159.         if (argc < 3) {
  160.             av_log(NULL, AV_LOG_INFO, "Missing argument for del operation.\n");
  161.             ret = AVERROR(EINVAL);
  162.         } else {
  163.             ret = del_op(argv[2]);
  164.         }
  165.     } else if (strcmp(op, "move") == 0) {
  166.         if (argc < 4) {
  167.             av_log(NULL, AV_LOG_INFO, "Missing argument for move operation.\n");
  168.             ret = AVERROR(EINVAL);
  169.         } else {
  170.             ret = move_op(argv[2], argv[3]);
  171.         }
  172.     } else {
  173.         av_log(NULL, AV_LOG_INFO, "Invalid operation %s\n", op);
  174.         ret = AVERROR(EINVAL);
  175.     }
  176.  
  177.     avformat_network_deinit();
  178.  
  179.     return ret < 0 ? 1 : 0;
  180. }
  181.